Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,12 @@ internal sealed class AwsAttributeKeys
internal static readonly string AttributeAWSDynamoTableName = "aws.table_name";
internal static readonly string AttributeAWSSQSQueueUrl = "aws.queue_url";

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";
internal static readonly string AttributeAWSSNSTopicArn = "aws.sns.topic.arn";
internal static readonly string AttributeAWSStepFunctionsActivityArn = "aws.stepfunctions.activity.arn";
internal static readonly string AttributeAWSStepFunctionsStateMachineArn = "aws.stepfunctions.state_machine.arn";

internal static readonly string AttributeAWSBedrockGuardrailId = "aws.bedrock.guardrail.id";
internal static readonly string AttributeAWSBedrockAgentId = "aws.bedrock.agent.id";
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -42,8 +42,12 @@ internal class AwsMetricAttributeGenerator : IMetricAttributeGenerator
// Normalized remote service names for supported AWS services
private static readonly string NormalizedDynamoDBServiceName = "AWS::DynamoDB";
private static readonly string NormalizedKinesisServiceName = "AWS::Kinesis";
private static readonly string NormalizedLambdaServiceName = "AWS::Lambda";
private static readonly string NormalizedS3ServiceName = "AWS::S3";
private static readonly string NormalizedSecretsManagerServiceName = "AWS::SecretsManager";
private static readonly string NormalizedSNSServiceName = "AWS::SNS";
private static readonly string NormalizedSQSServiceName = "AWS::SQS";
private static readonly string NormalizedStepFunctionsName = "AWS::StepFunctions";
private static readonly string NormalizedBedrockServiceName = "AWS::Bedrock";
private static readonly string NormalizedBedrockRuntimeServiceName = "AWS::BedrockRuntime";
private static readonly string DbConnectionResourceType = "DB::Connection";
Expand Down Expand Up @@ -358,12 +362,20 @@ private static string NormalizeRemoteServiceName(Activity span, string serviceNa
case "AmazonKinesis": // AWS SDK v1
case "Kinesis": // AWS SDK v2
return NormalizedKinesisServiceName;
case "Lambda":
return NormalizedLambdaServiceName;
case "Amazon S3": // AWS SDK v1
case "S3": // AWS SDK v2
return NormalizedS3ServiceName;
case "Secrets Manager":
return NormalizedSecretsManagerServiceName;
case "SNS":
return NormalizedSNSServiceName;
case "AmazonSQS": // AWS SDK v1
case "Sqs": // AWS SDK v2
return NormalizedSQSServiceName;
case "SFN":
return NormalizedStepFunctionsName;
case "Bedrock":
case "Bedrock Agent":
case "Bedrock Agent Runtime":
Expand Down Expand Up @@ -398,11 +410,28 @@ private static void SetRemoteResourceTypeAndIdentifier(Activity span, ActivityTa
remoteResourceType = NormalizedKinesisServiceName + "::Stream";
remoteResourceIdentifier = EscapeDelimiters((string?)span.GetTagItem(AttributeAWSKinesisStreamName));
}
else if (IsKeyPresent(span, AttributeAWSLambdaResourceMappingId))
{
remoteResourceType = NormalizedLambdaServiceName + "::EventSourceMapping";
remoteResourceIdentifier = EscapeDelimiters((string?)span.GetTagItem(AttributeAWSLambdaResourceMappingId));
}
else if (IsKeyPresent(span, AttributeAWSS3Bucket))
{
remoteResourceType = NormalizedS3ServiceName + "::Bucket";
remoteResourceIdentifier = EscapeDelimiters((string?)span.GetTagItem(AttributeAWSS3Bucket));
}
else if (IsKeyPresent(span, AttributeAWSSecretsManagerSecretArn))
{
remoteResourceType = NormalizedSecretsManagerServiceName + "::Secret";
remoteResourceIdentifier = EscapeDelimiters((string?)span.GetTagItem(AttributeAWSSecretsManagerSecretArn))?.Split(':').Last();
cloudformationPrimaryIdentifier = EscapeDelimiters((string?)span.GetTagItem(AttributeAWSSecretsManagerSecretArn));
}
else if (IsKeyPresent(span, AttributeAWSSNSTopicArn))
{
remoteResourceType = NormalizedSNSServiceName + "::Topic";
remoteResourceIdentifier = EscapeDelimiters((string?)span.GetTagItem(AttributeAWSSNSTopicArn))?.Split(':').Last();
cloudformationPrimaryIdentifier = EscapeDelimiters((string?)span.GetTagItem(AttributeAWSSNSTopicArn));
}
else if (IsKeyPresent(span, AttributeAWSSQSQueueName))
{
remoteResourceType = NormalizedSQSServiceName + "::Queue";
Expand All @@ -415,6 +444,18 @@ private static void SetRemoteResourceTypeAndIdentifier(Activity span, ActivityTa
remoteResourceIdentifier = EscapeDelimiters(GetQueueName((string?)span.GetTagItem(AttributeAWSSQSQueueUrl)));
cloudformationPrimaryIdentifier = EscapeDelimiters((string?)span.GetTagItem(AttributeAWSSQSQueueUrl));
}
else if (IsKeyPresent(span, AttributeAWSStepFunctionsActivityArn))
{
remoteResourceType = NormalizedStepFunctionsName + "::Activity";
remoteResourceIdentifier = EscapeDelimiters((string?)span.GetTagItem(AttributeAWSStepFunctionsActivityArn))?.Split(':').Last();
cloudformationPrimaryIdentifier = EscapeDelimiters((string?)span.GetTagItem(AttributeAWSStepFunctionsActivityArn));
}
else if (IsKeyPresent(span, AttributeAWSStepFunctionsStateMachineArn))
{
remoteResourceType = NormalizedStepFunctionsName + "::StateMachine";
remoteResourceIdentifier = EscapeDelimiters((string?)span.GetTagItem(AttributeAWSStepFunctionsStateMachineArn))?.Split(':').Last();
cloudformationPrimaryIdentifier = EscapeDelimiters((string?)span.GetTagItem(AttributeAWSStepFunctionsStateMachineArn));
}
else if (IsKeyPresent(span, AttributeAWSBedrockGuardrailId))
{
remoteResourceType = NormalizedBedrockServiceName + "::Guardrail";
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,11 @@ 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 AttributeAWSLambdaResourceMappingId = "aws.lambda.resource_mapping.id";
public const string AttributeAWSSecretsManagerSecretArn = "aws.secretsmanager.secret.arn";
public const string AttributeAWSSNSTopicArn = "aws.sns.topic.arn";
public const string AttributeAWSStepFunctionsActivityArn = "aws.stepfunctions.activity.arn";
public const string AttributeAWSStepFunctionsStateMachineArn = "aws.stepfunctions.state_machine.arn";

// AWS Bedrock service attributes not yet defined in semantic conventions
public const string AttributeAWSBedrockGuardrailId = "aws.bedrock.guardrail.id";
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,13 +13,18 @@ internal class AWSServiceHelper
{ AWSServiceType.SQSService, new List<string> { "QueueUrl", "QueueName" } },
{ AWSServiceType.S3Service, new List<string> { "BucketName" } },
{ AWSServiceType.KinesisService, new List<string> { "StreamName" } },
{ AWSServiceType.LambdaService, new List<string> { "UUID" } },
{ AWSServiceType.SecretsManagerService, new List<string> { "SecretId" } },
{ AWSServiceType.SNSService, new List<string> { "TopicArn" } },
{ AWSServiceType.StepFunctionsService, new List<string> { "ActivityArn", "StateMachineArn" } },
{ AWSServiceType.BedrockRuntimeService, new List<string> { "ModelId" } },
{ AWSServiceType.BedrockAgentService, new List<string> { "AgentId", "KnowledgeBaseId", "DataSourceId" } },
{ AWSServiceType.BedrockAgentRuntimeService, new List<string> { "AgentId", "KnowledgeBaseId" } },
};

internal static IReadOnlyDictionary<string, List<string>> ServiceResponseParameterMap = new Dictionary<string, List<string>>()
{
{ AWSServiceType.SecretsManagerService, new List<string> { "ARN" } },
{ AWSServiceType.SQSService, new List<string> { "QueueUrl" } },
{ AWSServiceType.BedrockService, new List<string> { "GuardrailId" } },
{ AWSServiceType.BedrockAgentService, new List<string> { "AgentId", "DataSourceId" } },
Expand All @@ -32,6 +37,12 @@ internal class AWSServiceHelper
{ "QueueName", AWSSemanticConventions.AttributeAWSSQSQueueName },
{ "BucketName", AWSSemanticConventions.AttributeAWSS3BucketName },
{ "StreamName", AWSSemanticConventions.AttributeAWSKinesisStreamName },
{ "TopicArn", AWSSemanticConventions.AttributeAWSSNSTopicArn },
{ "ARN", AWSSemanticConventions.AttributeAWSSecretsManagerSecretArn },
{ "SecretId", AWSSemanticConventions.AttributeAWSSecretsManagerSecretArn },
{ "ActivityArn", AWSSemanticConventions.AttributeAWSStepFunctionsActivityArn },
{ "StateMachineArn", AWSSemanticConventions.AttributeAWSStepFunctionsStateMachineArn },
{ "UUID", AWSSemanticConventions.AttributeAWSLambdaResourceMappingId },
{ "ModelId", AWSSemanticConventions.AttributeGenAiModelId },
{ "GuardrailId", AWSSemanticConventions.AttributeAWSBedrockGuardrailId },
{ "AgentId", AWSSemanticConventions.AttributeAWSBedrockAgentId },
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,9 @@ internal class AWSServiceType
internal const string SNSService = "SNS";
internal const string S3Service = "S3";
internal const string KinesisService = "Kinesis";
internal const string LambdaService = "Lambda";
internal const string SecretsManagerService = "Secrets Manager";
internal const string StepFunctionsService = "SFN";
internal const string BedrockService = "Bedrock";
internal const string BedrockRuntimeService = "Bedrock Runtime";
internal const string BedrockAgentService = "Bedrock Agent";
Expand All @@ -27,9 +30,18 @@ internal static bool IsSnsService(string service)
internal static bool IsS3Service(string service)
=> S3Service.Equals(service, StringComparison.OrdinalIgnoreCase);

internal static bool IsLambdaService(string service)
=> LambdaService.Equals(service, StringComparison.OrdinalIgnoreCase);

internal static bool IsKinesisService(string service)
=> KinesisService.Equals(service, StringComparison.OrdinalIgnoreCase);

internal static bool IsSecretsManagerService(string service)
=> SecretsManagerService.Equals(service, StringComparison.OrdinalIgnoreCase);

internal static bool IsStepFunctionsService(string service)
=> StepFunctionsService.Equals(service, StringComparison.OrdinalIgnoreCase);

internal static bool IsBedrockService(string service)
=> BedrockService.Equals(service, StringComparison.OrdinalIgnoreCase);

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -164,6 +164,20 @@ private static void AddRequestSpecificInformation(Activity activity, IRequestCon
}
}

// for secrets manager, only extract SecretId from request if it is a secret ARN.
if (AWSServiceType.IsSecretsManagerService(service) && parameter == "SecretId")
{
var secretId = property.GetValue(request);
if (secretId != null)
{
var secretIdString = secretId.ToString();
if (secretIdString != null && !secretIdString.StartsWith("arn:aws:secretsmanager:"))
{
continue;
}
}
}

if (AWSServiceHelper.ParameterAttributeMap.TryGetValue(parameter, out var attribute))
{
activity.SetTag(attribute, property.GetValue(request));
Expand Down
Loading
Loading