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 { 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,"