|
9 | 9 | import datadog_lambda.wrapper as wrapper
|
10 | 10 | from datadog_lambda.metric import lambda_metric
|
11 | 11 | from datadog_lambda.thread_stats_writer import ThreadStatsWriter
|
12 |
| -from ddtrace import Span |
| 12 | +from ddtrace import Span, tracer |
13 | 13 |
|
14 | 14 |
|
15 | 15 | def get_mock_context(
|
@@ -580,3 +580,70 @@ def test_some_envs_should_depend_on_dd_tracing_enabled(self):
|
580 | 580 | self.assertFalse(decorator.make_inferred_span)
|
581 | 581 | self.assertFalse(decorator.encode_authorizer_context)
|
582 | 582 | 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