@@ -380,8 +380,8 @@ def _parse_high_64_bits(trace_tags: str) -> str:
380380 return ""
381381
382382
383- def _sfn_context_to_parent_id ( context : dict ) -> int :
384- # todo: testme
383+ # todo: testme
384+ def _generate_sfn_parent_id ( context : dict ) -> int :
385385 execution_id = context .get ("Execution" ).get ("Id" )
386386 state_name = context .get ("State" ).get ("Name" )
387387 state_entered_time = context .get ("State" ).get ("EnteredTime" )
@@ -391,6 +391,18 @@ def _sfn_context_to_parent_id(context: dict) -> int:
391391 )
392392
393393
394+ # take the higher 64 bits as _dd.p.tid tag and use hex to encode
395+ # [2:] to remove '0x' in the hex str
396+ # todo testme
397+ # returning 128 bits since 128bit traceId will be break up into
398+ # traditional traceId and _dd.p.tid tag
399+ # https://github.com/DataDog/dd-trace-py/blob/3e34d21cb9b5e1916e549047158cb119317b96ab/ddtrace/propagation/http.py#L232-L240
400+ def _generate_sfn_trace_id (pre_hash : str , part : str ):
401+ if part == HIGHER_64_BITS :
402+ return hex (_deterministic_sha256_hash (pre_hash , part ))[2 :]
403+ return _deterministic_sha256_hash (pre_hash , part )
404+
405+
394406def extract_context_from_step_functions (event , lambda_context ):
395407 """
396408 Only extract datadog trace context when Step Functions Context Object is injected
@@ -410,29 +422,18 @@ def extract_context_from_step_functions(event, lambda_context):
410422 if high_64_bit_trace_id :
411423 meta ["_dd.p.tid" ] = high_64_bit_trace_id
412424 else : # sfn root
413- trace_id = _deterministic_sha256_hash (
414- dd_data .get ("RootExecutionId" ), LOWER_64_BITS
425+ root_execution_id = dd_data .get ("RootExecutionId" )
426+ trace_id = _generate_sfn_trace_id (root_execution_id , LOWER_64_BITS )
427+ meta ["_dd.p.tid" ] = _generate_sfn_trace_id (
428+ root_execution_id , HIGHER_64_BITS
415429 )
416- meta ["_dd.p.tid" ] = hex (
417- _deterministic_sha256_hash (
418- dd_data .get ("RootExecutionId" ), HIGHER_64_BITS
419- )
420- )[2 :]
421430
422- parent_id = _sfn_context_to_parent_id (dd_data )
431+ parent_id = _generate_sfn_parent_id (dd_data )
423432 else :
424433 execution_id = event .get ("Execution" ).get ("Id" )
425- # returning 128 bits since 128bit traceId will be break up into
426- # traditional traceId and _dd.p.tid tag
427- # https://github.com/DataDog/dd-trace-py/blob/3e34d21cb9b5e1916e549047158cb119317b96ab/ddtrace/propagation/http.py#L232-L240
428- trace_id = _deterministic_sha256_hash (execution_id , LOWER_64_BITS )
429- # take the higher 64 bits as _dd.p.tid tag and use hex to encode
430- # [2:] to remove '0x' in the hex str
431- meta ["_dd.p.tid" ] = hex (
432- _deterministic_sha256_hash (execution_id , HIGHER_64_BITS )
433- )[2 :]
434-
435- parent_id = _sfn_context_to_parent_id (event )
434+ trace_id = _generate_sfn_trace_id (execution_id , LOWER_64_BITS )
435+ meta ["_dd.p.tid" ] = _generate_sfn_trace_id (execution_id , HIGHER_64_BITS )
436+ parent_id = _generate_sfn_parent_id (event )
436437
437438 sampling_priority = SamplingPriority .AUTO_KEEP
438439 return Context (
@@ -454,8 +455,9 @@ def is_legacy_lambda_step_function(event):
454455 return False
455456
456457 event = event .get ("Payload" )
457- return "_datadog" in event or (
458- "Execution" in event and "StateMachine" in event and "State" in event
458+ return isinstance (event , dict ) and (
459+ "_datadog" in event
460+ or ("Execution" in event and "StateMachine" in event and "State" in event )
459461 )
460462
461463
0 commit comments