Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
36 commits
Select commit Hold shift + click to select a range
d76a11d
chore(internal): add process_tags to first span of each payload
dubloom Nov 4, 2025
a3643d8
tests(process_tags): add tests
dubloom Nov 5, 2025
a52e8cc
lint
dubloom Nov 5, 2025
f943f2a
fix: suitespec
dubloom Nov 5, 2025
660bd64
fix: telemetry test
dubloom Nov 5, 2025
ace7fae
Merge branch 'main' into dubloom/process-tags-collection
dubloom Nov 5, 2025
78dd521
fix telemetry 2
dubloom Nov 5, 2025
dd58490
simplify process_tags (brett review)
dubloom Nov 6, 2025
f47539e
Merge branch 'main' into dubloom/process-tags-collection
dubloom Nov 6, 2025
184ef53
update python version
dubloom Nov 6, 2025
be2973e
put tests within internal suite
dubloom Nov 6, 2025
c6b4d7f
remove sys hack
dubloom Nov 6, 2025
c6cb1be
make tests compatible with CI
dubloom Nov 7, 2025
974b474
Merge branch 'main' into dubloom/process-tags-collection
dubloom Nov 7, 2025
7416466
lint
dubloom Nov 7, 2025
0428dcd
brett review
dubloom Nov 10, 2025
b66d6a4
Merge branch 'main' into dubloom/process-tags-collection
dubloom Nov 10, 2025
71b5ed7
Merge branch 'main' into dubloom/process-tags-collection
dubloom Nov 12, 2025
a123350
Merge branch 'main' into dubloom/process-tags-collection
dubloom Nov 12, 2025
32ddf35
improve tag normalization
dubloom Nov 14, 2025
ee77b0e
Merge branch 'main' into dubloom/process-tags-collection
dubloom Nov 14, 2025
f5c3eee
Merge branch 'main' into dubloom/process-tags-collection
dubloom Nov 17, 2025
7cf4143
gab review
dubloom Nov 17, 2025
ae20207
improving normalization
dubloom Nov 18, 2025
f70b7ed
Merge branch 'main' into dubloom/process-tags-collection
dubloom Nov 18, 2025
efe28fa
remove print
dubloom Nov 18, 2025
e33db20
chore(rc): add process tags
dubloom Nov 7, 2025
8c6a18a
add tests
dubloom Nov 17, 2025
f957552
Update tests/internal/test_process_tags.py
dubloom Nov 18, 2025
86f04db
Merge branch 'main' into dubloom/process-tags-collection
dubloom Nov 19, 2025
914d52a
add a test that activates the feature with env variable
dubloom Nov 19, 2025
609b353
Merge branch 'dubloom/process-tags-collection' into dubloom/process-t…
dubloom Nov 19, 2025
d1f3d33
tests fix attempt
dubloom Nov 19, 2025
34d86f5
change patch to patch.object
dubloom Nov 19, 2025
8e92add
Merge branch 'main' into dubloom/process-tags-remote-config
dubloom Nov 20, 2025
43d8697
lint
dubloom Nov 20, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
16 changes: 10 additions & 6 deletions ddtrace/internal/process_tags/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,9 @@
from pathlib import Path
import re
import sys
from typing import List
from typing import Optional
from typing import Tuple

from ddtrace.internal.logger import get_logger
from ddtrace.internal.settings.process_tags import process_tags_config as config
Expand Down Expand Up @@ -44,12 +46,12 @@ def is_allowed_char(char: str) -> str:
return result.strip("_")


def generate_process_tags() -> Optional[str]:
def generate_process_tags() -> Tuple[Optional[str], Optional[List[str]]]:
if not config.enabled:
return None
return None, None

try:
return ",".join(
process_tags_list = [
f"{key}:{normalize_tag_value(value)}"
for key, value in sorted(
[
Expand All @@ -59,10 +61,12 @@ def generate_process_tags() -> Optional[str]:
(ENTRYPOINT_TYPE_TAG, ENTRYPOINT_TYPE_SCRIPT),
]
)
)
]
process_tags = ",".join(process_tags_list)
return process_tags, process_tags_list
except Exception as e:
log.debug("failed to get process_tags: %s", e)
return None
return None, None


