@@ -138,7 +138,7 @@ def test_active_tracing(self):
138
138
self .assertEqual (len (spans ), 1 )
139
139
span = spans [0 ]
140
140
self .assertEqual (span .name , os .environ [_HANDLER ])
141
- self .assertEqual (span .get_span_context ().trace_id , MOCK_XRAY_TRACE_ID )
141
+ self .assertNotEqual (span .get_span_context ().trace_id , MOCK_XRAY_TRACE_ID )
142
142
self .assertEqual (span .kind , SpanKind .SERVER )
143
143
self .assertSpanHasAttributes (
144
144
span ,
@@ -149,11 +149,7 @@ def test_active_tracing(self):
149
149
)
150
150
151
151
parent_context = span .parent
152
- self .assertEqual (
153
- parent_context .trace_id , span .get_span_context ().trace_id
154
- )
155
- self .assertEqual (parent_context .span_id , MOCK_XRAY_PARENT_SPAN_ID )
156
- self .assertTrue (parent_context .is_remote )
152
+ self .assertEqual (None , parent_context )
157
153
158
154
test_env_patch .stop ()
159
155
@@ -165,11 +161,8 @@ class TestCase:
165
161
context : Dict
166
162
expected_traceid : int
167
163
expected_parentid : int
168
- xray_traceid : str
169
164
expected_state_value : str = None
170
165
expected_trace_state_len : int = 0
171
- disable_aws_context_propagation : bool = False
172
- disable_aws_context_propagation_envvar : str = ""
173
166
174
167
def custom_event_context_extractor (lambda_event ):
175
168
return get_global_textmap ().extract (lambda_event ["foo" ]["headers" ])
@@ -187,11 +180,10 @@ def custom_event_context_extractor(lambda_event):
187
180
expected_traceid = MOCK_W3C_TRACE_ID ,
188
181
expected_parentid = MOCK_W3C_PARENT_SPAN_ID ,
189
182
expected_trace_state_len = 3 ,
190
- expected_state_value = MOCK_W3C_TRACE_STATE_VALUE ,
191
- xray_traceid = MOCK_XRAY_TRACE_CONTEXT_NOT_SAMPLED ,
183
+ expected_state_value = MOCK_W3C_TRACE_STATE_VALUE
192
184
),
193
185
TestCase (
194
- name = "custom_extractor_not_sampled_xray " ,
186
+ name = "custom_extractor " ,
195
187
custom_extractor = custom_event_context_extractor ,
196
188
context = {
197
189
"foo" : {
@@ -204,76 +196,21 @@ def custom_event_context_extractor(lambda_event):
204
196
expected_traceid = MOCK_W3C_TRACE_ID ,
205
197
expected_parentid = MOCK_W3C_PARENT_SPAN_ID ,
206
198
expected_trace_state_len = 3 ,
207
- expected_state_value = MOCK_W3C_TRACE_STATE_VALUE ,
208
- xray_traceid = MOCK_XRAY_TRACE_CONTEXT_NOT_SAMPLED ,
209
- ),
210
- TestCase (
211
- name = "custom_extractor_sampled_xray" ,
212
- custom_extractor = custom_event_context_extractor ,
213
- context = {
214
- "foo" : {
215
- "headers" : {
216
- TraceContextTextMapPropagator ._TRACEPARENT_HEADER_NAME : MOCK_W3C_TRACE_CONTEXT_SAMPLED ,
217
- TraceContextTextMapPropagator ._TRACESTATE_HEADER_NAME : f"{ MOCK_W3C_TRACE_STATE_KEY } ={ MOCK_W3C_TRACE_STATE_VALUE } ,foo=1,bar=2" ,
218
- }
219
- }
220
- },
221
- expected_traceid = MOCK_XRAY_TRACE_ID ,
222
- expected_parentid = MOCK_XRAY_PARENT_SPAN_ID ,
223
- xray_traceid = MOCK_XRAY_TRACE_CONTEXT_SAMPLED ,
224
- ),
225
- TestCase (
226
- name = "custom_extractor_sampled_xray_disable_aws_propagation" ,
227
- custom_extractor = custom_event_context_extractor ,
228
- context = {
229
- "foo" : {
230
- "headers" : {
231
- TraceContextTextMapPropagator ._TRACEPARENT_HEADER_NAME : MOCK_W3C_TRACE_CONTEXT_SAMPLED ,
232
- TraceContextTextMapPropagator ._TRACESTATE_HEADER_NAME : f"{ MOCK_W3C_TRACE_STATE_KEY } ={ MOCK_W3C_TRACE_STATE_VALUE } ,foo=1,bar=2" ,
233
- }
234
- }
235
- },
236
- disable_aws_context_propagation = True ,
237
- expected_traceid = MOCK_W3C_TRACE_ID ,
238
- expected_parentid = MOCK_W3C_PARENT_SPAN_ID ,
239
- expected_trace_state_len = 3 ,
240
- expected_state_value = MOCK_W3C_TRACE_STATE_VALUE ,
241
- xray_traceid = MOCK_XRAY_TRACE_CONTEXT_SAMPLED ,
242
- ),
243
- TestCase (
244
- name = "no_custom_extractor_xray_disable_aws_propagation_via_env_var" ,
245
- custom_extractor = None ,
246
- context = {
247
- "headers" : {
248
- TraceContextTextMapPropagator ._TRACEPARENT_HEADER_NAME : MOCK_W3C_TRACE_CONTEXT_SAMPLED ,
249
- TraceContextTextMapPropagator ._TRACESTATE_HEADER_NAME : f"{ MOCK_W3C_TRACE_STATE_KEY } ={ MOCK_W3C_TRACE_STATE_VALUE } ,foo=1,bar=2" ,
250
- }
251
- },
252
- disable_aws_context_propagation = False ,
253
- disable_aws_context_propagation_envvar = "true" ,
254
- expected_traceid = MOCK_W3C_TRACE_ID ,
255
- expected_parentid = MOCK_W3C_PARENT_SPAN_ID ,
256
- expected_trace_state_len = 3 ,
257
- expected_state_value = MOCK_W3C_TRACE_STATE_VALUE ,
258
- xray_traceid = MOCK_XRAY_TRACE_CONTEXT_SAMPLED ,
259
- ),
199
+ expected_state_value = MOCK_W3C_TRACE_STATE_VALUE
200
+ )
260
201
]
261
202
for test in tests :
262
203
test_env_patch = mock .patch .dict (
263
204
"os.environ" ,
264
205
{
265
206
** os .environ ,
266
- # NOT Active Tracing
267
- _X_AMZN_TRACE_ID : test .xray_traceid ,
268
- OTEL_LAMBDA_DISABLE_AWS_CONTEXT_PROPAGATION : test .disable_aws_context_propagation_envvar ,
269
207
# NOT using the X-Ray Propagator
270
208
OTEL_PROPAGATORS : "tracecontext" ,
271
209
},
272
210
)
273
211
test_env_patch .start ()
274
212
AwsLambdaInstrumentor ().instrument (
275
- event_context_extractor = test .custom_extractor ,
276
- disable_aws_context_propagation = test .disable_aws_context_propagation ,
213
+ event_context_extractor = test .custom_extractor
277
214
)
278
215
mock_execute_lambda (test .context )
279
216
spans = self .memory_exporter .get_finished_spans ()
@@ -301,6 +238,64 @@ def custom_event_context_extractor(lambda_event):
301
238
AwsLambdaInstrumentor ().uninstrument ()
302
239
test_env_patch .stop ()
303
240
241
+ def test_links_from_lambda_event (self ):
242
+ @dataclass
243
+ class TestCase :
244
+ name : str
245
+ context : Dict
246
+ expected_link_trace_id : int
247
+ xray_traceid : str
248
+ disable_aws_context_propagation : bool = False
249
+ disable_aws_context_propagation_envvar : str = ""
250
+
251
+ tests = [
252
+ TestCase (
253
+ name = "enabled_aws_context_propagation" ,
254
+ context = {},
255
+ expected_link_trace_id = MOCK_XRAY_TRACE_ID ,
256
+ xray_traceid = MOCK_XRAY_TRACE_CONTEXT_NOT_SAMPLED ,
257
+ ),
258
+ TestCase (
259
+ name = "disable_aws_context_propagation" ,
260
+ context = {},
261
+ expected_link_trace_id = None ,
262
+ xray_traceid = MOCK_XRAY_TRACE_CONTEXT_NOT_SAMPLED ,
263
+ disable_aws_context_propagation = True
264
+ )
265
+
266
+ ]
267
+ for test in tests :
268
+ test_env_patch = mock .patch .dict (
269
+ "os.environ" ,
270
+ {
271
+ ** os .environ ,
272
+ # NOT Active Tracing
273
+ _X_AMZN_TRACE_ID : test .xray_traceid ,
274
+ OTEL_LAMBDA_DISABLE_AWS_CONTEXT_PROPAGATION : test .disable_aws_context_propagation_envvar ,
275
+ # NOT using the X-Ray Propagator
276
+ OTEL_PROPAGATORS : "tracecontext" ,
277
+ },
278
+ )
279
+ test_env_patch .start ()
280
+ AwsLambdaInstrumentor ().instrument (
281
+ disable_aws_context_propagation = test .disable_aws_context_propagation ,
282
+ )
283
+ mock_execute_lambda (test .context )
284
+ spans = self .memory_exporter .get_finished_spans ()
285
+ assert spans
286
+ self .assertEqual (len (spans ), 1 )
287
+ span = spans [0 ]
288
+
289
+ if test .expected_link_trace_id == None :
290
+ self .assertEqual (0 , len (span .links ))
291
+ else :
292
+ link = span .links [0 ]
293
+ self .assertEqual (link .context .trace_id , test .expected_link_trace_id )
294
+
295
+ self .memory_exporter .clear ()
296
+ AwsLambdaInstrumentor ().uninstrument ()
297
+ test_env_patch .stop ()
298
+
304
299
def test_lambda_no_error_with_invalid_flush_timeout (self ):
305
300
test_env_patch = mock .patch .dict (
306
301
"os.environ" ,
@@ -327,6 +322,7 @@ def test_lambda_no_error_with_invalid_flush_timeout(self):
327
322
328
323
test_env_patch .stop ()
329
324
325
+
330
326
def test_lambda_handles_multiple_consumers (self ):
331
327
test_env_patch = mock .patch .dict (
332
328
"os.environ" ,
0 commit comments