@@ -272,6 +272,15 @@ def extract_context_from_sqs_or_sns_event_or_context(event, lambda_context):
272272
273273 if dd_json_data :
274274 dd_data = json .loads (dd_json_data )
275+
276+ if is_step_function_event (dd_data ):
277+ try :
278+ return extract_context_from_step_functions (dd_data , None )
279+ except Exception :
280+ logger .debug (
281+ "Failed to extract Step Functions context from SQS/SNS event."
282+ )
283+
275284 return propagator .extract (dd_data )
276285 else :
277286 # Handle case where trace context is injected into attributes.AWSTraceHeader
@@ -314,9 +323,10 @@ def _extract_context_from_eventbridge_sqs_event(event):
314323 body = json .loads (body_str )
315324 detail = body .get ("detail" )
316325 dd_context = detail .get ("_datadog" )
326+
317327 if is_step_function_event (dd_context ):
318328 try :
319- return extract_context_from_step_functions (detail , None )
329+ return extract_context_from_step_functions (dd_context , None )
320330 except Exception :
321331 logger .debug (
322332 "Failed to extract Step Functions context from EventBridge to SQS event."
@@ -338,8 +348,10 @@ def extract_context_from_eventbridge_event(event, lambda_context):
338348 dd_context = detail .get ("_datadog" )
339349 if not dd_context :
340350 return extract_context_from_lambda_context (lambda_context )
351+
341352 if is_step_function_event (dd_context ):
342- return extract_context_from_step_functions (detail , lambda_context )
353+ return extract_context_from_step_functions (dd_context , lambda_context )
354+
343355 return propagator .extract (dd_context )
344356 except Exception as e :
345357 logger .debug ("The trace extractor returned with error %s" , e )
@@ -450,26 +462,24 @@ def extract_context_from_step_functions(event, lambda_context):
450462 """
451463 try :
452464 event = event .get ("Payload" , event )
465+ event = event .get ("_datadog" , event )
453466
454467 meta = {}
455- dd_data = event .get ("_datadog" )
456468
457- if dd_data and dd_data .get ("serverless-version" ) == "v1" :
458- if "x-datadog-trace-id" in dd_data : # lambda root
459- trace_id = int (dd_data .get ("x-datadog-trace-id" ))
460- high_64_bit_trace_id = _parse_high_64_bits (
461- dd_data .get ("x-datadog-tags" )
462- )
469+ if event .get ("serverless-version" ) == "v1" :
470+ if "x-datadog-trace-id" in event : # lambda root
471+ trace_id = int (event .get ("x-datadog-trace-id" ))
472+ high_64_bit_trace_id = _parse_high_64_bits (event .get ("x-datadog-tags" ))
463473 if high_64_bit_trace_id :
464474 meta ["_dd.p.tid" ] = high_64_bit_trace_id
465475 else : # sfn root
466- root_execution_id = dd_data .get ("RootExecutionId" )
476+ root_execution_id = event .get ("RootExecutionId" )
467477 trace_id = _generate_sfn_trace_id (root_execution_id , LOWER_64_BITS )
468478 meta ["_dd.p.tid" ] = _generate_sfn_trace_id (
469479 root_execution_id , HIGHER_64_BITS
470480 )
471481
472- parent_id = _generate_sfn_parent_id (dd_data )
482+ parent_id = _generate_sfn_parent_id (event )
473483 else :
474484 execution_id = event .get ("Execution" ).get ("Id" )
475485 trace_id = _generate_sfn_trace_id (execution_id , LOWER_64_BITS )
@@ -1331,7 +1341,8 @@ def create_inferred_span_from_eventbridge_event(event, context):
13311341 span .start = dt .replace (tzinfo = timezone .utc ).timestamp ()
13321342
13331343 # Since inferred span will later parent Lambda, preserve Lambda's current parent
1334- span .parent_id = dd_trace_context .span_id
1344+ if dd_trace_context .span_id :
1345+ span .parent_id = dd_trace_context .span_id
13351346
13361347 return span
13371348
0 commit comments