From b6315c3254061a37ea321c9d06ae5d181da91fd0 Mon Sep 17 00:00:00 2001 From: Andrea Marziali Date: Wed, 2 Jul 2025 10:21:47 +0200 Subject: [PATCH 1/2] Ensure metric reporter is started when the agent is not available at bootstrap --- .../metrics/ConflatingMetricsAggregator.java | 24 +++++++---------- .../ConflatingMetricAggregatorTest.groovy | 27 +++++++++++++++++++ 2 files changed, 37 insertions(+), 14 deletions(-) diff --git a/dd-trace-core/src/main/java/datadog/trace/common/metrics/ConflatingMetricsAggregator.java b/dd-trace-core/src/main/java/datadog/trace/common/metrics/ConflatingMetricsAggregator.java index d7521591efb..cb9b6e58740 100644 --- a/dd-trace-core/src/main/java/datadog/trace/common/metrics/ConflatingMetricsAggregator.java +++ b/dd-trace-core/src/main/java/datadog/trace/common/metrics/ConflatingMetricsAggregator.java @@ -143,20 +143,16 @@ public ConflatingMetricsAggregator( @Override public void start() { - if (isMetricsEnabled()) { - sink.register(this); - thread.start(); - cancellation = - AgentTaskScheduler.INSTANCE.scheduleAtFixedRate( - new ReportTask(), - this, - reportingInterval, - reportingInterval, - reportingIntervalTimeUnit); - log.debug("started metrics aggregator"); - } else { - log.debug("metrics not supported by trace agent"); - } + sink.register(this); + thread.start(); + cancellation = + AgentTaskScheduler.INSTANCE.scheduleAtFixedRate( + new ReportTask(), + this, + reportingInterval, + reportingInterval, + reportingIntervalTimeUnit); + log.debug("started metrics aggregator"); } private boolean isMetricsEnabled() { diff --git a/dd-trace-core/src/test/groovy/datadog/trace/common/metrics/ConflatingMetricAggregatorTest.groovy b/dd-trace-core/src/test/groovy/datadog/trace/common/metrics/ConflatingMetricAggregatorTest.groovy index 498a4b4a0af..be77146114a 100644 --- a/dd-trace-core/src/test/groovy/datadog/trace/common/metrics/ConflatingMetricAggregatorTest.groovy +++ b/dd-trace-core/src/test/groovy/datadog/trace/common/metrics/ConflatingMetricAggregatorTest.groovy @@ -463,6 +463,33 @@ class ConflatingMetricAggregatorTest extends DDSpecification { aggregator.close() } + def "should start even if the agent is not available"() { + setup: + MetricWriter writer = Mock(MetricWriter) + Sink sink = Stub(Sink) + DDAgentFeaturesDiscovery features = Mock(DDAgentFeaturesDiscovery) + features.supportsMetrics() >> false + ConflatingMetricsAggregator aggregator = new ConflatingMetricsAggregator(empty, + features, sink, writer, 10, queueSize, 200, MILLISECONDS) + final spans = [ + new SimpleSpan("service" , "operation", "resource", "type", false, true, false, 0, 10, HTTP_OK) + ] + aggregator.start() + when: + aggregator.publish(spans) + Thread.sleep(1_000) + then: + 0 * writer._ + when: + features.supportsMetrics() >> true + aggregator.publish(spans) + Thread.sleep(1_000) + then: + (1.._) * writer._ + cleanup: + aggregator.close() + } + def "force flush should wait for aggregator to start"() { setup: int maxAggregates = 10 From de1e11134da765471729da3182d10ab20b2a6a8d Mon Sep 17 00:00:00 2001 From: Andrea Marziali Date: Wed, 2 Jul 2025 16:02:30 +0200 Subject: [PATCH 2/2] Update dd-trace-core/src/test/groovy/datadog/trace/common/metrics/ConflatingMetricAggregatorTest.groovy Co-authored-by: Brice Dutheil --- .../common/metrics/ConflatingMetricAggregatorTest.groovy | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/dd-trace-core/src/test/groovy/datadog/trace/common/metrics/ConflatingMetricAggregatorTest.groovy b/dd-trace-core/src/test/groovy/datadog/trace/common/metrics/ConflatingMetricAggregatorTest.groovy index be77146114a..bad7eb8f587 100644 --- a/dd-trace-core/src/test/groovy/datadog/trace/common/metrics/ConflatingMetricAggregatorTest.groovy +++ b/dd-trace-core/src/test/groovy/datadog/trace/common/metrics/ConflatingMetricAggregatorTest.groovy @@ -475,17 +475,21 @@ class ConflatingMetricAggregatorTest extends DDSpecification { new SimpleSpan("service" , "operation", "resource", "type", false, true, false, 0, 10, HTTP_OK) ] aggregator.start() + when: aggregator.publish(spans) Thread.sleep(1_000) + then: 0 * writer._ when: features.supportsMetrics() >> true aggregator.publish(spans) Thread.sleep(1_000) + then: (1.._) * writer._ + cleanup: aggregator.close() }