Skip to content

Commit 199783c

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 199783c

File tree

2 files changed

+42
-2
lines changed

2 files changed

+42
-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: 36 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,38 @@ 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_daemon_envvar = "localhost:1234"
586+
xray_trace_envvar = (
587+
"Root=1-5e272390-8c398be037738dc042009320;Parent=94ae789b969f1cc5;Sampled=1;Lineage=c6c5b1b9:0"
588+
)
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+
wrapper.dd_tracing_enabled = True
596+
597+
def handler(event, context):
598+
return tracer.current_trace_context()
599+
600+
wrapped_handler = wrapper.datadog_lambda_wrapper(handler)
601+
602+
trace_id = "2a4abb4251b6ec1d"
603+
event = {
604+
"headers": {
605+
"traceparent": f"00-0000000000000000{trace_id}-74d86a8e4b55daf4-01",
606+
"tracestate": "dd=s:1;t.dm:-1",
607+
},
608+
}
609+
context = get_mock_context()
610+
611+
result = wrapped_handler(event, context)
612+
aws_lambda_span = wrapped_handler.span
613+
614+
self.assertIsNotNone(result)
615+
self.assertEqual(result.trace_id, int(trace_id, 16))
616+
self.assertEqual(result.span_id, aws_lambda_span.span_id)
617+
self.assertEqual(result.sampling_priority, 1)

0 commit comments

Comments
 (0)