7
7
from urllib .parse import ParseResult , urlparse
8
8
9
9
from amazon .opentelemetry .distro ._aws_attribute_keys import (
10
+ AWS_AUTH_ACCESS_KEY ,
11
+ AWS_AUTH_REGION ,
10
12
AWS_BEDROCK_AGENT_ID ,
11
13
AWS_BEDROCK_DATA_SOURCE_ID ,
12
14
AWS_BEDROCK_GUARDRAIL_ARN ,
13
15
AWS_BEDROCK_GUARDRAIL_ID ,
14
16
AWS_BEDROCK_KNOWLEDGE_BASE_ID ,
15
17
AWS_CLOUDFORMATION_PRIMARY_IDENTIFIER ,
18
+ AWS_DYNAMODB_TABLE_ARN ,
19
+ AWS_KINESIS_STREAM_ARN ,
16
20
AWS_KINESIS_STREAM_NAME ,
17
21
AWS_LAMBDA_FUNCTION_ARN ,
18
22
AWS_LAMBDA_FUNCTION_NAME ,
22
26
AWS_REMOTE_DB_USER ,
23
27
AWS_REMOTE_ENVIRONMENT ,
24
28
AWS_REMOTE_OPERATION ,
29
+ AWS_REMOTE_RESOURCE_ACCESS_KEY ,
30
+ AWS_REMOTE_RESOURCE_ACCOUNT_ID ,
25
31
AWS_REMOTE_RESOURCE_IDENTIFIER ,
32
+ AWS_REMOTE_RESOURCE_REGION ,
26
33
AWS_REMOTE_RESOURCE_TYPE ,
27
34
AWS_REMOTE_SERVICE ,
28
35
AWS_SECRETSMANAGER_SECRET_ARN ,
56
63
SERVICE_METRIC ,
57
64
MetricAttributeGenerator ,
58
65
)
66
+ from amazon .opentelemetry .distro .regional_resource_arn_parser import RegionalResourceArnParser
59
67
from amazon .opentelemetry .distro .sqs_url_parser import SqsUrlParser
60
68
from opentelemetry .sdk .resources import Resource
61
69
from opentelemetry .sdk .trace import BoundedAttributes , ReadableSpan
@@ -148,7 +156,11 @@ def _generate_dependency_metric_attributes(span: ReadableSpan, resource: Resourc
148
156
_set_service (resource , span , attributes )
149
157
_set_egress_operation (span , attributes )
150
158
_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 )
152
164
_set_remote_environment (span , attributes )
153
165
_set_remote_db_user (span , attributes )
154
166
_set_span_kind_for_dependency (span , attributes )
@@ -383,7 +395,7 @@ def _generate_remote_operation(span: ReadableSpan) -> str:
383
395
384
396
385
397
# 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 :
387
399
"""
388
400
Remote resource attributes {@link AwsAttributeKeys#AWS_REMOTE_RESOURCE_TYPE} and {@link
389
401
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
403
415
if is_key_present (span , _AWS_TABLE_NAMES ) and len (span .attributes .get (_AWS_TABLE_NAMES )) == 1 :
404
416
remote_resource_type = _NORMALIZED_DYNAMO_DB_SERVICE_NAME + "::Table"
405
417
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
+ )
406
423
elif is_key_present (span , AWS_KINESIS_STREAM_NAME ):
407
424
remote_resource_type = _NORMALIZED_KINESIS_SERVICE_NAME + "::Stream"
408
425
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
+ )
409
431
elif is_key_present (span , _AWS_BUCKET_NAME ):
410
432
remote_resource_type = _NORMALIZED_S3_SERVICE_NAME + "::Bucket"
411
433
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
491
513
attributes [AWS_REMOTE_RESOURCE_TYPE ] = remote_resource_type
492
514
attributes [AWS_REMOTE_RESOURCE_IDENTIFIER ] = remote_resource_identifier
493
515
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 )
494
558
495
559
496
560
def _set_remote_environment (span : ReadableSpan , attributes : BoundedAttributes ) -> None :
0 commit comments