diff --git a/ddtrace/internal/process_tags/__init__.py b/ddtrace/internal/process_tags/__init__.py index 1a4092232bf..a27e20b1969 100644 --- a/ddtrace/internal/process_tags/__init__.py +++ b/ddtrace/internal/process_tags/__init__.py @@ -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 @@ -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( [ @@ -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() diff --git a/ddtrace/internal/remoteconfig/client.py b/ddtrace/internal/remoteconfig/client.py index efa73f65d9f..b49e407f020 100644 --- a/ddtrace/internal/remoteconfig/client.py +++ b/ddtrace/internal/remoteconfig/client.py @@ -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 @@ -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() diff --git a/tests/internal/remoteconfig/test_remoteconfig.py b/tests/internal/remoteconfig/test_remoteconfig.py index 08e655e9ce0..b5ffb3d2260 100644 --- a/tests/internal/remoteconfig/test_remoteconfig.py +++ b/tests/internal/remoteconfig/test_remoteconfig.py @@ -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 diff --git a/tests/internal/test_process_tags.py b/tests/internal/test_process_tags.py index 2912ee09366..8cba990f8f7 100644 --- a/tests/internal/test_process_tags.py +++ b/tests/internal/test_process_tags.py @@ -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 diff --git a/tests/utils.py b/tests/utils.py index ece5d630d27..fbcd44b3107 100644 --- a/tests/utils.py +++ b/tests/utils.py @@ -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()