diff --git a/src/OpenTelemetry.Instrumentation.AWSLambda/AWSLambdaWrapper.cs b/src/OpenTelemetry.Instrumentation.AWSLambda/AWSLambdaWrapper.cs index 4695c10460..9ba0410d08 100644 --- a/src/OpenTelemetry.Instrumentation.AWSLambda/AWSLambdaWrapper.cs +++ b/src/OpenTelemetry.Instrumentation.AWSLambda/AWSLambdaWrapper.cs @@ -162,14 +162,9 @@ public static Task TraceAsync( } } - // No parallel invocation of the same lambda handler. - bool faasColdStart = isColdStart; - if (faasColdStart) - { - isColdStart = false; - } - - var functionTags = AWSLambdaUtils.GetFunctionTags(input, context, faasColdStart); + // No parallel invocation of the same lambda handler expected. + var functionTags = AWSLambdaUtils.GetFunctionTags(input, context, isColdStart); + isColdStart = false; var httpTags = AWSLambdaHttpUtils.GetHttpTags(input); // We assume that functionTags and httpTags have no intersection. @@ -179,6 +174,9 @@ public static Task TraceAsync( return activity; } + // Use only for testing. + internal static void ResetColdStart() => isColdStart = true; + private static void OnFunctionStop(Activity? activity, TracerProvider? tracerProvider) { activity?.Stop(); diff --git a/test/OpenTelemetry.Instrumentation.AWSLambda.Tests/AWSLambdaWrapperTests.cs b/test/OpenTelemetry.Instrumentation.AWSLambda.Tests/AWSLambdaWrapperTests.cs index 6262c29baa..a7d617bc70 100644 --- a/test/OpenTelemetry.Instrumentation.AWSLambda.Tests/AWSLambdaWrapperTests.cs +++ b/test/OpenTelemetry.Instrumentation.AWSLambda.Tests/AWSLambdaWrapperTests.cs @@ -213,6 +213,30 @@ public void OnFunctionStart_NoSampledAndAwsXRayContextExtractionDisabled_Activit Assert.NotNull(activity); } + [Theory] + [InlineData(1)] + [InlineData(2)] + public void OnFunctionStart_ColdStart_ColdStartTagHasCorrectValue(int invocationsCount) + { + AWSLambdaWrapper.ResetColdStart(); + Activity? activity = null; + + using (var tracerProvider = Sdk.CreateTracerProviderBuilder() + .AddAWSLambdaConfigurations(c => c.DisableAwsXRayContextExtraction = true) + .Build()) + { + for (int i = 1; i <= invocationsCount; i++) + { + activity = AWSLambdaWrapper.OnFunctionStart("test-input", new SampleLambdaContext()); + } + } + + Assert.NotNull(activity); + Assert.NotNull(activity.TagObjects); + var expectedColdStartValue = invocationsCount == 1 ? true : false; + Assert.Contains(activity.TagObjects, x => x.Key == AWSLambdaSemanticConventions.AttributeFaasColdStart && expectedColdStartValue.Equals(x.Value)); + } + private static ActivityContext CreateParentContext() { var traceId = ActivityTraceId.CreateFromString(TraceId.AsSpan());