Skip to content

Commit c3681de

Browse files
committed
updated to use trace/parent hash from _datadog
1 parent aad3cd8 commit c3681de

File tree

3 files changed

+59
-65
lines changed

3 files changed

+59
-65
lines changed

datadog_lambda/tracing.py

Lines changed: 27 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -358,8 +358,10 @@ def extract_context_from_kinesis_event(event, lambda_context):
358358

359359

360360
def _deterministic_sha256_hash(s: str, part: str) -> (int, int):
361-
sha256_hash = hashlib.sha256(s.encode()).hexdigest()
361+
return _sha256_to_binary_part(hashlib.sha256(s.encode()).hexdigest(), part)
362362

363+
364+
def _sha256_to_binary_part(sha256_hash: str, part: str) -> (int, int):
363365
# First two chars is '0b'. zfill to ensure 256 bits, but we only care about the first 128 bits
364366
binary_hash = bin(int(sha256_hash, 16))[2:].zfill(256)
365367
if part == HIGHER_64_BITS:
@@ -378,32 +380,33 @@ def extract_context_from_step_functions(event, lambda_context):
378380
into lambda's event dict.
379381
"""
380382
try:
381-
execution_id = event.get("Execution").get("Id")
382-
state_name = event.get("State").get("Name")
383-
state_entered_time = event.get("State").get("EnteredTime")
384383
meta = {}
385384

386-
trace_id = None
387385
if "_datadog" in event:
388-
trace_header = event.get("_datadog")
389-
explicit_context = propagator.extract(trace_header)
390-
if _is_context_complete(explicit_context):
391-
tags = trace_header.get(TraceHeader.TAGS, "")
392-
for tag in tags.split(","):
393-
tag_key, tag_val = tag.split("=")
394-
meta[tag_key] = tag_val
395-
explicit_context.span_id = _deterministic_sha256_hash(
396-
f"{execution_id}#{state_name}#{state_entered_time}", HIGHER_64_BITS
386+
dd_data = event.get("_datadog")
387+
parent_id = _sha256_to_binary_part(
388+
dd_data.get("x-datadog-parent-id-hash"), HIGHER_64_BITS
389+
)
390+
if "x-datadog-trace-id" in dd_data: # lambda root
391+
dd_data["x-datadog-parent-id"] = str(parent_id)
392+
explicit_context = propagator.extract(dd_data)
393+
if _is_context_complete(explicit_context):
394+
return explicit_context
395+
else:
396+
return None
397+
else: # sfn root
398+
trace_id = _sha256_to_binary_part(
399+
dd_data.get("x-datadog-trace-id-hash"), LOWER_64_BITS
397400
)
398-
return explicit_context
399-
if "x-datadog-execution-arn" in trace_header:
400-
root_execution_id = trace_header.get("x-datadog-root-execution-arn")
401-
trace_id = _deterministic_sha256_hash(root_execution_id, LOWER_64_BITS)
402401
meta["_dd.p.tid"] = hex(
403-
_deterministic_sha256_hash(root_execution_id, HIGHER_64_BITS)
402+
_sha256_to_binary_part(
403+
dd_data.get("x-datadog-trace-id-hash"), HIGHER_64_BITS
404+
)
404405
)[2:]
405-
406-
if not trace_id:
406+
else:
407+
execution_id = event.get("Execution").get("Id")
408+
state_name = event.get("State").get("Name")
409+
state_entered_time = event.get("State").get("EnteredTime")
407410
# returning 128 bits since 128bit traceId will be break up into
408411
# traditional traceId and _dd.p.tid tag
409412
# https://github.com/DataDog/dd-trace-py/blob/3e34d21cb9b5e1916e549047158cb119317b96ab/ddtrace/propagation/http.py#L232-L240
@@ -414,9 +417,9 @@ def extract_context_from_step_functions(event, lambda_context):
414417
_deterministic_sha256_hash(execution_id, HIGHER_64_BITS)
415418
)[2:]
416419

417-
parent_id = _deterministic_sha256_hash(
418-
f"{execution_id}#{state_name}#{state_entered_time}", HIGHER_64_BITS
419-
)
420+
parent_id = _deterministic_sha256_hash(
421+
f"{execution_id}#{state_name}#{state_entered_time}", HIGHER_64_BITS
422+
)
420423

421424
sampling_priority = SamplingPriority.AUTO_KEEP
422425
return Context(

datadog_lambda/trigger.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -146,7 +146,9 @@ def parse_event_source(event: dict) -> _EventSource:
146146
if event.get("source") == "aws.events" or has_event_categories:
147147
event_source = _EventSource(EventTypes.CLOUDWATCH_EVENTS)
148148

149-
if "Execution" in event and "StateMachine" in event and "State" in event:
149+
if (
150+
"_datadog" in event and event.get("_datadog").get("serverless-version") == "v2"
151+
) or ("Execution" in event and "StateMachine" in event and "State" in event):
150152
event_source = _EventSource(EventTypes.STEPFUNCTIONS)
151153

152154
event_record = get_first_record(event)

tests/test_tracing.py

Lines changed: 29 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -617,7 +617,7 @@ def test_with_complete_datadog_trace_headers_with_trigger_tags(self):
617617
@with_trace_propagation_style("datadog")
618618
def test_step_function_trace_data(self):
619619
lambda_ctx = get_mock_context()
620-
sf_event = {
620+
sfn_event = {
621621
"Execution": {
622622
"Id": "665c417c-1237-4742-aaca-8b3becbb9e75",
623623
},
@@ -627,7 +627,7 @@ def test_step_function_trace_data(self):
627627
"EnteredTime": "Mon Nov 13 12:43:33 PST 2023",
628628
},
629629
}
630-
ctx, source, event_source = extract_dd_trace_context(sf_event, lambda_ctx)
630+
ctx, source, event_source = extract_dd_trace_context(sfn_event, lambda_ctx)
631631
self.assertEqual(source, "event")
632632
expected_context = Context(
633633
trace_id=3675572987363469717,
@@ -652,40 +652,35 @@ def test_step_function_trace_data(self):
652652
)
653653

654654
@with_trace_propagation_style("datadog")
655-
def test_step_function_trace_data_with_trace_header(self):
655+
def test_step_function_trace_data_lambda_root(self):
656656
lambda_ctx = get_mock_context()
657-
sf_event = {
658-
"Execution": {
659-
"Id": "665c417c-1237-4742-aaca-8b3becbb9e75",
660-
},
661-
"StateMachine": {},
662-
"State": {
663-
"Name": "my-awesome-state",
664-
"EnteredTime": "Mon Nov 13 12:43:33 PST 2023",
665-
},
657+
sfn_event = {
666658
"_datadog": {
667-
"x-datadog-trace-id": "11742251842529032210",
668-
"x-datadog-parent-id": "13977111940858727778",
659+
"x-datadog-trace-id": "5821803790426892636",
669660
"x-datadog-sampling-priority": "1",
670-
"x-datadog-tags": "_dd.p.dm=-0,_dd.p.tid=6728f8ec00000000",
671-
},
661+
"x-datadog-tags": "_dd.p.dm=-0,_dd.p.tid=672a7cb100000000",
662+
"traceparent": "00-672a7cb10000000050cb33b3c06ae95c-5fda9d8d1d1373f9-01",
663+
"tracestate": "dd=p:5fda9d8d1d1373f9;s:1;t.dm:-0;t.tid:672a7cb100000000",
664+
"x-datadog-parent-id-hash": "a926584eba705d6ec904c54db2ecc4d4a2c91e7dabe7ce87ac26edb43388fbc5",
665+
"serverless-version": "v2",
666+
}
672667
}
673-
ctx, source, event_source = extract_dd_trace_context(sf_event, lambda_ctx)
668+
ctx, source, event_source = extract_dd_trace_context(sfn_event, lambda_ctx)
674669
self.assertEqual(source, "event")
675670
expected_context = Context(
676-
trace_id=137123224175615787006624409899264538642,
677-
span_id=6880978411788117524,
671+
trace_id=137131089076080415507232535361568303452,
672+
span_id=2965154499828669806,
678673
sampling_priority=1,
679-
meta={"_dd.p.dm": "-0", "_dd.p.tid": "6728f8ec00000000"},
674+
meta={"_dd.p.dm": "-0", "_dd.p.tid": "672a7cb100000000"},
680675
)
681676
self.assertEqual(ctx, expected_context)
682677
self.assertEqual(
683678
get_dd_trace_context(),
684679
{
685-
TraceHeader.TRACE_ID: "11742251842529032210",
680+
TraceHeader.TRACE_ID: "5821803790426892636",
686681
TraceHeader.PARENT_ID: "10713633173203262661",
687682
TraceHeader.SAMPLING_PRIORITY: "1",
688-
TraceHeader.TAGS: "_dd.p.dm=-0,_dd.p.tid=6728f8ec00000000",
683+
TraceHeader.TAGS: "_dd.p.dm=-0,_dd.p.tid=672a7cb100000000",
689684
},
690685
)
691686
create_dd_dummy_metadata_subsegment(ctx, XraySubsegment.TRACE_KEY)
@@ -695,37 +690,31 @@ def test_step_function_trace_data_with_trace_header(self):
695690
)
696691

697692
@with_trace_propagation_style("datadog")
698-
def test_step_function_trace_data_with_arn_header(self):
693+
def test_step_function_trace_data_sfn_root(self):
699694
lambda_ctx = get_mock_context()
700-
sf_event = {
701-
"Execution": {
702-
"Id": "665c417c-1237-4742-aaca-8b3becbb9e75",
703-
},
704-
"StateMachine": {},
705-
"State": {
706-
"Name": "my-awesome-state",
707-
"EnteredTime": "Mon Nov 13 12:43:33 PST 2023",
708-
},
695+
sfn_event = {
709696
"_datadog": {
710-
"x-datadog-root-execution-arn": "ca7383bc-e370-4a85-a266-a4686bd7d00f"
711-
},
697+
"x-datadog-trace-id-hash": "fed93f8c162880cb9aa90fcd1f8395383835841d5470d30215f3dd52906ebc58",
698+
"x-datadog-parent-id-hash": "c5eb94cc9220ab5783e1db53debd54b8c93f6f2a3eae1c680d7b849f2d34e551",
699+
"serverless-version": "v2"
700+
}
712701
}
713-
ctx, source, event_source = extract_dd_trace_context(sf_event, lambda_ctx)
702+
ctx, source, event_source = extract_dd_trace_context(sfn_event, lambda_ctx)
714703
self.assertEqual(source, "event")
715704
expected_context = Context(
716-
trace_id=3675572987363469717,
717-
span_id=6880978411788117524,
705+
trace_id=1921084089721656632,
706+
span_id=5038284214489885527,
718707
sampling_priority=1,
719-
meta={"_dd.p.tid": "e987c84b36b11ab"},
708+
meta={"_dd.p.tid": "7ed93f8c162880cb"},
720709
)
721710
self.assertEqual(ctx, expected_context)
722711
self.assertEqual(
723712
get_dd_trace_context(),
724713
{
725-
TraceHeader.TRACE_ID: "3675572987363469717",
714+
TraceHeader.TRACE_ID: "1921084089721656632",
726715
TraceHeader.PARENT_ID: "10713633173203262661",
727716
TraceHeader.SAMPLING_PRIORITY: "1",
728-
TraceHeader.TAGS: "_dd.p.tid=e987c84b36b11ab",
717+
TraceHeader.TAGS: "_dd.p.tid=7ed93f8c162880cb",
729718
},
730719
)
731720
create_dd_dummy_metadata_subsegment(ctx, XraySubsegment.TRACE_KEY)

0 commit comments

Comments
 (0)