From cbb0e8222afb1148fc950f188de874b9f3de3ce4 Mon Sep 17 00:00:00 2001 From: Douglas Q Hawkins Date: Mon, 19 Oct 2026 16:09:38 -0400 Subject: [PATCH 1/2] Rebuild tracer tags when remote config toggles Data Streams ConfigSnapshot reused the previous mergedTracerTags whenever the tracing tags were unchanged, but withTracerTags also depends on whether Data Streams Monitoring is enabled. Enabling or disabling DSM through remote config, without a tag change, left _dd.dsm.enabled stale on new spans. Co-Authored-By: Claude Opus 5.5 --- .../src/main/java/datadog/trace/core/CoreTracer.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/dd-trace-core/src/main/java/datadog/trace/core/CoreTracer.java b/dd-trace-core/src/main/java/datadog/trace/core/CoreTracer.java index 8f52b49052c..52110f9f0e8 100644 --- a/dd-trace-core/src/main/java/datadog/trace/core/CoreTracer.java +++ b/dd-trace-core/src/main/java/datadog/trace/core/CoreTracer.java @@ -2610,7 +2610,9 @@ protected ConfigSnapshot( if (null == oldSnapshot) { mergedTracerTags = CoreTracer.this.defaultSpanTags.immutableCopy(); this.mergedTracerTagsNeedsIntercept = CoreTracer.this.defaultSpanTagsNeedsIntercept; - } else if (getTracingTags().equals(oldSnapshot.getTracingTags())) { + } else if (getTracingTags().equals(oldSnapshot.getTracingTags()) + // withTracerTags also depends on whether Data Streams Monitoring is enabled + && isDataStreamsEnabled() == oldSnapshot.isDataStreamsEnabled()) { mergedTracerTags = oldSnapshot.mergedTracerTags; mergedTracerTagsNeedsIntercept = oldSnapshot.mergedTracerTagsNeedsIntercept; } else { From 3b8dd31a20b0f016e4634190256ea4dadb21f49a Mon Sep 17 00:00:00 2001 From: Douglas Q Hawkins Date: Mon, 19 Oct 2026 16:09:40 -0400 Subject: [PATCH 2/2] Test that remote config DSM toggle updates tracer tags Co-Authored-By: Claude Opus 5.5 --- .../datadog/trace/core/CoreTracerTest.java | 44 +++++++++++++++++++ 1 file changed, 44 insertions(+) diff --git a/dd-trace-core/src/test/java/datadog/trace/core/CoreTracerTest.java b/dd-trace-core/src/test/java/datadog/trace/core/CoreTracerTest.java index 666431d8f1f..9c13831a2c1 100644 --- a/dd-trace-core/src/test/java/datadog/trace/core/CoreTracerTest.java +++ b/dd-trace-core/src/test/java/datadog/trace/core/CoreTracerTest.java @@ -597,6 +597,50 @@ void verifyConfigurationPollingWithCustomTags( } } + /** + * Remote config can enable Data Streams Monitoring without changing the tracing tags; the tags + * every span starts with must still pick up (and later drop) {@code _dd.dsm.enabled}. + */ + @Test + void remoteConfigDataStreamsToggleUpdatesTracerTags() throws Exception { + ParsedConfigKey key = ParsedConfigKey.parse("datadog/2/APM_TRACING/config_overrides/config"); + ConfigurationPoller poller = mock(ConfigurationPoller.class); + SharedCommunicationObjects sco = createScoWithPoller(poller); + + ProductListener[] capturedUpdater = {null}; + doAnswer( + inv -> { + capturedUpdater[0] = inv.getArgument(1, ProductListener.class); + return null; + }) + .when(poller) + .addListener(eq(Product.APM_TRACING), any(ProductListener.class)); + + CoreTracer tracer = + CoreTracer.builder().sharedCommunicationObjects(sco).pollForTracingConfiguration().build(); + unclosedTracers.add(tracer); + + try { + assertFalse(tracer.captureTraceConfig().isDataStreamsEnabled()); + assertFalse(tracer.captureTraceConfig().mergedTracerTags.containsKey(DDTags.DSM_ENABLED)); + + String json = "{\"lib_config\":{\"data_streams_enabled\": true}}"; + capturedUpdater[0].accept(key, json.getBytes(StandardCharsets.UTF_8), null); + capturedUpdater[0].commit(null); + + ConfigSnapshot config = tracer.captureTraceConfig(); + assertTrue(config.isDataStreamsEnabled()); + assertEquals(1, config.mergedTracerTags.get(DDTags.DSM_ENABLED)); + + capturedUpdater[0].remove(key, null); + capturedUpdater[0].commit(null); + + assertFalse(tracer.captureTraceConfig().mergedTracerTags.containsKey(DDTags.DSM_ENABLED)); + } finally { + tracer.close(); + } + } + static final String ACTION_JSON = "'{\"action\": \"enable\", \"lib_config\":" + "{\"tracing_sampling_rate\": null,"