Skip to content

Commit 515903a

Browse files
committed
chore(di): add process_tags
1 parent 7cf4143 commit 515903a

File tree

2 files changed

+71
-0
lines changed

2 files changed

+71
-0
lines changed

ddtrace/debugging/_encoding.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
from ddtrace.debugging._signal.log import LogSignal
2121
from ddtrace.debugging._signal.snapshot import Snapshot
2222
from ddtrace.internal import forksafe
23+
from ddtrace.internal import process_tags
2324
from ddtrace.internal._encoding import BufferFull
2425
from ddtrace.internal.logger import get_logger
2526
from ddtrace.internal.utils.formats import format_trace_id
@@ -113,6 +114,9 @@ def _build_log_track_payload(
113114
"timestamp": int(signal.timestamp * 1e3), # milliseconds,
114115
}
115116

117+
if p_tags := process_tags.process_tags:
118+
payload["process_tags"] = p_tags
119+
116120
# Add the correlation IDs if available
117121
if context is not None and context.trace_id is not None:
118122
payload["dd"] = {

tests/debugging/test_encoding.py

Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -250,6 +250,73 @@ def test_batch_json_encoder():
250250
assert queue.count == 0
251251

252252

253+
def test_process_tags_are_not_included_by_default():
254+
s = Snapshot(
255+
probe=create_snapshot_line_probe(probe_id="batch-test", source_file="foo.py", line=42),
256+
frame=inspect.currentframe(),
257+
thread=threading.current_thread(),
258+
)
259+
buffer_size = 30 * (1 << 20)
260+
queue = SignalQueue(encoder=LogSignalJsonEncoder(None), buffer_size=buffer_size)
261+
262+
s.line({})
263+
264+
queue = SignalQueue(encoder=LogSignalJsonEncoder("test-service"))
265+
queue.put(s)
266+
data = queue.flush()
267+
assert data is not None
268+
payload, _ = data
269+
decoded = json.loads(payload.decode())
270+
assert "process_tags" not in decoded[0]
271+
272+
273+
def test_process_tags_are_included():
274+
from unittest.mock import patch
275+
276+
from ddtrace.internal.process_tags import _process_tag_reload
277+
from ddtrace.internal.process_tags.constants import ENTRYPOINT_BASEDIR_TAG
278+
from ddtrace.internal.process_tags.constants import ENTRYPOINT_NAME_TAG
279+
from ddtrace.internal.process_tags.constants import ENTRYPOINT_TYPE_SCRIPT
280+
from ddtrace.internal.process_tags.constants import ENTRYPOINT_TYPE_TAG
281+
from ddtrace.internal.process_tags.constants import ENTRYPOINT_WORKDIR_TAG
282+
from ddtrace.settings._config import config
283+
284+
try:
285+
with patch("sys.argv", ["/path/to/test_script.py"]), patch("os.getcwd", return_value="/path/to/workdir"):
286+
config._process_tags_enabled = True
287+
_process_tag_reload()
288+
s = Snapshot(
289+
probe=create_snapshot_line_probe(probe_id="batch-test", source_file="foo.py", line=42),
290+
frame=inspect.currentframe(),
291+
thread=threading.current_thread(),
292+
)
293+
buffer_size = 30 * (1 << 20)
294+
queue = SignalQueue(encoder=LogSignalJsonEncoder(None), buffer_size=buffer_size)
295+
296+
s.line({})
297+
298+
queue = SignalQueue(encoder=LogSignalJsonEncoder("test-service"))
299+
queue.put(s)
300+
data = queue.flush()
301+
assert data is not None
302+
payload, _ = data
303+
decoded = json.loads(payload.decode())
304+
305+
assert "process_tags" in decoded[0]
306+
307+
expected_raw = (
308+
f"{ENTRYPOINT_BASEDIR_TAG}:to,"
309+
f"{ENTRYPOINT_NAME_TAG}:test_script,"
310+
f"{ENTRYPOINT_TYPE_TAG}:{ENTRYPOINT_TYPE_SCRIPT},"
311+
f"{ENTRYPOINT_WORKDIR_TAG}:workdir"
312+
)
313+
314+
assert decoded[0]["process_tags"] == expected_raw
315+
finally:
316+
config._process_tags_enabled = False
317+
_process_tag_reload()
318+
319+
253320
def test_batch_flush_reencode():
254321
s = Snapshot(
255322
probe=create_snapshot_line_probe(probe_id="batch-test", source_file="foo.py", line=42),

0 commit comments

Comments
 (0)