Skip to content

Commit e8896d1

Browse files
authored
Ensure dummy metadata segment is json serializable. (#403)
Fixes error `TypeError: Object of type Context is not JSON serializable` #402
1 parent 122e616 commit e8896d1

File tree

2 files changed

+74
-2
lines changed

2 files changed

+74
-2
lines changed

datadog_lambda/wrapper.py

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -281,7 +281,12 @@ def _before(self, event, context):
281281
# Create a Datadog X-Ray subsegment with the trace context
282282
if dd_context and trace_context_source == TraceContextSource.EVENT:
283283
create_dd_dummy_metadata_subsegment(
284-
dd_context, XraySubsegment.TRACE_KEY
284+
{
285+
"trace-id": str(dd_context.trace_id),
286+
"parent-id": str(dd_context.span_id),
287+
"sampling-priority": str(dd_context.sampling_priority),
288+
},
289+
XraySubsegment.TRACE_KEY,
285290
)
286291

287292
if dd_tracing_enabled:

tests/test_wrapper.py

Lines changed: 68 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
import datadog_lambda.wrapper as wrapper
1010
from datadog_lambda.metric import lambda_metric
1111
from datadog_lambda.thread_stats_writer import ThreadStatsWriter
12-
from ddtrace import Span
12+
from ddtrace import Span, tracer
1313

1414

1515
def get_mock_context(
@@ -580,3 +580,70 @@ def test_some_envs_should_depend_on_dd_tracing_enabled(self):
580580
self.assertFalse(decorator.make_inferred_span)
581581
self.assertFalse(decorator.encode_authorizer_context)
582582
self.assertFalse(decorator.decode_authorizer_context)
583+
584+
585+
class TestLambdaWrapperWithTraceContext(unittest.TestCase):
586+
xray_root = "1-5e272390-8c398be037738dc042009320"
587+
xray_parent = "94ae789b969f1cc5"
588+
xray_daemon_envvar = "localhost:1234"
589+
xray_trace_envvar = (
590+
f"Root={xray_root};Parent={xray_parent};Sampled=1;Lineage=c6c5b1b9:0"
591+
)
592+
593+
@patch(
594+
"os.environ",
595+
{
596+
"AWS_XRAY_DAEMON_ADDRESS": xray_daemon_envvar,
597+
"_X_AMZN_TRACE_ID": xray_trace_envvar,
598+
},
599+
)
600+
def test_event_bridge_sqs_payload(self):
601+
patcher = patch("datadog_lambda.xray.send")
602+
mock_send = patcher.start()
603+
self.addCleanup(patcher.stop)
604+
605+
def handler(event, context):
606+
return tracer.current_trace_context()
607+
608+
wrapper.dd_tracing_enabled = True
609+
wrapped_handler = wrapper.datadog_lambda_wrapper(handler)
610+
611+
event_trace_id = 3047453991382739997
612+
event_parent_id = 3047453991382739997
613+
event = {
614+
"headers": {
615+
"traceparent": (
616+
f"00-0000000000000000{hex(event_trace_id)[2:]}-{hex(event_parent_id)[2:]}-01"
617+
),
618+
"tracestate": "dd=s:1;t.dm:-1",
619+
"x-datadog-trace-id": str(event_trace_id),
620+
"x-datadog-parent-id": str(event_parent_id),
621+
"x-datadog-sampling-priority": "1",
622+
},
623+
}
624+
context = get_mock_context()
625+
626+
result = wrapped_handler(event, context)
627+
aws_lambda_span = wrapped_handler.span
628+
629+
self.assertIsNotNone(result)
630+
self.assertEqual(result.trace_id, event_trace_id)
631+
self.assertEqual(result.span_id, aws_lambda_span.span_id)
632+
self.assertEqual(result.sampling_priority, 1)
633+
mock_send.assert_called_once()
634+
(_, raw_payload), _ = mock_send.call_args
635+
payload = json.loads(raw_payload[33:]) # strip formatting prefix
636+
self.assertEqual(self.xray_root, payload["trace_id"])
637+
self.assertEqual(self.xray_parent, payload["parent_id"])
638+
self.assertDictEqual(
639+
{
640+
"datadog": {
641+
"trace": {
642+
"trace-id": str(event_trace_id),
643+
"parent-id": str(event_parent_id),
644+
"sampling-priority": "1",
645+
},
646+
},
647+
},
648+
payload["metadata"],
649+
)

0 commit comments

Comments
 (0)