diff --git a/src/OpenTelemetry.Instrumentation.AWSLambda/.publicApi/PublicAPI.Unshipped.txt b/src/OpenTelemetry.Instrumentation.AWSLambda/.publicApi/PublicAPI.Unshipped.txt index e69de29bb2..e961cf7780 100644 --- a/src/OpenTelemetry.Instrumentation.AWSLambda/.publicApi/PublicAPI.Unshipped.txt +++ b/src/OpenTelemetry.Instrumentation.AWSLambda/.publicApi/PublicAPI.Unshipped.txt @@ -0,0 +1,2 @@ +OpenTelemetry.Instrumentation.AWSLambda.AWSLambdaResourceBuilderExtensions +static OpenTelemetry.Instrumentation.AWSLambda.AWSLambdaResourceBuilderExtensions.AddAWSLambdaDetector(this OpenTelemetry.Resources.ResourceBuilder! builder) -> OpenTelemetry.Resources.ResourceBuilder! \ No newline at end of file diff --git a/src/OpenTelemetry.Instrumentation.AWSLambda/AWSLambdaResourceBuilderExtensions.cs b/src/OpenTelemetry.Instrumentation.AWSLambda/AWSLambdaResourceBuilderExtensions.cs new file mode 100644 index 0000000000..5dab623bc2 --- /dev/null +++ b/src/OpenTelemetry.Instrumentation.AWSLambda/AWSLambdaResourceBuilderExtensions.cs @@ -0,0 +1,29 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +using OpenTelemetry.AWS; +using OpenTelemetry.Instrumentation.AWSLambda.Implementation; +using OpenTelemetry.Internal; +using OpenTelemetry.Resources; +using OpenTelemetry.Trace; + +namespace OpenTelemetry.Instrumentation.AWSLambda; + +/// +/// Extension methods to simplify registering of AWS Lambda resource detectors. +/// +public static class AWSLambdaResourceBuilderExtensions +{ + /// + /// Enables AWS Lambda resource detector. Do not call this method while also calling or . + /// + /// The being configured. + /// The instance of being configured. + public static ResourceBuilder AddAWSLambdaDetector(this ResourceBuilder builder) + { + Guard.ThrowIfNull(builder); + + var semanticConventionBuilder = new AWSSemanticConventions(); + return builder.AddDetector(new AWSLambdaResourceDetector(semanticConventionBuilder)); + } +} diff --git a/src/OpenTelemetry.Instrumentation.AWSLambda/CHANGELOG.md b/src/OpenTelemetry.Instrumentation.AWSLambda/CHANGELOG.md index 0470d3921d..7eb128ba16 100644 --- a/src/OpenTelemetry.Instrumentation.AWSLambda/CHANGELOG.md +++ b/src/OpenTelemetry.Instrumentation.AWSLambda/CHANGELOG.md @@ -12,6 +12,7 @@ Released 2025-Nov-13 * Update Amazon.Lambda.Core dependency from 2.2.0 to 2.8.0 which reworks the internal logic for determining the trace id created by AWS Lambda. ([#3410](https://github.com/open-telemetry/opentelemetry-dotnet-contrib/pull/3410)) +* Implement AWS Lambda detector ([#3411](https://github.com/open-telemetry/opentelemetry-dotnet-contrib/pull/3411)) * Update .NET 10.0 NuGet package versions from `10.0.0-rc.2.25502.107` to `10.0.0`. ([#3403](https://github.com/open-telemetry/opentelemetry-dotnet-contrib/pull/3403)) diff --git a/src/OpenTelemetry.Instrumentation.AWSLambda/TracerProviderBuilderExtensions.cs b/src/OpenTelemetry.Instrumentation.AWSLambda/TracerProviderBuilderExtensions.cs index d65977dae2..e328b5f68d 100644 --- a/src/OpenTelemetry.Instrumentation.AWSLambda/TracerProviderBuilderExtensions.cs +++ b/src/OpenTelemetry.Instrumentation.AWSLambda/TracerProviderBuilderExtensions.cs @@ -22,7 +22,7 @@ public static TracerProviderBuilder AddAWSLambdaConfigurations(this TracerProvid AddAWSLambdaConfigurations(builder, configure: null); /// - /// Add AWS Lambda configurations. + /// Add AWS Lambda configurations. Do not call this method if also calling as it already adds the detector. /// /// being configured. /// AWS lambda instrumentation options. diff --git a/test/OpenTelemetry.Instrumentation.AWSLambda.Tests/AWSLambdaResourceBuilderExtensionsTests.cs b/test/OpenTelemetry.Instrumentation.AWSLambda.Tests/AWSLambdaResourceBuilderExtensionsTests.cs new file mode 100644 index 0000000000..3e671e5c40 --- /dev/null +++ b/test/OpenTelemetry.Instrumentation.AWSLambda.Tests/AWSLambdaResourceBuilderExtensionsTests.cs @@ -0,0 +1,51 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +using OpenTelemetry.Resources; +using Xunit; + +namespace OpenTelemetry.Instrumentation.AWSLambda.Tests; + +public class AWSLambdaResourceBuilderExtensionsTests : IDisposable +{ + // Expected Semantic Conventions + private const string AttributeCloudProvider = "cloud.provider"; + private const string AttributeCloudRegion = "cloud.region"; + private const string AttributeFaasName = "faas.name"; + private const string AttributeFaasVersion = "faas.version"; + private const string AttributeFaasInstance = "faas.instance"; + private const string AttributeFaasMaxMemory = "faas.max_memory"; + + private readonly IDisposable environmentScope = EnvironmentVariableScope.Create( + ("AWS_REGION", "us-east-1"), + ("AWS_LAMBDA_FUNCTION_NAME", "testfunction"), + ("AWS_LAMBDA_FUNCTION_VERSION", "latest"), + ("AWS_LAMBDA_FUNCTION_MEMORY_SIZE", "128"), + ("AWS_LAMBDA_LOG_STREAM_NAME", "2025/07/21/[$LATEST]7b176c212e954e62adfb9b5451cb5374")); + + public void Dispose() => this.environmentScope.Dispose(); + + [Fact] + public void AssertAttributes() + { + var resourceBuilder = ResourceBuilder.CreateDefault(); + resourceBuilder.AddAWSLambdaDetector(); + + var resource = resourceBuilder.Build(); + + var resourceAttributes = resource.Attributes + .ToDictionary(x => x.Key, x => x.Value); + + Assert.Equal("aws", resourceAttributes[AttributeCloudProvider]); + Assert.Equal("us-east-1", resourceAttributes[AttributeCloudRegion]); + Assert.Equal("testfunction", resourceAttributes[AttributeFaasName]); + Assert.Equal("latest", resourceAttributes[AttributeFaasVersion]); + Assert.Equal("2025/07/21/[$LATEST]7b176c212e954e62adfb9b5451cb5374", + resourceAttributes[AttributeFaasInstance]); + Assert.Equal(134217728L, resourceAttributes[AttributeFaasMaxMemory]); + } + + [Fact] + public void AssertArgumentNullException() => + Assert.Throws(() => AWSLambdaResourceBuilderExtensions.AddAWSLambdaDetector(null!)); +}