22import logging
33from typing import List
44
5+ from ddtrace ._trace .utils_botocore .span_pointers .dynamodb import (
6+ _aws_dynamodb_item_span_pointer_description ,
7+ )
58from ddtrace ._trace .utils_botocore .span_pointers .s3 import (
69 _aws_s3_object_span_pointer_description ,
710)
@@ -21,6 +24,9 @@ def calculate_span_pointers(
2124 if event_source .equals (EventTypes .S3 ):
2225 return _calculate_s3_span_pointers_for_event (event )
2326
27+ elif event_source .equals (EventTypes .DYNAMODB ):
28+ return _calculate_dynamodb_span_pointers_for_event (event )
29+
2430 except Exception as e :
2531 logger .warning (
2632 "failed to calculate span pointers for event: %s" ,
@@ -89,3 +95,64 @@ def _calculate_s3_span_pointers_for_object_created_s3_information(
8995 str (e ),
9096 )
9197 return []
98+
99+
100+ def _calculate_dynamodb_span_pointers_for_event (event ) -> List [_SpanPointerDescription ]:
101+ # Example event:
102+ # https://docs.aws.amazon.com/lambda/latest/dg/with-ddb.html
103+
104+ return list (
105+ chain .from_iterable (
106+ _calculate_dynamodb_span_pointers_for_event_record (record )
107+ for record in event .get ("Records" , [])
108+ )
109+ )
110+
111+
112+ def _calculate_dynamodb_span_pointers_for_event_record (
113+ record ,
114+ ) -> List [_SpanPointerDescription ]:
115+ try :
116+ table_name = _extract_table_name_from_dynamodb_stream_record (record )
117+ primary_key = record ["dynamodb" ]["Keys" ]
118+
119+ except Exception as e :
120+ logger .warning (
121+ "missing DynamoDB information required to make a span pointer: %s" ,
122+ str (e ),
123+ )
124+ return []
125+
126+ try :
127+ return [
128+ _aws_dynamodb_item_span_pointer_description (
129+ pointer_direction = _SpanPointerDirection .UPSTREAM ,
130+ table_name = table_name ,
131+ primary_key = primary_key ,
132+ )
133+ ]
134+
135+ except Exception as e :
136+ logger .warning (
137+ "failed to generate DynamoDB span pointer: %s" ,
138+ str (e ),
139+ )
140+ return []
141+
142+
143+ def _extract_table_name_from_dynamodb_stream_record (record ) -> str :
144+ # Example eventSourceARN:
145+ # arn:aws:dynamodb:us-east-2:123456789012:table/my-table/stream/2024-06-10T19:26:16.525
146+ event_source_arn = record ["eventSourceARN" ]
147+
148+ [_arn , _aws , _dynamodb , _region , _account , dynamodb_info ] = event_source_arn .split (
149+ ":" , maxsplit = 5
150+ )
151+ if _arn != "arn" or _aws != "aws" or _dynamodb != "dynamodb" :
152+ raise ValueError (f"unexpected eventSourceARN format: { event_source_arn } " )
153+
154+ [_table , table_name , _stream , _timestamp ] = dynamodb_info .split ("/" )
155+ if not _table == "table" or not _stream == "stream" :
156+ raise ValueError (f"unexpected eventSourceARN format: { event_source_arn } " )
157+
158+ return table_name
0 commit comments