diff --git a/src/OpenTelemetry.Instrumentation.AWSLambda/AWSLambdaResourceBuilderExtensions.cs b/src/OpenTelemetry.Instrumentation.AWSLambda/AWSLambdaResourceBuilderExtensions.cs new file mode 100644 index 0000000000..5ee32ec79b --- /dev/null +++ b/src/OpenTelemetry.Instrumentation.AWSLambda/AWSLambdaResourceBuilderExtensions.cs @@ -0,0 +1,33 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +using OpenTelemetry.AWS; +using OpenTelemetry.Instrumentation.AWSLambda.Implementation; +using OpenTelemetry.Internal; +using OpenTelemetry.Resources; + +namespace OpenTelemetry.Instrumentation.AWSLambda; + +/// +/// Extension methods to simplify registering of AWS Lambda resource detectors. +/// +public static class AWSLambdaResourceBuilderExtensions +{ + /// + /// Enables AWS Lambda resource detector. + /// + /// The being configured. + /// Optional callback action for configuring . + /// The instance of being configured. + public static ResourceBuilder AddAWSLambdaDetector(this ResourceBuilder builder, Action? configure = null) + { + Guard.ThrowIfNull(builder); + + var options = new AWSLambdaInstrumentationOptions(); + configure?.Invoke(options); + + var semanticConventionBuilder = new AWSSemanticConventions(options.SemanticConventionVersion); + + return builder.AddDetector(new AWSLambdaResourceDetector(semanticConventionBuilder)); + } +} diff --git a/src/OpenTelemetry.Instrumentation.AWSLambda/CHANGELOG.md b/src/OpenTelemetry.Instrumentation.AWSLambda/CHANGELOG.md index 24eba641f8..bbb06fb906 100644 --- a/src/OpenTelemetry.Instrumentation.AWSLambda/CHANGELOG.md +++ b/src/OpenTelemetry.Instrumentation.AWSLambda/CHANGELOG.md @@ -7,6 +7,7 @@ * 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)) ## 1.13.0 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!)); +}