Skip to content
Merged
Show file tree
Hide file tree
Changes from 16 commits
Commits
Show all changes
21 commits
Select commit Hold shift + click to select a range
aa525f5
#894: enabled nullable for AWSLambda instrumentation
rypdal Aug 7, 2023
ecc6330
#894: allow nulls for ILambdaContext
rypdal Aug 8, 2023
221f6ac
#894: review suggestions
rypdal Aug 8, 2023
fce5a66
Update test/OpenTelemetry.Instrumentation.AWSLambda.Tests/Implementat…
rypdal Aug 8, 2023
edd3e9d
#894: made ILambdaContext non-nullable (for AWS lambda functions it m…
rypdal Aug 8, 2023
0a62c40
#894: added null-forgiving for passed tags and got rid of type casting
rypdal Aug 8, 2023
490f16b
Update test/OpenTelemetry.Instrumentation.AWSLambda.Tests/Implementat…
rypdal Aug 8, 2023
556bd8a
#894: further null-check improvements
rypdal Aug 8, 2023
888dbec
#894: moved repeating null check to internal methods
rypdal Aug 9, 2023
dabf755
Merge branch 'main' into feature/aws-lambda-enable-nullable
rypdal Aug 9, 2023
0bfa3ce
#894: review suggestions and other improvements
rypdal Aug 9, 2023
6bfce39
#894: additional review suggestions
rypdal Aug 9, 2023
3d129bf
Update src/OpenTelemetry.Instrumentation.AWSLambda/CHANGELOG.md
rypdal Aug 9, 2023
edaed39
Update src/OpenTelemetry.Instrumentation.AWSLambda/CHANGELOG.md
rypdal Aug 9, 2023
7ba3940
#894: long lines split
rypdal Aug 9, 2023
e257928
#894: more line split
rypdal Aug 9, 2023
117e923
Update src/OpenTelemetry.Instrumentation.AWSLambda/CHANGELOG.md
rypdal Aug 9, 2023
b0890f2
#894: removed unnecessary mentioning of test project
rypdal Aug 9, 2023
0f828ec
#894: fixed line length
rypdal Aug 9, 2023
d98bd3c
#894: fixed typo
rypdal Aug 9, 2023
df55a4e
Merge branch 'main' into feature/aws-lambda-enable-nullable
Kielek Aug 10, 2023
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Comment thread
rypdal marked this conversation as resolved.
Comment thread
rypdal marked this conversation as resolved.
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
#nullable enable
OpenTelemetry.Instrumentation.AWSLambda.AWSLambdaInstrumentationOptions
OpenTelemetry.Instrumentation.AWSLambda.AWSLambdaInstrumentationOptions.AWSLambdaInstrumentationOptions() -> void
OpenTelemetry.Instrumentation.AWSLambda.AWSLambdaInstrumentationOptions.DisableAwsXRayContextExtraction.get -> bool
Expand All @@ -6,9 +7,9 @@ OpenTelemetry.Instrumentation.AWSLambda.AWSLambdaInstrumentationOptions.SetParen
OpenTelemetry.Instrumentation.AWSLambda.AWSLambdaInstrumentationOptions.SetParentFromBatch.set -> void
OpenTelemetry.Instrumentation.AWSLambda.AWSLambdaWrapper
OpenTelemetry.Instrumentation.AWSLambda.TracerProviderBuilderExtensions
static OpenTelemetry.Instrumentation.AWSLambda.AWSLambdaWrapper.Trace<TInput, TResult>(OpenTelemetry.Trace.TracerProvider tracerProvider, System.Func<TInput, Amazon.Lambda.Core.ILambdaContext, TResult> lambdaHandler, TInput input, Amazon.Lambda.Core.ILambdaContext context, System.Diagnostics.ActivityContext parentContext = default(System.Diagnostics.ActivityContext)) -> TResult
static OpenTelemetry.Instrumentation.AWSLambda.AWSLambdaWrapper.Trace<TInput>(OpenTelemetry.Trace.TracerProvider tracerProvider, System.Action<TInput, Amazon.Lambda.Core.ILambdaContext> lambdaHandler, TInput input, Amazon.Lambda.Core.ILambdaContext context, System.Diagnostics.ActivityContext parentContext = default(System.Diagnostics.ActivityContext)) -> void
static OpenTelemetry.Instrumentation.AWSLambda.AWSLambdaWrapper.TraceAsync<TInput, TResult>(OpenTelemetry.Trace.TracerProvider tracerProvider, System.Func<TInput, Amazon.Lambda.Core.ILambdaContext, System.Threading.Tasks.Task<TResult>> lambdaHandler, TInput input, Amazon.Lambda.Core.ILambdaContext context, System.Diagnostics.ActivityContext parentContext = default(System.Diagnostics.ActivityContext)) -> System.Threading.Tasks.Task<TResult>
static OpenTelemetry.Instrumentation.AWSLambda.AWSLambdaWrapper.TraceAsync<TInput>(OpenTelemetry.Trace.TracerProvider tracerProvider, System.Func<TInput, Amazon.Lambda.Core.ILambdaContext, System.Threading.Tasks.Task> lambdaHandler, TInput input, Amazon.Lambda.Core.ILambdaContext context, System.Diagnostics.ActivityContext parentContext = default(System.Diagnostics.ActivityContext)) -> System.Threading.Tasks.Task
static OpenTelemetry.Instrumentation.AWSLambda.TracerProviderBuilderExtensions.AddAWSLambdaConfigurations(this OpenTelemetry.Trace.TracerProviderBuilder builder) -> OpenTelemetry.Trace.TracerProviderBuilder
static OpenTelemetry.Instrumentation.AWSLambda.TracerProviderBuilderExtensions.AddAWSLambdaConfigurations(this OpenTelemetry.Trace.TracerProviderBuilder builder, System.Action<OpenTelemetry.Instrumentation.AWSLambda.AWSLambdaInstrumentationOptions> configure) -> OpenTelemetry.Trace.TracerProviderBuilder
static OpenTelemetry.Instrumentation.AWSLambda.AWSLambdaWrapper.Trace<TInput, TResult>(OpenTelemetry.Trace.TracerProvider? tracerProvider, System.Func<TInput, Amazon.Lambda.Core.ILambdaContext!, TResult>! lambdaHandler, TInput input, Amazon.Lambda.Core.ILambdaContext! context, System.Diagnostics.ActivityContext parentContext = default(System.Diagnostics.ActivityContext)) -> TResult
Comment thread
rypdal marked this conversation as resolved.
static OpenTelemetry.Instrumentation.AWSLambda.AWSLambdaWrapper.Trace<TInput>(OpenTelemetry.Trace.TracerProvider? tracerProvider, System.Action<TInput, Amazon.Lambda.Core.ILambdaContext!>! lambdaHandler, TInput input, Amazon.Lambda.Core.ILambdaContext! context, System.Diagnostics.ActivityContext parentContext = default(System.Diagnostics.ActivityContext)) -> void
static OpenTelemetry.Instrumentation.AWSLambda.AWSLambdaWrapper.TraceAsync<TInput, TResult>(OpenTelemetry.Trace.TracerProvider? tracerProvider, System.Func<TInput, Amazon.Lambda.Core.ILambdaContext!, System.Threading.Tasks.Task<TResult>!>! lambdaHandler, TInput input, Amazon.Lambda.Core.ILambdaContext! context, System.Diagnostics.ActivityContext parentContext = default(System.Diagnostics.ActivityContext)) -> System.Threading.Tasks.Task<TResult>!
static OpenTelemetry.Instrumentation.AWSLambda.AWSLambdaWrapper.TraceAsync<TInput>(OpenTelemetry.Trace.TracerProvider? tracerProvider, System.Func<TInput, Amazon.Lambda.Core.ILambdaContext!, System.Threading.Tasks.Task!>! lambdaHandler, TInput input, Amazon.Lambda.Core.ILambdaContext! context, System.Diagnostics.ActivityContext parentContext = default(System.Diagnostics.ActivityContext)) -> System.Threading.Tasks.Task!
static OpenTelemetry.Instrumentation.AWSLambda.TracerProviderBuilderExtensions.AddAWSLambdaConfigurations(this OpenTelemetry.Trace.TracerProviderBuilder! builder) -> OpenTelemetry.Trace.TracerProviderBuilder!
static OpenTelemetry.Instrumentation.AWSLambda.TracerProviderBuilderExtensions.AddAWSLambdaConfigurations(this OpenTelemetry.Trace.TracerProviderBuilder! builder, System.Action<OpenTelemetry.Instrumentation.AWSLambda.AWSLambdaInstrumentationOptions!>? configure) -> OpenTelemetry.Trace.TracerProviderBuilder!
32 changes: 19 additions & 13 deletions src/OpenTelemetry.Instrumentation.AWSLambda/AWSLambdaWrapper.cs
Original file line number Diff line number Diff line change
Expand Up @@ -65,13 +65,14 @@ public static class AWSLambdaWrapper
/// </param>
/// <returns>Instance of output result.</returns>
public static TResult Trace<TInput, TResult>(
TracerProvider tracerProvider,
TracerProvider? tracerProvider,
Func<TInput, ILambdaContext, TResult> lambdaHandler,
TInput input,
ILambdaContext context,
ActivityContext parentContext = default)
{
Guard.ThrowIfNull(lambdaHandler);

return TraceInternal(tracerProvider, lambdaHandler, input, context, parentContext);
}

