From dec3d5708cadb7c2887a5a152a572e69a8b5f107 Mon Sep 17 00:00:00 2001 From: Munir Abdinur Date: Wed, 5 Aug 2026 15:09:32 -0400 Subject: [PATCH 01/16] test(otlp-trace-metrics): fix Java compatibility checks --- tests/parametric/test_otlp_trace_metrics.py | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/tests/parametric/test_otlp_trace_metrics.py b/tests/parametric/test_otlp_trace_metrics.py index 964eeb0a052..dec4229789e 100644 --- a/tests/parametric/test_otlp_trace_metrics.py +++ b/tests/parametric/test_otlp_trace_metrics.py @@ -433,7 +433,7 @@ def test_fr01_5_disabled_when_tracing_is_disabled( # flush window and fail if the span-duration trace metric ever appears. deadline = time.monotonic() + 8 while time.monotonic() < deadline: - metrics = test_agent.metrics() + metrics = _normalize_keys(test_agent.metrics()) assert not _duration_data_points(metrics), ( f"OTLP trace metrics must be disabled when OTLP trace export is off, got: {_all_metric_names(metrics)}" ) @@ -459,7 +459,7 @@ def test_fr01_6_disabled_when_apm_tracing_disabled( deadline = time.monotonic() + 8 while time.monotonic() < deadline: - metrics = test_agent.metrics() + metrics = _normalize_keys(test_agent.metrics()) assert not _duration_data_points(metrics), ( f"OTLP trace metrics must be disabled when APM tracing is disabled, got: {_all_metric_names(metrics)}" ) @@ -1343,13 +1343,17 @@ def test_fr08_13_is_trace_root( service_entry_point = _find_data_point(points, **{"datadog.operation.name": "postgres.query"}) assert service_entry_point is not None, "No data point for the service-entry child span" service_entry_attrs = _data_point_attrs(service_entry_point) - assert service_entry_attrs.get("datadog.span.top_level") is True, ( + assert service_entry_attrs.get("datadog.span.top_level") in (True, 1), ( f"Expected datadog.span.top_level=true on the service-entry child: {service_entry_attrs}" ) assert service_entry_attrs.get("datadog.is_trace_root") is False, ( f"A service-entry child is not the trace root; expected datadog.is_trace_root=false: {service_entry_attrs}" ) + @pytest.mark.parametrize( + "agent_env", + [{"DD_AGENT_EXTRA_INFO": json.dumps({"peer_tags": ["db.hostname"]})}], + ) @pytest.mark.parametrize("library_env", [{**DEFAULT_ENVVARS_OTLP}]) def test_fr08_14_peer_tags( self, @@ -1362,7 +1366,9 @@ def test_fr08_14_peer_tags( the Agent's peer_tags allowlist covers (e.g. db.hostname, aws.s3.bucket, grpc.target). """ with test_library as t: + assert t.ensure_agent_info(), "Tracer did not consume the Agent /info response" with t.dd_start_span(name="postgres.query", service="postgres", typestr="db") as span: + span.set_meta("span.kind", "client") span.set_meta("db.hostname", "prod-db-1") t.dd_flush() From c9d38c1a89052e3afbc249ae787351d8fb0092de Mon Sep 17 00:00:00 2001 From: Munir Abdinur Date: Thu, 6 Aug 2026 15:27:00 -0400 Subject: [PATCH 02/16] test(otlp-trace-metrics): align Datadog attributes --- manifests/cpp.yml | 1 - manifests/php.yml | 1 - manifests/ruby.yml | 1 - manifests/rust.yml | 1 - tests/parametric/test_otlp_trace_metrics.py | 126 +++++--------------- 5 files changed, 27 insertions(+), 103 deletions(-) diff --git a/manifests/cpp.yml b/manifests/cpp.yml index 6bef94170dc..2c7a94acb11 100644 --- a/manifests/cpp.yml +++ b/manifests/cpp.yml @@ -245,7 +245,6 @@ manifest: tests/parametric/test_otlp_trace_metrics.py::Test_FR05_Sampling_Independence: missing_feature tests/parametric/test_otlp_trace_metrics.py::Test_FR06_Otel_Resource_Attributes: missing_feature tests/parametric/test_otlp_trace_metrics.py::Test_FR06_Otel_Span_Attributes: missing_feature - tests/parametric/test_otlp_trace_metrics.py::Test_FR07_Otel_Semantics_Mode: missing_feature tests/parametric/test_otlp_trace_metrics.py::Test_FR08_AdditionalTags: missing_feature tests/parametric/test_otlp_trace_metrics.py::Test_FR08_Datadog_Attributes: missing_feature tests/parametric/test_otlp_trace_metrics.py::Test_FR09_Red_Metric_Derivation: missing_feature diff --git a/manifests/php.yml b/manifests/php.yml index fcf85ab4e7c..5a44e2dc4fc 100644 --- a/manifests/php.yml +++ b/manifests/php.yml @@ -1171,7 +1171,6 @@ manifest: tests/parametric/test_otlp_trace_metrics.py::Test_FR05_Sampling_Independence: missing_feature tests/parametric/test_otlp_trace_metrics.py::Test_FR06_Otel_Resource_Attributes: missing_feature tests/parametric/test_otlp_trace_metrics.py::Test_FR06_Otel_Span_Attributes: missing_feature - tests/parametric/test_otlp_trace_metrics.py::Test_FR07_Otel_Semantics_Mode: missing_feature tests/parametric/test_otlp_trace_metrics.py::Test_FR08_AdditionalTags: missing_feature tests/parametric/test_otlp_trace_metrics.py::Test_FR08_Datadog_Attributes: missing_feature tests/parametric/test_otlp_trace_metrics.py::Test_FR09_Red_Metric_Derivation: missing_feature diff --git a/manifests/ruby.yml b/manifests/ruby.yml index 7874e983871..1ae1603acb9 100644 --- a/manifests/ruby.yml +++ b/manifests/ruby.yml @@ -2497,7 +2497,6 @@ manifest: tests/parametric/test_otlp_trace_metrics.py::Test_FR05_Sampling_Independence: missing_feature tests/parametric/test_otlp_trace_metrics.py::Test_FR06_Otel_Resource_Attributes: missing_feature tests/parametric/test_otlp_trace_metrics.py::Test_FR06_Otel_Span_Attributes: missing_feature - tests/parametric/test_otlp_trace_metrics.py::Test_FR07_Otel_Semantics_Mode: missing_feature tests/parametric/test_otlp_trace_metrics.py::Test_FR08_AdditionalTags: missing_feature tests/parametric/test_otlp_trace_metrics.py::Test_FR08_Datadog_Attributes: missing_feature tests/parametric/test_otlp_trace_metrics.py::Test_FR09_Red_Metric_Derivation: missing_feature diff --git a/manifests/rust.yml b/manifests/rust.yml index 9de297d82fb..7fc8dc4f4b1 100644 --- a/manifests/rust.yml +++ b/manifests/rust.yml @@ -276,7 +276,6 @@ manifest: tests/parametric/test_otlp_trace_metrics.py::Test_FR05_Sampling_Independence: missing_feature tests/parametric/test_otlp_trace_metrics.py::Test_FR06_Otel_Resource_Attributes: missing_feature tests/parametric/test_otlp_trace_metrics.py::Test_FR06_Otel_Span_Attributes: missing_feature - tests/parametric/test_otlp_trace_metrics.py::Test_FR07_Otel_Semantics_Mode: missing_feature tests/parametric/test_otlp_trace_metrics.py::Test_FR08_AdditionalTags: missing_feature tests/parametric/test_otlp_trace_metrics.py::Test_FR08_Datadog_Attributes: missing_feature tests/parametric/test_otlp_trace_metrics.py::Test_FR09_Red_Metric_Derivation: missing_feature diff --git a/tests/parametric/test_otlp_trace_metrics.py b/tests/parametric/test_otlp_trace_metrics.py index dec4229789e..c0d039601ff 100644 --- a/tests/parametric/test_otlp_trace_metrics.py +++ b/tests/parametric/test_otlp_trace_metrics.py @@ -13,9 +13,8 @@ FR05 Computed before head-based sampling Test_FR05_Sampling_Independence FR06 OTel semantic-convention attributes wherever applicable Test_FR06_Otel_Span_Attributes, Test_FR06_Otel_Resource_Attributes - FR07 DD_TRACE_OTEL_SEMANTICS_ENABLED=true -> only OTel attributes Test_FR07_Otel_Semantics_Mode - FR08 DD_TRACE_OTEL_SEMANTICS_ENABLED=false (default) -> datadog.* allowed Test_FR08_Datadog_Attributes, - DD_TRACE_STATS_ADDITIONAL_TAGS (additional_metric_tags) Test_FR08_AdditionalTags + FR08 Datadog attributes and DD_TRACE_STATS_ADDITIONAL_TAGS Test_FR08_Datadog_Attributes, + (additional_metric_tags) Test_FR08_AdditionalTags FR09 Derive request/span count, error count, and duration Test_FR09_Red_Metric_Derivation FR10 Transport over OTLP HTTP/JSON (set in _BASE_ENVVARS, exercised by every test) FR11 SDKs without client-side stats are out of scope (handled by manifests / @features gating) @@ -25,9 +24,8 @@ Key conventions: * Top-level marker is datadog.span.top_level. - * Error is conveyed via the OTel status.code attribute; it works in OTel-semantics mode where datadog.* and - other bespoke attributes are disallowed. - * Resource name is the OTel span.name attribute in both modes; datadog.resource.name is not emitted. + * Error is conveyed via the OTel status.code attribute. + * Resource name is the OTel span.name attribute; datadog.resource.name is not emitted. * The emitter is identified by the resource attributes telemetry.sdk.name ("datadog") and telemetry.sdk.language (the library's OTel language token, e.g. "go" for golang). * service.name, service.version and deployment.environment.name are reported as resource attributes @@ -127,8 +125,7 @@ def _get_otlp_metrics_protocol() -> str: "DD_SERVICE": SERVICE, } -# OTLP trace metrics explicitly enabled. DD_TRACE_OTEL_SEMANTICS_ENABLED is unset, so this is the -# default Datadog mode where datadog.* attributes are emitted alongside OTel attributes (FR08). +# OTLP trace metrics explicitly enabled. DEFAULT_ENVVARS = {**_BASE_ENVVARS, "OTEL_TRACES_SPAN_METRICS_ENABLED": "true"} # Same as DEFAULT_ENVVARS, but also exercises the OTLP trace export path (OTEL_TRACES_EXPORTER=otlp). @@ -137,9 +134,6 @@ def _get_otlp_metrics_protocol() -> str: # otlp_traces_and_metrics_library_env fixture below. DEFAULT_ENVVARS_OTLP = {**DEFAULT_ENVVARS, "OTEL_TRACES_EXPORTER": "otlp"} -# OTel-semantics mode: only OpenTelemetry attributes are emitted, no datadog.* attributes (FR07). -OTEL_SEMANTICS_ENVVARS_OTLP = {**DEFAULT_ENVVARS_OTLP, "DD_TRACE_OTEL_SEMANTICS_ENABLED": "true"} - @pytest.fixture def otlp_trace_metrics_library_env(library_env: dict[str, str], test_agent: TestAgentAPI): @@ -712,7 +706,7 @@ def test_fr05_1_metrics_computed_before_sampling( @scenarios.parametric @features.client_side_stats_supported class Test_FR06_Otel_Span_Attributes: - """FR06: Span dimensions map to OTel semantic-convention data-point attributes (both modes).""" + """FR06: Span dimensions map to OTel semantic-convention data-point attributes.""" @pytest.mark.parametrize("library_env", [{**DEFAULT_ENVVARS_OTLP}]) def test_fr06_1_resource_span_name( @@ -1017,95 +1011,10 @@ def test_fr06_13_telemetry_sdk_language( ) -@scenarios.parametric -@features.client_side_stats_supported -class Test_FR07_Otel_Semantics_Mode: - """FR07: With DD_TRACE_OTEL_SEMANTICS_ENABLED=true, only OTel attributes are emitted.""" - - @pytest.mark.parametrize("library_env", [{**OTEL_SEMANTICS_ENVVARS_OTLP}]) - def test_fr07_1_no_datadog_attributes( - self, - otlp_traces_and_metrics_library_env: dict[str, str], # noqa: ARG002 - test_agent: TestAgentAPI, - test_library: APMLibrary, - ): - """No datadog.* prefixed attributes are emitted on the data point in OTel-semantics mode.""" - with test_library as t: - with t.dd_start_span(name="web.request", service=SERVICE, resource="/users", typestr="web") as span: - span.set_meta(ORIGIN, "synthetics") - t.dd_flush() - - metrics = _wait_for_otlp_metrics(test_agent) - attrs = _data_point_attrs(_duration_data_points(metrics)[0]) - datadog_keys = [key for key in attrs if key.startswith(("datadog.", "_datadog."))] - assert not datadog_keys, f"datadog.* attributes must not be emitted in OTel-semantics mode: {datadog_keys}" - - @pytest.mark.parametrize("library_env", [{**OTEL_SEMANTICS_ENVVARS_OTLP}]) - def test_fr07_2_no_datadog_resource_or_type( - self, - otlp_traces_and_metrics_library_env: dict[str, str], # noqa: ARG002 - test_agent: TestAgentAPI, - test_library: APMLibrary, - ): - """Resource is carried by span.name (not datadog.resource.name) and datadog.span.type is absent.""" - with test_library as t: - with t.dd_start_span(name="web.request", service=SERVICE, resource="/users", typestr="web"): - pass - t.dd_flush() - - metrics = _wait_for_otlp_metrics(test_agent) - attrs = _data_point_attrs(_duration_data_points(metrics)[0]) - assert attrs.get("span.name") == "/users", f"Expected span.name=/users, got attrs: {attrs}" - assert "datadog.resource.name" not in attrs, f"datadog.resource.name must be absent: {attrs}" - assert "datadog.span.type" not in attrs, f"datadog.span.type must be absent: {attrs}" - assert "datadog.operation.name" not in attrs, f"datadog.operation.name must be absent: {attrs}" - - @pytest.mark.parametrize("library_env", [{**OTEL_SEMANTICS_ENVVARS_OTLP}]) - def test_fr07_3_otel_attributes_present( - self, - otlp_traces_and_metrics_library_env: dict[str, str], # noqa: ARG002 - test_agent: TestAgentAPI, - test_library: APMLibrary, - ): - """OTel semantic-convention attributes are still emitted in OTel-semantics mode.""" - with test_library as t: - with t.dd_start_span(name="web.request", service=SERVICE, typestr="web") as span: - span.set_meta("http.method", "GET") - span.set_meta("http.route", "/users/{id}") - t.dd_flush() - - metrics = _wait_for_otlp_metrics(test_agent) - attrs = _data_point_attrs(_duration_data_points(metrics)[0]) - assert attrs.get("http.request.method") == "GET", f"Expected http.request.method=GET, got attrs: {attrs}" - assert attrs.get("http.route") == "/users/{id}", f"Expected http.route=/users/{{id}}, got attrs: {attrs}" - - @pytest.mark.parametrize( - "library_env", - [{**OTEL_SEMANTICS_ENVVARS_OTLP, "DD_EXPERIMENTAL_PROPAGATE_PROCESS_TAGS_ENABLED": "true"}], - ) - def test_fr07_4_no_datadog_resource_attributes( - self, - otlp_traces_and_metrics_library_env: dict[str, str], # noqa: ARG002 - test_agent: TestAgentAPI, - test_library: APMLibrary, - ): - """No datadog.* resource attributes are emitted in OTel-semantics mode (process tags must not leak).""" - with test_library as t: - with t.dd_start_span(name="web.request", service=SERVICE, typestr="web"): - pass - t.dd_flush() - - metrics = _wait_for_otlp_metrics(test_agent) - datadog_keys = [key for key in _resource_attributes(metrics) if key.startswith(("datadog.", "_datadog."))] - assert not datadog_keys, ( - f"datadog.* resource attributes must not be emitted in OTel-semantics mode: {datadog_keys}" - ) - - @scenarios.parametric @features.client_side_stats_supported class Test_FR08_Datadog_Attributes: - """FR08: In default mode (DD_TRACE_OTEL_SEMANTICS_ENABLED=false) datadog.* attributes are added.""" + """FR08: Datadog span dimensions map to datadog.* attributes.""" @pytest.mark.parametrize("library_env", [{**DEFAULT_ENVVARS_OTLP}]) def test_fr08_1_operation_name( @@ -1343,7 +1252,7 @@ def test_fr08_13_is_trace_root( service_entry_point = _find_data_point(points, **{"datadog.operation.name": "postgres.query"}) assert service_entry_point is not None, "No data point for the service-entry child span" service_entry_attrs = _data_point_attrs(service_entry_point) - assert service_entry_attrs.get("datadog.span.top_level") in (True, 1), ( + assert service_entry_attrs.get("datadog.span.top_level") is True, ( f"Expected datadog.span.top_level=true on the service-entry child: {service_entry_attrs}" ) assert service_entry_attrs.get("datadog.is_trace_root") is False, ( @@ -1377,6 +1286,25 @@ def test_fr08_14_peer_tags( peer_tags = attrs.get("datadog.peer_tags") or [] assert "db.hostname:prod-db-1" in peer_tags, f"Expected db.hostname:prod-db-1 in datadog.peer_tags: {attrs}" + @pytest.mark.parametrize("library_env", [{**DEFAULT_ENVVARS_OTLP}]) + def test_fr08_15_service_source( + self, + otlp_traces_and_metrics_library_env: dict[str, str], # noqa: ARG002 + test_agent: TestAgentAPI, + test_library: APMLibrary, + ): + """The service override source maps to the string attribute datadog.svc_src.""" + with test_library as t: + with t.dd_start_span(name="mapped.request", service="mapped-service", typestr="web") as span: + span.set_meta("_dd.svc_src", "m") + t.dd_flush() + + metrics = _wait_for_otlp_metrics(test_agent) + point = _find_data_point(_duration_data_points(metrics), **{"datadog.operation.name": "mapped.request"}) + assert point is not None, "No data point for the service-override span" + attrs = _data_point_attrs(point) + assert attrs.get("datadog.svc_src") == "m", f"Expected datadog.svc_src=m, got attrs: {attrs}" + @scenarios.parametric @features.client_side_stats_supported From 9570addcdbce365095f96725aa60f2cd3c48fd56 Mon Sep 17 00:00:00 2001 From: Munir Abdinur Date: Thu, 6 Aug 2026 15:30:42 -0400 Subject: [PATCH 03/16] Apply suggestion from @mabdinur --- tests/parametric/test_otlp_trace_metrics.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/parametric/test_otlp_trace_metrics.py b/tests/parametric/test_otlp_trace_metrics.py index c0d039601ff..937ca8082eb 100644 --- a/tests/parametric/test_otlp_trace_metrics.py +++ b/tests/parametric/test_otlp_trace_metrics.py @@ -1303,7 +1303,7 @@ def test_fr08_15_service_source( point = _find_data_point(_duration_data_points(metrics), **{"datadog.operation.name": "mapped.request"}) assert point is not None, "No data point for the service-override span" attrs = _data_point_attrs(point) - assert attrs.get("datadog.svc_src") == "m", f"Expected datadog.svc_src=m, got attrs: {attrs}" + assert attrs.get("datadog.svc_src"), f"Expected datadog.svc_src to be set, got attrs: {attrs}" @scenarios.parametric From d1f2911d52b5e8ba5a587fc268f528befa4137a3 Mon Sep 17 00:00:00 2001 From: Munir Abdinur Date: Thu, 6 Aug 2026 15:36:24 -0400 Subject: [PATCH 04/16] test(otlp-trace-metrics): gate service source rollout --- manifests/dotnet.yml | 1 + manifests/golang.yml | 1 + manifests/java.yml | 1 + manifests/nodejs.yml | 1 + manifests/python.yml | 1 + tests/parametric/test_otlp_trace_metrics.py | 6 +++--- 6 files changed, 8 insertions(+), 3 deletions(-) diff --git a/manifests/dotnet.yml b/manifests/dotnet.yml index bd5c981052b..b75497bc6c3 100644 --- a/manifests/dotnet.yml +++ b/manifests/dotnet.yml @@ -1034,6 +1034,7 @@ manifest: tests/parametric/test_otlp_trace_metrics.py::Test_FR08_AdditionalTags::test_fr08_12_stats_additional_tags: missing_feature (DD_TRACE_STATS_ADDITIONAL_TAGS is not yet emitted as additional_metric_tags on OTLP trace metrics data points) tests/parametric/test_otlp_trace_metrics.py::Test_FR08_Datadog_Attributes::test_fr08_13_is_trace_root: missing_feature (datadog.is_trace_root is computed but never emitted on OTLP trace metrics data points) tests/parametric/test_otlp_trace_metrics.py::Test_FR08_Datadog_Attributes::test_fr08_14_peer_tags: missing_feature (Blocked on test-agent support for advertising a peer_tags allowlist in /info) + tests/parametric/test_otlp_trace_metrics.py::Test_FR08_Datadog_Attributes::test_fr08_15_service_source: missing_feature (pending implementation release) tests/parametric/test_otlp_trace_metrics.py::Test_FR08_Datadog_Attributes::test_fr08_8_process_tags: missing_feature (process tags are not yet emitted on the OTLP trace metrics resource) tests/parametric/test_otlp_trace_metrics.py::Test_FR09_Red_Metric_Derivation::test_fr09_2_error_count: missing_feature (status.code is emitted as an integer, e.g. 2, not the SMC's STATUS_CODE_ERROR string convention, so the error span is not counted) tests/parametric/test_otlp_trace_metrics.py::Test_FR15_Client_Computed_Stats_Header::test_fr15_1_header_set_when_enabled: irrelevant (OTLP trace metrics alongside native (non-OTLP) trace export was removed and will not be supported; OTLP trace metrics now require OTEL_TRACES_EXPORTER=otlp) diff --git a/manifests/golang.yml b/manifests/golang.yml index dd6738a9086..201eb628bed 100644 --- a/manifests/golang.yml +++ b/manifests/golang.yml @@ -1540,6 +1540,7 @@ manifest: tests/parametric/test_otlp_trace_metrics.py::Test_FR08_AdditionalTags: missing_feature (datadog.tracer_tags / DD_TRACE_STATS_ADDITIONAL_TAGS per-key attrs not yet implemented) tests/parametric/test_otlp_trace_metrics.py::Test_FR08_Datadog_Attributes::test_fr08_13_is_trace_root: missing_feature (datadog.is_trace_root not emitted) tests/parametric/test_otlp_trace_metrics.py::Test_FR08_Datadog_Attributes::test_fr08_14_peer_tags: missing_feature (Blocked on test-agent support for advertising a peer_tags allowlist in /info) + tests/parametric/test_otlp_trace_metrics.py::Test_FR08_Datadog_Attributes::test_fr08_15_service_source: missing_feature (pending implementation release) tests/parametric/test_otlp_trace_metrics.py::Test_FR08_Datadog_Attributes::test_fr08_8_process_tags: missing_feature (process_tags is split into per-key datadog. resource attributes instead of one combined datadog.process_tags arrayValue) tests/parametric/test_otlp_trace_metrics.py::Test_FR09_Red_Metric_Derivation::test_fr09_2_error_count: missing_feature (status.code is emitted as an integer, e.g. 2, not the SMC's STATUS_CODE_ERROR string convention, so the error span is not counted) tests/parametric/test_parametric_endpoints.py::TestRemoteConfigApplyEndpoint: incomplete_test_app (POST /trace/remote-config/apply only implemented in the python parametric app) diff --git a/manifests/java.yml b/manifests/java.yml index c890813eb2f..cdd970db27b 100644 --- a/manifests/java.yml +++ b/manifests/java.yml @@ -3996,6 +3996,7 @@ manifest: tests/parametric/test_otlp_trace_metrics.py::Test_FR08_AdditionalTags: missing_feature (DD_TAGS/OTEL_RESOURCE_ATTRIBUTES are not yet emitted as the datadog.tracer_tags resource attribute; support coming in a future PR) tests/parametric/test_otlp_trace_metrics.py::Test_FR08_Datadog_Attributes::test_fr08_13_is_trace_root: missing_feature (datadog.is_trace_root is computed but never emitted on OTLP trace metrics data points) tests/parametric/test_otlp_trace_metrics.py::Test_FR08_Datadog_Attributes::test_fr08_14_peer_tags: missing_feature (Blocked on test-agent support for advertising a peer_tags allowlist in /info) + tests/parametric/test_otlp_trace_metrics.py::Test_FR08_Datadog_Attributes::test_fr08_15_service_source: missing_feature (pending implementation release) tests/parametric/test_otlp_trace_metrics.py::Test_FR08_Datadog_Attributes::test_fr08_8_process_tags: missing_feature (process_tags is split into per-key datadog. resource attributes instead of one combined datadog.process_tags arrayValue) tests/parametric/test_otlp_trace_metrics.py::Test_FR09_Red_Metric_Derivation::test_fr09_2_error_count: missing_feature (status.code is emitted as the bare string "ERROR" instead of the SMC's STATUS_CODE_ERROR convention, so the error span is not counted) tests/parametric/test_parametric_endpoints.py::TestRemoteConfigApplyEndpoint: incomplete_test_app (POST /trace/remote-config/apply only implemented in the python parametric app) diff --git a/manifests/nodejs.yml b/manifests/nodejs.yml index bba0e151b30..87c162b3421 100644 --- a/manifests/nodejs.yml +++ b/manifests/nodejs.yml @@ -2394,6 +2394,7 @@ manifest: tests/parametric/test_otlp_trace_metrics.py::Test_FR08_AdditionalTags::test_fr08_12_stats_additional_tags: missing_feature (DD_TRACE_STATS_ADDITIONAL_TAGS is not forwarded to the native OTLP trace-metrics exporter) tests/parametric/test_otlp_trace_metrics.py::Test_FR08_Datadog_Attributes::test_fr08_13_is_trace_root: missing_feature (datadog.is_trace_root is not yet emitted on OTLP trace-metric data points) tests/parametric/test_otlp_trace_metrics.py::Test_FR08_Datadog_Attributes::test_fr08_14_peer_tags: missing_feature (Blocked on test-agent support for advertising a peer_tags allowlist in /info) + tests/parametric/test_otlp_trace_metrics.py::Test_FR08_Datadog_Attributes::test_fr08_15_service_source: missing_feature (pending implementation release) tests/parametric/test_otlp_trace_metrics.py::Test_FR08_Datadog_Attributes::test_fr08_5_top_level_child_different_service: missing_feature (nodejs does not tag child spans with a different service than their parent as top-level) tests/parametric/test_otlp_trace_metrics.py::Test_FR08_Datadog_Attributes::test_fr08_8_process_tags: missing_feature (process_tags is split into per-key datadog. resource attributes instead of one combined datadog.process_tags arrayValue) tests/parametric/test_otlp_trace_metrics.py::Test_FR09_Red_Metric_Derivation::test_fr09_2_error_count: missing_feature (status.code is emitted as an integer, e.g. 2, not the SMC's STATUS_CODE_ERROR string convention, so the error span is not counted) diff --git a/manifests/python.yml b/manifests/python.yml index df40ace7d0e..cc74906aeb1 100644 --- a/manifests/python.yml +++ b/manifests/python.yml @@ -2067,6 +2067,7 @@ manifest: tests/parametric/test_otlp_trace_metrics.py::Test_FR08_AdditionalTags::test_fr08_12_stats_additional_tags: missing_feature (DD_TRACE_STATS_ADDITIONAL_TAGS is not forwarded to the native OTLP trace-metrics exporter) tests/parametric/test_otlp_trace_metrics.py::Test_FR08_Datadog_Attributes::test_fr08_13_is_trace_root: missing_feature (datadog.is_trace_root is emitted as _datadog.is_trace_root, with a leading underscore) tests/parametric/test_otlp_trace_metrics.py::Test_FR08_Datadog_Attributes::test_fr08_14_peer_tags: missing_feature (Blocked on test-agent support for advertising a peer_tags allowlist in /info) + tests/parametric/test_otlp_trace_metrics.py::Test_FR08_Datadog_Attributes::test_fr08_15_service_source: missing_feature (pending libdatadog implementation release) tests/parametric/test_otlp_trace_metrics.py::Test_FR08_Datadog_Attributes::test_fr08_8_process_tags: missing_feature (process_tags is split into per-key datadog. resource attributes instead of one combined datadog.process_tags arrayValue) tests/parametric/test_otlp_trace_metrics.py::Test_FR09_Red_Metric_Derivation::test_fr09_2_error_count: missing_feature (status.code is emitted as an integer, e.g. 2, not the SMC's STATUS_CODE_ERROR string convention, so the error span is not counted) tests/parametric/test_parametric_endpoints.py::Test_Parametric_DDTrace_Baggage: v2.16.0 diff --git a/tests/parametric/test_otlp_trace_metrics.py b/tests/parametric/test_otlp_trace_metrics.py index 937ca8082eb..2c6fa4e6140 100644 --- a/tests/parametric/test_otlp_trace_metrics.py +++ b/tests/parametric/test_otlp_trace_metrics.py @@ -1067,7 +1067,7 @@ def test_fr08_3_top_level_root( metrics = _wait_for_otlp_metrics(test_agent) attrs = _data_point_attrs(_duration_data_points(metrics)[0]) - assert attrs.get("datadog.span.top_level") in (True, 1), ( + assert attrs.get("datadog.span.top_level") is True, ( f"Expected datadog.span.top_level truthy on root, got attrs: {attrs}" ) @@ -1095,7 +1095,7 @@ def test_fr08_4_top_level_child_same_service( child_point = _find_data_point(_duration_data_points(metrics), **{"datadog.operation.name": "child.op"}) assert child_point is not None, "No data point for the child span" attrs = _data_point_attrs(child_point) - assert attrs.get("datadog.span.top_level") in (False, 0), ( + assert attrs.get("datadog.span.top_level") is False, ( f"Expected datadog.span.top_level false on same-service child, got attrs: {attrs}" ) @@ -1119,7 +1119,7 @@ def test_fr08_5_top_level_child_different_service( child = _find_data_point(_duration_data_points(metrics), **{"datadog.operation.name": "postgres.query"}) assert child is not None, "No data point for the child span" attrs = _data_point_attrs(child) - assert attrs.get("datadog.span.top_level") in (True, 1), ( + assert attrs.get("datadog.span.top_level") is True, ( f"Expected datadog.span.top_level true on service-entry child, got attrs: {attrs}" ) From cb9fab23ac2b61393e81ff0b115457c5be79e838 Mon Sep 17 00:00:00 2001 From: Munir Abdinur Date: Thu, 6 Aug 2026 15:59:15 -0400 Subject: [PATCH 05/16] fix(manifest): preserve retired test tombstones --- manifests/cpp.yml | 1 + manifests/php.yml | 1 + manifests/ruby.yml | 1 + manifests/rust.yml | 1 + tests/test_the_test/test_manifest.py | 7 +++++++ utils/manifest/_internal/validate.py | 5 ++++- 6 files changed, 15 insertions(+), 1 deletion(-) diff --git a/manifests/cpp.yml b/manifests/cpp.yml index 2c7a94acb11..f7c4b102279 100644 --- a/manifests/cpp.yml +++ b/manifests/cpp.yml @@ -245,6 +245,7 @@ manifest: tests/parametric/test_otlp_trace_metrics.py::Test_FR05_Sampling_Independence: missing_feature tests/parametric/test_otlp_trace_metrics.py::Test_FR06_Otel_Resource_Attributes: missing_feature tests/parametric/test_otlp_trace_metrics.py::Test_FR06_Otel_Span_Attributes: missing_feature + tests/parametric/test_otlp_trace_metrics.py::Test_FR07_Otel_Semantics_Mode: irrelevant (OTel-semantics trace-metrics requirement retired) tests/parametric/test_otlp_trace_metrics.py::Test_FR08_AdditionalTags: missing_feature tests/parametric/test_otlp_trace_metrics.py::Test_FR08_Datadog_Attributes: missing_feature tests/parametric/test_otlp_trace_metrics.py::Test_FR09_Red_Metric_Derivation: missing_feature diff --git a/manifests/php.yml b/manifests/php.yml index 5a44e2dc4fc..133387ca984 100644 --- a/manifests/php.yml +++ b/manifests/php.yml @@ -1171,6 +1171,7 @@ manifest: tests/parametric/test_otlp_trace_metrics.py::Test_FR05_Sampling_Independence: missing_feature tests/parametric/test_otlp_trace_metrics.py::Test_FR06_Otel_Resource_Attributes: missing_feature tests/parametric/test_otlp_trace_metrics.py::Test_FR06_Otel_Span_Attributes: missing_feature + tests/parametric/test_otlp_trace_metrics.py::Test_FR07_Otel_Semantics_Mode: irrelevant (OTel-semantics trace-metrics requirement retired) tests/parametric/test_otlp_trace_metrics.py::Test_FR08_AdditionalTags: missing_feature tests/parametric/test_otlp_trace_metrics.py::Test_FR08_Datadog_Attributes: missing_feature tests/parametric/test_otlp_trace_metrics.py::Test_FR09_Red_Metric_Derivation: missing_feature diff --git a/manifests/ruby.yml b/manifests/ruby.yml index 1ae1603acb9..c9d0dc58807 100644 --- a/manifests/ruby.yml +++ b/manifests/ruby.yml @@ -2497,6 +2497,7 @@ manifest: tests/parametric/test_otlp_trace_metrics.py::Test_FR05_Sampling_Independence: missing_feature tests/parametric/test_otlp_trace_metrics.py::Test_FR06_Otel_Resource_Attributes: missing_feature tests/parametric/test_otlp_trace_metrics.py::Test_FR06_Otel_Span_Attributes: missing_feature + tests/parametric/test_otlp_trace_metrics.py::Test_FR07_Otel_Semantics_Mode: irrelevant (OTel-semantics trace-metrics requirement retired) tests/parametric/test_otlp_trace_metrics.py::Test_FR08_AdditionalTags: missing_feature tests/parametric/test_otlp_trace_metrics.py::Test_FR08_Datadog_Attributes: missing_feature tests/parametric/test_otlp_trace_metrics.py::Test_FR09_Red_Metric_Derivation: missing_feature diff --git a/manifests/rust.yml b/manifests/rust.yml index 7fc8dc4f4b1..8e0af5e0607 100644 --- a/manifests/rust.yml +++ b/manifests/rust.yml @@ -276,6 +276,7 @@ manifest: tests/parametric/test_otlp_trace_metrics.py::Test_FR05_Sampling_Independence: missing_feature tests/parametric/test_otlp_trace_metrics.py::Test_FR06_Otel_Resource_Attributes: missing_feature tests/parametric/test_otlp_trace_metrics.py::Test_FR06_Otel_Span_Attributes: missing_feature + tests/parametric/test_otlp_trace_metrics.py::Test_FR07_Otel_Semantics_Mode: irrelevant (OTel-semantics trace-metrics requirement retired) tests/parametric/test_otlp_trace_metrics.py::Test_FR08_AdditionalTags: missing_feature tests/parametric/test_otlp_trace_metrics.py::Test_FR08_Datadog_Attributes: missing_feature tests/parametric/test_otlp_trace_metrics.py::Test_FR09_Red_Metric_Derivation: missing_feature diff --git a/tests/test_the_test/test_manifest.py b/tests/test_the_test/test_manifest.py index 1e5ba8be614..dc3c2df60fa 100644 --- a/tests/test_the_test/test_manifest.py +++ b/tests/test_the_test/test_manifest.py @@ -375,6 +375,13 @@ def own_method(self): finally: shutil.rmtree(test_dir) + def test_irrelevant_nodeids_allow_tombstones(self): + manifest = { + "manifest": {"tests/test_the_test/test_manifest.py::Test_Retired": "irrelevant (requirement retired)"} + } + + assert assert_nodeids_exist(manifest) == [] + @scenarios.test_the_test class Test_ManifestEditor_WriteNewRules: diff --git a/utils/manifest/_internal/validate.py b/utils/manifest/_internal/validate.py index 58115311559..d0bb786f3be 100644 --- a/utils/manifest/_internal/validate.py +++ b/utils/manifest/_internal/validate.py @@ -147,7 +147,10 @@ def assert_nodeids_exist(obj: dict) -> list[str]: errors = [] module_cache: dict[str, object | None] = {} - for key in obj: + for key, declaration in obj.items(): + if isinstance(declaration, str) and declaration.startswith("irrelevant"): + continue + elements = key.split("::") if not Path(elements[0]).exists(): From 4b4e812f906b6797352dd3b419af4d09b105d39b Mon Sep 17 00:00:00 2001 From: Munir Abdinur Date: Thu, 6 Aug 2026 16:23:39 -0400 Subject: [PATCH 06/16] test(otlp-trace-metrics): clarify tracer tag names --- manifests/dotnet.yml | 4 ++-- manifests/nodejs.yml | 4 ++-- manifests/python.yml | 4 ++-- tests/parametric/test_otlp_trace_metrics.py | 4 ++-- 4 files changed, 8 insertions(+), 8 deletions(-) diff --git a/manifests/dotnet.yml b/manifests/dotnet.yml index b75497bc6c3..14f265e5d44 100644 --- a/manifests/dotnet.yml +++ b/manifests/dotnet.yml @@ -1029,8 +1029,8 @@ manifest: tests/parametric/test_otlp_trace_metrics.py::Test_FR06_Otel_Resource_Attributes::test_fr06_15_default_service_on_data_point: missing_feature (service.name is omitted from the data point when the span uses the configured default service) tests/parametric/test_otlp_trace_metrics.py::Test_FR06_Otel_Span_Attributes::test_fr06_2_span_kind: missing_feature (span.kind is emitted as the raw Datadog value, e.g. "server", not the SMC's SPAN_KIND_* convention) tests/parametric/test_otlp_trace_metrics.py::Test_FR06_Otel_Span_Attributes::test_fr06_8_status_code_error: missing_feature (status.code is emitted as an integer, e.g. 2, not the SMC's STATUS_CODE_ERROR string convention) - tests/parametric/test_otlp_trace_metrics.py::Test_FR08_AdditionalTags::test_fr08_10_dd_tags_resource_attributes: missing_feature (DD_TAGS is not yet reported as datadog.tracer_tags on the OTLP trace metrics resource) - tests/parametric/test_otlp_trace_metrics.py::Test_FR08_AdditionalTags::test_fr08_11_otel_resource_attributes_env: missing_feature (OTEL_RESOURCE_ATTRIBUTES is not yet reported as datadog.tracer_tags on the OTLP trace metrics resource) + tests/parametric/test_otlp_trace_metrics.py::Test_FR08_AdditionalTags::test_fr08_10_dd_tags_tracer_tags_resource_attributes: missing_feature (DD_TAGS is not yet reported as datadog.tracer_tags on the OTLP trace metrics resource) + tests/parametric/test_otlp_trace_metrics.py::Test_FR08_AdditionalTags::test_fr08_11_otel_resource_attributes_env_tracer_tags: missing_feature (OTEL_RESOURCE_ATTRIBUTES is not yet reported as datadog.tracer_tags on the OTLP trace metrics resource) tests/parametric/test_otlp_trace_metrics.py::Test_FR08_AdditionalTags::test_fr08_12_stats_additional_tags: missing_feature (DD_TRACE_STATS_ADDITIONAL_TAGS is not yet emitted as additional_metric_tags on OTLP trace metrics data points) tests/parametric/test_otlp_trace_metrics.py::Test_FR08_Datadog_Attributes::test_fr08_13_is_trace_root: missing_feature (datadog.is_trace_root is computed but never emitted on OTLP trace metrics data points) tests/parametric/test_otlp_trace_metrics.py::Test_FR08_Datadog_Attributes::test_fr08_14_peer_tags: missing_feature (Blocked on test-agent support for advertising a peer_tags allowlist in /info) diff --git a/manifests/nodejs.yml b/manifests/nodejs.yml index 87c162b3421..512ca7a72d6 100644 --- a/manifests/nodejs.yml +++ b/manifests/nodejs.yml @@ -2389,8 +2389,8 @@ manifest: tests/parametric/test_otlp_trace_metrics.py::Test_FR06_Otel_Resource_Attributes::test_fr06_15_default_service_on_data_point: missing_feature (service.name is omitted from the data point when the span uses the configured default service) tests/parametric/test_otlp_trace_metrics.py::Test_FR06_Otel_Span_Attributes::test_fr06_2_span_kind: missing_feature (span.kind is emitted as the raw Datadog value, e.g. "server", not the SMC's SPAN_KIND_* convention) tests/parametric/test_otlp_trace_metrics.py::Test_FR06_Otel_Span_Attributes::test_fr06_8_status_code_error: missing_feature (status.code is emitted as an integer, e.g. 2, not the SMC's STATUS_CODE_ERROR string convention) - tests/parametric/test_otlp_trace_metrics.py::Test_FR08_AdditionalTags::test_fr08_10_dd_tags_resource_attributes: missing_feature (DD_TAGS is not yet reported as datadog.tracer_tags on the OTLP trace metrics resource) - tests/parametric/test_otlp_trace_metrics.py::Test_FR08_AdditionalTags::test_fr08_11_otel_resource_attributes_env: missing_feature (OTEL_RESOURCE_ATTRIBUTES is not yet reported as datadog.tracer_tags on the OTLP trace metrics resource) + tests/parametric/test_otlp_trace_metrics.py::Test_FR08_AdditionalTags::test_fr08_10_dd_tags_tracer_tags_resource_attributes: missing_feature (DD_TAGS is not yet reported as datadog.tracer_tags on the OTLP trace metrics resource) + tests/parametric/test_otlp_trace_metrics.py::Test_FR08_AdditionalTags::test_fr08_11_otel_resource_attributes_env_tracer_tags: missing_feature (OTEL_RESOURCE_ATTRIBUTES is not yet reported as datadog.tracer_tags on the OTLP trace metrics resource) tests/parametric/test_otlp_trace_metrics.py::Test_FR08_AdditionalTags::test_fr08_12_stats_additional_tags: missing_feature (DD_TRACE_STATS_ADDITIONAL_TAGS is not forwarded to the native OTLP trace-metrics exporter) tests/parametric/test_otlp_trace_metrics.py::Test_FR08_Datadog_Attributes::test_fr08_13_is_trace_root: missing_feature (datadog.is_trace_root is not yet emitted on OTLP trace-metric data points) tests/parametric/test_otlp_trace_metrics.py::Test_FR08_Datadog_Attributes::test_fr08_14_peer_tags: missing_feature (Blocked on test-agent support for advertising a peer_tags allowlist in /info) diff --git a/manifests/python.yml b/manifests/python.yml index cc74906aeb1..b313863a3ae 100644 --- a/manifests/python.yml +++ b/manifests/python.yml @@ -2062,8 +2062,8 @@ manifest: tests/parametric/test_otlp_trace_metrics.py::Test_FR06_Otel_Span_Attributes::test_fr06_2_span_kind: missing_feature (span.kind is emitted as the raw Datadog value, e.g. "server", not the SMC's SPAN_KIND_* convention) tests/parametric/test_otlp_trace_metrics.py::Test_FR06_Otel_Span_Attributes::test_fr06_7_rpc_status_code: v4.14.0-dev tests/parametric/test_otlp_trace_metrics.py::Test_FR06_Otel_Span_Attributes::test_fr06_8_status_code_error: missing_feature (status.code is emitted as an integer, e.g. 2, not the SMC's STATUS_CODE_ERROR string convention) - tests/parametric/test_otlp_trace_metrics.py::Test_FR08_AdditionalTags::test_fr08_10_dd_tags_resource_attributes: missing_feature (DD_TAGS is not yet reported as datadog.tracer_tags on the OTLP trace metrics resource) - tests/parametric/test_otlp_trace_metrics.py::Test_FR08_AdditionalTags::test_fr08_11_otel_resource_attributes_env: missing_feature (OTEL_RESOURCE_ATTRIBUTES is not yet reported as datadog.tracer_tags on the OTLP trace metrics resource) + tests/parametric/test_otlp_trace_metrics.py::Test_FR08_AdditionalTags::test_fr08_10_dd_tags_tracer_tags_resource_attributes: missing_feature (DD_TAGS is not yet reported as datadog.tracer_tags on the OTLP trace metrics resource) + tests/parametric/test_otlp_trace_metrics.py::Test_FR08_AdditionalTags::test_fr08_11_otel_resource_attributes_env_tracer_tags: missing_feature (OTEL_RESOURCE_ATTRIBUTES is not yet reported as datadog.tracer_tags on the OTLP trace metrics resource) tests/parametric/test_otlp_trace_metrics.py::Test_FR08_AdditionalTags::test_fr08_12_stats_additional_tags: missing_feature (DD_TRACE_STATS_ADDITIONAL_TAGS is not forwarded to the native OTLP trace-metrics exporter) tests/parametric/test_otlp_trace_metrics.py::Test_FR08_Datadog_Attributes::test_fr08_13_is_trace_root: missing_feature (datadog.is_trace_root is emitted as _datadog.is_trace_root, with a leading underscore) tests/parametric/test_otlp_trace_metrics.py::Test_FR08_Datadog_Attributes::test_fr08_14_peer_tags: missing_feature (Blocked on test-agent support for advertising a peer_tags allowlist in /info) diff --git a/tests/parametric/test_otlp_trace_metrics.py b/tests/parametric/test_otlp_trace_metrics.py index 2c6fa4e6140..bb8939680cd 100644 --- a/tests/parametric/test_otlp_trace_metrics.py +++ b/tests/parametric/test_otlp_trace_metrics.py @@ -1326,7 +1326,7 @@ class Test_FR08_AdditionalTags: } ], ) - def test_fr08_10_dd_tags_resource_attributes( + def test_fr08_10_dd_tags_tracer_tags_resource_attributes( self, otlp_traces_and_metrics_library_env: dict[str, str], # noqa: ARG002 test_agent: TestAgentAPI, @@ -1358,7 +1358,7 @@ def test_fr08_10_dd_tags_resource_attributes( "library_env", [{**DEFAULT_ENVVARS_OTLP, "OTEL_RESOURCE_ATTRIBUTES": "team=apm,deployment.region=us-east-1"}], ) - def test_fr08_11_otel_resource_attributes_env( + def test_fr08_11_otel_resource_attributes_env_tracer_tags( self, otlp_traces_and_metrics_library_env: dict[str, str], # noqa: ARG002 test_agent: TestAgentAPI, From 2a4061f55a09a69f2752a67517f35cd99c2ca7e3 Mon Sep 17 00:00:00 2001 From: Munir Abdinur Date: Thu, 6 Aug 2026 16:37:13 -0400 Subject: [PATCH 07/16] Revert manifest tombstone validation --- tests/test_the_test/test_manifest.py | 7 ------- utils/manifest/_internal/validate.py | 5 +---- 2 files changed, 1 insertion(+), 11 deletions(-) diff --git a/tests/test_the_test/test_manifest.py b/tests/test_the_test/test_manifest.py index dc3c2df60fa..1e5ba8be614 100644 --- a/tests/test_the_test/test_manifest.py +++ b/tests/test_the_test/test_manifest.py @@ -375,13 +375,6 @@ def own_method(self): finally: shutil.rmtree(test_dir) - def test_irrelevant_nodeids_allow_tombstones(self): - manifest = { - "manifest": {"tests/test_the_test/test_manifest.py::Test_Retired": "irrelevant (requirement retired)"} - } - - assert assert_nodeids_exist(manifest) == [] - @scenarios.test_the_test class Test_ManifestEditor_WriteNewRules: diff --git a/utils/manifest/_internal/validate.py b/utils/manifest/_internal/validate.py index d0bb786f3be..58115311559 100644 --- a/utils/manifest/_internal/validate.py +++ b/utils/manifest/_internal/validate.py @@ -147,10 +147,7 @@ def assert_nodeids_exist(obj: dict) -> list[str]: errors = [] module_cache: dict[str, object | None] = {} - for key, declaration in obj.items(): - if isinstance(declaration, str) and declaration.startswith("irrelevant"): - continue - + for key in obj: elements = key.split("::") if not Path(elements[0]).exists(): From 96d676d04dcddefe43f177e593556ca0b20dc540 Mon Sep 17 00:00:00 2001 From: Munir Abdinur Date: Thu, 6 Aug 2026 16:38:27 -0400 Subject: [PATCH 08/16] Remove retired OTLP semantics tombstones --- manifests/cpp.yml | 1 - manifests/php.yml | 1 - manifests/ruby.yml | 1 - manifests/rust.yml | 1 - 4 files changed, 4 deletions(-) diff --git a/manifests/cpp.yml b/manifests/cpp.yml index f7c4b102279..2c7a94acb11 100644 --- a/manifests/cpp.yml +++ b/manifests/cpp.yml @@ -245,7 +245,6 @@ manifest: tests/parametric/test_otlp_trace_metrics.py::Test_FR05_Sampling_Independence: missing_feature tests/parametric/test_otlp_trace_metrics.py::Test_FR06_Otel_Resource_Attributes: missing_feature tests/parametric/test_otlp_trace_metrics.py::Test_FR06_Otel_Span_Attributes: missing_feature - tests/parametric/test_otlp_trace_metrics.py::Test_FR07_Otel_Semantics_Mode: irrelevant (OTel-semantics trace-metrics requirement retired) tests/parametric/test_otlp_trace_metrics.py::Test_FR08_AdditionalTags: missing_feature tests/parametric/test_otlp_trace_metrics.py::Test_FR08_Datadog_Attributes: missing_feature tests/parametric/test_otlp_trace_metrics.py::Test_FR09_Red_Metric_Derivation: missing_feature diff --git a/manifests/php.yml b/manifests/php.yml index 133387ca984..5a44e2dc4fc 100644 --- a/manifests/php.yml +++ b/manifests/php.yml @@ -1171,7 +1171,6 @@ manifest: tests/parametric/test_otlp_trace_metrics.py::Test_FR05_Sampling_Independence: missing_feature tests/parametric/test_otlp_trace_metrics.py::Test_FR06_Otel_Resource_Attributes: missing_feature tests/parametric/test_otlp_trace_metrics.py::Test_FR06_Otel_Span_Attributes: missing_feature - tests/parametric/test_otlp_trace_metrics.py::Test_FR07_Otel_Semantics_Mode: irrelevant (OTel-semantics trace-metrics requirement retired) tests/parametric/test_otlp_trace_metrics.py::Test_FR08_AdditionalTags: missing_feature tests/parametric/test_otlp_trace_metrics.py::Test_FR08_Datadog_Attributes: missing_feature tests/parametric/test_otlp_trace_metrics.py::Test_FR09_Red_Metric_Derivation: missing_feature diff --git a/manifests/ruby.yml b/manifests/ruby.yml index c9d0dc58807..1ae1603acb9 100644 --- a/manifests/ruby.yml +++ b/manifests/ruby.yml @@ -2497,7 +2497,6 @@ manifest: tests/parametric/test_otlp_trace_metrics.py::Test_FR05_Sampling_Independence: missing_feature tests/parametric/test_otlp_trace_metrics.py::Test_FR06_Otel_Resource_Attributes: missing_feature tests/parametric/test_otlp_trace_metrics.py::Test_FR06_Otel_Span_Attributes: missing_feature - tests/parametric/test_otlp_trace_metrics.py::Test_FR07_Otel_Semantics_Mode: irrelevant (OTel-semantics trace-metrics requirement retired) tests/parametric/test_otlp_trace_metrics.py::Test_FR08_AdditionalTags: missing_feature tests/parametric/test_otlp_trace_metrics.py::Test_FR08_Datadog_Attributes: missing_feature tests/parametric/test_otlp_trace_metrics.py::Test_FR09_Red_Metric_Derivation: missing_feature diff --git a/manifests/rust.yml b/manifests/rust.yml index 8e0af5e0607..7fc8dc4f4b1 100644 --- a/manifests/rust.yml +++ b/manifests/rust.yml @@ -276,7 +276,6 @@ manifest: tests/parametric/test_otlp_trace_metrics.py::Test_FR05_Sampling_Independence: missing_feature tests/parametric/test_otlp_trace_metrics.py::Test_FR06_Otel_Resource_Attributes: missing_feature tests/parametric/test_otlp_trace_metrics.py::Test_FR06_Otel_Span_Attributes: missing_feature - tests/parametric/test_otlp_trace_metrics.py::Test_FR07_Otel_Semantics_Mode: irrelevant (OTel-semantics trace-metrics requirement retired) tests/parametric/test_otlp_trace_metrics.py::Test_FR08_AdditionalTags: missing_feature tests/parametric/test_otlp_trace_metrics.py::Test_FR08_Datadog_Attributes: missing_feature tests/parametric/test_otlp_trace_metrics.py::Test_FR09_Red_Metric_Derivation: missing_feature From 94a981f80742facf8804e4da28496e9fe0d231b2 Mon Sep 17 00:00:00 2001 From: Munir Abdinur Date: Thu, 6 Aug 2026 16:40:35 -0400 Subject: [PATCH 09/16] test(otlp-trace-metrics): tolerate numeric top-level flags --- tests/parametric/test_otlp_trace_metrics.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/tests/parametric/test_otlp_trace_metrics.py b/tests/parametric/test_otlp_trace_metrics.py index bb8939680cd..4fe42251d0b 100644 --- a/tests/parametric/test_otlp_trace_metrics.py +++ b/tests/parametric/test_otlp_trace_metrics.py @@ -1067,7 +1067,7 @@ def test_fr08_3_top_level_root( metrics = _wait_for_otlp_metrics(test_agent) attrs = _data_point_attrs(_duration_data_points(metrics)[0]) - assert attrs.get("datadog.span.top_level") is True, ( + assert attrs.get("datadog.span.top_level") in (True, 1), ( f"Expected datadog.span.top_level truthy on root, got attrs: {attrs}" ) @@ -1095,7 +1095,7 @@ def test_fr08_4_top_level_child_same_service( child_point = _find_data_point(_duration_data_points(metrics), **{"datadog.operation.name": "child.op"}) assert child_point is not None, "No data point for the child span" attrs = _data_point_attrs(child_point) - assert attrs.get("datadog.span.top_level") is False, ( + assert attrs.get("datadog.span.top_level") in (False, 0), ( f"Expected datadog.span.top_level false on same-service child, got attrs: {attrs}" ) @@ -1119,7 +1119,7 @@ def test_fr08_5_top_level_child_different_service( child = _find_data_point(_duration_data_points(metrics), **{"datadog.operation.name": "postgres.query"}) assert child is not None, "No data point for the child span" attrs = _data_point_attrs(child) - assert attrs.get("datadog.span.top_level") is True, ( + assert attrs.get("datadog.span.top_level") in (True, 1), ( f"Expected datadog.span.top_level true on service-entry child, got attrs: {attrs}" ) @@ -1252,7 +1252,7 @@ def test_fr08_13_is_trace_root( service_entry_point = _find_data_point(points, **{"datadog.operation.name": "postgres.query"}) assert service_entry_point is not None, "No data point for the service-entry child span" service_entry_attrs = _data_point_attrs(service_entry_point) - assert service_entry_attrs.get("datadog.span.top_level") is True, ( + assert service_entry_attrs.get("datadog.span.top_level") in (True, 1), ( f"Expected datadog.span.top_level=true on the service-entry child: {service_entry_attrs}" ) assert service_entry_attrs.get("datadog.is_trace_root") is False, ( From 1fefd4f18c4c5c0e437d98763626a6213395b273 Mon Sep 17 00:00:00 2001 From: Munir Abdinur Date: Thu, 6 Aug 2026 16:41:30 -0400 Subject: [PATCH 10/16] test(otlp-trace-metrics): tolerate numeric trace-root flags --- tests/parametric/test_otlp_trace_metrics.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tests/parametric/test_otlp_trace_metrics.py b/tests/parametric/test_otlp_trace_metrics.py index 4fe42251d0b..834453144b4 100644 --- a/tests/parametric/test_otlp_trace_metrics.py +++ b/tests/parametric/test_otlp_trace_metrics.py @@ -1239,13 +1239,13 @@ def test_fr08_13_is_trace_root( root_point = _find_data_point(points, **{"datadog.operation.name": "web.request"}) assert root_point is not None, "No data point for the root span" - assert _data_point_attrs(root_point).get("datadog.is_trace_root") is True, ( + assert _data_point_attrs(root_point).get("datadog.is_trace_root") in (True, 1), ( f"Expected datadog.is_trace_root=true on the root span: {_data_point_attrs(root_point)}" ) same_service_point = _find_data_point(points, **{"datadog.operation.name": "child.op"}) assert same_service_point is not None, "No data point for the same-service child span" - assert _data_point_attrs(same_service_point).get("datadog.is_trace_root") is False, ( + assert _data_point_attrs(same_service_point).get("datadog.is_trace_root") in (False, 0), ( f"Expected datadog.is_trace_root=false on a non-root child: {_data_point_attrs(same_service_point)}" ) @@ -1255,7 +1255,7 @@ def test_fr08_13_is_trace_root( assert service_entry_attrs.get("datadog.span.top_level") in (True, 1), ( f"Expected datadog.span.top_level=true on the service-entry child: {service_entry_attrs}" ) - assert service_entry_attrs.get("datadog.is_trace_root") is False, ( + assert service_entry_attrs.get("datadog.is_trace_root") in (False, 0), ( f"A service-entry child is not the trace root; expected datadog.is_trace_root=false: {service_entry_attrs}" ) From bf4073d617d3387d7d92c3ebffbf993dd98fc205 Mon Sep 17 00:00:00 2001 From: Munir Abdinur Date: Thu, 6 Aug 2026 16:43:08 -0400 Subject: [PATCH 11/16] test(otlp-trace-metrics): keep top-level flags strict --- tests/parametric/test_otlp_trace_metrics.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/tests/parametric/test_otlp_trace_metrics.py b/tests/parametric/test_otlp_trace_metrics.py index 834453144b4..2a1c8d7745c 100644 --- a/tests/parametric/test_otlp_trace_metrics.py +++ b/tests/parametric/test_otlp_trace_metrics.py @@ -1067,7 +1067,7 @@ def test_fr08_3_top_level_root( metrics = _wait_for_otlp_metrics(test_agent) attrs = _data_point_attrs(_duration_data_points(metrics)[0]) - assert attrs.get("datadog.span.top_level") in (True, 1), ( + assert attrs.get("datadog.span.top_level") is True, ( f"Expected datadog.span.top_level truthy on root, got attrs: {attrs}" ) @@ -1095,7 +1095,7 @@ def test_fr08_4_top_level_child_same_service( child_point = _find_data_point(_duration_data_points(metrics), **{"datadog.operation.name": "child.op"}) assert child_point is not None, "No data point for the child span" attrs = _data_point_attrs(child_point) - assert attrs.get("datadog.span.top_level") in (False, 0), ( + assert attrs.get("datadog.span.top_level") is False, ( f"Expected datadog.span.top_level false on same-service child, got attrs: {attrs}" ) @@ -1119,7 +1119,7 @@ def test_fr08_5_top_level_child_different_service( child = _find_data_point(_duration_data_points(metrics), **{"datadog.operation.name": "postgres.query"}) assert child is not None, "No data point for the child span" attrs = _data_point_attrs(child) - assert attrs.get("datadog.span.top_level") in (True, 1), ( + assert attrs.get("datadog.span.top_level") is True, ( f"Expected datadog.span.top_level true on service-entry child, got attrs: {attrs}" ) @@ -1252,7 +1252,7 @@ def test_fr08_13_is_trace_root( service_entry_point = _find_data_point(points, **{"datadog.operation.name": "postgres.query"}) assert service_entry_point is not None, "No data point for the service-entry child span" service_entry_attrs = _data_point_attrs(service_entry_point) - assert service_entry_attrs.get("datadog.span.top_level") in (True, 1), ( + assert service_entry_attrs.get("datadog.span.top_level") is True, ( f"Expected datadog.span.top_level=true on the service-entry child: {service_entry_attrs}" ) assert service_entry_attrs.get("datadog.is_trace_root") in (False, 0), ( From 2958906b3b6553a3dbc4f697bca508843e5dfa45 Mon Sep 17 00:00:00 2001 From: Munir Abdinur Date: Thu, 6 Aug 2026 16:46:20 -0400 Subject: [PATCH 12/16] test(otlp-trace-metrics): align Boolean flag assertions --- tests/parametric/test_otlp_trace_metrics.py | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/tests/parametric/test_otlp_trace_metrics.py b/tests/parametric/test_otlp_trace_metrics.py index 2a1c8d7745c..4fe42251d0b 100644 --- a/tests/parametric/test_otlp_trace_metrics.py +++ b/tests/parametric/test_otlp_trace_metrics.py @@ -1067,7 +1067,7 @@ def test_fr08_3_top_level_root( metrics = _wait_for_otlp_metrics(test_agent) attrs = _data_point_attrs(_duration_data_points(metrics)[0]) - assert attrs.get("datadog.span.top_level") is True, ( + assert attrs.get("datadog.span.top_level") in (True, 1), ( f"Expected datadog.span.top_level truthy on root, got attrs: {attrs}" ) @@ -1095,7 +1095,7 @@ def test_fr08_4_top_level_child_same_service( child_point = _find_data_point(_duration_data_points(metrics), **{"datadog.operation.name": "child.op"}) assert child_point is not None, "No data point for the child span" attrs = _data_point_attrs(child_point) - assert attrs.get("datadog.span.top_level") is False, ( + assert attrs.get("datadog.span.top_level") in (False, 0), ( f"Expected datadog.span.top_level false on same-service child, got attrs: {attrs}" ) @@ -1119,7 +1119,7 @@ def test_fr08_5_top_level_child_different_service( child = _find_data_point(_duration_data_points(metrics), **{"datadog.operation.name": "postgres.query"}) assert child is not None, "No data point for the child span" attrs = _data_point_attrs(child) - assert attrs.get("datadog.span.top_level") is True, ( + assert attrs.get("datadog.span.top_level") in (True, 1), ( f"Expected datadog.span.top_level true on service-entry child, got attrs: {attrs}" ) @@ -1239,23 +1239,23 @@ def test_fr08_13_is_trace_root( root_point = _find_data_point(points, **{"datadog.operation.name": "web.request"}) assert root_point is not None, "No data point for the root span" - assert _data_point_attrs(root_point).get("datadog.is_trace_root") in (True, 1), ( + assert _data_point_attrs(root_point).get("datadog.is_trace_root") is True, ( f"Expected datadog.is_trace_root=true on the root span: {_data_point_attrs(root_point)}" ) same_service_point = _find_data_point(points, **{"datadog.operation.name": "child.op"}) assert same_service_point is not None, "No data point for the same-service child span" - assert _data_point_attrs(same_service_point).get("datadog.is_trace_root") in (False, 0), ( + assert _data_point_attrs(same_service_point).get("datadog.is_trace_root") is False, ( f"Expected datadog.is_trace_root=false on a non-root child: {_data_point_attrs(same_service_point)}" ) service_entry_point = _find_data_point(points, **{"datadog.operation.name": "postgres.query"}) assert service_entry_point is not None, "No data point for the service-entry child span" service_entry_attrs = _data_point_attrs(service_entry_point) - assert service_entry_attrs.get("datadog.span.top_level") is True, ( + assert service_entry_attrs.get("datadog.span.top_level") in (True, 1), ( f"Expected datadog.span.top_level=true on the service-entry child: {service_entry_attrs}" ) - assert service_entry_attrs.get("datadog.is_trace_root") in (False, 0), ( + assert service_entry_attrs.get("datadog.is_trace_root") is False, ( f"A service-entry child is not the trace root; expected datadog.is_trace_root=false: {service_entry_attrs}" ) From c6cf11eb3413dfba7dcfbe1676910ece4c215325 Mon Sep 17 00:00:00 2001 From: Munir Abdinur Date: Thu, 6 Aug 2026 17:11:08 -0400 Subject: [PATCH 13/16] test(otlp-trace-metrics): derive service source --- tests/parametric/test_otlp_trace_metrics.py | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/tests/parametric/test_otlp_trace_metrics.py b/tests/parametric/test_otlp_trace_metrics.py index 4fe42251d0b..37845a9a82a 100644 --- a/tests/parametric/test_otlp_trace_metrics.py +++ b/tests/parametric/test_otlp_trace_metrics.py @@ -68,6 +68,7 @@ from utils.docker_fixtures._test_agent import AgentRequest from utils.docker_fixtures.spec.trace import SPAN_MEASURED_KEY from utils.docker_fixtures.spec.trace import ORIGIN +from utils.docker_fixtures.spec.trace import find_only_span from .conftest import APMLibrary @@ -1286,19 +1287,22 @@ def test_fr08_14_peer_tags( peer_tags = attrs.get("datadog.peer_tags") or [] assert "db.hostname:prod-db-1" in peer_tags, f"Expected db.hostname:prod-db-1 in datadog.peer_tags: {attrs}" - @pytest.mark.parametrize("library_env", [{**DEFAULT_ENVVARS_OTLP}]) + @pytest.mark.parametrize("library_env", [{**DEFAULT_ENVVARS, "DD_SERVICE": "default-service"}]) def test_fr08_15_service_source( self, - otlp_traces_and_metrics_library_env: dict[str, str], # noqa: ARG002 + otlp_trace_metrics_library_env: dict[str, str], # noqa: ARG002 test_agent: TestAgentAPI, test_library: APMLibrary, ): """The service override source maps to the string attribute datadog.svc_src.""" with test_library as t: - with t.dd_start_span(name="mapped.request", service="mapped-service", typestr="web") as span: - span.set_meta("_dd.svc_src", "m") + with t.dd_start_span(name="mapped.request", service="mapped-service", typestr="web"): + pass t.dd_flush() + span = find_only_span(test_agent.wait_for_num_traces(1)) + assert span["meta"].get("_dd.svc_src") == "m", f"Expected _dd.svc_src=m on the span, got: {span}" + metrics = _wait_for_otlp_metrics(test_agent) point = _find_data_point(_duration_data_points(metrics), **{"datadog.operation.name": "mapped.request"}) assert point is not None, "No data point for the service-override span" From 2c98fd2254d5a5fe1a05d312488d6416bd62c5ec Mon Sep 17 00:00:00 2001 From: Munir Abdinur Date: Thu, 6 Aug 2026 17:17:25 -0400 Subject: [PATCH 14/16] test(otlp-trace-metrics): check service source presence --- tests/parametric/test_otlp_trace_metrics.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/parametric/test_otlp_trace_metrics.py b/tests/parametric/test_otlp_trace_metrics.py index 37845a9a82a..d0a5c57d23e 100644 --- a/tests/parametric/test_otlp_trace_metrics.py +++ b/tests/parametric/test_otlp_trace_metrics.py @@ -1301,13 +1301,13 @@ def test_fr08_15_service_source( t.dd_flush() span = find_only_span(test_agent.wait_for_num_traces(1)) - assert span["meta"].get("_dd.svc_src") == "m", f"Expected _dd.svc_src=m on the span, got: {span}" + assert "_dd.svc_src" in span["meta"], f"Expected _dd.svc_src on the span, got: {span}" metrics = _wait_for_otlp_metrics(test_agent) point = _find_data_point(_duration_data_points(metrics), **{"datadog.operation.name": "mapped.request"}) assert point is not None, "No data point for the service-override span" attrs = _data_point_attrs(point) - assert attrs.get("datadog.svc_src"), f"Expected datadog.svc_src to be set, got attrs: {attrs}" + assert "datadog.svc_src" in attrs, f"Expected datadog.svc_src to be set, got attrs: {attrs}" @scenarios.parametric From 52a6f0d66540c2c8fb55587eb6c8c2bfc406f2d1 Mon Sep 17 00:00:00 2001 From: Munir Abdinur Date: Thu, 6 Aug 2026 23:54:06 -0400 Subject: [PATCH 15/16] test(otlp-trace-metrics): align branch verification --- manifests/dotnet.yml | 3 +-- manifests/golang.yml | 5 +++-- manifests/java.yml | 5 +++-- tests/parametric/test_otlp_trace_metrics.py | 19 ++++++++++++------- 4 files changed, 19 insertions(+), 13 deletions(-) diff --git a/manifests/dotnet.yml b/manifests/dotnet.yml index 14f265e5d44..502d71d2394 100644 --- a/manifests/dotnet.yml +++ b/manifests/dotnet.yml @@ -1031,8 +1031,7 @@ manifest: tests/parametric/test_otlp_trace_metrics.py::Test_FR06_Otel_Span_Attributes::test_fr06_8_status_code_error: missing_feature (status.code is emitted as an integer, e.g. 2, not the SMC's STATUS_CODE_ERROR string convention) tests/parametric/test_otlp_trace_metrics.py::Test_FR08_AdditionalTags::test_fr08_10_dd_tags_tracer_tags_resource_attributes: missing_feature (DD_TAGS is not yet reported as datadog.tracer_tags on the OTLP trace metrics resource) tests/parametric/test_otlp_trace_metrics.py::Test_FR08_AdditionalTags::test_fr08_11_otel_resource_attributes_env_tracer_tags: missing_feature (OTEL_RESOURCE_ATTRIBUTES is not yet reported as datadog.tracer_tags on the OTLP trace metrics resource) - tests/parametric/test_otlp_trace_metrics.py::Test_FR08_AdditionalTags::test_fr08_12_stats_additional_tags: missing_feature (DD_TRACE_STATS_ADDITIONAL_TAGS is not yet emitted as additional_metric_tags on OTLP trace metrics data points) - tests/parametric/test_otlp_trace_metrics.py::Test_FR08_Datadog_Attributes::test_fr08_13_is_trace_root: missing_feature (datadog.is_trace_root is computed but never emitted on OTLP trace metrics data points) + tests/parametric/test_otlp_trace_metrics.py::Test_FR08_Datadog_Attributes::test_fr08_13_is_trace_root: missing_feature (pending implementation release) tests/parametric/test_otlp_trace_metrics.py::Test_FR08_Datadog_Attributes::test_fr08_14_peer_tags: missing_feature (Blocked on test-agent support for advertising a peer_tags allowlist in /info) tests/parametric/test_otlp_trace_metrics.py::Test_FR08_Datadog_Attributes::test_fr08_15_service_source: missing_feature (pending implementation release) tests/parametric/test_otlp_trace_metrics.py::Test_FR08_Datadog_Attributes::test_fr08_8_process_tags: missing_feature (process tags are not yet emitted on the OTLP trace metrics resource) diff --git a/manifests/golang.yml b/manifests/golang.yml index 6b8ca5facfe..f08c4d4f2de 100644 --- a/manifests/golang.yml +++ b/manifests/golang.yml @@ -1537,8 +1537,9 @@ manifest: tests/parametric/test_otlp_trace_metrics.py::Test_FR06_Otel_Resource_Attributes::test_fr06_15_default_service_on_data_point: missing_feature (default service not on data point) tests/parametric/test_otlp_trace_metrics.py::Test_FR06_Otel_Span_Attributes::test_fr06_2_span_kind: missing_feature (span.kind is emitted as the raw Datadog value, e.g. "server", not the SMC's SPAN_KIND_* convention) tests/parametric/test_otlp_trace_metrics.py::Test_FR06_Otel_Span_Attributes::test_fr06_8_status_code_error: missing_feature (status.code is emitted as an integer, e.g. 2, not the SMC's STATUS_CODE_ERROR string convention) - tests/parametric/test_otlp_trace_metrics.py::Test_FR08_AdditionalTags: missing_feature (datadog.tracer_tags / DD_TRACE_STATS_ADDITIONAL_TAGS per-key attrs not yet implemented) - tests/parametric/test_otlp_trace_metrics.py::Test_FR08_Datadog_Attributes::test_fr08_13_is_trace_root: missing_feature (datadog.is_trace_root not emitted) + tests/parametric/test_otlp_trace_metrics.py::Test_FR08_AdditionalTags::test_fr08_10_dd_tags_tracer_tags_resource_attributes: missing_feature (DD_TAGS is not yet reported as datadog.tracer_tags on the OTLP trace metrics resource) + tests/parametric/test_otlp_trace_metrics.py::Test_FR08_AdditionalTags::test_fr08_11_otel_resource_attributes_env_tracer_tags: missing_feature (OTEL_RESOURCE_ATTRIBUTES is not yet reported as datadog.tracer_tags on the OTLP trace metrics resource) + tests/parametric/test_otlp_trace_metrics.py::Test_FR08_Datadog_Attributes::test_fr08_13_is_trace_root: missing_feature (pending implementation release) tests/parametric/test_otlp_trace_metrics.py::Test_FR08_Datadog_Attributes::test_fr08_14_peer_tags: missing_feature (Blocked on test-agent support for advertising a peer_tags allowlist in /info) tests/parametric/test_otlp_trace_metrics.py::Test_FR08_Datadog_Attributes::test_fr08_15_service_source: missing_feature (pending implementation release) tests/parametric/test_otlp_trace_metrics.py::Test_FR08_Datadog_Attributes::test_fr08_8_process_tags: missing_feature (process_tags is split into per-key datadog. resource attributes instead of one combined datadog.process_tags arrayValue) diff --git a/manifests/java.yml b/manifests/java.yml index cdd970db27b..c53b19aae7d 100644 --- a/manifests/java.yml +++ b/manifests/java.yml @@ -3993,8 +3993,9 @@ manifest: tests/parametric/test_otlp_trace_metrics.py::Test_FR06_Otel_Resource_Attributes::test_fr06_15_default_service_on_data_point: missing_feature (service.name is omitted from the data point when the span uses the configured default service) tests/parametric/test_otlp_trace_metrics.py::Test_FR06_Otel_Span_Attributes::test_fr06_2_span_kind: missing_feature (span.kind is emitted as the raw Datadog value, e.g. "server", not the SMC's SPAN_KIND_* convention) tests/parametric/test_otlp_trace_metrics.py::Test_FR06_Otel_Span_Attributes::test_fr06_8_status_code_error: missing_feature (status.code is emitted as the bare string "ERROR" instead of the SMC's STATUS_CODE_ERROR convention, and is omitted entirely for non-error spans) - tests/parametric/test_otlp_trace_metrics.py::Test_FR08_AdditionalTags: missing_feature (DD_TAGS/OTEL_RESOURCE_ATTRIBUTES are not yet emitted as the datadog.tracer_tags resource attribute; support coming in a future PR) - tests/parametric/test_otlp_trace_metrics.py::Test_FR08_Datadog_Attributes::test_fr08_13_is_trace_root: missing_feature (datadog.is_trace_root is computed but never emitted on OTLP trace metrics data points) + tests/parametric/test_otlp_trace_metrics.py::Test_FR08_AdditionalTags::test_fr08_10_dd_tags_tracer_tags_resource_attributes: missing_feature (DD_TAGS is not yet reported as datadog.tracer_tags on the OTLP trace metrics resource) + tests/parametric/test_otlp_trace_metrics.py::Test_FR08_AdditionalTags::test_fr08_11_otel_resource_attributes_env_tracer_tags: missing_feature (OTEL_RESOURCE_ATTRIBUTES is not yet reported as datadog.tracer_tags on the OTLP trace metrics resource) + tests/parametric/test_otlp_trace_metrics.py::Test_FR08_Datadog_Attributes::test_fr08_13_is_trace_root: missing_feature (pending implementation release) tests/parametric/test_otlp_trace_metrics.py::Test_FR08_Datadog_Attributes::test_fr08_14_peer_tags: missing_feature (Blocked on test-agent support for advertising a peer_tags allowlist in /info) tests/parametric/test_otlp_trace_metrics.py::Test_FR08_Datadog_Attributes::test_fr08_15_service_source: missing_feature (pending implementation release) tests/parametric/test_otlp_trace_metrics.py::Test_FR08_Datadog_Attributes::test_fr08_8_process_tags: missing_feature (process_tags is split into per-key datadog. resource attributes instead of one combined datadog.process_tags arrayValue) diff --git a/tests/parametric/test_otlp_trace_metrics.py b/tests/parametric/test_otlp_trace_metrics.py index d0a5c57d23e..bab1f18630e 100644 --- a/tests/parametric/test_otlp_trace_metrics.py +++ b/tests/parametric/test_otlp_trace_metrics.py @@ -68,7 +68,6 @@ from utils.docker_fixtures._test_agent import AgentRequest from utils.docker_fixtures.spec.trace import SPAN_MEASURED_KEY from utils.docker_fixtures.spec.trace import ORIGIN -from utils.docker_fixtures.spec.trace import find_only_span from .conftest import APMLibrary @@ -1287,10 +1286,10 @@ def test_fr08_14_peer_tags( peer_tags = attrs.get("datadog.peer_tags") or [] assert "db.hostname:prod-db-1" in peer_tags, f"Expected db.hostname:prod-db-1 in datadog.peer_tags: {attrs}" - @pytest.mark.parametrize("library_env", [{**DEFAULT_ENVVARS, "DD_SERVICE": "default-service"}]) + @pytest.mark.parametrize("library_env", [{**DEFAULT_ENVVARS_OTLP, "DD_SERVICE": "default-service"}]) def test_fr08_15_service_source( self, - otlp_trace_metrics_library_env: dict[str, str], # noqa: ARG002 + otlp_traces_and_metrics_library_env: dict[str, str], # noqa: ARG002 test_agent: TestAgentAPI, test_library: APMLibrary, ): @@ -1300,9 +1299,6 @@ def test_fr08_15_service_source( pass t.dd_flush() - span = find_only_span(test_agent.wait_for_num_traces(1)) - assert "_dd.svc_src" in span["meta"], f"Expected _dd.svc_src on the span, got: {span}" - metrics = _wait_for_otlp_metrics(test_agent) point = _find_data_point(_duration_data_points(metrics), **{"datadog.operation.name": "mapped.request"}) assert point is not None, "No data point for the service-override span" @@ -1385,7 +1381,16 @@ def test_fr08_11_otel_resource_attributes_env_tracer_tags( @pytest.mark.parametrize( "library_env", - [{**DEFAULT_ENVVARS_OTLP, "DD_TRACE_STATS_ADDITIONAL_TAGS": "customer.tier,region"}], + [ + { + **DEFAULT_ENVVARS_OTLP, + # Go uses a Boolean gate; other tracers list the experimental feature by name. + "DD_TRACE_STATS_ADDITIONAL_TAGS": "customer.tier,region", + "DD_TRACE_EXPERIMENTAL_FEATURES_ENABLED": ( + "true" if context.library.name == "golang" else "DD_TRACE_STATS_ADDITIONAL_TAGS" + ), + } + ], ) def test_fr08_12_stats_additional_tags( self, From e6a20a15165b9816429abf5aa30d3a58cef8cba5 Mon Sep 17 00:00:00 2001 From: Munir Abdinur Date: Fri, 7 Aug 2026 00:05:36 -0400 Subject: [PATCH 16/16] test(otlp-trace-metrics): gate unreleased dotnet tags --- manifests/dotnet.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/manifests/dotnet.yml b/manifests/dotnet.yml index 502d71d2394..7fb1ca12d51 100644 --- a/manifests/dotnet.yml +++ b/manifests/dotnet.yml @@ -1031,6 +1031,7 @@ manifest: tests/parametric/test_otlp_trace_metrics.py::Test_FR06_Otel_Span_Attributes::test_fr06_8_status_code_error: missing_feature (status.code is emitted as an integer, e.g. 2, not the SMC's STATUS_CODE_ERROR string convention) tests/parametric/test_otlp_trace_metrics.py::Test_FR08_AdditionalTags::test_fr08_10_dd_tags_tracer_tags_resource_attributes: missing_feature (DD_TAGS is not yet reported as datadog.tracer_tags on the OTLP trace metrics resource) tests/parametric/test_otlp_trace_metrics.py::Test_FR08_AdditionalTags::test_fr08_11_otel_resource_attributes_env_tracer_tags: missing_feature (OTEL_RESOURCE_ATTRIBUTES is not yet reported as datadog.tracer_tags on the OTLP trace metrics resource) + tests/parametric/test_otlp_trace_metrics.py::Test_FR08_AdditionalTags::test_fr08_12_stats_additional_tags: missing_feature (pending implementation release) tests/parametric/test_otlp_trace_metrics.py::Test_FR08_Datadog_Attributes::test_fr08_13_is_trace_root: missing_feature (pending implementation release) tests/parametric/test_otlp_trace_metrics.py::Test_FR08_Datadog_Attributes::test_fr08_14_peer_tags: missing_feature (Blocked on test-agent support for advertising a peer_tags allowlist in /info) tests/parametric/test_otlp_trace_metrics.py::Test_FR08_Datadog_Attributes::test_fr08_15_service_source: missing_feature (pending implementation release)