Skip to content

Commit 8556eb5

Browse files
Don't send x-ray trace metadata for when x-ray has filtered trace (#193)
1 parent 2b4f95a commit 8556eb5

File tree

3 files changed

+49
-5
lines changed

3 files changed

+49
-5
lines changed

datadog_lambda/xray.py

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,11 +10,11 @@
1010
logger = logging.getLogger(__name__)
1111

1212

13-
def get_xray_host_port(adress):
14-
if adress == "":
13+
def get_xray_host_port(address):
14+
if address == "":
1515
logger.debug("X-Ray daemon env var not set, not sending sub-segment")
1616
return None
17-
parts = adress.split(":")
17+
parts = address.split(":")
1818
if len(parts) <= 1:
1919
logger.debug("X-Ray daemon env var not set, not sending sub-segment")
2020
return None
@@ -108,6 +108,11 @@ def send_segment(key, metadata):
108108
"Failed to create segment since it was not possible to get trace context from header"
109109
)
110110
return None
111+
112+
# Skip adding segment, if the xray trace is going to be sampled away.
113+
if context["sampled"] == "0":
114+
logger.debug("Skipping sending metadata, x-ray trace was sampled out")
115+
return None
111116
segment = build_segment(context, key, metadata)
112117
segment_payload = build_segment_payload(segment)
113118
send(host_port_tuple, segment_payload)

tests/Dockerfile

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,8 @@ RUN mkdir -p /test/datadog_lambda
77
WORKDIR /test
88

99
# Copy minimal subset of files to make pip install succeed and be cached (next docker builds will be way faster)
10-
COPY setup.py .
10+
COPY pyproject.toml .
11+
COPY poetry.lock .
1112
COPY README.md .
1213
COPY datadog_lambda/__init__.py datadog_lambda/__init__.py
1314

tests/test_xray.py

Lines changed: 39 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,25 @@
11
import unittest
22
import json
3+
import os
34

45
from unittest.mock import MagicMock, patch
56

6-
from datadog_lambda.xray import get_xray_host_port, build_segment_payload, build_segment
7+
from datadog_lambda.xray import (
8+
get_xray_host_port,
9+
build_segment_payload,
10+
build_segment,
11+
send_segment,
12+
)
713

814

915
class TestXRay(unittest.TestCase):
16+
def tearDown(self):
17+
if os.environ.get("_X_AMZN_TRACE_ID"):
18+
os.environ.pop("_X_AMZN_TRACE_ID")
19+
if os.environ.get("AWS_XRAY_DAEMON_ADDRESS"):
20+
os.environ.pop("AWS_XRAY_DAEMON_ADDRESS")
21+
return super().tearDown()
22+
1023
def test_get_xray_host_port_empty_(self):
1124
result = get_xray_host_port("")
1225
self.assertIsNone(result)
@@ -20,6 +33,31 @@ def test_get_xray_host_port_success(self):
2033
self.assertEqual("mySuperHost", result[0])
2134
self.assertEqual(1000, result[1])
2235

36+
def test_send_segment_sampled_out(self):
37+
os.environ["AWS_XRAY_DAEMON_ADDRESS"] = "fake-agent.com:8080"
38+
os.environ[
39+
"_X_AMZN_TRACE_ID"
40+
] = "Root=1-5e272390-8c398be037738dc042009320;Parent=94ae789b969f1cc5;Sampled=0"
41+
42+
with patch(
43+
"datadog_lambda.xray.send", MagicMock(return_value=None)
44+
) as mock_send:
45+
# XRay trace won't be sampled according to the trace header.
46+
send_segment("my_key", {"data": "value"})
47+
self.assertFalse(mock_send.called)
48+
49+
def test_send_segment_sampled(self):
50+
os.environ["AWS_XRAY_DAEMON_ADDRESS"] = "fake-agent.com:8080"
51+
os.environ[
52+
"_X_AMZN_TRACE_ID"
53+
] = "Root=1-5e272390-8c398be037738dc042009320;Parent=94ae789b969f1cc5;Sampled=1"
54+
with patch(
55+
"datadog_lambda.xray.send", MagicMock(return_value=None)
56+
) as mock_send:
57+
# X-Ray trace will be sampled according to the trace header.
58+
send_segment("my_key", {"data": "value"})
59+
self.assertTrue(mock_send.called)
60+
2361
def test_build_segment_payload_ok(self):
2462
exected_text = '{"format": "json", "version": 1}\nmyPayload'
2563
self.assertEqual(exected_text, build_segment_payload("myPayload"))

0 commit comments

Comments
 (0)