Expand All @@ -90,15 +91,15 @@ public static TResult Trace<TInput, TResult>(
/// unless X-Ray propagation is disabled in the configuration for this wrapper.
/// </param>
public static void Trace<TInput>(
TracerProvider tracerProvider,
TracerProvider? tracerProvider,
Action<TInput, ILambdaContext> lambdaHandler,
TInput input,
ILambdaContext context,
ActivityContext parentContext = default)
{
Guard.ThrowIfNull(lambdaHandler);

object Handler(TInput input, ILambdaContext context)
object? Handler(TInput input, ILambdaContext context)
{
lambdaHandler(input, context);
return null;
Expand All @@ -123,15 +124,15 @@ object Handler(TInput input, ILambdaContext context)
/// </param>
/// <returns>Task.</returns>
public static Task TraceAsync<TInput>(
TracerProvider tracerProvider,
TracerProvider? tracerProvider,
Func<TInput, ILambdaContext, Task> lambdaHandler,
TInput input,
ILambdaContext context,
ActivityContext parentContext = default)
{
Guard.ThrowIfNull(lambdaHandler);

async Task<object> Handler(TInput input, ILambdaContext context)
async Task<object?> Handler(TInput input, ILambdaContext context)
{
await lambdaHandler(input, context).ConfigureAwait(false);
return null;
Expand All @@ -157,21 +158,22 @@ async Task<object> Handler(TInput input, ILambdaContext context)
/// </param>
/// <returns>Task of result.</returns>
public static Task<TResult> TraceAsync<TInput, TResult>(
TracerProvider tracerProvider,
TracerProvider? tracerProvider,
Func<TInput, ILambdaContext, Task<TResult>> lambdaHandler,
TInput input,
ILambdaContext context,
ActivityContext parentContext = default)
{
Guard.ThrowIfNull(lambdaHandler);

return TraceInternalAsync(tracerProvider, lambdaHandler, input, context, parentContext);
}

#pragma warning restore RS0026 // Do not add multiple public overloads with optional parameters

internal static Activity OnFunctionStart<TInput>(TInput input, ILambdaContext context, ActivityContext parentContext = default)
internal static Activity? OnFunctionStart<TInput>(TInput input, ILambdaContext context, ActivityContext parentContext = default)
{
IEnumerable<ActivityLink> links = null;
IEnumerable<ActivityLink>? links = null;
if (parentContext == default)
{
(parentContext, links) = AWSLambdaUtils.ExtractParentContext(input);
Expand All @@ -186,20 +188,20 @@ internal static Activity OnFunctionStart<TInput>(TInput input, ILambdaContext co

// We assume that functionTags and httpTags have no intersection.
var activityName = AWSLambdaUtils.GetFunctionName(context) ?? "AWS Lambda Invoke";
var activity = AWSLambdaActivitySource.StartActivity(activityName, ActivityKind.Server, parentContext, functionTags.Concat(httpTags), links);
var activity = AWSLambdaActivitySource.StartActivity(activityName, ActivityKind.Server, parentContext, functionTags.Concat(httpTags)!, links);
Comment thread
rypdal marked this conversation as resolved.

return activity;
}

private static void OnFunctionStop(Activity activity, TracerProvider tracerProvider)
private static void OnFunctionStop(Activity? activity, TracerProvider? tracerProvider)
{
activity?.Stop();

// force flush before function quit in case of Lambda freeze.
tracerProvider?.ForceFlush();
}

private static void OnException(Activity activity, Exception exception)
private static void OnException(Activity? activity, Exception exception)
{
if (activity != null)
{
Expand All @@ -212,12 +214,14 @@ private static void OnException(Activity activity, Exception exception)
}

private static TResult TraceInternal<TInput, TResult>(
TracerProvider tracerProvider,
TracerProvider? tracerProvider,
Func<TInput, ILambdaContext, TResult> handler,
TInput input,
ILambdaContext context,
ActivityContext parentContext = default)
{
Guard.ThrowIfNull(context);

var activity = OnFunctionStart(input, context, parentContext);
try
{
Expand All @@ -238,12 +242,14 @@ private static TResult TraceInternal<TInput, TResult>(
}

private static async Task<TResult> TraceInternalAsync<TInput, TResult>(
TracerProvider tracerProvider,
TracerProvider? tracerProvider,
Func<TInput, ILambdaContext, Task<TResult>> handlerAsync,
TInput input,
ILambdaContext context,
ActivityContext parentContext = default)
{
Guard.ThrowIfNull(context);

var activity = OnFunctionStart(input, context, parentContext);
try
{
Expand Down
8 changes: 8 additions & 0 deletions src/OpenTelemetry.Instrumentation.AWSLambda/CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,14 @@

## Unreleased

* BREAKING: `ILambdaContext context` argument of all tracing methods of
`OpenTelemetry.Instrumentation.AWSLambda.AWSLambdaWrapper` was annotated as non-nullable.
* Enabled null state analysis for `OpenTelemetry.Instrumentation.AWSLambda` and
`OpenTelemetry.Instrumentation.AWSLambda.Tests`. The interface will now
Comment thread
rypdal marked this conversation as resolved.
Outdated
contain attributes for null-state static analysis. If null state analysis is
enabled your depending project, you may encounter new warnings.
([#894](https://github.com/open-telemetry/opentelemetry-dotnet-contrib/issues/894))
Comment thread
rypdal marked this conversation as resolved.
Outdated

## 1.2.0-beta.1

Released 2023-Aug-07
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -34,10 +34,10 @@ internal static IEnumerable<KeyValuePair<string, object>> GetHttpTags<TInput>(TI
{
var tags = new List<KeyValuePair<string, object>>();

string httpScheme = null;
string httpTarget = null;
string httpMethod = null;
string hostName = null;
string? httpScheme = null;
string? httpTarget = null;
string? httpMethod = null;
string? hostName = null;
int? hostPort = null;

switch (input)
Comment thread
rypdal marked this conversation as resolved.
Expand All @@ -57,6 +57,8 @@ internal static IEnumerable<KeyValuePair<string, object>> GetHttpTags<TInput>(TI
var hostHeaderV2 = AWSLambdaUtils.GetHeaderValues(requestV2, HeaderHost)?.LastOrDefault();
(hostName, hostPort) = GetHostAndPort(httpScheme, hostHeaderV2);
break;
default:
return tags;
}

tags.AddTagIfNotNull(SemanticConventions.AttributeHttpScheme, httpScheme);
Expand All @@ -68,8 +70,13 @@ internal static IEnumerable<KeyValuePair<string, object>> GetHttpTags<TInput>(TI
return tags;
}

internal static void SetHttpTagsFromResult(Activity activity, object result)
internal static void SetHttpTagsFromResult(Activity? activity, object? result)
{
if (activity == null || result == null)
{
return;
}

switch (result)
{
case APIGatewayProxyResponse response:
Expand All @@ -81,7 +88,7 @@ internal static void SetHttpTagsFromResult(Activity activity, object result)
}
}

internal static string GetQueryString(APIGatewayProxyRequest request)
internal static string? GetQueryString(APIGatewayProxyRequest request)
{
if (request.MultiValueQueryStringParameters == null)
{
Expand All @@ -107,10 +114,10 @@ internal static string GetQueryString(APIGatewayProxyRequest request)
return queryString.ToString();
}

internal static string GetQueryString(APIGatewayHttpApiV2ProxyRequest request) =>
internal static string? GetQueryString(APIGatewayHttpApiV2ProxyRequest request) =>
string.IsNullOrEmpty(request.RawQueryString) ? string.Empty : "?" + request.RawQueryString;

internal static (string Host, int? Port) GetHostAndPort(string httpScheme, string hostHeader)
internal static (string? Host, int? Port) GetHostAndPort(string? httpScheme, string? hostHeader)
{
if (hostHeader == null)
{
Expand All @@ -131,6 +138,6 @@ internal static (string Host, int? Port) GetHostAndPort(string httpScheme, strin
}
}

private static int? GetDefaultPort(string httpScheme) =>
private static int? GetDefaultPort(string? httpScheme) =>
httpScheme == "https" ? 443 : httpScheme == "http" ? 80 : null;
}
Original file line number Diff line number Diff line change
Expand Up @@ -65,10 +65,10 @@ internal static ActivityContext GetXRayParentContext()
return activityContext;
}

internal static (ActivityContext ParentContext, IEnumerable<ActivityLink> Links) ExtractParentContext<TInput>(TInput input)
internal static (ActivityContext ParentContext, IEnumerable<ActivityLink>? Links) ExtractParentContext<TInput>(TInput input)
{
PropagationContext parentContext = default;
IEnumerable<ActivityLink> links = null;
IEnumerable<ActivityLink>? links = null;
switch (input)
{
case APIGatewayProxyRequest apiGatewayProxyRequest:
Expand Down Expand Up @@ -104,7 +104,7 @@ internal static string GetAWSRegion()
return Environment.GetEnvironmentVariable(AWSRegion);
}

internal static string GetFunctionName(ILambdaContext context = null)
internal static string GetFunctionName(ILambdaContext? context = null)
{
return context?.FunctionName ?? Environment.GetEnvironmentVariable(FunctionName);
}
Expand All @@ -127,11 +127,6 @@ internal static IEnumerable<KeyValuePair<string, object>> GetFunctionTags<TInput
tags.Add(new(AWSLambdaSemanticConventions.AttributeFaasName, functionName));
}

if (context == null)
{
return tags;
}

if (context.AwsRequestId != null)
{
tags.Add(new(AWSLambdaSemanticConventions.AttributeFaasExecution, context.AwsRequestId));
Expand All @@ -152,7 +147,7 @@ internal static IEnumerable<KeyValuePair<string, object>> GetFunctionTags<TInput
return tags;
}

internal static IEnumerable<string> GetHeaderValues(APIGatewayProxyRequest request, string name)
internal static IEnumerable<string>? GetHeaderValues(APIGatewayProxyRequest request, string name)
{
var multiValueHeader = request.MultiValueHeaders?.GetValueByKeyIgnoringCase(name);
if (multiValueHeader != null)
Expand All @@ -165,18 +160,18 @@ internal static IEnumerable<string> GetHeaderValues(APIGatewayProxyRequest reque
return headerValue != null ? new[] { headerValue } : null;
}

internal static IEnumerable<string> GetHeaderValues(APIGatewayHttpApiV2ProxyRequest request, string name)
internal static IEnumerable<string>? GetHeaderValues(APIGatewayHttpApiV2ProxyRequest request, string name)
{
var headerValue = GetHeaderValue(request, name);

// Multiple values for the same header will be separated by a comma.
return headerValue?.Split(',');
}

private static string GetHeaderValue(APIGatewayHttpApiV2ProxyRequest request, string name) =>
private static string? GetHeaderValue(APIGatewayHttpApiV2ProxyRequest request, string name) =>
request.Headers?.GetValueByKeyIgnoringCase(name);

private static string GetAccountId(string functionArn)
private static string? GetAccountId(string functionArn)
{
// The fifth item of function arn: https://github.com/open-telemetry/opentelemetry-specification/blob/86aeab1e0a7e6c67be09c7f15ff25063ee6d2b5c/specification/trace/semantic_conventions/instrumentation/aws-lambda.md#all-triggers
// Function arn format - arn:aws:lambda:<region>:<account-id>:function:<function-name>
Expand Down
Loading