From e9b55d06c780784002b95a5381aa65a418811899 Mon Sep 17 00:00:00 2001 From: Brice Dutheil Date: Wed, 8 Apr 2026 12:06:33 +0200 Subject: [PATCH] feat(metrics): Config to disable agent version check for trace stats computation --- .../ddagent/DDAgentFeaturesDiscovery.java | 9 +++- .../ddagent/SharedCommunicationObjects.java | 3 +- .../DDAgentFeaturesDiscoveryTest.groovy | 44 +++++++++---------- .../appsec/benchmark/AppSecBenchmark.java | 3 +- .../test/InstrumentationSpecification.groovy | 2 +- .../datastreams/MockFeaturesDiscovery.java | 2 +- .../trace/api/config/GeneralConfig.java | 2 + .../ConflatingMetricsAggregatorBenchmark.java | 2 +- .../trace/common/writer/DDAgentWriter.java | 13 +++++- .../TracerConnectionReliabilityTest.groovy | 2 +- .../trace/common/writer/DDAgentApiTest.groovy | 2 +- .../writer/DDAgentWriterCombinedTest.groovy | 4 +- .../groovy/DDApiIntegrationTest.groovy | 4 +- .../groovy/TraceMapperRealAgentTest.groovy | 4 +- .../main/java/datadog/trace/api/Config.java | 10 +++++ metadata/supported-configurations.json | 8 ++++ 16 files changed, 76 insertions(+), 38 deletions(-) diff --git a/communication/src/main/java/datadog/communication/ddagent/DDAgentFeaturesDiscovery.java b/communication/src/main/java/datadog/communication/ddagent/DDAgentFeaturesDiscovery.java index 755094cc2e4..42b94fa1567 100644 --- a/communication/src/main/java/datadog/communication/ddagent/DDAgentFeaturesDiscovery.java +++ b/communication/src/main/java/datadog/communication/ddagent/DDAgentFeaturesDiscovery.java @@ -76,6 +76,7 @@ public class DDAgentFeaturesDiscovery implements DroppingPolicy { private final String[] metricsEndpoints = {V06_METRICS_ENDPOINT}; private final String[] configEndpoints = {V07_CONFIG_ENDPOINT}; private final boolean metricsEnabled; + private final boolean ignoreAgentVersionForStats; private final String[] dataStreamsEndpoints = {V01_DATASTREAMS_ENDPOINT}; // ordered from most recent to least recent, as the logic will stick with the first one that is // available @@ -108,10 +109,12 @@ public DDAgentFeaturesDiscovery( Monitoring monitoring, HttpUrl agentUrl, boolean enableV05Traces, - boolean metricsEnabled) { + boolean metricsEnabled, + boolean ignoreAgentVersionForStats) { this.client = client; this.agentBaseUrl = agentUrl; this.metricsEnabled = metricsEnabled; + this.ignoreAgentVersionForStats = ignoreAgentVersionForStats; this.traceEndpoints = enableV05Traces ? new String[] {V05_ENDPOINT, V04_ENDPOINT, V03_ENDPOINT} @@ -301,7 +304,9 @@ private boolean processInfoResponse(State newState, String response) { || Boolean.TRUE.equals(canDrop)); newState.supportsClientSideStats = - newState.supportsDropping && !AgentVersion.isVersionBelow(newState.version, 7, 65, 0); + newState.supportsDropping + && (ignoreAgentVersionForStats + || !AgentVersion.isVersionBelow(newState.version, 7, 65, 0)); Object peer_tags = map.get("peer_tags"); newState.peerTags = diff --git a/communication/src/main/java/datadog/communication/ddagent/SharedCommunicationObjects.java b/communication/src/main/java/datadog/communication/ddagent/SharedCommunicationObjects.java index e261e56714f..41b06f7fc4b 100644 --- a/communication/src/main/java/datadog/communication/ddagent/SharedCommunicationObjects.java +++ b/communication/src/main/java/datadog/communication/ddagent/SharedCommunicationObjects.java @@ -174,7 +174,8 @@ public DDAgentFeaturesDiscovery featuresDiscovery(Config config) { monitoring, agentUrl, config.isTraceAgentV05Enabled(), - config.isTracerMetricsEnabled()); + config.isTracerMetricsEnabled(), + config.isTracerMetricsIgnoreAgentVersion()); if (paused) { // defer remote discovery until remote I/O is allowed diff --git a/communication/src/test/groovy/datadog/communication/ddagent/DDAgentFeaturesDiscoveryTest.groovy b/communication/src/test/groovy/datadog/communication/ddagent/DDAgentFeaturesDiscoveryTest.groovy index 505595e55e7..ce5c7263efd 100644 --- a/communication/src/test/groovy/datadog/communication/ddagent/DDAgentFeaturesDiscoveryTest.groovy +++ b/communication/src/test/groovy/datadog/communication/ddagent/DDAgentFeaturesDiscoveryTest.groovy @@ -51,7 +51,7 @@ class DDAgentFeaturesDiscoveryTest extends DDSpecification { def "test parse /info response"() { setup: OkHttpClient client = Mock(OkHttpClient) - DDAgentFeaturesDiscovery features = new DDAgentFeaturesDiscovery(client, monitoring, agentUrl, v05Enabled, true) + DDAgentFeaturesDiscovery features = new DDAgentFeaturesDiscovery(client, monitoring, agentUrl, v05Enabled, true, false) when: "/info available" features.discover() @@ -85,7 +85,7 @@ class DDAgentFeaturesDiscoveryTest extends DDSpecification { def "Should change discovery state atomically after discovery happened"() { setup: OkHttpClient client = Mock(OkHttpClient) - DDAgentFeaturesDiscovery features = new DDAgentFeaturesDiscovery(client, monitoring, agentUrl, true, true) + DDAgentFeaturesDiscovery features = new DDAgentFeaturesDiscovery(client, monitoring, agentUrl, true, true, false) when: "/info available" features.discover() @@ -111,7 +111,7 @@ class DDAgentFeaturesDiscoveryTest extends DDSpecification { def "test parse /info response with discoverIfOutdated"() { setup: OkHttpClient client = Mock(OkHttpClient) - DDAgentFeaturesDiscovery features = new DDAgentFeaturesDiscovery(client, monitoring, agentUrl, true, true) + DDAgentFeaturesDiscovery features = new DDAgentFeaturesDiscovery(client, monitoring, agentUrl, true, true, false) when: "/info available" features.discoverIfOutdated() @@ -139,7 +139,7 @@ class DDAgentFeaturesDiscoveryTest extends DDSpecification { def "test parse /info response with client dropping"() { setup: OkHttpClient client = Mock(OkHttpClient) - DDAgentFeaturesDiscovery features = new DDAgentFeaturesDiscovery(client, monitoring, agentUrl, true, true) + DDAgentFeaturesDiscovery features = new DDAgentFeaturesDiscovery(client, monitoring, agentUrl, true, true, false) when: "/info available" features.discover() @@ -157,7 +157,7 @@ class DDAgentFeaturesDiscoveryTest extends DDSpecification { def "test parse /info response with data streams unavailable"() { setup: OkHttpClient client = Mock(OkHttpClient) - DDAgentFeaturesDiscovery features = new DDAgentFeaturesDiscovery(client, monitoring, agentUrl, true, true) + DDAgentFeaturesDiscovery features = new DDAgentFeaturesDiscovery(client, monitoring, agentUrl, true, true, false) when: "/info available" features.discover() @@ -176,7 +176,7 @@ class DDAgentFeaturesDiscoveryTest extends DDSpecification { def "test parse /info response with long running spans available"() { setup: OkHttpClient client = Mock(OkHttpClient) - DDAgentFeaturesDiscovery features = new DDAgentFeaturesDiscovery(client, monitoring, agentUrl, true, true) + DDAgentFeaturesDiscovery features = new DDAgentFeaturesDiscovery(client, monitoring, agentUrl, true, true, false) when: "/info available" features.discover() @@ -190,7 +190,7 @@ class DDAgentFeaturesDiscoveryTest extends DDSpecification { def "test fallback when /info empty"() { setup: OkHttpClient client = Mock(OkHttpClient) - DDAgentFeaturesDiscovery features = new DDAgentFeaturesDiscovery(client, monitoring, agentUrl, false, true) + DDAgentFeaturesDiscovery features = new DDAgentFeaturesDiscovery(client, monitoring, agentUrl, false, true, false) when: "/info is empty" features.discover() @@ -212,7 +212,7 @@ class DDAgentFeaturesDiscoveryTest extends DDSpecification { def "test fallback when /info not found"() { setup: OkHttpClient client = Mock(OkHttpClient) - DDAgentFeaturesDiscovery features = new DDAgentFeaturesDiscovery(client, monitoring, agentUrl, true, true) + DDAgentFeaturesDiscovery features = new DDAgentFeaturesDiscovery(client, monitoring, agentUrl, true, true, false) when: "/info unavailable" features.discover() @@ -234,7 +234,7 @@ class DDAgentFeaturesDiscoveryTest extends DDSpecification { def "test fallback when /info not found and agent returns ok"() { setup: OkHttpClient client = Mock(OkHttpClient) - DDAgentFeaturesDiscovery features = new DDAgentFeaturesDiscovery(client, monitoring, agentUrl, true, true) + DDAgentFeaturesDiscovery features = new DDAgentFeaturesDiscovery(client, monitoring, agentUrl, true, true, false) when: "/info unavailable" features.discover() @@ -254,7 +254,7 @@ class DDAgentFeaturesDiscoveryTest extends DDSpecification { def "test fallback when /info not found and v0.5 disabled"() { setup: OkHttpClient client = Mock(OkHttpClient) - DDAgentFeaturesDiscovery features = new DDAgentFeaturesDiscovery(client, monitoring, agentUrl, false, true) + DDAgentFeaturesDiscovery features = new DDAgentFeaturesDiscovery(client, monitoring, agentUrl, false, true, false) when: "/info unavailable" features.discover() @@ -275,7 +275,7 @@ class DDAgentFeaturesDiscoveryTest extends DDSpecification { def "test fallback when /info not found and v0.5 unavailable agent side"() { setup: OkHttpClient client = Mock(OkHttpClient) - DDAgentFeaturesDiscovery features = new DDAgentFeaturesDiscovery(client, monitoring, agentUrl, true, true) + DDAgentFeaturesDiscovery features = new DDAgentFeaturesDiscovery(client, monitoring, agentUrl, true, true, false) when: "/info unavailable" features.discover() @@ -296,7 +296,7 @@ class DDAgentFeaturesDiscoveryTest extends DDSpecification { def "test fallback on very old agent"() { setup: OkHttpClient client = Mock(OkHttpClient) - DDAgentFeaturesDiscovery features = new DDAgentFeaturesDiscovery(client, monitoring, agentUrl, true, true) + DDAgentFeaturesDiscovery features = new DDAgentFeaturesDiscovery(client, monitoring, agentUrl, true, true, false) when: "/info unavailable" features.discover() @@ -318,7 +318,7 @@ class DDAgentFeaturesDiscoveryTest extends DDSpecification { def "disabling metrics disables metrics and dropping"() { setup: OkHttpClient client = Mock(OkHttpClient) - DDAgentFeaturesDiscovery features = new DDAgentFeaturesDiscovery(client, monitoring, agentUrl, true, false) + DDAgentFeaturesDiscovery features = new DDAgentFeaturesDiscovery(client, monitoring, agentUrl, true, false, false) when: "/info unavailable" features.discover() @@ -354,7 +354,7 @@ class DDAgentFeaturesDiscoveryTest extends DDSpecification { def "discovery of metrics endpoint after agent upgrade enables dropping and metrics"() { setup: OkHttpClient client = Mock(OkHttpClient) - DDAgentFeaturesDiscovery features = new DDAgentFeaturesDiscovery(client, monitoring, agentUrl, false, true) + DDAgentFeaturesDiscovery features = new DDAgentFeaturesDiscovery(client, monitoring, agentUrl, false, true, false) when: "/info unavailable" features.discover() @@ -382,7 +382,7 @@ class DDAgentFeaturesDiscoveryTest extends DDSpecification { def "disappearance of info endpoint after agent downgrade disables metrics and dropping"() { setup: OkHttpClient client = Mock(OkHttpClient) - DDAgentFeaturesDiscovery features = new DDAgentFeaturesDiscovery(client, monitoring, agentUrl, false, true) + DDAgentFeaturesDiscovery features = new DDAgentFeaturesDiscovery(client, monitoring, agentUrl, false, true, false) when: "/info available" features.discover() @@ -411,7 +411,7 @@ class DDAgentFeaturesDiscoveryTest extends DDSpecification { def "disappearance of metrics endpoint after agent downgrade disables metrics and dropping"() { setup: OkHttpClient client = Mock(OkHttpClient) - DDAgentFeaturesDiscovery features = new DDAgentFeaturesDiscovery(client, monitoring, agentUrl, false, true) + DDAgentFeaturesDiscovery features = new DDAgentFeaturesDiscovery(client, monitoring, agentUrl, false, true, false) when: "/info available" features.discover() @@ -441,7 +441,7 @@ class DDAgentFeaturesDiscoveryTest extends DDSpecification { def "test parse /info response with telemetry proxy"() { setup: OkHttpClient client = Mock(OkHttpClient) - DDAgentFeaturesDiscovery features = new DDAgentFeaturesDiscovery(client, monitoring, agentUrl, true, true) + DDAgentFeaturesDiscovery features = new DDAgentFeaturesDiscovery(client, monitoring, agentUrl, true, true, false) when: "/info available" features.discover() @@ -458,7 +458,7 @@ class DDAgentFeaturesDiscoveryTest extends DDSpecification { def "test parse /info response with old EVP proxy"() { setup: OkHttpClient client = Mock(OkHttpClient) - DDAgentFeaturesDiscovery features = new DDAgentFeaturesDiscovery(client, monitoring, agentUrl, true, true) + DDAgentFeaturesDiscovery features = new DDAgentFeaturesDiscovery(client, monitoring, agentUrl, true, true, false) when: "/info available" features.discover() @@ -477,7 +477,7 @@ class DDAgentFeaturesDiscoveryTest extends DDSpecification { def "test parse /info response with peer tag back propagation"() { setup: OkHttpClient client = Mock(OkHttpClient) - DDAgentFeaturesDiscovery features = new DDAgentFeaturesDiscovery(client, monitoring, agentUrl, true, true) + DDAgentFeaturesDiscovery features = new DDAgentFeaturesDiscovery(client, monitoring, agentUrl, true, true, false) when: "/info available" features.discover() @@ -510,7 +510,7 @@ class DDAgentFeaturesDiscoveryTest extends DDSpecification { def "test metrics disabled for agent version below 7.65"() { setup: OkHttpClient client = Mock(OkHttpClient) - DDAgentFeaturesDiscovery features = new DDAgentFeaturesDiscovery(client, monitoring, agentUrl, true, true) + DDAgentFeaturesDiscovery features = new DDAgentFeaturesDiscovery(client, monitoring, agentUrl, true, true, false) when: "agent version is below 7.65" features.discover() @@ -544,7 +544,7 @@ class DDAgentFeaturesDiscoveryTest extends DDSpecification { def "test metrics disabled for agent with unparseable version"() { setup: OkHttpClient client = Mock(OkHttpClient) - DDAgentFeaturesDiscovery features = new DDAgentFeaturesDiscovery(client, monitoring, agentUrl, true, true) + DDAgentFeaturesDiscovery features = new DDAgentFeaturesDiscovery(client, monitoring, agentUrl, true, true, false) when: "agent version is unparseable" features.discover() @@ -570,7 +570,7 @@ class DDAgentFeaturesDiscoveryTest extends DDSpecification { def "should send container id as header on the info request and parse the hash in the response"() { setup: OkHttpClient client = Mock(OkHttpClient) - DDAgentFeaturesDiscovery features = new DDAgentFeaturesDiscovery(client, monitoring, agentUrl, true, true) + DDAgentFeaturesDiscovery features = new DDAgentFeaturesDiscovery(client, monitoring, agentUrl, true, true, false) def oldContainerId = ContainerInfo.get().getContainerId() def oldContainerTagsHash = ContainerInfo.get().getContainerTagsHash() ContainerInfo.get().setContainerId("test") diff --git a/dd-java-agent/appsec/src/jmh/java/datadog/appsec/benchmark/AppSecBenchmark.java b/dd-java-agent/appsec/src/jmh/java/datadog/appsec/benchmark/AppSecBenchmark.java index 206b46e60b8..62362feac13 100644 --- a/dd-java-agent/appsec/src/jmh/java/datadog/appsec/benchmark/AppSecBenchmark.java +++ b/dd-java-agent/appsec/src/jmh/java/datadog/appsec/benchmark/AppSecBenchmark.java @@ -187,7 +187,8 @@ public Call clone() { static class StubDDAgentFeaturesDiscovery extends DDAgentFeaturesDiscovery { public StubDDAgentFeaturesDiscovery(OkHttpClient client) { - super(client, Monitoring.DISABLED, HttpUrl.get("http://localhost:8080/"), false, false); + super( + client, Monitoring.DISABLED, HttpUrl.get("http://localhost:8080/"), false, false, false); } @Override diff --git a/dd-java-agent/instrumentation-testing/src/main/groovy/datadog/trace/agent/test/InstrumentationSpecification.groovy b/dd-java-agent/instrumentation-testing/src/main/groovy/datadog/trace/agent/test/InstrumentationSpecification.groovy index 0b9fb35e563..798bec9f144 100644 --- a/dd-java-agent/instrumentation-testing/src/main/groovy/datadog/trace/agent/test/InstrumentationSpecification.groovy +++ b/dd-java-agent/instrumentation-testing/src/main/groovy/datadog/trace/agent/test/InstrumentationSpecification.groovy @@ -387,7 +387,7 @@ abstract class InstrumentationSpecification extends DDSpecification implements A // emit traces to the APM Test-Agent for Cross-Tracer Testing Trace Checks HttpUrl agentUrl = HttpUrl.get("http://" + agentHost + ":" + DEFAULT_TRACE_AGENT_PORT) OkHttpClient client = buildHttpClient(true, null, null, TimeUnit.SECONDS.toMillis(DEFAULT_AGENT_TIMEOUT)) - DDAgentFeaturesDiscovery featureDiscovery = new DDAgentFeaturesDiscovery(client, Monitoring.DISABLED, agentUrl, Config.get().isTraceAgentV05Enabled(), Config.get().isTracerMetricsEnabled()) + DDAgentFeaturesDiscovery featureDiscovery = new DDAgentFeaturesDiscovery(client, Monitoring.DISABLED, agentUrl, Config.get().isTraceAgentV05Enabled(), Config.get().isTracerMetricsEnabled(), Config.get().isTracerMetricsIgnoreAgentVersion()) TEST_AGENT_API = new DDAgentApi(client, agentUrl, featureDiscovery, Monitoring.DISABLED, Config.get().isTracerMetricsEnabled()) TEST_AGENT_WRITER = DDAgentWriter.builder().agentApi(TEST_AGENT_API).build() } diff --git a/dd-java-agent/instrumentation-testing/src/main/groovy/datadog/trace/agent/test/datastreams/MockFeaturesDiscovery.java b/dd-java-agent/instrumentation-testing/src/main/groovy/datadog/trace/agent/test/datastreams/MockFeaturesDiscovery.java index 470975cf0e1..52a46a9cec1 100644 --- a/dd-java-agent/instrumentation-testing/src/main/groovy/datadog/trace/agent/test/datastreams/MockFeaturesDiscovery.java +++ b/dd-java-agent/instrumentation-testing/src/main/groovy/datadog/trace/agent/test/datastreams/MockFeaturesDiscovery.java @@ -8,7 +8,7 @@ public class MockFeaturesDiscovery extends DDAgentFeaturesDiscovery { private final boolean supportsDataStreams; public MockFeaturesDiscovery(boolean supportsDataStreams) { - super(null, Monitoring.DISABLED, null, true, true); + super(null, Monitoring.DISABLED, null, true, true, false); this.supportsDataStreams = supportsDataStreams; } diff --git a/dd-trace-api/src/main/java/datadog/trace/api/config/GeneralConfig.java b/dd-trace-api/src/main/java/datadog/trace/api/config/GeneralConfig.java index 60e94418f09..3395988d418 100644 --- a/dd-trace-api/src/main/java/datadog/trace/api/config/GeneralConfig.java +++ b/dd-trace-api/src/main/java/datadog/trace/api/config/GeneralConfig.java @@ -65,6 +65,8 @@ public final class GeneralConfig { public static final String PERF_METRICS_ENABLED = "trace.perf.metrics.enabled"; public static final String TRACE_STATS_COMPUTATION_ENABLED = "trace.stats.computation.enabled"; + public static final String TRACE_STATS_COMPUTATION_IGNORE_AGENT_VERSION = + "trace.stats.computation.ignore.agent.version"; public static final String TRACER_METRICS_ENABLED = "trace.tracer.metrics.enabled"; public static final String TRACER_METRICS_BUFFERING_ENABLED = "trace.tracer.metrics.buffering.enabled"; diff --git a/dd-trace-core/src/jmh/java/datadog/trace/common/metrics/ConflatingMetricsAggregatorBenchmark.java b/dd-trace-core/src/jmh/java/datadog/trace/common/metrics/ConflatingMetricsAggregatorBenchmark.java index c9ed0e00683..ee19065220b 100644 --- a/dd-trace-core/src/jmh/java/datadog/trace/common/metrics/ConflatingMetricsAggregatorBenchmark.java +++ b/dd-trace-core/src/jmh/java/datadog/trace/common/metrics/ConflatingMetricsAggregatorBenchmark.java @@ -72,7 +72,7 @@ static class FixedAgentFeaturesDiscovery extends DDAgentFeaturesDiscovery { public FixedAgentFeaturesDiscovery(Set peerTags, Set spanKinds) { // create a fixed discovery with metrics enabled - super(null, Monitoring.DISABLED, null, false, true); + super(null, Monitoring.DISABLED, null, false, true, false); this.peerTags = peerTags; this.spanKinds = spanKinds; } diff --git a/dd-trace-core/src/main/java/datadog/trace/common/writer/DDAgentWriter.java b/dd-trace-core/src/main/java/datadog/trace/common/writer/DDAgentWriter.java index f02f5c4b2ca..521cfa57172 100644 --- a/dd-trace-core/src/main/java/datadog/trace/common/writer/DDAgentWriter.java +++ b/dd-trace-core/src/main/java/datadog/trace/common/writer/DDAgentWriter.java @@ -39,6 +39,7 @@ public static class DDAgentWriterBuilder { Monitoring monitoring = Monitoring.DISABLED; boolean traceAgentV05Enabled = Config.get().isTraceAgentV05Enabled(); boolean metricsReportingEnabled = Config.get().isTracerMetricsEnabled(); + boolean metricsIgnoreAgentVersion = Config.get().isTracerMetricsIgnoreAgentVersion(); private int flushTimeout = 1; private TimeUnit flushTimeoutUnit = TimeUnit.SECONDS; boolean alwaysFlush = false; @@ -113,6 +114,11 @@ public DDAgentWriterBuilder metricsReportingEnabled(boolean metricsReportingEnab return this; } + public DDAgentWriterBuilder metricsIgnoreAgentVersion(boolean metricsIgnoreAgentVersion) { + this.metricsIgnoreAgentVersion = metricsIgnoreAgentVersion; + return this; + } + public DDAgentWriterBuilder featureDiscovery(DDAgentFeaturesDiscovery featureDiscovery) { this.featureDiscovery = featureDiscovery; return this; @@ -143,7 +149,12 @@ public DDAgentWriter build() { if (null == featureDiscovery) { featureDiscovery = new DDAgentFeaturesDiscovery( - client, monitoring, agentUrl, traceAgentV05Enabled, metricsReportingEnabled); + client, + monitoring, + agentUrl, + traceAgentV05Enabled, + metricsReportingEnabled, + metricsIgnoreAgentVersion); } if (null == agentApi) { agentApi = diff --git a/dd-trace-core/src/test/groovy/datadog/trace/TracerConnectionReliabilityTest.groovy b/dd-trace-core/src/test/groovy/datadog/trace/TracerConnectionReliabilityTest.groovy index 69b971bee4f..25e7aa4ab88 100644 --- a/dd-trace-core/src/test/groovy/datadog/trace/TracerConnectionReliabilityTest.groovy +++ b/dd-trace-core/src/test/groovy/datadog/trace/TracerConnectionReliabilityTest.groovy @@ -147,7 +147,7 @@ class TracerConnectionReliabilityTest extends DDSpecification { class FixedTraceEndpointFeaturesDiscovery extends DDAgentFeaturesDiscovery { FixedTraceEndpointFeaturesDiscovery(SharedCommunicationObjects objects) { - super(objects.agentHttpClient, Monitoring.DISABLED, objects.agentUrl, false, false) + super(objects.agentHttpClient, Monitoring.DISABLED, objects.agentUrl, false, false, false) } @Override diff --git a/dd-trace-core/src/test/groovy/datadog/trace/common/writer/DDAgentApiTest.groovy b/dd-trace-core/src/test/groovy/datadog/trace/common/writer/DDAgentApiTest.groovy index a6ec2ec5cba..010846241bd 100644 --- a/dd-trace-core/src/test/groovy/datadog/trace/common/writer/DDAgentApiTest.groovy +++ b/dd-trace-core/src/test/groovy/datadog/trace/common/writer/DDAgentApiTest.groovy @@ -474,7 +474,7 @@ class DDAgentApiTest extends DDCoreSpecification { def createAgentApi(String url) { HttpUrl agentUrl = HttpUrl.get(url) OkHttpClient client = OkHttpUtils.buildHttpClient(agentUrl, 1000) - DDAgentFeaturesDiscovery discovery = new DDAgentFeaturesDiscovery(client, monitoring, agentUrl, true, true) + DDAgentFeaturesDiscovery discovery = new DDAgentFeaturesDiscovery(client, monitoring, agentUrl, true, true, false) return [discovery, new DDAgentApi(client, agentUrl, discovery, monitoring, false)] } } diff --git a/dd-trace-core/src/test/groovy/datadog/trace/common/writer/DDAgentWriterCombinedTest.groovy b/dd-trace-core/src/test/groovy/datadog/trace/common/writer/DDAgentWriterCombinedTest.groovy index 7280309d446..2cb6cbeaf72 100644 --- a/dd-trace-core/src/test/groovy/datadog/trace/common/writer/DDAgentWriterCombinedTest.groovy +++ b/dd-trace-core/src/test/groovy/datadog/trace/common/writer/DDAgentWriterCombinedTest.groovy @@ -321,7 +321,7 @@ class DDAgentWriterCombinedTest extends DDCoreSpecification { } def agentUrl = HttpUrl.get(agent.address) def client = OkHttpUtils.buildHttpClient(agentUrl, 1000) - def discovery = new DDAgentFeaturesDiscovery(client, monitoring, agentUrl, true, true) + def discovery = new DDAgentFeaturesDiscovery(client, monitoring, agentUrl, true, true, false) def api = new DDAgentApi(client, agentUrl, discovery, monitoring, true) def writer = DDAgentWriter.builder() .featureDiscovery(discovery) @@ -380,7 +380,7 @@ class DDAgentWriterCombinedTest extends DDCoreSpecification { } def agentUrl = HttpUrl.get(agent.address) def client = OkHttpUtils.buildHttpClient(agentUrl, 1000) - def discovery = new DDAgentFeaturesDiscovery(client, monitoring, agentUrl, true, true) + def discovery = new DDAgentFeaturesDiscovery(client, monitoring, agentUrl, true, true, false) def api = new DDAgentApi(client, agentUrl, discovery, monitoring, true) def writer = DDAgentWriter.builder() .featureDiscovery(discovery) diff --git a/dd-trace-core/src/traceAgentTest/groovy/DDApiIntegrationTest.groovy b/dd-trace-core/src/traceAgentTest/groovy/DDApiIntegrationTest.groovy index 2455c5a0f75..bfea18f3dca 100644 --- a/dd-trace-core/src/traceAgentTest/groovy/DDApiIntegrationTest.groovy +++ b/dd-trace-core/src/traceAgentTest/groovy/DDApiIntegrationTest.groovy @@ -79,12 +79,12 @@ class DDApiIntegrationTest extends AbstractTraceAgentTest { MonitoringImpl monitoring = new MonitoringImpl(StatsDClient.NO_OP, 1, TimeUnit.SECONDS) HttpUrl agentUrl = HttpUrl.get(Config.get().getAgentUrl()) OkHttpClient httpClient = OkHttpUtils.buildHttpClient(agentUrl, 5000) - discovery = new DDAgentFeaturesDiscovery(httpClient, monitoring, agentUrl, enableV05, true) + discovery = new DDAgentFeaturesDiscovery(httpClient, monitoring, agentUrl, enableV05, true, false) api = new DDAgentApi(httpClient, agentUrl, discovery, monitoring, false) api.addResponseListener(responseListener) HttpUrl udsAgentUrl = HttpUrl.get(String.format("http://%s:%d", SOMEHOST, SOMEPORT)) OkHttpClient udsClient = OkHttpUtils.buildHttpClient(true, socketPath.toString(), null, 5000) - udsDiscovery = new DDAgentFeaturesDiscovery(udsClient, monitoring, agentUrl, enableV05, true) + udsDiscovery = new DDAgentFeaturesDiscovery(udsClient, monitoring, agentUrl, enableV05, true, false) unixDomainSocketApi = new DDAgentApi(udsClient, udsAgentUrl, udsDiscovery, monitoring, false) unixDomainSocketApi.addResponseListener(responseListener) mapper = enableV05 ? new TraceMapperV0_5() : new TraceMapperV0_4() diff --git a/dd-trace-core/src/traceAgentTest/groovy/TraceMapperRealAgentTest.groovy b/dd-trace-core/src/traceAgentTest/groovy/TraceMapperRealAgentTest.groovy index b654bf45d5d..4363015892f 100644 --- a/dd-trace-core/src/traceAgentTest/groovy/TraceMapperRealAgentTest.groovy +++ b/dd-trace-core/src/traceAgentTest/groovy/TraceMapperRealAgentTest.groovy @@ -30,8 +30,8 @@ class TraceMapperRealAgentTest extends AbstractTraceAgentTest { client = OkHttpUtils.buildHttpClient(agentUrl, 30_000) monitoring = new MonitoringImpl(StatsDClient.NO_OP, 1, TimeUnit.SECONDS) - v05Discovery = new DDAgentFeaturesDiscovery(client, monitoring, agentUrl, true, true) - v04Discovery = new DDAgentFeaturesDiscovery(client, monitoring, agentUrl, false, true) + v05Discovery = new DDAgentFeaturesDiscovery(client, monitoring, agentUrl, true, true, false) + v04Discovery = new DDAgentFeaturesDiscovery(client, monitoring, agentUrl, false, true, false) v05Api = new DDAgentApi(client, agentUrl, v05Discovery, monitoring, false) v04Api = new DDAgentApi(client, agentUrl, v04Discovery, monitoring, false) } diff --git a/internal-api/src/main/java/datadog/trace/api/Config.java b/internal-api/src/main/java/datadog/trace/api/Config.java index 3b7534eafb5..9d22b9ffb58 100644 --- a/internal-api/src/main/java/datadog/trace/api/Config.java +++ b/internal-api/src/main/java/datadog/trace/api/Config.java @@ -407,6 +407,7 @@ import static datadog.trace.api.config.GeneralConfig.TRACE_DEBUG; import static datadog.trace.api.config.GeneralConfig.TRACE_LOG_LEVEL; import static datadog.trace.api.config.GeneralConfig.TRACE_STATS_COMPUTATION_ENABLED; +import static datadog.trace.api.config.GeneralConfig.TRACE_STATS_COMPUTATION_IGNORE_AGENT_VERSION; import static datadog.trace.api.config.GeneralConfig.TRACE_TAGS; import static datadog.trace.api.config.GeneralConfig.TRACE_TRIAGE; import static datadog.trace.api.config.GeneralConfig.TRIAGE_REPORT_DIR; @@ -953,6 +954,7 @@ public static String getHostName() { private final boolean perfMetricsEnabled; private final boolean tracerMetricsEnabled; + private final boolean tracerMetricsIgnoreAgentVersion; private final boolean tracerMetricsBufferingEnabled; private final int tracerMetricsMaxAggregates; private final int tracerMetricsMaxPending; @@ -2056,6 +2058,8 @@ private Config(final ConfigProvider configProvider, final InstrumenterConfig ins tracerMetricsEnabled = configProvider.getBoolean(TRACE_STATS_COMPUTATION_ENABLED, true, TRACER_METRICS_ENABLED); + tracerMetricsIgnoreAgentVersion = + configProvider.getBoolean(TRACE_STATS_COMPUTATION_IGNORE_AGENT_VERSION, false); tracerMetricsBufferingEnabled = configProvider.getBoolean(TRACER_METRICS_BUFFERING_ENABLED, false); tracerMetricsMaxAggregates = configProvider.getInteger(TRACER_METRICS_MAX_AGGREGATES, 2048); @@ -3598,6 +3602,10 @@ public boolean isTracerMetricsEnabled() { return tracerMetricsEnabled && isApmTracingEnabled(); } + public boolean isTracerMetricsIgnoreAgentVersion() { + return tracerMetricsIgnoreAgentVersion; + } + public boolean isTracerMetricsBufferingEnabled() { return tracerMetricsBufferingEnabled; } @@ -6063,6 +6071,8 @@ public String toString() { + perfMetricsEnabled + ", tracerMetricsEnabled=" + tracerMetricsEnabled + + ", tracerMetricsIgnoreAgentVersion=" + + tracerMetricsIgnoreAgentVersion + ", tracerMetricsBufferingEnabled=" + tracerMetricsBufferingEnabled + ", tracerMetricsMaxAggregates=" diff --git a/metadata/supported-configurations.json b/metadata/supported-configurations.json index 8f2eec5b73d..65b98beaf92 100644 --- a/metadata/supported-configurations.json +++ b/metadata/supported-configurations.json @@ -10377,6 +10377,14 @@ "aliases": ["DD_TRACE_TRACER_METRICS_ENABLED"] } ], + "DD_TRACE_STATS_COMPUTATION_IGNORE_AGENT_VERSION": [ + { + "version": "A", + "type": "boolean", + "default": "false", + "aliases": [] + } + ], "DD_TRACE_STATUS404DECORATOR_ENABLED": [ { "version": "A",