Skip to content

Commit dc18646

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

File tree

2 files changed

+65
-2
lines changed

2 files changed

+65
-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': dd_context.trace_id,
286+
'parent-id': dd_context.span_id,
287+
'sampling-priority': dd_context.sampling_priority,
288+
},
289+
XraySubsegment.TRACE_KEY,
285290
)
286291

287292
if dd_tracing_enabled:

tests/test_wrapper.py

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

0 commit comments

Comments
 (0)