|
8 | 8 | from mock import MagicMock, patch, call
|
9 | 9 |
|
10 | 10 | from ddtrace.helpers import get_correlation_ids
|
| 11 | +from ddtrace.context import Context |
11 | 12 |
|
12 | 13 | from datadog_lambda.constants import SamplingPriority, TraceHeader, XraySubsegment
|
13 | 14 | from datadog_lambda.tracing import (
|
|
16 | 17 | create_function_execution_span,
|
17 | 18 | get_dd_trace_context,
|
18 | 19 | set_correlation_ids,
|
| 20 | + set_dd_trace_py_root, |
19 | 21 | _convert_xray_trace_id,
|
20 | 22 | _convert_xray_entity_id,
|
21 | 23 | _convert_xray_sampling,
|
@@ -493,3 +495,53 @@ def test_function_with_trigger_tags(self):
|
493 | 495 | self.assertEqual(
|
494 | 496 | span.get_tag("function_trigger.event_source"), "cloudwatch-logs"
|
495 | 497 | )
|
| 498 | + |
| 499 | + |
| 500 | +class TestSetTraceRootSpan(unittest.TestCase): |
| 501 | + def setUp(self): |
| 502 | + global dd_tracing_enabled |
| 503 | + dd_tracing_enabled = False |
| 504 | + os.environ["_X_AMZN_TRACE_ID"] = fake_xray_header_value |
| 505 | + patcher = patch("datadog_lambda.tracing.send_segment") |
| 506 | + self.mock_send_segment = patcher.start() |
| 507 | + self.addCleanup(patcher.stop) |
| 508 | + patcher = patch("datadog_lambda.tracing.is_lambda_context") |
| 509 | + self.mock_is_lambda_context = patcher.start() |
| 510 | + self.mock_is_lambda_context.return_value = True |
| 511 | + self.addCleanup(patcher.stop) |
| 512 | + patcher = patch("ddtrace.tracer.context_provider.activate") |
| 513 | + self.mock_activate = patcher.start() |
| 514 | + self.mock_activate.return_value = True |
| 515 | + self.addCleanup(patcher.stop) |
| 516 | + |
| 517 | + def tearDown(self): |
| 518 | + global dd_tracing_enabled |
| 519 | + dd_tracing_enabled = False |
| 520 | + del os.environ["_X_AMZN_TRACE_ID"] |
| 521 | + |
| 522 | + def test_mixed_parent_context_when_merging(self): |
| 523 | + # When trace merging is enabled, and dd_trace headers are present, |
| 524 | + # use the dd-trace trace-id and the x-ray parent-id |
| 525 | + # This allows parenting relationships like dd-trace -> x-ray -> dd-trace |
| 526 | + lambda_ctx = get_mock_context() |
| 527 | + ctx, source = extract_dd_trace_context( |
| 528 | + { |
| 529 | + "headers": { |
| 530 | + TraceHeader.TRACE_ID: "123", |
| 531 | + TraceHeader.PARENT_ID: "321", |
| 532 | + TraceHeader.SAMPLING_PRIORITY: "1", |
| 533 | + } |
| 534 | + }, |
| 535 | + lambda_ctx, |
| 536 | + ) |
| 537 | + set_dd_trace_py_root( |
| 538 | + source, True |
| 539 | + ) # When merging is off, always use dd-trace-context |
| 540 | + |
| 541 | + expected_context = Context( |
| 542 | + trace_id=123, # Trace Id from incomming context |
| 543 | + span_id=int(fake_xray_header_value_parent_decimal), # Parent Id from x-ray |
| 544 | + sampling_priority=1, # Sampling priority from incomming context |
| 545 | + ) |
| 546 | + self.mock_activate.assert_called() |
| 547 | + self.mock_activate.assert_has_calls([call(expected_context)]) |
0 commit comments