77from urllib .parse import ParseResult , urlparse
88
99from amazon .opentelemetry .distro ._aws_attribute_keys import (
10+ AWS_AUTH_ACCESS_KEY ,
11+ AWS_AUTH_REGION ,
1012 AWS_BEDROCK_AGENT_ID ,
1113 AWS_BEDROCK_DATA_SOURCE_ID ,
1214 AWS_BEDROCK_GUARDRAIL_ARN ,
1315 AWS_BEDROCK_GUARDRAIL_ID ,
1416 AWS_BEDROCK_KNOWLEDGE_BASE_ID ,
1517 AWS_CLOUDFORMATION_PRIMARY_IDENTIFIER ,
18+ AWS_DYNAMODB_TABLE_ARN ,
19+ AWS_KINESIS_STREAM_ARN ,
1620 AWS_KINESIS_STREAM_NAME ,
1721 AWS_LAMBDA_FUNCTION_ARN ,
1822 AWS_LAMBDA_FUNCTION_NAME ,
2226 AWS_REMOTE_DB_USER ,
2327 AWS_REMOTE_ENVIRONMENT ,
2428 AWS_REMOTE_OPERATION ,
29+ AWS_REMOTE_RESOURCE_ACCESS_KEY ,
30+ AWS_REMOTE_RESOURCE_ACCOUNT_ID ,
2531 AWS_REMOTE_RESOURCE_IDENTIFIER ,
32+ AWS_REMOTE_RESOURCE_REGION ,
2633 AWS_REMOTE_RESOURCE_TYPE ,
2734 AWS_REMOTE_SERVICE ,
2835 AWS_SECRETSMANAGER_SECRET_ARN ,
5764 SERVICE_METRIC ,
5865 MetricAttributeGenerator ,
5966)
67+ from amazon .opentelemetry .distro .regional_resource_arn_parser import RegionalResourceArnParser
6068from amazon .opentelemetry .distro .sqs_url_parser import SqsUrlParser
6169from opentelemetry .sdk .resources import Resource
6270from opentelemetry .sdk .trace import BoundedAttributes , ReadableSpan
@@ -148,7 +156,11 @@ def _generate_dependency_metric_attributes(span: ReadableSpan, resource: Resourc
148156 _set_service (resource , span , attributes )
149157 _set_egress_operation (span , attributes )
150158 _set_remote_service_and_operation (span , attributes )
151- _set_remote_type_and_identifier (span , attributes )
159+ is_remote_identifier_present = _set_remote_type_and_identifier (span , attributes )
160+ if is_remote_identifier_present :
161+ is_remote_account_id_present = _set_remote_account_id_and_region (span , attributes )
162+ if not is_remote_account_id_present :
163+ _set_remote_access_key_and_region (span , attributes )
152164 _set_remote_environment (span , attributes )
153165 _set_remote_db_user (span , attributes )
154166 _set_span_kind_for_dependency (span , attributes )
@@ -383,7 +395,7 @@ def _generate_remote_operation(span: ReadableSpan) -> str:
383395
384396
385397# pylint: disable=too-many-branches,too-many-statements
386- def _set_remote_type_and_identifier (span : ReadableSpan , attributes : BoundedAttributes ) -> None :
398+ def _set_remote_type_and_identifier (span : ReadableSpan , attributes : BoundedAttributes ) -> bool :
387399 """
388400 Remote resource attributes {@link AwsAttributeKeys#AWS_REMOTE_RESOURCE_TYPE} and {@link
389401 AwsAttributeKeys#AWS_REMOTE_RESOURCE_IDENTIFIER} are used to store information about the resource associated with
@@ -403,9 +415,19 @@ def _set_remote_type_and_identifier(span: ReadableSpan, attributes: BoundedAttri
403415 if is_key_present (span , _AWS_TABLE_NAMES ) and len (span .attributes .get (_AWS_TABLE_NAMES )) == 1 :
404416 remote_resource_type = _NORMALIZED_DYNAMO_DB_SERVICE_NAME + "::Table"
405417 remote_resource_identifier = _escape_delimiters (span .attributes .get (_AWS_TABLE_NAMES )[0 ])
418+ elif is_key_present (span , AWS_DYNAMODB_TABLE_ARN ):
419+ remote_resource_type = _NORMALIZED_DYNAMO_DB_SERVICE_NAME + "::Table"
420+ remote_resource_identifier = (
421+ _escape_delimiters (span .attributes .get (AWS_DYNAMODB_TABLE_ARN )).split (":" )[- 1 ].replace ("table/" , "" )
422+ )
406423 elif is_key_present (span , AWS_KINESIS_STREAM_NAME ):
407424 remote_resource_type = _NORMALIZED_KINESIS_SERVICE_NAME + "::Stream"
408425 remote_resource_identifier = _escape_delimiters (span .attributes .get (AWS_KINESIS_STREAM_NAME ))
426+ elif is_key_present (span , AWS_KINESIS_STREAM_ARN ):
427+ remote_resource_type = _NORMALIZED_KINESIS_SERVICE_NAME + "::Stream"
428+ remote_resource_identifier = (
429+ _escape_delimiters (span .attributes .get (AWS_KINESIS_STREAM_ARN )).split (":" )[- 1 ].replace ("stream/" , "" )
430+ )
409431 elif is_key_present (span , _AWS_BUCKET_NAME ):
410432 remote_resource_type = _NORMALIZED_S3_SERVICE_NAME + "::Bucket"
411433 remote_resource_identifier = _escape_delimiters (span .attributes .get (_AWS_BUCKET_NAME ))
@@ -491,6 +513,48 @@ def _set_remote_type_and_identifier(span: ReadableSpan, attributes: BoundedAttri
491513 attributes [AWS_REMOTE_RESOURCE_TYPE ] = remote_resource_type
492514 attributes [AWS_REMOTE_RESOURCE_IDENTIFIER ] = remote_resource_identifier
493515 attributes [AWS_CLOUDFORMATION_PRIMARY_IDENTIFIER ] = cloudformation_primary_identifier
516+ return True
517+ return False
518+
519+
520+ def _set_remote_account_id_and_region (span : ReadableSpan , attributes : BoundedAttributes ) -> bool :
521+ ARN_ATTRIBUTES = [
522+ AWS_DYNAMODB_TABLE_ARN ,
523+ AWS_KINESIS_STREAM_ARN ,
524+ AWS_SNS_TOPIC_ARN ,
525+ AWS_SECRETSMANAGER_SECRET_ARN ,
526+ AWS_STEPFUNCTIONS_STATEMACHINE_ARN ,
527+ AWS_STEPFUNCTIONS_ACTIVITY_ARN ,
528+ AWS_BEDROCK_GUARDRAIL_ARN ,
529+ AWS_LAMBDA_FUNCTION_ARN ,
530+ ]
531+ remote_account_id : Optional [str ] = None
532+ remote_region : Optional [str ] = None
533+
534+ if is_key_present (span , AWS_SQS_QUEUE_URL ):
535+ queue_url = _escape_delimiters (span .attributes .get (AWS_SQS_QUEUE_URL ))
536+ remote_account_id = SqsUrlParser .get_account_id (queue_url )
537+ remote_region = SqsUrlParser .get_region (queue_url )
538+ else :
539+ for arn_attribute in ARN_ATTRIBUTES :
540+ if is_key_present (span , arn_attribute ):
541+ arn = span .attributes .get (arn_attribute )
542+ remote_account_id = RegionalResourceArnParser .get_account_id (arn )
543+ remote_region = RegionalResourceArnParser .get_region (arn )
544+ break
545+
546+ if remote_account_id is not None and remote_region is not None :
547+ attributes [AWS_REMOTE_RESOURCE_ACCOUNT_ID ] = remote_account_id
548+ attributes [AWS_REMOTE_RESOURCE_REGION ] = remote_region
549+ return True
550+ return False
551+
552+
553+ def _set_remote_access_key_and_region (span : ReadableSpan , attributes : BoundedAttributes ) -> None :
554+ if is_key_present (span , AWS_AUTH_ACCESS_KEY ):
555+ attributes [AWS_REMOTE_RESOURCE_ACCESS_KEY ] = span .attributes .get (AWS_AUTH_ACCESS_KEY )
556+ if is_key_present (span , AWS_AUTH_REGION ):
557+ attributes [AWS_REMOTE_RESOURCE_REGION ] = span .attributes .get (AWS_AUTH_REGION )
494558
495559
496560def _set_remote_environment (span : ReadableSpan , attributes : BoundedAttributes ) -> None :
0 commit comments