Skip to content

Commit d19cafd

Browse files
authored
ssi: enable instrumentation source tests (#5007)
1 parent c3cc7b0 commit d19cafd

7 files changed

Lines changed: 50 additions & 49 deletions

File tree

manifests/java.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2164,7 +2164,7 @@ tests/:
21642164
Test_Stable_Configuration_Origin: v1.47.0-SNAPSHOT
21652165
Test_TelemetryInstallSignature: v1.27.0
21662166
Test_TelemetrySCAEnvVar: v1.34.0
2167-
Test_TelemetrySSIConfigs: missing_feature
2167+
Test_TelemetrySSIConfigs: v1.51.0
21682168
test_trace_sampling.py:
21692169
Test_Trace_Sampling_Basic: v0.111.0
21702170
Test_Trace_Sampling_Globs: v1.25.1

manifests/nodejs.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1366,7 +1366,7 @@ tests/:
13661366
Test_Stable_Configuration_Origin: *ref_5_41_0
13671367
Test_TelemetryInstallSignature: *ref_4_23_0
13681368
Test_TelemetrySCAEnvVar: *ref_5_13_0
1369-
Test_TelemetrySSIConfigs: missing_feature
1369+
Test_TelemetrySSIConfigs: *ref_5_59_0
13701370
test_trace_sampling.py:
13711371
Test_Trace_Sampling_Basic: *ref_5_16_0 #actual version unknown
13721372
Test_Trace_Sampling_Globs: *ref_5_16_0 #actual version unknown

manifests/python.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1165,7 +1165,7 @@ tests/:
11651165
Test_Stable_Configuration_Origin: v3.7.0.dev
11661166
Test_TelemetryInstallSignature: v2.5.0
11671167
Test_TelemetrySCAEnvVar: v2.9.0
1168-
Test_TelemetrySSIConfigs: v3.8.0.dev
1168+
Test_TelemetrySSIConfigs: v3.11.0
11691169
test_trace_sampling.py:
11701170
Test_Trace_Sampling_Basic: v1.9.0 # actual version unknown
11711171
Test_Trace_Sampling_Globs: v2.8.0

manifests/ruby.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -800,7 +800,7 @@ tests/:
800800
Test_Stable_Configuration_Origin: v2.18.0
801801
Test_TelemetryInstallSignature: missing_feature
802802
Test_TelemetrySCAEnvVar: v2.1.0
803-
Test_TelemetrySSIConfigs: missing_feature
803+
Test_TelemetrySSIConfigs: v2.18.0
804804
test_trace_sampling.py:
805805
Test_Trace_Sampling_Basic: v1.0.0 # TODO what is the earliest version?
806806
Test_Trace_Sampling_Globs: v2.0.0

tests/docker_ssi/test_docker_ssi.py

Lines changed: 28 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,17 @@
11
from urllib.parse import urlparse
22

3-
from utils import scenarios, features, context, irrelevant, bug, interfaces, weblog, logger, missing_feature
3+
from tests.parametric.test_telemetry import _mapped_telemetry_name
4+
from utils import (
5+
scenarios,
6+
features,
7+
context,
8+
irrelevant,
9+
bug,
10+
interfaces,
11+
weblog,
12+
logger,
13+
missing_feature,
14+
)
415

516

617
@scenarios.docker_ssi
@@ -131,25 +142,25 @@ def setup_instrumentation_source_ssi(self):
131142
self._setup_all()
132143

133144
@features.ssi_service_tracking
134-
@missing_feature(context.library in ("nodejs", "dotnet", "java", "ruby"), reason="Not implemented yet")
135-
@missing_feature(context.library < "python@3.8.0.dev", reason="Not implemented")
136145
@irrelevant(context.library == "python" and context.installed_language_runtime < "3.9.0")
137-
@irrelevant(context.library == "php" and context.installed_language_runtime < "7.0")
146+
@irrelevant(context.library == "java" and context.installed_language_runtime < "1.8.0_0")
147+
@irrelevant(context.library == "php" and context.installed_language_runtime < "7.1")
148+
@irrelevant(context.library == "nodejs" and context.installed_language_runtime < "17.0")
149+
@irrelevant(context.library >= "python@4.0.0.dev" and context.installed_language_runtime < "3.9.0")
150+
@irrelevant(context.library < "python@4.0.0.dev" and context.installed_language_runtime < "3.8.0")
151+
@missing_feature(context.library < "java@1.52.0", reason="Not implemented yet")
152+
@missing_feature(context.library < "python@3.11.0", reason="Not implemented yet")
153+
@missing_feature(context.library < "dotnet@3.22.0", reason="Not implemented yet")
154+
@missing_feature(context.library < "nodejs@5.66.0", reason="Not implemented yet")
155+
@missing_feature(context.library < "php@1.12.0", reason="Not implemented yet")
156+
@missing_feature(context.library < "ruby@v2.19.0", reason="Not implemented yet")
138157
def test_instrumentation_source_ssi(self):
139158
logger.info("Testing Docker SSI service tracking")
140-
# There are traces related with the request
141-
root_span = interfaces.test_agent.get_traces(request=self.r)
142-
assert root_span, f"No traces found for request {self.r.get_rid()}"
143-
assert "service" in root_span, f"No service name found in root_span: {root_span}"
144-
# Get all captured telemetry configuration data
145-
configurations = interfaces.test_agent.get_telemetry_configurations(
146-
root_span["service"], root_span["meta"]["runtime-id"]
147-
)
148-
149-
# Check that instrumentation source is ssi
150-
injection_source = configurations.get("instrumentation_source")
151-
assert injection_source, f"instrumentation_source not found in configuration {configurations}"
152-
assert injection_source["value"] == "ssi", f"instrumentation_source value is not ssi {injection_source}"
159+
# Get the latest (effective) configurations
160+
telemetry_name = _mapped_telemetry_name("instrumentation_source")
161+
configurations = interfaces.test_agent.get_telemetry_configurations()
162+
instrumentation_source = configurations.get(telemetry_name, {})
163+
assert instrumentation_source.get("value") == "ssi", f"{telemetry_name}=ssi not found in {configurations}"
153164

154165
def setup_injection_metadata(self):
155166
self._setup_all()

tests/parametric/test_telemetry.py

Lines changed: 7 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -9,19 +9,22 @@
99

1010
from .conftest import StableConfigWriter, _TestAgentAPI
1111
from utils.telemetry_utils import TelemetryUtils
12+
1213
from utils import context, scenarios, rfc, features, missing_feature, irrelevant, logger, bug
1314
from utils.docker_fixtures import TestAgentAPI
1415
from .conftest import APMLibrary
1516

1617

1718
telemetry_name_mapping = {
1819
"ssi_injection_enabled": {
19-
"nodejs": "DD_INJECTION_ENABLED",
2020
"python": "DD_INJECTION_ENABLED",
21+
"java": "injection_enabled",
22+
"ruby": "DD_INJECTION_ENABLED",
2123
},
2224
"ssi_forced_injection_enabled": {
23-
"nodejs": "DD_INJECT_FORCE",
2425
"python": "DD_INJECT_FORCE",
26+
"ruby": "DD_INJECT_FORCE",
27+
"java": "inject_force",
2528
},
2629
"trace_sample_rate": {
2730
"dotnet": "DD_TRACE_SAMPLE_RATE",
@@ -1053,20 +1056,12 @@ class Test_TelemetrySSIConfigs:
10531056
},
10541057
"service_test,profiler,false",
10551058
),
1056-
(
1057-
{
1058-
**DEFAULT_ENVVARS,
1059-
"DD_SERVICE": "service_test",
1060-
"DD_INJECTION_ENABLED": None,
1061-
},
1062-
None,
1063-
),
10641059
],
10651060
)
10661061
def test_injection_enabled(
10671062
self,
10681063
library_env: dict[str, str],
1069-
expected_value: str | None,
1064+
expected_value: str,
10701065
test_agent: TestAgentAPI,
10711066
test_library: APMLibrary,
10721067
):
@@ -1108,14 +1103,6 @@ def test_injection_enabled(
11081103
},
11091104
"false",
11101105
),
1111-
(
1112-
{
1113-
**DEFAULT_ENVVARS,
1114-
"DD_SERVICE": "service_test",
1115-
"DD_INJECT_FORCE": None,
1116-
},
1117-
"none",
1118-
),
11191106
],
11201107
)
11211108
def test_inject_force(
@@ -1137,10 +1124,8 @@ def test_inject_force(
11371124
assert inject_force is not None, f"No configuration found for '{inject_force_telemetry_name}'"
11381125
assert isinstance(inject_force, dict)
11391126
assert str(inject_force.get("value")).lower() == expected_value
1140-
if expected_value != "none":
1141-
assert inject_force.get("origin") == "env_var"
1127+
assert inject_force.get("origin") == "env_var"
11421128

1143-
@missing_feature(context.library == "dotnet", reason="Not implemented")
11441129
@pytest.mark.parametrize("library_env", [{**DEFAULT_ENVVARS, "DD_SERVICE": "service_test"}])
11451130
def test_instrumentation_source_non_ssi(
11461131
self, library_env: dict[str, str], test_agent: TestAgentAPI, test_library: APMLibrary

utils/interfaces/_test_agent.py

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -125,21 +125,26 @@ def get_telemetry_configurations(self, service_name: str | None = None, runtime_
125125
requests = list(self.get_telemetry_for_runtime(runtime_id))
126126
requests.sort(key=lambda x: x["tracer_time"])
127127
for request in requests:
128-
if service_name is not None:
128+
if service_name is not None and request["application"]["service_name"] != service_name:
129129
# Check if the service name in telemetry matches the expected service name
130-
assert (
131-
request["application"]["service_name"] == service_name
132-
), f"Service name in telemetry in requests: {request} "
133-
f"does not match expected service name {service_name}"
130+
logger.debug(
131+
f"Service name in telemetry in requests: {request} "
132+
f"does not match expected service name {service_name}"
133+
)
134+
continue
134135
# Convert all telemetry payloads to the the message-batch format. This simplifies configuration extraction
135136
events = (
136137
request.get("payload")
137138
if request["request_type"] == "message-batch"
138139
else [{"payload": request.get("payload"), "request_type": request["request_type"]}]
139140
)
141+
logger.debug("Found telemetry events: %s", events)
140142
for event in events:
141143
# Get the configuration from app-started or app-client-configuration-change payloads
142144
if event and event["request_type"] in ("app-started", "app-client-configuration-change"):
143-
for config in event["payload"].get("configuration", []):
145+
# Sort configurations by seq_id so the latest configuration is the last one in the list
146+
config_list = event["payload"].get("configuration", [])
147+
config_list.sort(key=lambda x: x.get("seq_id", 0))
148+
for config in config_list:
144149
configurations[config["name"]] = config
145150
return configurations

0 commit comments

Comments
 (0)