99using OpenTelemetry . Trace ;
1010using static AWS . Distro . OpenTelemetry . AutoInstrumentation . AwsAttributeKeys ;
1111using static AWS . Distro . OpenTelemetry . AutoInstrumentation . AwsSpanProcessingUtil ;
12+ using static AWS . Distro . OpenTelemetry . AutoInstrumentation . RegionalResourceArnParser ;
1213using static AWS . Distro . OpenTelemetry . AutoInstrumentation . SqsUrlParser ;
1314using static OpenTelemetry . Trace . TraceSemanticConventions ;
1415
@@ -94,7 +95,16 @@ private ActivityTagsCollection GenerateDependencyMetricAttributes(Activity span,
9495 SetEgressOperation ( span , attributes ) ;
9596 SetRemoteEnvironment ( span , attributes ) ;
9697 SetRemoteServiceAndOperation ( span , attributes ) ;
97- SetRemoteResourceTypeAndIdentifier ( span , attributes ) ;
98+ bool isRemoteResourceIdentifierPresent = SetRemoteResourceTypeAndIdentifier ( span , attributes ) ;
99+ if ( isRemoteResourceIdentifierPresent )
100+ {
101+ bool isAccountIdAndRegionPresent = SetRemoteResourceAccountIdAndRegion ( span , attributes ) ;
102+ if ( ! isAccountIdAndRegionPresent )
103+ {
104+ SetRemoteResourceAccessKeyAndRegion ( span , attributes ) ;
105+ }
106+ }
107+
98108 SetSpanKindForDependency ( span , attributes ) ;
99109 SetRemoteDbUser ( span , attributes ) ;
100110
@@ -413,8 +423,9 @@ private static string NormalizeRemoteServiceName(Activity span, string serviceNa
413423
414424 // This function is used to check for AWS specific attributes and set the RemoteResourceType
415425 // and RemoteResourceIdentifier accordingly. Right now, this sets it for DDB, S3, Kinesis,
416- // and SQS (using QueueName or QueueURL)
417- private static void SetRemoteResourceTypeAndIdentifier ( Activity span , ActivityTagsCollection attributes )
426+ // and SQS (using QueueName or QueueURL). Returns true if remote resource type and identifier
427+ // are successfully set, false otherwise.
428+ private static bool SetRemoteResourceTypeAndIdentifier ( Activity span , ActivityTagsCollection attributes )
418429 {
419430 string ? remoteResourceType = null ;
420431 string ? remoteResourceIdentifier = null ;
@@ -426,11 +437,21 @@ private static void SetRemoteResourceTypeAndIdentifier(Activity span, ActivityTa
426437 remoteResourceType = NormalizedDynamoDBServiceName + "::Table" ;
427438 remoteResourceIdentifier = EscapeDelimiters ( ( string ? ) span . GetTagItem ( AttributeAWSDynamoTableName ) ) ;
428439 }
440+ else if ( IsKeyPresent ( span , AttributeAWSDynamoTableArn ) )
441+ {
442+ remoteResourceType = NormalizedDynamoDBServiceName + "::Table" ;
443+ remoteResourceIdentifier = EscapeDelimiters ( RegionalResourceArnParser . ExtractDynamoDbTableNameFromArn ( ( string ? ) span . GetTagItem ( AttributeAWSDynamoTableArn ) ) ) ;
444+ }
429445 else if ( IsKeyPresent ( span , AttributeAWSKinesisStreamName ) )
430446 {
431447 remoteResourceType = NormalizedKinesisServiceName + "::Stream" ;
432448 remoteResourceIdentifier = EscapeDelimiters ( ( string ? ) span . GetTagItem ( AttributeAWSKinesisStreamName ) ) ;
433449 }
450+ else if ( IsKeyPresent ( span , AttributeAWSKinesisStreamArn ) )
451+ {
452+ remoteResourceType = NormalizedKinesisServiceName + "::Stream" ;
453+ remoteResourceIdentifier = EscapeDelimiters ( RegionalResourceArnParser . ExtractKinesisStreamNameFromArn ( ( string ? ) span . GetTagItem ( AttributeAWSKinesisStreamArn ) ) ) ;
454+ }
434455 else if ( IsKeyPresent ( span , AttributeAWSLambdaFunctionName ) )
435456 {
436457 // For non-invoke Lambda operations, treat Lambda as a resource.
@@ -455,13 +476,13 @@ private static void SetRemoteResourceTypeAndIdentifier(Activity span, ActivityTa
455476 else if ( IsKeyPresent ( span , AttributeAWSSecretsManagerSecretArn ) )
456477 {
457478 remoteResourceType = NormalizedSecretsManagerServiceName + "::Secret" ;
458- remoteResourceIdentifier = EscapeDelimiters ( ( string ? ) span . GetTagItem ( AttributeAWSSecretsManagerSecretArn ) ) ? . Split ( ':' ) . Last ( ) ;
479+ remoteResourceIdentifier = EscapeDelimiters ( RegionalResourceArnParser . ExtractResourceNameFromArn ( ( string ? ) span . GetTagItem ( AttributeAWSSecretsManagerSecretArn ) ) ) ;
459480 cloudformationPrimaryIdentifier = EscapeDelimiters ( ( string ? ) span . GetTagItem ( AttributeAWSSecretsManagerSecretArn ) ) ;
460481 }
461482 else if ( IsKeyPresent ( span , AttributeAWSSNSTopicArn ) )
462483 {
463484 remoteResourceType = NormalizedSNSServiceName + "::Topic" ;
464- remoteResourceIdentifier = EscapeDelimiters ( ( string ? ) span . GetTagItem ( AttributeAWSSNSTopicArn ) ) ? . Split ( ':' ) . Last ( ) ;
485+ remoteResourceIdentifier = EscapeDelimiters ( RegionalResourceArnParser . ExtractResourceNameFromArn ( ( string ? ) span . GetTagItem ( AttributeAWSSNSTopicArn ) ) ) ;
465486 cloudformationPrimaryIdentifier = EscapeDelimiters ( ( string ? ) span . GetTagItem ( AttributeAWSSNSTopicArn ) ) ;
466487 }
467488 else if ( IsKeyPresent ( span , AttributeAWSSQSQueueName ) )
@@ -479,13 +500,16 @@ private static void SetRemoteResourceTypeAndIdentifier(Activity span, ActivityTa
479500 else if ( IsKeyPresent ( span , AttributeAWSStepFunctionsActivityArn ) )
480501 {
481502 remoteResourceType = NormalizedStepFunctionsName + "::Activity" ;
482- remoteResourceIdentifier = EscapeDelimiters ( ( string ? ) span . GetTagItem ( AttributeAWSStepFunctionsActivityArn ) ) ? . Split ( ':' ) . Last ( ) ;
503+ remoteResourceIdentifier =
504+ EscapeDelimiters (
505+ RegionalResourceArnParser . ExtractResourceNameFromArn (
506+ ( string ? ) span . GetTagItem ( AttributeAWSStepFunctionsActivityArn ) ) ) ;
483507 cloudformationPrimaryIdentifier = EscapeDelimiters ( ( string ? ) span . GetTagItem ( AttributeAWSStepFunctionsActivityArn ) ) ;
484508 }
485509 else if ( IsKeyPresent ( span , AttributeAWSStepFunctionsStateMachineArn ) )
486510 {
487511 remoteResourceType = NormalizedStepFunctionsName + "::StateMachine" ;
488- remoteResourceIdentifier = EscapeDelimiters ( ( string ? ) span . GetTagItem ( AttributeAWSStepFunctionsStateMachineArn ) ) ? . Split ( ':' ) . Last ( ) ;
512+ remoteResourceIdentifier = EscapeDelimiters ( RegionalResourceArnParser . ExtractResourceNameFromArn ( ( string ? ) span . GetTagItem ( AttributeAWSStepFunctionsStateMachineArn ) ) ) ;
489513 cloudformationPrimaryIdentifier = EscapeDelimiters ( ( string ? ) span . GetTagItem ( AttributeAWSStepFunctionsStateMachineArn ) ) ;
490514 }
491515 else if ( IsKeyPresent ( span , AttributeAWSBedrockGuardrailId ) )
@@ -535,6 +559,73 @@ private static void SetRemoteResourceTypeAndIdentifier(Activity span, ActivityTa
535559 attributes . Add ( AttributeAWSRemoteResourceType , remoteResourceType ) ;
536560 attributes . Add ( AttributeAWSRemoteResourceIdentifier , remoteResourceIdentifier ) ;
537561 attributes . Add ( AttributeAWSCloudformationPrimaryIdentifier , cloudformationPrimaryIdentifier ) ;
562+ return true ;
563+ }
564+
565+ return false ;
566+ }
567+
568+ // Extracts and sets the remote resource account ID and region from either an SQS queue URL or various AWS ARN attributes.
569+ private static bool SetRemoteResourceAccountIdAndRegion ( Activity span , ActivityTagsCollection attributes )
570+ {
571+ string [ ] arnAttributes = new [ ]
572+ {
573+ AttributeAWSDynamoTableArn ,
574+ AttributeAWSKinesisStreamArn ,
575+ AttributeAWSSNSTopicArn ,
576+ AttributeAWSSecretsManagerSecretArn ,
577+ AttributeAWSStepFunctionsActivityArn ,
578+ AttributeAWSStepFunctionsStateMachineArn ,
579+ AttributeAWSBedrockGuardrailArn ,
580+ AttributeAWSLambdaFunctionArn ,
581+ } ;
582+
583+ string ? remoteResourceAccountId = null ;
584+ string ? remoteResourceRegion = null ;
585+
586+ if ( IsKeyPresent ( span , AttributeAWSSQSQueueUrl ) )
587+ {
588+ string ? url = EscapeDelimiters ( ( string ? ) span . GetTagItem ( AttributeAWSSQSQueueUrl ) ) ;
589+ remoteResourceAccountId = SqsUrlParser . GetAccountId ( url ) ;
590+ remoteResourceRegion = SqsUrlParser . GetRegion ( url ) ;
591+ }
592+ else
593+ {
594+ foreach ( var attributeKey in arnAttributes )
595+ {
596+ if ( IsKeyPresent ( span , attributeKey ) )
597+ {
598+ string ? arn = ( string ? ) span . GetTagItem ( attributeKey ) ;
599+ remoteResourceAccountId = RegionalResourceArnParser . GetAccountId ( arn ) ;
600+ remoteResourceRegion = RegionalResourceArnParser . GetRegion ( arn ) ;
601+ break ;
602+ }
603+ }
604+ }
605+
606+ if ( remoteResourceAccountId != null && remoteResourceRegion != null )
607+ {
608+ attributes . Add ( AttributeAWSRemoteResourceAccountId , remoteResourceAccountId ) ;
609+ attributes . Add ( AttributeAWSRemoteResourceRegion , remoteResourceRegion ) ;
610+ return true ;
611+ }
612+
613+ return false ;
614+ }
615+
616+ // Extracts and sets the remote resource account access key id and region from STS credentials.
617+ private static void SetRemoteResourceAccessKeyAndRegion ( Activity span , ActivityTagsCollection attributes )
618+ {
619+ if ( IsKeyPresent ( span , AttributeAWSAuthAccessKey ) )
620+ {
621+ string ? remoteResourceAccessKey = ( string ? ) span . GetTagItem ( AttributeAWSAuthAccessKey ) ;
622+ attributes . Add ( AttributeAWSRemoteResourceAccessKey , remoteResourceAccessKey ) ;
623+ }
624+
625+ if ( IsKeyPresent ( span , AttributeAWSAuthRegion ) )
626+ {
627+ string ? remoteResourceRegion = ( string ? ) span . GetTagItem ( AttributeAWSAuthRegion ) ;
628+ attributes . Add ( AttributeAWSRemoteResourceRegion , remoteResourceRegion ) ;
538629 }
539630 }
540631
0 commit comments