Skip to content

Commit 28dd2b1

Browse files
authored
fix(ci-visibility): add dd_origin propagation to CIVisibilityEncoder (#5541)
This PR builds on #5489 by adding dd_origin propagation to the CIVisibilityEncoder, which is necessary for CI Visibility. This is not a new feature as this functionality is already present in the regular encoder. This doesn't need a changelog since this is internal and is a fix to an unreleased change.
1 parent c4ee0db commit 28dd2b1

File tree

2 files changed

+19
-5
lines changed

2 files changed

+19
-5
lines changed

ddtrace/internal/ci_visibility/encoder.py

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -22,13 +22,14 @@ def __init__(self, *args):
2222
super(CIVisibilityEncoderV01, self).__init__()
2323
self._lock = threading.RLock()
2424
self._init_buffer()
25+
self._metadata = {}
2526

2627
def __len__(self):
2728
with self._lock:
2829
return len(self.buffer)
2930

3031
def set_metadata(self, metadata):
31-
self._metadata = metadata or dict()
32+
self._metadata.update(metadata)
3233

3334
def _init_buffer(self):
3435
with self._lock:
@@ -48,21 +49,25 @@ def encode(self):
4849
return payload
4950

5051
def _build_payload(self, traces):
51-
normalized_spans = [CIVisibilityEncoderV01._convert_span(span) for trace in traces for span in trace]
52+
normalized_spans = [
53+
CIVisibilityEncoderV01._convert_span(span, trace[0].context.dd_origin) for trace in traces for span in trace
54+
]
5255
self._metadata = {k: v for k, v in self._metadata.items() if k in self.ALLOWED_METADATA_KEYS}
5356
# TODO: Split the events in several payloads as needed to avoid hitting the intake's maximum payload size.
5457
return msgpack_packb(
5558
{"version": self.PAYLOAD_FORMAT_VERSION, "metadata": {"*": self._metadata}, "events": normalized_spans}
5659
)
5760

5861
@staticmethod
59-
def _convert_span(span):
60-
# type: (Span) -> Dict[str, Any]
62+
def _convert_span(span, dd_origin):
63+
# type: (Span, str) -> Dict[str, Any]
6164
sp = JSONEncoderV2._convert_span(span)
6265
sp["type"] = span.span_type
6366
sp["duration"] = span.duration_ns
6467
sp["meta"] = dict(sorted(span._meta.items()))
6568
sp["metrics"] = dict(sorted(span._metrics.items()))
69+
if dd_origin is not None:
70+
sp["meta"].update({"_dd.origin": dd_origin})
6671
if span.span_type == "test":
6772
event_type = "test"
6873
else:

tests/contrib/pytest/test_pytest.py

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
from ddtrace.ext import ci
1313
from ddtrace.ext import test
1414
from ddtrace.internal.ci_visibility import CIVisibility
15+
from ddtrace.internal.ci_visibility.encoder import CIVisibilityEncoderV01
1516
from tests.utils import DummyCIVisibilityWriter
1617
from tests.utils import TracerTestCase
1718
from tests.utils import override_env
@@ -547,7 +548,6 @@ def test_service(ddtracer):
547548
file_name = os.path.basename(py_file.strpath)
548549
rec = self.inline_run("--ddtrace", file_name)
549550
rec.assertoutcome(passed=1)
550-
551551
spans = self.pop_spans()
552552
# Check if spans tagged with dd_origin after encoding and decoding as the tagging occurs at encode time
553553
encoder = self.tracer.encoder
@@ -558,6 +558,15 @@ def test_service(ddtracer):
558558
for span in decoded_trace:
559559
assert span[b"meta"][b"_dd.origin"] == b"ciapp-test"
560560

561+
ci_agentless_encoder = CIVisibilityEncoderV01(0, 0)
562+
ci_agentless_encoder.put(spans)
563+
trace = ci_agentless_encoder.encode()
564+
decoded_trace = self.tracer.encoder._decode(trace)
565+
assert len(decoded_trace[b"events"]) == 4
566+
for event in decoded_trace[b"events"]:
567+
assert event[b"content"][b"meta"][b"_dd.origin"] == b"ciapp-test"
568+
pass
569+
561570
def test_pytest_doctest_module(self):
562571
"""Test that pytest with doctest works as expected."""
563572
py_file = self.testdir.makepyfile(

0 commit comments

Comments
 (0)