2
2
import logging
3
3
from typing import List
4
4
5
+ from ddtrace ._trace .utils_botocore .span_pointers .dynamodb import (
6
+ _aws_dynamodb_item_span_pointer_description ,
7
+ )
5
8
from ddtrace ._trace .utils_botocore .span_pointers .s3 import (
6
9
_aws_s3_object_span_pointer_description ,
7
10
)
@@ -21,6 +24,9 @@ def calculate_span_pointers(
21
24
if event_source .equals (EventTypes .S3 ):
22
25
return _calculate_s3_span_pointers_for_event (event )
23
26
27
+ elif event_source .equals (EventTypes .DYNAMODB ):
28
+ return _calculate_dynamodb_span_pointers_for_event (event )
29
+
24
30
except Exception as e :
25
31
logger .warning (
26
32
"failed to calculate span pointers for event: %s" ,
@@ -89,3 +95,64 @@ def _calculate_s3_span_pointers_for_object_created_s3_information(
89
95
str (e ),
90
96
)
91
97
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