From 782ba94b704c1473dac5b2d7d6881203e0a7f6cf Mon Sep 17 00:00:00 2001 From: yiyuanh Date: Mon, 10 Feb 2025 15:19:20 -0800 Subject: [PATCH] lambda topology issue fix --- .../AwsAttributeKeys.cs | 2 ++ .../AwsMetricAttributeGenerator.cs | 32 +++++++++++++++++++ .../Implementation/AWSSemanticConventions.cs | 1 + .../Implementation/AWSServiceHelper.cs | 3 +- 4 files changed, 37 insertions(+), 1 deletion(-) diff --git a/src/AWS.Distro.OpenTelemetry.AutoInstrumentation/AwsAttributeKeys.cs b/src/AWS.Distro.OpenTelemetry.AutoInstrumentation/AwsAttributeKeys.cs index 8cf4fcbc..0225ef6a 100644 --- a/src/AWS.Distro.OpenTelemetry.AutoInstrumentation/AwsAttributeKeys.cs +++ b/src/AWS.Distro.OpenTelemetry.AutoInstrumentation/AwsAttributeKeys.cs @@ -11,6 +11,7 @@ internal sealed class AwsAttributeKeys internal static readonly string AttributeAWSLocalOperation = "aws.local.operation"; internal static readonly string AttributeAWSRemoteDBUser = "aws.remote.db.user"; internal static readonly string AttributeAWSRemoteService = "aws.remote.service"; + internal static readonly string AttributeAWSRemoteEnvironment = "aws.remote.environment"; internal static readonly string AttributeAWSRemoteOperation = "aws.remote.operation"; internal static readonly string AttributeAWSRemoteResourceIdentifier = "aws.remote.resource.identifier"; @@ -48,6 +49,7 @@ internal sealed class AwsAttributeKeys internal static readonly string AttributeAWSDynamoTableName = "aws.table_name"; internal static readonly string AttributeAWSSQSQueueUrl = "aws.queue_url"; + internal static readonly string AttributeAWSLambdaFunctionName = "aws.lambda.function.name"; internal static readonly string AttributeAWSLambdaResourceMappingId = "aws.lambda.resource_mapping.id"; internal static readonly string AttributeAWSS3Bucket = "aws.s3.bucket"; internal static readonly string AttributeAWSSecretsManagerSecretArn = "aws.secretsmanager.secret.arn"; diff --git a/src/AWS.Distro.OpenTelemetry.AutoInstrumentation/AwsMetricAttributeGenerator.cs b/src/AWS.Distro.OpenTelemetry.AutoInstrumentation/AwsMetricAttributeGenerator.cs index c4834fe0..3aed46a6 100644 --- a/src/AWS.Distro.OpenTelemetry.AutoInstrumentation/AwsMetricAttributeGenerator.cs +++ b/src/AWS.Distro.OpenTelemetry.AutoInstrumentation/AwsMetricAttributeGenerator.cs @@ -410,6 +410,22 @@ private static void SetRemoteResourceTypeAndIdentifier(Activity span, ActivityTa remoteResourceType = NormalizedKinesisServiceName + "::Stream"; remoteResourceIdentifier = EscapeDelimiters((string?)span.GetTagItem(AttributeAWSKinesisStreamName)); } + else if (IsKeyPresent(span, AttributeAWSLambdaFunctionName)) + { + if (GetRemoteOperation(span, AttributeRpcMethod) == "Invoke") + { + attributes[AttributeAWSRemoteService] = GetLambdaFunctionNameFromArn(EscapeDelimiters((string?)span.GetTagItem(AttributeAWSLambdaFunctionName))); + + string lambdaRemoteEnv = Environment.GetEnvironmentVariable("LAMBDA_APPLICATION_SIGNALS_REMOTE_ENVIRONMENT") ?? "default"; + attributes.Add(AttributeAWSRemoteEnvironment, $"lambda:{lambdaRemoteEnv}"); + } + else + { + remoteResourceType = NormalizedLambdaServiceName + "::Function"; + remoteResourceIdentifier = GetLambdaFunctionNameFromArn(EscapeDelimiters((string?)span.GetTagItem(AttributeAWSLambdaFunctionName))); + cloudformationPrimaryIdentifier = EscapeDelimiters((string?)span.GetTagItem(AttributeAWSLambdaFunctionName)); + } + } else if (IsKeyPresent(span, AttributeAWSLambdaResourceMappingId)) { remoteResourceType = NormalizedLambdaServiceName + "::EventSourceMapping"; @@ -505,6 +521,22 @@ private static void SetRemoteResourceTypeAndIdentifier(Activity span, ActivityTa } } + private static string? GetLambdaFunctionNameFromArn(string? stringArn) + { + if (stringArn == null) + { + return null; + } + + if (stringArn.StartsWith("arn:aws:lambda:", StringComparison.Ordinal)) + { + string[] parts = stringArn.Split(':'); + return parts.Length > 0 ? parts[parts.Length - 1] : null; + } + + return stringArn; + } + private static void SetRemoteDbUser(Activity span, ActivityTagsCollection attributes) { if (IsDBSpan(span) && IsKeyPresent(span, AttributeDBUser)) diff --git a/src/OpenTelemetry.Instrumentation.AWS/Implementation/AWSSemanticConventions.cs b/src/OpenTelemetry.Instrumentation.AWS/Implementation/AWSSemanticConventions.cs index c5036db4..cbc946a6 100644 --- a/src/OpenTelemetry.Instrumentation.AWS/Implementation/AWSSemanticConventions.cs +++ b/src/OpenTelemetry.Instrumentation.AWS/Implementation/AWSSemanticConventions.cs @@ -15,6 +15,7 @@ internal static class AWSSemanticConventions public const string AttributeAWSSQSQueueName = "aws.sqs.queue_name"; public const string AttributeAWSS3BucketName = "aws.s3.bucket"; public const string AttributeAWSKinesisStreamName = "aws.kinesis.stream_name"; + public const string AttributeAWSLambdaFunctionName = "aws.lambda.function.name"; public const string AttributeAWSLambdaResourceMappingId = "aws.lambda.resource_mapping.id"; public const string AttributeAWSSecretsManagerSecretArn = "aws.secretsmanager.secret.arn"; public const string AttributeAWSSNSTopicArn = "aws.sns.topic.arn"; diff --git a/src/OpenTelemetry.Instrumentation.AWS/Implementation/AWSServiceHelper.cs b/src/OpenTelemetry.Instrumentation.AWS/Implementation/AWSServiceHelper.cs index 6a5f07e4..7f3d2409 100644 --- a/src/OpenTelemetry.Instrumentation.AWS/Implementation/AWSServiceHelper.cs +++ b/src/OpenTelemetry.Instrumentation.AWS/Implementation/AWSServiceHelper.cs @@ -13,7 +13,7 @@ internal class AWSServiceHelper { AWSServiceType.SQSService, new List { "QueueUrl", "QueueName" } }, { AWSServiceType.S3Service, new List { "BucketName" } }, { AWSServiceType.KinesisService, new List { "StreamName" } }, - { AWSServiceType.LambdaService, new List { "UUID" } }, + { AWSServiceType.LambdaService, new List { "UUID", "FunctionName" } }, { AWSServiceType.SecretsManagerService, new List { "SecretId" } }, { AWSServiceType.SNSService, new List { "TopicArn" } }, { AWSServiceType.StepFunctionsService, new List { "ActivityArn", "StateMachineArn" } }, @@ -42,6 +42,7 @@ internal class AWSServiceHelper { "SecretId", AWSSemanticConventions.AttributeAWSSecretsManagerSecretArn }, { "ActivityArn", AWSSemanticConventions.AttributeAWSStepFunctionsActivityArn }, { "StateMachineArn", AWSSemanticConventions.AttributeAWSStepFunctionsStateMachineArn }, + { "FunctionName", AWSSemanticConventions.AttributeAWSLambdaFunctionName }, { "UUID", AWSSemanticConventions.AttributeAWSLambdaResourceMappingId }, { "ModelId", AWSSemanticConventions.AttributeGenAiModelId }, { "GuardrailId", AWSSemanticConventions.AttributeAWSBedrockGuardrailId },