process_tags = generate_process_tags()
process_tags, process_tags_list = generate_process_tags()
5 changes: 5 additions & 0 deletions ddtrace/internal/remoteconfig/client.py
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@
import ddtrace
from ddtrace.internal import agent
from ddtrace.internal import gitmetadata
from ddtrace.internal import process_tags
from ddtrace.internal import runtime
from ddtrace.internal.hostname import get_hostname
from ddtrace.internal.logger import get_logger
Expand Down Expand Up @@ -233,6 +234,10 @@ def __init__(self) -> None:
app_version=ddtrace.config.version,
tags=[":".join(_) for _ in tags.items()],
)

if p_tags_list := process_tags.process_tags_list:
self._client_tracer["process_tags"] = p_tags_list

self.cached_target_files: List[AppliedConfigType] = []

self._products: MutableMapping[str, PubSub] = dict()
Expand Down
41 changes: 41 additions & 0 deletions tests/internal/remoteconfig/test_remoteconfig.py
Original file line number Diff line number Diff line change
Expand Up @@ -802,3 +802,44 @@ def test_apm_tracing_sampling_rules_none_override(remote_config_worker):
# Restore original config
config.service = original_service
config.env = original_env


def test_remote_config_payload_not_includes_process_tags():
client = RemoteConfigClient()
payload = client._build_payload({})

assert "process_tags" not in payload["client"]["client_tracer"]


@pytest.mark.subprocess(env={"DD_EXPERIMENTAL_PROPAGATE_PROCESS_TAGS_ENABLED": "True"})
def test_remote_config_payload_includes_process_tags():
import os
import sys
from unittest.mock import patch

from ddtrace.internal.process_tags import ENTRYPOINT_BASEDIR_TAG
from ddtrace.internal.process_tags import ENTRYPOINT_NAME_TAG
from ddtrace.internal.process_tags import ENTRYPOINT_TYPE_SCRIPT
from ddtrace.internal.process_tags import ENTRYPOINT_TYPE_TAG
from ddtrace.internal.process_tags import ENTRYPOINT_WORKDIR_TAG
from ddtrace.internal.remoteconfig.client import RemoteConfigClient
from tests.utils import process_tag_reload

with (
patch.object(sys, "argv", ["/path/to/test_script.py"]),
patch.object(os, "getcwd", return_value="/path/to/workdir"),
):
process_tag_reload()

client = RemoteConfigClient()
payload = client._build_payload({})

assert "process_tags" in payload["client"]["client_tracer"]

process_tags = payload["client"]["client_tracer"]["process_tags"]

assert isinstance(process_tags, list)
assert f"{ENTRYPOINT_BASEDIR_TAG}:to" in process_tags
assert f"{ENTRYPOINT_NAME_TAG}:test_script" in process_tags
assert f"{ENTRYPOINT_TYPE_TAG}:{ENTRYPOINT_TYPE_SCRIPT}" in process_tags
assert f"{ENTRYPOINT_WORKDIR_TAG}:workdir" in process_tags
2 changes: 2 additions & 0 deletions tests/internal/test_process_tags.py
Original file line number Diff line number Diff line change
Expand Up @@ -81,10 +81,12 @@ def setUp(self):
super(TestProcessTags, self).setUp()
self._original_process_tags_enabled = config.enabled
self._original_process_tags = process_tags.process_tags
self._original_process_tags_list = process_tags.process_tags_list

def tearDown(self):
config.enabled = self._original_process_tags_enabled
process_tags.process_tags = self._original_process_tags
process_tags.process_tags_list = self._original_process_tags_list
super().tearDown()

@pytest.mark.snapshot
Expand Down
2 changes: 1 addition & 1 deletion tests/utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -1623,4 +1623,4 @@ def override_third_party_packages(packages: List[str]):


def process_tag_reload():
process_tags.process_tags = process_tags.generate_process_tags()
process_tags.process_tags, process_tags.process_tags_list = process_tags.generate_process_tags()
Loading