From aa00140f1987292fa7b1a364ee889d9c86d9e5a8 Mon Sep 17 00:00:00 2001 From: Andrew Glaude Date: Wed, 6 May 2026 15:39:35 -0400 Subject: [PATCH 1/7] [golang] add version as aggregation key dimension in test_distinct_aggregationkeys_TS003 Extends TS003 to cover per-span version tags as a distinct stats aggregation key. Catches the bug introduced in dd-trace-go v2.8.0 (fixed in PR #4734) where the client-side stats concentrator ignored per-span version meta and collapsed all spans into a version="" bucket. Co-Authored-By: Claude Sonnet 4.6 (1M context) --- tests/parametric/test_library_tracestats.py | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/tests/parametric/test_library_tracestats.py b/tests/parametric/test_library_tracestats.py index 9676a1766e3..b23398fbdfe 100644 --- a/tests/parametric/test_library_tracestats.py +++ b/tests/parametric/test_library_tracestats.py @@ -100,7 +100,7 @@ def test_metrics_msgpack_serialization_TS001(self, test_agent: TestAgentAPI, tes def test_distinct_aggregationkeys_TS003(self, test_agent: TestAgentAPI, test_library: APMLibrary): """When spans are created with a unique set of dimensions Each span has stats computed for it and is in its own bucket - The dimensions are: { service, type, name, resource, HTTP_status_code, synthetics } + The dimensions are: { service, type, name, resource, HTTP_status_code, synthetics, version } """ name = "name" resource = "resource" @@ -153,6 +153,12 @@ def test_distinct_aggregationkeys_TS003(self, test_agent: TestAgentAPI, test_lib span.set_meta(key="_dd.origin", val=origin) span.set_meta(key="http.status_code", val="400") + # Unique Version (per-span version tag, no global DD_VERSION set) + with test_library.dd_start_span(name=name, resource=resource, service=service, typestr=span_type) as span: + span.set_meta(key="_dd.origin", val=origin) + span.set_meta(key="http.status_code", val=http_status_code) + span.set_meta(key="version", val="v1.0.0") + if test_library.lang in ("golang", "java"): test_library.dd_flush() @@ -173,8 +179,8 @@ def test_distinct_aggregationkeys_TS003(self, test_agent: TestAgentAPI, test_lib assert s["TopLevelHits"] == 1 assert s["Duration"] > 0 - assert cnt == 7, ( - "There should be seven stats entries in the bucket. There is one baseline entry and 6 that are unique along each of 6 dimensions." + assert cnt == 8, ( + "There should be eight stats entries in the bucket. There is one baseline entry and 7 that are unique along each of 7 dimensions." ) @enable_tracestats() From 68a864b28cbbaef3665d4662300afc2186a0e19d Mon Sep 17 00:00:00 2001 From: Andrew Glaude Date: Fri, 8 May 2026 12:32:57 -0400 Subject: [PATCH 2/7] [golang] mark test_distinct_aggregationkeys_TS003 as bug below v2.8.2-rc.2 Per-span version tag support in client-side stats aggregation key was fixed in dd-trace-go#4734 and released in v2.8.2-rc.2. Gate the new version dimension assertion so CI does not fail on older tracer builds. Co-Authored-By: Claude Sonnet 4.6 (1M context) --- manifests/golang.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/manifests/golang.yml b/manifests/golang.yml index 8f211724449..94ee95e083c 100644 --- a/manifests/golang.yml +++ b/manifests/golang.yml @@ -1128,6 +1128,9 @@ manifest: - declaration: missing_feature (Not implemented) component_version: <1.64.0 tests/parametric/test_headers_tracestate_dd.py::Test_Headers_Tracestate_DD::test_headers_tracestate_dd_propagate_propagatedtags: "missing_feature (\"False Bug: header[3,6]: can't guarantee the order of strings in the tracestate since they came from the map. BUG: header[4,5]: w3cTraceID shouldn't be present\")" + tests/parametric/test_library_tracestats.py::Test_Library_Tracestats::test_distinct_aggregationkeys_TS003: + - declaration: bug (dd-trace-go#4734 per-span version tag ignored in client-side stats aggregation key) + component_version: '<2.8.2-rc.2' tests/parametric/test_library_tracestats.py::Test_Library_Tracestats::test_relative_error_TS008: missing_feature (relative error test is broken) tests/parametric/test_llm_observability/: incomplete_test_app tests/parametric/test_otel_api_interoperability.py: missing_feature From 581520eafe927de8dcbd152e9a8b311aa9b3bad4 Mon Sep 17 00:00:00 2001 From: Andrew Glaude Date: Wed, 1 Jul 2026 13:43:46 -0400 Subject: [PATCH 3/7] skip dotnet and java for now --- manifests/dotnet.yml | 4 +--- manifests/java.yml | 1 + 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/manifests/dotnet.yml b/manifests/dotnet.yml index 11134e94076..c299d5ab223 100644 --- a/manifests/dotnet.yml +++ b/manifests/dotnet.yml @@ -883,9 +883,7 @@ manifest: component_version: <2.51.0 ? tests/parametric/test_headers_tracestate_dd.py::Test_Headers_Tracestate_DD::test_headers_tracestate_dd_evicts_32_or_greater_list_members : bug (APMAPI-914) - tests/parametric/test_library_tracestats.py::Test_Library_Tracestats::test_distinct_aggregationkeys_TS003: - - declaration: missing_feature - component_version: '<3.43.0' + tests/parametric/test_library_tracestats.py::Test_Library_Tracestats::test_distinct_aggregationkeys_TS003: bug (dotnet doesn't aggregate by version) tests/parametric/test_library_tracestats.py::Test_Library_Tracestats::test_measured_spans_TS004: - declaration: missing_feature component_version: '<3.43.0' diff --git a/manifests/java.yml b/manifests/java.yml index 3b9d80209a8..8ea99a2c6ec 100644 --- a/manifests/java.yml +++ b/manifests/java.yml @@ -3792,6 +3792,7 @@ manifest: ? tests/parametric/test_headers_tracestate_dd.py::Test_Headers_Tracestate_DD::test_headers_tracestate_dd_evicts_32_or_greater_list_members : - declaration: missing_feature (Implemented in 1.24.0) component_version: <1.24.0 + tests/parametric/test_library_tracestats.py::Test_Library_Tracestats::test_distinct_aggregationkeys_TS003: bug (java doesn't aggregate by version) tests/parametric/test_library_tracestats.py::Test_Library_Tracestats::test_partial_version_excluded_TS014: missing_feature (CSS v1.2.0 - dd-trace-java exclusion uses internal longRunningVersion field, not the _dd.partial_version metric) tests/parametric/test_library_tracestats.py::Test_Library_Tracestats::test_relative_error_TS008: missing_feature (relative error test is broken) tests/parametric/test_library_tracestats.py::Test_Library_Tracestats::test_sample_rate_0_TS007: # Modified by easy win activation script From 7a3ca2bc3e55b02954a730055ed4ddb19eed67fe Mon Sep 17 00:00:00 2001 From: Andrew Glaude Date: Wed, 1 Jul 2026 14:05:27 -0400 Subject: [PATCH 4/7] Revert "skip dotnet and java for now" This reverts commit 581520eafe927de8dcbd152e9a8b311aa9b3bad4. --- manifests/dotnet.yml | 4 +++- manifests/java.yml | 1 - 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/manifests/dotnet.yml b/manifests/dotnet.yml index c299d5ab223..11134e94076 100644 --- a/manifests/dotnet.yml +++ b/manifests/dotnet.yml @@ -883,7 +883,9 @@ manifest: component_version: <2.51.0 ? tests/parametric/test_headers_tracestate_dd.py::Test_Headers_Tracestate_DD::test_headers_tracestate_dd_evicts_32_or_greater_list_members : bug (APMAPI-914) - tests/parametric/test_library_tracestats.py::Test_Library_Tracestats::test_distinct_aggregationkeys_TS003: bug (dotnet doesn't aggregate by version) + tests/parametric/test_library_tracestats.py::Test_Library_Tracestats::test_distinct_aggregationkeys_TS003: + - declaration: missing_feature + component_version: '<3.43.0' tests/parametric/test_library_tracestats.py::Test_Library_Tracestats::test_measured_spans_TS004: - declaration: missing_feature component_version: '<3.43.0' diff --git a/manifests/java.yml b/manifests/java.yml index 8ea99a2c6ec..3b9d80209a8 100644 --- a/manifests/java.yml +++ b/manifests/java.yml @@ -3792,7 +3792,6 @@ manifest: ? tests/parametric/test_headers_tracestate_dd.py::Test_Headers_Tracestate_DD::test_headers_tracestate_dd_evicts_32_or_greater_list_members : - declaration: missing_feature (Implemented in 1.24.0) component_version: <1.24.0 - tests/parametric/test_library_tracestats.py::Test_Library_Tracestats::test_distinct_aggregationkeys_TS003: bug (java doesn't aggregate by version) tests/parametric/test_library_tracestats.py::Test_Library_Tracestats::test_partial_version_excluded_TS014: missing_feature (CSS v1.2.0 - dd-trace-java exclusion uses internal longRunningVersion field, not the _dd.partial_version metric) tests/parametric/test_library_tracestats.py::Test_Library_Tracestats::test_relative_error_TS008: missing_feature (relative error test is broken) tests/parametric/test_library_tracestats.py::Test_Library_Tracestats::test_sample_rate_0_TS007: # Modified by easy win activation script From 0deef23cffe19736f615849954d7e0e5bdea8375 Mon Sep 17 00:00:00 2001 From: Andrew Glaude Date: Wed, 1 Jul 2026 14:24:37 -0400 Subject: [PATCH 5/7] too strict on version check, just validate non-empty --- tests/parametric/test_library_tracestats.py | 28 +++++++++++++-------- 1 file changed, 17 insertions(+), 11 deletions(-) diff --git a/tests/parametric/test_library_tracestats.py b/tests/parametric/test_library_tracestats.py index 246e833f978..ea17a9de236 100644 --- a/tests/parametric/test_library_tracestats.py +++ b/tests/parametric/test_library_tracestats.py @@ -168,12 +168,6 @@ def test_distinct_aggregationkeys_TS003(self, test_agent: TestAgentAPI, test_lib span.set_meta(key="_dd.origin", val=origin) span.set_meta(key="http.status_code", val="400") - # Unique Version (per-span version tag, no global DD_VERSION set) - with test_library.dd_start_span(name=name, resource=resource, service=service, typestr=span_type) as span: - span.set_meta(key="_dd.origin", val=origin) - span.set_meta(key="http.status_code", val=http_status_code) - span.set_meta(key="version", val="v1.0.0") - if test_library.lang in ("golang", "java"): test_library.dd_flush() @@ -194,8 +188,8 @@ def test_distinct_aggregationkeys_TS003(self, test_agent: TestAgentAPI, test_lib assert s["TopLevelHits"] == 1 assert s["Duration"] > 0 - assert cnt == 8, ( - "There should be eight stats entries in the bucket. There is one baseline entry and 7 that are unique along each of 7 dimensions." + assert cnt == 7, ( + "There should be seven stats entries in the bucket. There is one baseline entry and 6 that are unique along each of 6 dimensions." ) @enable_tracestats() @@ -237,7 +231,18 @@ def test_measured_spans_TS004(self, test_agent: TestAgentAPI, test_library: APML assert op2_stats["Hits"] == 1 assert op2_stats["TopLevelHits"] == 0 - @enable_tracestats() + @parametrize( + "library_env", + [ + { + "DD_TRACE_STATS_COMPUTATION_ENABLED": "1", + "DD_TRACE_TRACER_METRICS_ENABLED": "true", + "DD_VERSION": "1.2.3", + "DD_ENV": "some-env", + "DD_SERVICE": "some-service", + } + ], + ) @enable_agent_version() def test_top_level_TS005(self, test_agent: TestAgentAPI, test_library: APMLibrary): """When top level (service entry) spans are created @@ -257,8 +262,9 @@ def test_top_level_TS005(self, test_agent: TestAgentAPI, test_library: APMLibrar requests = test_agent.get_v06_stats_requests() assert len(requests) == 1, "Only one stats request is expected" request = requests[0]["body"] - for key in ("Hostname", "Env", "Version", "Stats"): - assert key in request, f"{key} should be in stats request" + assert request["Env"] == "some-env" + assert request["Version"] == "1.2.3" + assert request["Stats"] is not None buckets = request["Stats"] assert len(buckets) == 1, "There should be one bucket containing the stats" From cbb9b012b45f6976e3720e3e69047b2892426287 Mon Sep 17 00:00:00 2001 From: Andrew Glaude Date: Wed, 1 Jul 2026 14:26:34 -0400 Subject: [PATCH 6/7] nvm on manifest --- manifests/golang.yml | 3 --- 1 file changed, 3 deletions(-) diff --git a/manifests/golang.yml b/manifests/golang.yml index cd484e56a1e..c544083463f 100644 --- a/manifests/golang.yml +++ b/manifests/golang.yml @@ -1164,9 +1164,6 @@ manifest: - declaration: missing_feature (Not implemented) component_version: <1.64.0 tests/parametric/test_headers_tracestate_dd.py::Test_Headers_Tracestate_DD::test_headers_tracestate_dd_propagate_propagatedtags: "missing_feature (\"False Bug: header[3,6]: can't guarantee the order of strings in the tracestate since they came from the map. BUG: header[4,5]: w3cTraceID shouldn't be present\")" - tests/parametric/test_library_tracestats.py::Test_Library_Tracestats::test_distinct_aggregationkeys_TS003: - - declaration: bug (dd-trace-go#4734 per-span version tag ignored in client-side stats aggregation key) - component_version: '<2.8.2-rc.2' tests/parametric/test_library_tracestats.py::Test_Library_Tracestats::test_payload_metadata_TS012: - declaration: missing_feature (CSS v1.2.0 - dd-trace-go does not set payload-level RuntimeID; stats.go PayloadAggregationKey omits it) component_version: '<=2.10.0-dev' From 638d31f6c1b272d67a6f35b45e6c37d5ba358fdb Mon Sep 17 00:00:00 2001 From: Andrew Glaude Date: Wed, 1 Jul 2026 14:30:36 -0400 Subject: [PATCH 7/7] Fix comments --- tests/parametric/test_library_tracestats.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tests/parametric/test_library_tracestats.py b/tests/parametric/test_library_tracestats.py index ea17a9de236..9c89f891172 100644 --- a/tests/parametric/test_library_tracestats.py +++ b/tests/parametric/test_library_tracestats.py @@ -115,7 +115,7 @@ def test_metrics_msgpack_serialization_TS001(self, test_agent: TestAgentAPI, tes def test_distinct_aggregationkeys_TS003(self, test_agent: TestAgentAPI, test_library: APMLibrary): """When spans are created with a unique set of dimensions Each span has stats computed for it and is in its own bucket - The dimensions are: { service, type, name, resource, HTTP_status_code, synthetics, version } + The dimensions are: { service, type, name, resource, HTTP_status_code, synthetics } """ name = "name" resource = "resource" @@ -247,6 +247,7 @@ def test_measured_spans_TS004(self, test_agent: TestAgentAPI, test_library: APML def test_top_level_TS005(self, test_agent: TestAgentAPI, test_library: APMLibrary): """When top level (service entry) spans are created Each top level span has trace stats computed for it. + Asserts that version and env are set correctly in the stats request. """ with ( test_library,