From d15edf28a33b2d9bf6cad8a597f5b109c78e83e3 Mon Sep 17 00:00:00 2001 From: Bruce Bujon Date: Mon, 19 Jan 2026 09:19:02 +0100 Subject: [PATCH 1/8] feat(metrics): Try to extract metrics from communication --- communication/build.gradle.kts | 8 +-- .../ddagent/DDAgentFeaturesDiscovery.java | 6 +-- .../ddagent/SharedCommunicationObjects.java | 2 +- .../communication/monitor/Monitoring.java | 37 -------------- .../DDAgentFeaturesDiscoveryTest.groovy | 2 +- ...dCommunicationsObjectsSpecification.groovy | 2 +- dd-java-agent/agent-bootstrap/build.gradle | 1 + .../java/datadog/trace/bootstrap/Agent.java | 2 +- .../agent-crashtracking/build.gradle | 1 + .../datadog/crashtracking/OOMENotifier.java | 4 +- dd-java-agent/agent-debugger/build.gradle | 1 + .../debugger/agent/StatsdMetricForwarder.java | 4 +- .../debugger/util/DebuggerMetrics.java | 4 +- .../agent/jmxfetch/AgentStatsdReporter.java | 2 +- .../trace/agent/jmxfetch/JMXFetch.java | 4 +- dd-java-agent/agent-tooling/build.gradle | 1 + .../tooling/nativeimage/TracerActivation.java | 4 +- dd-java-agent/appsec/build.gradle | 1 + .../java/com/datadog/appsec/AppSecSystem.java | 2 +- .../com/datadog/appsec/ddwaf/WAFModule.java | 4 +- dd-java-agent/build.gradle | 6 +++ .../spark/spark-common/build.gradle | 2 + .../spark/SparkAggregatedTaskMetrics.java | 22 ++++---- dd-trace-core/build.gradle | 3 ++ .../trace/common/metrics/AggregateMetric.java | 4 +- .../trace/common/writer/DDAgentWriter.java | 2 +- .../trace/common/writer/DDIntakeWriter.java | 2 +- .../common/writer/PayloadDispatcherImpl.java | 4 +- .../common/writer/ddagent/DDAgentApi.java | 6 +-- .../java/datadog/trace/core/CoreTracer.java | 17 ++----- .../java/datadog/trace/core/PendingTrace.java | 2 +- .../trace/core/datastreams/StatsGroup.java | 4 +- .../core/monitor/TracerHealthMetrics.java | 2 +- .../trace/common/writer/DDAgentApiTest.groovy | 6 +-- .../writer/DDAgentWriterCombinedTest.groovy | 6 +-- .../common/writer/DDAgentWriterTest.groovy | 4 +- .../writer/DDIntakeWriterCombinedTest.groovy | 4 +- .../common/writer/DDIntakeWriterTest.groovy | 4 +- .../writer/PayloadDispatcherImplTest.groovy | 4 +- .../groovy/DDApiIntegrationTest.groovy | 4 +- .../groovy/TraceMapperRealAgentTest.groovy | 4 +- gradle/dependencies.gradle | 2 + .../instrumentation/api/AgentTracer.java | 51 ------------------- products/metrics/api/build.gradle.kts | 11 ++++ .../java/datadog/metrics/api}/Counter.java | 2 +- .../java/datadog/metrics/api/Histogram.java | 4 +- .../java/datadog/metrics/api/Monitoring.java | 13 +++++ .../datadog/metrics/api}/NoOpCounter.java | 4 +- .../datadog/metrics/api/NoOpHistogram.java | 46 +++++++++++++++++ .../datadog/metrics/api/NoOpMonitoring.java | 25 +++++++++ .../datadog/metrics/api}/NoOpRecording.java | 4 +- .../java/datadog/metrics/api}/Recording.java | 2 +- .../metrics/statsd}/NoOpStatsDClient.java | 2 +- .../datadog/metrics/statsd}/StatsDClient.java | 2 +- .../metrics/statsd}/StatsDClientManager.java | 2 +- products/metrics/lib/build.gradle.kts | 47 +++++++++++++++++ .../datadog/metrics/api}/MonitoringImpl.java | 9 +--- .../datadog/metrics/api}/StatsDCounter.java | 7 ++- .../metrics/api}/ThreadLocalRecording.java | 4 +- .../main/java/datadog/metrics/api}/Timer.java | 10 ++-- .../main/java/datadog/metrics/api}/Utils.java | 6 ++- .../metrics/histogram/DDSketchHistogram.java | 7 ++- .../metrics}/histogram/Histograms.java | 9 ++-- .../metrics/statsd}/DDAgentStatsDClient.java | 3 +- .../statsd}/DDAgentStatsDClientManager.java | 4 +- .../statsd}/DDAgentStatsDConnection.java | 2 +- .../metrics/statsd}/LoggingStatsDClient.java | 7 +-- .../statsd}/DDAgentStatsDClientTest.groovy | 7 ++- .../statsd}/DisabledMonitoringTest.groovy | 5 +- .../metrics/statsd}/NoopCounterTest.groovy | 4 +- settings.gradle.kts | 2 + 71 files changed, 282 insertions(+), 225 deletions(-) delete mode 100644 communication/src/main/java/datadog/communication/monitor/Monitoring.java create mode 100644 products/metrics/api/build.gradle.kts rename {communication/src/main/java/datadog/communication/monitor => products/metrics/api/src/main/java/datadog/metrics/api}/Counter.java (74%) rename internal-api/src/main/java/datadog/trace/bootstrap/instrumentation/api/AgentHistogram.java => products/metrics/api/src/main/java/datadog/metrics/api/Histogram.java (76%) create mode 100644 products/metrics/api/src/main/java/datadog/metrics/api/Monitoring.java rename {communication/src/main/java/datadog/communication/monitor => products/metrics/api/src/main/java/datadog/metrics/api}/NoOpCounter.java (64%) create mode 100644 products/metrics/api/src/main/java/datadog/metrics/api/NoOpHistogram.java create mode 100644 products/metrics/api/src/main/java/datadog/metrics/api/NoOpMonitoring.java rename {communication/src/main/java/datadog/communication/monitor => products/metrics/api/src/main/java/datadog/metrics/api}/NoOpRecording.java (73%) rename {communication/src/main/java/datadog/communication/monitor => products/metrics/api/src/main/java/datadog/metrics/api}/Recording.java (86%) rename {internal-api/src/main/java/datadog/trace/api => products/metrics/api/src/main/java/datadog/metrics/statsd}/NoOpStatsDClient.java (97%) rename {internal-api/src/main/java/datadog/trace/api => products/metrics/api/src/main/java/datadog/metrics/statsd}/StatsDClient.java (97%) rename {internal-api/src/main/java/datadog/trace/api => products/metrics/api/src/main/java/datadog/metrics/statsd}/StatsDClientManager.java (93%) create mode 100644 products/metrics/lib/build.gradle.kts rename {dd-trace-core/src/main/java/datadog/trace/core/monitor => products/metrics/lib/src/main/java/datadog/metrics/api}/MonitoringImpl.java (82%) rename {dd-trace-core/src/main/java/datadog/trace/core/monitor => products/metrics/lib/src/main/java/datadog/metrics/api}/StatsDCounter.java (75%) rename {dd-trace-core/src/main/java/datadog/trace/core/monitor => products/metrics/lib/src/main/java/datadog/metrics/api}/ThreadLocalRecording.java (84%) rename {dd-trace-core/src/main/java/datadog/trace/core/monitor => products/metrics/lib/src/main/java/datadog/metrics/api}/Timer.java (89%) rename {dd-trace-core/src/main/java/datadog/trace/core/monitor => products/metrics/lib/src/main/java/datadog/metrics/api}/Utils.java (79%) rename dd-trace-core/src/main/java/datadog/trace/core/histogram/Histogram.java => products/metrics/lib/src/main/java/datadog/metrics/histogram/DDSketchHistogram.java (83%) rename {dd-trace-core/src/main/java/datadog/trace/core => products/metrics/lib/src/main/java/datadog/metrics}/histogram/Histograms.java (86%) rename {communication/src/main/java/datadog/communication/monitor => products/metrics/lib/src/main/java/datadog/metrics/statsd}/DDAgentStatsDClient.java (98%) rename {communication/src/main/java/datadog/communication/monitor => products/metrics/lib/src/main/java/datadog/metrics/statsd}/DDAgentStatsDClientManager.java (98%) rename {communication/src/main/java/datadog/communication/monitor => products/metrics/lib/src/main/java/datadog/metrics/statsd}/DDAgentStatsDConnection.java (99%) rename {communication/src/main/java/datadog/communication/monitor => products/metrics/lib/src/main/java/datadog/metrics/statsd}/LoggingStatsDClient.java (95%) rename {communication/src/test/groovy/datadog/communication/monitor => products/metrics/lib/src/test/groovy/datadog/metrics/statsd}/DDAgentStatsDClientTest.groovy (99%) rename {communication/src/test/groovy/datadog/communication/monitor => products/metrics/lib/src/test/groovy/datadog/metrics/statsd}/DisabledMonitoringTest.groovy (77%) rename {communication/src/test/groovy/datadog/communication/monitor => products/metrics/lib/src/test/groovy/datadog/metrics/statsd}/NoopCounterTest.groovy (68%) diff --git a/communication/build.gradle.kts b/communication/build.gradle.kts index a6b22288473..66e8a4c74b0 100644 --- a/communication/build.gradle.kts +++ b/communication/build.gradle.kts @@ -20,7 +20,7 @@ dependencies { api(libs.okio) api(libs.okhttp) api(libs.moshi) - implementation(libs.dogstatsd) + implementation(project(":products:metrics:lib")) testImplementation(project(":utils:test-utils")) testImplementation(libs.bundles.junit5) @@ -49,9 +49,9 @@ val excludedClassesCoverage by extra( "datadog.communication.http.OkHttpUtils.GZipByteBufferRequestBody", "datadog.communication.http.OkHttpUtils.GZipRequestBodyDecorator", "datadog.communication.http.OkHttpUtils.JsonRequestBody", - "datadog.communication.monitor.DDAgentStatsDConnection", - "datadog.communication.monitor.DDAgentStatsDConnection.*", - "datadog.communication.monitor.LoggingStatsDClient", + // "datadog.communication.monitor.DDAgentStatsDConnection", + // "datadog.communication.monitor.DDAgentStatsDConnection.*", + // "datadog.communication.monitor.LoggingStatsDClient", "datadog.communication.BackendApiFactory", "datadog.communication.BackendApiFactory.Intake", "datadog.communication.EvpProxyApi", diff --git a/communication/src/main/java/datadog/communication/ddagent/DDAgentFeaturesDiscovery.java b/communication/src/main/java/datadog/communication/ddagent/DDAgentFeaturesDiscovery.java index 1c55f9ccc82..a36fb29c741 100644 --- a/communication/src/main/java/datadog/communication/ddagent/DDAgentFeaturesDiscovery.java +++ b/communication/src/main/java/datadog/communication/ddagent/DDAgentFeaturesDiscovery.java @@ -12,9 +12,9 @@ import com.squareup.moshi.Types; import datadog.common.container.ContainerInfo; import datadog.communication.http.OkHttpUtils; -import datadog.communication.monitor.DDAgentStatsDClientManager; -import datadog.communication.monitor.Monitoring; -import datadog.communication.monitor.Recording; +import datadog.metrics.api.Monitoring; +import datadog.metrics.api.Recording; +import datadog.metrics.statsd.DDAgentStatsDClientManager; import datadog.trace.api.BaseHash; import datadog.trace.api.telemetry.LogCollector; import datadog.trace.util.Strings; diff --git a/communication/src/main/java/datadog/communication/ddagent/SharedCommunicationObjects.java b/communication/src/main/java/datadog/communication/ddagent/SharedCommunicationObjects.java index f4728952673..894272e782b 100644 --- a/communication/src/main/java/datadog/communication/ddagent/SharedCommunicationObjects.java +++ b/communication/src/main/java/datadog/communication/ddagent/SharedCommunicationObjects.java @@ -6,7 +6,7 @@ import datadog.common.container.ContainerInfo; import datadog.common.socket.SocketUtils; import datadog.communication.http.OkHttpUtils; -import datadog.communication.monitor.Monitoring; +import datadog.metrics.api.Monitoring; import datadog.remoteconfig.ConfigurationPoller; import datadog.remoteconfig.DefaultConfigurationPoller; import datadog.trace.api.Config; diff --git a/communication/src/main/java/datadog/communication/monitor/Monitoring.java b/communication/src/main/java/datadog/communication/monitor/Monitoring.java deleted file mode 100644 index 8f11fd1082b..00000000000 --- a/communication/src/main/java/datadog/communication/monitor/Monitoring.java +++ /dev/null @@ -1,37 +0,0 @@ -package datadog.communication.monitor; - -public interface Monitoring { - Monitoring DISABLED = new DisabledMonitoring(); - - Recording newTimer(String name); - - Recording newTimer(String name, String... tags); - - Recording newThreadLocalTimer(String name); - - Counter newCounter(String name); - - class DisabledMonitoring implements Monitoring { - private DisabledMonitoring() {} - - @Override - public Recording newTimer(String name) { - return NoOpRecording.NO_OP; - } - - @Override - public Recording newTimer(String name, String... tags) { - return NoOpRecording.NO_OP; - } - - @Override - public Recording newThreadLocalTimer(String name) { - return NoOpRecording.NO_OP; - } - - @Override - public Counter newCounter(String name) { - return NoOpCounter.NO_OP; - } - } -} diff --git a/communication/src/test/groovy/datadog/communication/ddagent/DDAgentFeaturesDiscoveryTest.groovy b/communication/src/test/groovy/datadog/communication/ddagent/DDAgentFeaturesDiscoveryTest.groovy index 86f8dda7011..e2a5e02d6d2 100644 --- a/communication/src/test/groovy/datadog/communication/ddagent/DDAgentFeaturesDiscoveryTest.groovy +++ b/communication/src/test/groovy/datadog/communication/ddagent/DDAgentFeaturesDiscoveryTest.groovy @@ -1,7 +1,7 @@ package datadog.communication.ddagent import datadog.common.container.ContainerInfo -import datadog.communication.monitor.Monitoring +import datadog.metrics.api.Monitoring import datadog.trace.test.util.DDSpecification import datadog.trace.util.Strings import okhttp3.Call diff --git a/communication/src/test/groovy/datadog/communication/ddagent/SharedCommunicationsObjectsSpecification.groovy b/communication/src/test/groovy/datadog/communication/ddagent/SharedCommunicationsObjectsSpecification.groovy index 9795aca655c..8f08648adc5 100644 --- a/communication/src/test/groovy/datadog/communication/ddagent/SharedCommunicationsObjectsSpecification.groovy +++ b/communication/src/test/groovy/datadog/communication/ddagent/SharedCommunicationsObjectsSpecification.groovy @@ -1,6 +1,6 @@ package datadog.communication.ddagent -import datadog.communication.monitor.Monitoring +import datadog.metrics.api.Monitoring import datadog.trace.api.Config import datadog.trace.test.util.DDSpecification import okhttp3.HttpUrl diff --git a/dd-java-agent/agent-bootstrap/build.gradle b/dd-java-agent/agent-bootstrap/build.gradle index 6d33a2c709d..a781747b2aa 100644 --- a/dd-java-agent/agent-bootstrap/build.gradle +++ b/dd-java-agent/agent-bootstrap/build.gradle @@ -23,6 +23,7 @@ dependencies { api project(':dd-java-agent:agent-debugger:debugger-bootstrap') api project(':components:environment') api project(':components:json') + api project(':products:metrics:api') api libs.instrument.java api libs.slf4j // ^ Generally a bad idea for libraries, but we're shadowing. diff --git a/dd-java-agent/agent-bootstrap/src/main/java/datadog/trace/bootstrap/Agent.java b/dd-java-agent/agent-bootstrap/src/main/java/datadog/trace/bootstrap/Agent.java index f19a034fd12..a76e24931d9 100644 --- a/dd-java-agent/agent-bootstrap/src/main/java/datadog/trace/bootstrap/Agent.java +++ b/dd-java-agent/agent-bootstrap/src/main/java/datadog/trace/bootstrap/Agent.java @@ -23,9 +23,9 @@ import datadog.environment.SystemProperties; import datadog.instrument.classinject.ClassInjector; import datadog.instrument.utils.ClassLoaderValue; +import datadog.metrics.statsd.StatsDClientManager; import datadog.trace.api.Config; import datadog.trace.api.Platform; -import datadog.trace.api.StatsDClientManager; import datadog.trace.api.WithGlobalTracer; import datadog.trace.api.appsec.AppSecEventTracker; import datadog.trace.api.config.AppSecConfig; diff --git a/dd-java-agent/agent-crashtracking/build.gradle b/dd-java-agent/agent-crashtracking/build.gradle index 752ba182ac4..abcc615bed5 100644 --- a/dd-java-agent/agent-crashtracking/build.gradle +++ b/dd-java-agent/agent-crashtracking/build.gradle @@ -14,6 +14,7 @@ dependencies { implementation libs.slf4j implementation project(':communication') implementation project(':internal-api') + implementation project(':products:metrics:lib') implementation project(':utils:container-utils') implementation project(':utils:version-utils') implementation project(path: ':dd-java-agent:ddprof-lib', configuration: 'shadow') diff --git a/dd-java-agent/agent-crashtracking/src/main/java/datadog/crashtracking/OOMENotifier.java b/dd-java-agent/agent-crashtracking/src/main/java/datadog/crashtracking/OOMENotifier.java index 4e8486c1c39..9b96f206abd 100644 --- a/dd-java-agent/agent-crashtracking/src/main/java/datadog/crashtracking/OOMENotifier.java +++ b/dd-java-agent/agent-crashtracking/src/main/java/datadog/crashtracking/OOMENotifier.java @@ -1,8 +1,8 @@ package datadog.crashtracking; -import static datadog.communication.monitor.DDAgentStatsDClientManager.statsDClientManager; +import static datadog.metrics.statsd.DDAgentStatsDClientManager.statsDClientManager; -import datadog.trace.api.StatsDClient; +import datadog.metrics.statsd.StatsDClient; import de.thetaphi.forbiddenapis.SuppressForbidden; import java.util.concurrent.locks.LockSupport; import org.slf4j.Logger; diff --git a/dd-java-agent/agent-debugger/build.gradle b/dd-java-agent/agent-debugger/build.gradle index 0ef3992644f..37c4066e4c7 100644 --- a/dd-java-agent/agent-debugger/build.gradle +++ b/dd-java-agent/agent-debugger/build.gradle @@ -35,6 +35,7 @@ dependencies { implementation libs.bundles.asm implementation project(':internal-api') implementation project(':communication') + implementation project(':products:metrics:lib') compileOnly project(':dd-java-agent:agent-tooling') compileOnly project(':dd-java-agent:agent-builder') compileOnly project(':dd-trace-core') diff --git a/dd-java-agent/agent-debugger/src/main/java/com/datadog/debugger/agent/StatsdMetricForwarder.java b/dd-java-agent/agent-debugger/src/main/java/com/datadog/debugger/agent/StatsdMetricForwarder.java index 7a79d6a29e6..20ecb6f8d4b 100644 --- a/dd-java-agent/agent-debugger/src/main/java/com/datadog/debugger/agent/StatsdMetricForwarder.java +++ b/dd-java-agent/agent-debugger/src/main/java/com/datadog/debugger/agent/StatsdMetricForwarder.java @@ -2,9 +2,9 @@ import com.datadog.debugger.sink.ProbeStatusSink; import com.timgroup.statsd.StatsDClientErrorHandler; -import datadog.communication.monitor.DDAgentStatsDClientManager; +import datadog.metrics.statsd.DDAgentStatsDClientManager; +import datadog.metrics.statsd.StatsDClient; import datadog.trace.api.Config; -import datadog.trace.api.StatsDClient; import datadog.trace.bootstrap.debugger.DebuggerContext; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/dd-java-agent/agent-debugger/src/main/java/com/datadog/debugger/util/DebuggerMetrics.java b/dd-java-agent/agent-debugger/src/main/java/com/datadog/debugger/util/DebuggerMetrics.java index cedb952fe94..09811c8be15 100644 --- a/dd-java-agent/agent-debugger/src/main/java/com/datadog/debugger/util/DebuggerMetrics.java +++ b/dd-java-agent/agent-debugger/src/main/java/com/datadog/debugger/util/DebuggerMetrics.java @@ -1,8 +1,8 @@ package com.datadog.debugger.util; -import datadog.communication.monitor.DDAgentStatsDClientManager; +import datadog.metrics.statsd.DDAgentStatsDClientManager; +import datadog.metrics.statsd.StatsDClient; import datadog.trace.api.Config; -import datadog.trace.api.StatsDClient; /** implements a StatsD client for internal debugger agent metrics */ public class DebuggerMetrics implements StatsDClient { diff --git a/dd-java-agent/agent-jmxfetch/src/main/java/datadog/trace/agent/jmxfetch/AgentStatsdReporter.java b/dd-java-agent/agent-jmxfetch/src/main/java/datadog/trace/agent/jmxfetch/AgentStatsdReporter.java index 3ab5197163e..270a2d5d582 100644 --- a/dd-java-agent/agent-jmxfetch/src/main/java/datadog/trace/agent/jmxfetch/AgentStatsdReporter.java +++ b/dd-java-agent/agent-jmxfetch/src/main/java/datadog/trace/agent/jmxfetch/AgentStatsdReporter.java @@ -1,6 +1,6 @@ package datadog.trace.agent.jmxfetch; -import datadog.trace.api.StatsDClient; +import datadog.metrics.statsd.StatsDClient; import datadog.trace.api.flare.TracerFlare; import java.io.IOException; import java.text.NumberFormat; diff --git a/dd-java-agent/agent-jmxfetch/src/main/java/datadog/trace/agent/jmxfetch/JMXFetch.java b/dd-java-agent/agent-jmxfetch/src/main/java/datadog/trace/agent/jmxfetch/JMXFetch.java index ea2a79f49c2..e40b3ea9800 100644 --- a/dd-java-agent/agent-jmxfetch/src/main/java/datadog/trace/agent/jmxfetch/JMXFetch.java +++ b/dd-java-agent/agent-jmxfetch/src/main/java/datadog/trace/agent/jmxfetch/JMXFetch.java @@ -5,10 +5,10 @@ import static org.datadog.jmxfetch.AppConfig.ACTION_COLLECT; import datadog.environment.SystemProperties; +import datadog.metrics.statsd.StatsDClient; +import datadog.metrics.statsd.StatsDClientManager; import datadog.trace.api.Config; import datadog.trace.api.GlobalTracer; -import datadog.trace.api.StatsDClient; -import datadog.trace.api.StatsDClientManager; import datadog.trace.api.flare.TracerFlare; import datadog.trace.api.telemetry.LogCollector; import de.thetaphi.forbiddenapis.SuppressForbidden; diff --git a/dd-java-agent/agent-tooling/build.gradle b/dd-java-agent/agent-tooling/build.gradle index 6f7a73393ff..2cca8587243 100644 --- a/dd-java-agent/agent-tooling/build.gradle +++ b/dd-java-agent/agent-tooling/build.gradle @@ -63,6 +63,7 @@ dependencies { api libs.bytebuddyagent implementation group: 'net.java.dev.jna', name: 'jna', version: '5.8.0' implementation group: 'net.java.dev.jna', name: 'jna-platform', version: '5.8.0' + implementation project(':products:metrics:lib') api project(':dd-trace-core') implementation project(':dd-java-agent:agent-crashtracking') diff --git a/dd-java-agent/agent-tooling/src/main/java/datadog/trace/agent/tooling/nativeimage/TracerActivation.java b/dd-java-agent/agent-tooling/src/main/java/datadog/trace/agent/tooling/nativeimage/TracerActivation.java index 9c5f769ad19..8bc1876bca9 100644 --- a/dd-java-agent/agent-tooling/src/main/java/datadog/trace/agent/tooling/nativeimage/TracerActivation.java +++ b/dd-java-agent/agent-tooling/src/main/java/datadog/trace/agent/tooling/nativeimage/TracerActivation.java @@ -2,11 +2,11 @@ import com.datadog.profiling.controller.openjdk.JFREventContextIntegration; import datadog.communication.ddagent.SharedCommunicationObjects; -import datadog.communication.monitor.DDAgentStatsDClientManager; +import datadog.metrics.statsd.DDAgentStatsDClientManager; +import datadog.metrics.statsd.StatsDClientManager; import datadog.trace.agent.jmxfetch.JMXFetch; import datadog.trace.agent.tooling.ProfilerInstaller; import datadog.trace.agent.tooling.TracerInstaller; -import datadog.trace.api.StatsDClientManager; import datadog.trace.bootstrap.instrumentation.api.ProfilingContextIntegration; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/dd-java-agent/appsec/build.gradle b/dd-java-agent/appsec/build.gradle index a9bb2b1b001..f69c5f996ab 100644 --- a/dd-java-agent/appsec/build.gradle +++ b/dd-java-agent/appsec/build.gradle @@ -14,6 +14,7 @@ dependencies { api libs.slf4j implementation project(':internal-api') implementation project(':communication') + implementation project(':products:metrics:api') implementation project(':telemetry') implementation group: 'io.sqreen', name: 'libsqreen', version: '17.3.0' implementation libs.moshi diff --git a/dd-java-agent/appsec/src/main/java/com/datadog/appsec/AppSecSystem.java b/dd-java-agent/appsec/src/main/java/com/datadog/appsec/AppSecSystem.java index 992e7dddace..7258637b5bd 100644 --- a/dd-java-agent/appsec/src/main/java/com/datadog/appsec/AppSecSystem.java +++ b/dd-java-agent/appsec/src/main/java/com/datadog/appsec/AppSecSystem.java @@ -15,7 +15,7 @@ import datadog.appsec.api.blocking.Blocking; import datadog.appsec.api.blocking.BlockingService; import datadog.communication.ddagent.SharedCommunicationObjects; -import datadog.communication.monitor.Monitoring; +import datadog.metrics.api.Monitoring; import datadog.remoteconfig.ConfigurationPoller; import datadog.trace.api.Config; import datadog.trace.api.ProductActivation; diff --git a/dd-java-agent/appsec/src/main/java/com/datadog/appsec/ddwaf/WAFModule.java b/dd-java-agent/appsec/src/main/java/com/datadog/appsec/ddwaf/WAFModule.java index b7a70694077..00295e0a64c 100644 --- a/dd-java-agent/appsec/src/main/java/com/datadog/appsec/ddwaf/WAFModule.java +++ b/dd-java-agent/appsec/src/main/java/com/datadog/appsec/ddwaf/WAFModule.java @@ -28,8 +28,8 @@ import com.squareup.moshi.Moshi; import com.squareup.moshi.Types; import datadog.appsec.api.blocking.BlockingContentType; -import datadog.communication.monitor.Counter; -import datadog.communication.monitor.Monitoring; +import datadog.metrics.api.Counter; +import datadog.metrics.api.Monitoring; import datadog.trace.api.Config; import datadog.trace.api.ProductActivation; import datadog.trace.api.ProductTraceSource; diff --git a/dd-java-agent/build.gradle b/dd-java-agent/build.gradle index 1b6ccfba789..f2594317ad1 100644 --- a/dd-java-agent/build.gradle +++ b/dd-java-agent/build.gradle @@ -366,6 +366,12 @@ dependencies { // do not bring along slf4j and dependent subprojects // (which are loaded on the bootstrap cl) } + sharedShadowInclude project(':products:metrics:api'), { + transitive = false + } + sharedShadowInclude project(':products:metrics:lib'), { + transitive = false + } sharedShadowInclude project(':telemetry'), { transitive = false // do not bring along slf4j and dependent subprojects diff --git a/dd-java-agent/instrumentation/spark/spark-common/build.gradle b/dd-java-agent/instrumentation/spark/spark-common/build.gradle index 84dd5cca6a5..311eaf80dff 100644 --- a/dd-java-agent/instrumentation/spark/spark-common/build.gradle +++ b/dd-java-agent/instrumentation/spark/spark-common/build.gradle @@ -11,6 +11,8 @@ dependencies { compileOnly group: 'org.apache.spark', name: 'spark-core_2.12', version: '2.4.0' compileOnly group: 'org.apache.spark', name: 'spark-sql_2.12', version: '2.4.0' + implementation project(':products:metrics:lib') // Is this valid? + testFixturesImplementation group: 'com.datadoghq', name: 'sketches-java', version: '0.8.2' testFixturesImplementation group: 'com.google.protobuf', name: 'protobuf-java', version: '3.14.0' diff --git a/dd-java-agent/instrumentation/spark/spark-common/src/main/java/datadog/trace/instrumentation/spark/SparkAggregatedTaskMetrics.java b/dd-java-agent/instrumentation/spark/spark-common/src/main/java/datadog/trace/instrumentation/spark/SparkAggregatedTaskMetrics.java index 641f7bbf1cc..769f933e934 100644 --- a/dd-java-agent/instrumentation/spark/spark-common/src/main/java/datadog/trace/instrumentation/spark/SparkAggregatedTaskMetrics.java +++ b/dd-java-agent/instrumentation/spark/spark-common/src/main/java/datadog/trace/instrumentation/spark/SparkAggregatedTaskMetrics.java @@ -1,9 +1,9 @@ package datadog.trace.instrumentation.spark; +import datadog.metrics.api.Histogram; +import datadog.metrics.histogram.Histograms; import datadog.trace.api.Config; -import datadog.trace.bootstrap.instrumentation.api.AgentHistogram; import datadog.trace.bootstrap.instrumentation.api.AgentSpan; -import datadog.trace.bootstrap.instrumentation.api.AgentTracer; import java.nio.ByteBuffer; import java.util.Base64; import org.apache.spark.TaskFailedReason; @@ -53,12 +53,12 @@ class SparkAggregatedTaskMetrics { private long totalTaskRunTimeSinceLastStage = 0L; private long skewTime = 0; - private AgentHistogram taskRunTimeHistogram; - private AgentHistogram inputBytesHistogram; - private AgentHistogram outputBytesHistogram; - private AgentHistogram shuffleReadBytesHistogram; - private AgentHistogram shuffleWriteBytesHistogram; - private AgentHistogram diskBytesSpilledHistogram; + private Histogram taskRunTimeHistogram; + private Histogram inputBytesHistogram; + private Histogram outputBytesHistogram; + private Histogram shuffleReadBytesHistogram; + private Histogram shuffleWriteBytesHistogram; + private Histogram diskBytesSpilledHistogram; public SparkAggregatedTaskMetrics() {} @@ -258,14 +258,14 @@ public void setSpanMetrics(AgentSpan span) { * usually involve either input/output or shuffle read/write operations, resulting in an average * of 3 histograms having non-zero values */ - private AgentHistogram lazyHistogramAccept(AgentHistogram hist, double value) { + private Histogram lazyHistogramAccept(Histogram hist, double value) { if (hist != null) { hist.accept(value); } else { if (value != 0) { // All the callbacks in DatadogSparkListener are called from the same thread, meaning we // don't risk to lose values by creating the histogram this way - hist = AgentTracer.get().newHistogram(HISTOGRAM_RELATIVE_ACCURACY, HISTOGRAM_MAX_NUM_BINS); + hist = Histograms.newHistogram(HISTOGRAM_RELATIVE_ACCURACY, HISTOGRAM_MAX_NUM_BINS); if (taskCompletedCount > 1) { // Filling all the previous 0s that we might have missed hist.accept(0, taskCompletedCount - 1); @@ -283,7 +283,7 @@ public static long computeTaskRunTime(TaskMetrics metrics) { + metrics.resultSerializationTime(); } - private static String histogramToBase64(AgentHistogram hist) { + private static String histogramToBase64(Histogram hist) { ByteBuffer bb = hist.serialize(); byte[] bytes; diff --git a/dd-trace-core/build.gradle b/dd-trace-core/build.gradle index b2d17cc8ef1..2dd30133590 100644 --- a/dd-trace-core/build.gradle +++ b/dd-trace-core/build.gradle @@ -66,7 +66,9 @@ dependencies { api project(':dd-trace-api') api project(':communication') api project(':internal-api') + api project(':products:metrics:api') implementation project(':components:json') + implementation project(':products:metrics:lib') implementation project(':utils:container-utils') implementation project(':utils:socket-utils') // for span exception debugging @@ -76,6 +78,7 @@ dependencies { implementation libs.moshi implementation libs.jctools + // Required for DataStream Monitoring product implementation group: 'com.datadoghq', name: 'sketches-java', version: '0.8.3' implementation group: 'com.google.re2j', name: 're2j', version: '1.7' diff --git a/dd-trace-core/src/main/java/datadog/trace/common/metrics/AggregateMetric.java b/dd-trace-core/src/main/java/datadog/trace/common/metrics/AggregateMetric.java index 9c16477bfad..547c2db464e 100644 --- a/dd-trace-core/src/main/java/datadog/trace/common/metrics/AggregateMetric.java +++ b/dd-trace-core/src/main/java/datadog/trace/common/metrics/AggregateMetric.java @@ -1,7 +1,7 @@ package datadog.trace.common.metrics; -import datadog.trace.core.histogram.Histogram; -import datadog.trace.core.histogram.Histograms; +import datadog.metrics.api.Histogram; +import datadog.metrics.histogram.Histograms; import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; import java.util.concurrent.atomic.AtomicLongArray; 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 728df7a134f..f02f5c4b2ca 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 @@ -7,7 +7,7 @@ import static datadog.trace.common.writer.ddagent.Prioritization.FAST_LANE; import datadog.communication.ddagent.DDAgentFeaturesDiscovery; -import datadog.communication.monitor.Monitoring; +import datadog.metrics.api.Monitoring; import datadog.trace.api.Config; import datadog.trace.common.sampling.SingleSpanSampler; import datadog.trace.common.writer.ddagent.DDAgentApi; diff --git a/dd-trace-core/src/main/java/datadog/trace/common/writer/DDIntakeWriter.java b/dd-trace-core/src/main/java/datadog/trace/common/writer/DDIntakeWriter.java index f298a5e8f6a..c75ef712ae2 100644 --- a/dd-trace-core/src/main/java/datadog/trace/common/writer/DDIntakeWriter.java +++ b/dd-trace-core/src/main/java/datadog/trace/common/writer/DDIntakeWriter.java @@ -1,7 +1,7 @@ package datadog.trace.common.writer; import datadog.communication.ddagent.DroppingPolicy; -import datadog.communication.monitor.Monitoring; +import datadog.metrics.api.Monitoring; import datadog.trace.api.Config; import datadog.trace.api.civisibility.CiVisibilityWellKnownTags; import datadog.trace.api.intake.TrackType; diff --git a/dd-trace-core/src/main/java/datadog/trace/common/writer/PayloadDispatcherImpl.java b/dd-trace-core/src/main/java/datadog/trace/common/writer/PayloadDispatcherImpl.java index 77fbd5c5a74..5ba20fd25da 100644 --- a/dd-trace-core/src/main/java/datadog/trace/common/writer/PayloadDispatcherImpl.java +++ b/dd-trace-core/src/main/java/datadog/trace/common/writer/PayloadDispatcherImpl.java @@ -1,11 +1,11 @@ package datadog.trace.common.writer; -import datadog.communication.monitor.Monitoring; -import datadog.communication.monitor.Recording; import datadog.communication.serialization.ByteBufferConsumer; import datadog.communication.serialization.FlushingBuffer; import datadog.communication.serialization.WritableFormatter; import datadog.communication.serialization.msgpack.MsgPackWriter; +import datadog.metrics.api.Monitoring; +import datadog.metrics.api.Recording; import datadog.trace.core.CoreSpan; import datadog.trace.core.monitor.HealthMetrics; import java.nio.ByteBuffer; diff --git a/dd-trace-core/src/main/java/datadog/trace/common/writer/ddagent/DDAgentApi.java b/dd-trace-core/src/main/java/datadog/trace/common/writer/ddagent/DDAgentApi.java index 645bbc4b9e9..e5fa8aee520 100644 --- a/dd-trace-core/src/main/java/datadog/trace/common/writer/ddagent/DDAgentApi.java +++ b/dd-trace-core/src/main/java/datadog/trace/common/writer/ddagent/DDAgentApi.java @@ -6,9 +6,9 @@ import com.squareup.moshi.Moshi; import com.squareup.moshi.Types; import datadog.communication.ddagent.DDAgentFeaturesDiscovery; -import datadog.communication.monitor.Counter; -import datadog.communication.monitor.Monitoring; -import datadog.communication.monitor.Recording; +import datadog.metrics.api.Counter; +import datadog.metrics.api.Monitoring; +import datadog.metrics.api.Recording; import datadog.trace.api.Config; import datadog.trace.common.writer.Payload; import datadog.trace.common.writer.RemoteApi; 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 f434fe820b9..6a9908a4bd0 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 @@ -1,6 +1,6 @@ package datadog.trace.core; -import static datadog.communication.monitor.DDAgentStatsDClientManager.statsDClientManager; +import static datadog.metrics.statsd.DDAgentStatsDClientManager.statsDClientManager; import static datadog.trace.api.DDTags.DJM_ENABLED; import static datadog.trace.api.DDTags.DSM_ENABLED; import static datadog.trace.api.DDTags.PROFILING_CONTEXT_ENGINE; @@ -22,10 +22,12 @@ import datadog.communication.ddagent.DDAgentFeaturesDiscovery; import datadog.communication.ddagent.ExternalAgentLauncher; import datadog.communication.ddagent.SharedCommunicationObjects; -import datadog.communication.monitor.Monitoring; -import datadog.communication.monitor.Recording; import datadog.context.propagation.Propagators; import datadog.environment.ThreadSupport; +import datadog.metrics.api.Monitoring; +import datadog.metrics.api.MonitoringImpl; +import datadog.metrics.api.Recording; +import datadog.metrics.statsd.StatsDClient; import datadog.trace.api.ClassloaderConfigurationOverrides; import datadog.trace.api.Config; import datadog.trace.api.DDSpanId; @@ -33,7 +35,6 @@ import datadog.trace.api.DynamicConfig; import datadog.trace.api.EndpointTracker; import datadog.trace.api.IdGenerationStrategy; -import datadog.trace.api.StatsDClient; import datadog.trace.api.TagMap; import datadog.trace.api.TraceConfig; import datadog.trace.api.config.GeneralConfig; @@ -57,7 +58,6 @@ import datadog.trace.api.scopemanager.ScopeListener; import datadog.trace.api.time.SystemTimeSource; import datadog.trace.api.time.TimeSource; -import datadog.trace.bootstrap.instrumentation.api.AgentHistogram; import datadog.trace.bootstrap.instrumentation.api.AgentScope; import datadog.trace.bootstrap.instrumentation.api.AgentSpan; import datadog.trace.bootstrap.instrumentation.api.AgentSpanContext; @@ -87,9 +87,7 @@ import datadog.trace.core.baggage.BaggagePropagator; import datadog.trace.core.datastreams.DataStreamsMonitoring; import datadog.trace.core.datastreams.DefaultDataStreamsMonitoring; -import datadog.trace.core.histogram.Histograms; import datadog.trace.core.monitor.HealthMetrics; -import datadog.trace.core.monitor.MonitoringImpl; import datadog.trace.core.monitor.TracerHealthMetrics; import datadog.trace.core.propagation.ExtractedContext; import datadog.trace.core.propagation.HttpCodec; @@ -260,11 +258,6 @@ public ConfigSnapshot captureTraceConfig() { return dynamicConfig.captureTraceConfig(); } - @Override - public AgentHistogram newHistogram(double relativeAccuracy, int maxNumBins) { - return Histograms.newHistogram(relativeAccuracy, maxNumBins); - } - @Override public void updatePreferredServiceName(String serviceName) { dynamicConfig.current().setPreferredServiceName(serviceName).apply(); diff --git a/dd-trace-core/src/main/java/datadog/trace/core/PendingTrace.java b/dd-trace-core/src/main/java/datadog/trace/core/PendingTrace.java index 985ed06372d..4842a53c2ae 100644 --- a/dd-trace-core/src/main/java/datadog/trace/core/PendingTrace.java +++ b/dd-trace-core/src/main/java/datadog/trace/core/PendingTrace.java @@ -1,6 +1,6 @@ package datadog.trace.core; -import datadog.communication.monitor.Recording; +import datadog.metrics.api.Recording; import datadog.trace.api.DDTraceId; import datadog.trace.api.time.TimeSource; import datadog.trace.bootstrap.instrumentation.api.AgentScope; diff --git a/dd-trace-core/src/main/java/datadog/trace/core/datastreams/StatsGroup.java b/dd-trace-core/src/main/java/datadog/trace/core/datastreams/StatsGroup.java index 7831b58e365..ed86285fdac 100644 --- a/dd-trace-core/src/main/java/datadog/trace/core/datastreams/StatsGroup.java +++ b/dd-trace-core/src/main/java/datadog/trace/core/datastreams/StatsGroup.java @@ -1,8 +1,8 @@ package datadog.trace.core.datastreams; +import datadog.metrics.api.Histogram; +import datadog.metrics.histogram.Histograms; import datadog.trace.api.datastreams.DataStreamsTags; -import datadog.trace.core.histogram.Histogram; -import datadog.trace.core.histogram.Histograms; public class StatsGroup { private static final double NANOSECONDS_TO_SECOND = 1_000_000_000d; diff --git a/dd-trace-core/src/main/java/datadog/trace/core/monitor/TracerHealthMetrics.java b/dd-trace-core/src/main/java/datadog/trace/core/monitor/TracerHealthMetrics.java index 54024e85721..59ff97b965d 100644 --- a/dd-trace-core/src/main/java/datadog/trace/core/monitor/TracerHealthMetrics.java +++ b/dd-trace-core/src/main/java/datadog/trace/core/monitor/TracerHealthMetrics.java @@ -9,7 +9,7 @@ import static datadog.trace.bootstrap.instrumentation.api.Tags.SPAN_KIND_CLIENT; import static java.util.concurrent.TimeUnit.SECONDS; -import datadog.trace.api.StatsDClient; +import datadog.metrics.statsd.StatsDClient; import datadog.trace.api.cache.RadixTreeCache; import datadog.trace.common.writer.RemoteApi; import datadog.trace.core.DDSpan; 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 3342a975969..1c27277ba4e 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 @@ -4,13 +4,14 @@ import com.fasterxml.jackson.core.type.TypeReference import com.fasterxml.jackson.databind.ObjectMapper import datadog.communication.ddagent.DDAgentFeaturesDiscovery import datadog.communication.http.OkHttpUtils -import datadog.communication.monitor.Monitoring import datadog.communication.serialization.ByteBufferConsumer +import datadog.metrics.api.Monitoring +import datadog.metrics.api.MonitoringImpl +import datadog.metrics.statsd.StatsDClient import datadog.communication.serialization.FlushingBuffer import datadog.communication.serialization.msgpack.MsgPackWriter import datadog.trace.api.Config import datadog.trace.api.ProcessTags -import datadog.trace.api.StatsDClient import datadog.trace.bootstrap.instrumentation.api.InstrumentationTags import datadog.trace.common.sampling.RateByServiceTraceSampler import datadog.trace.common.writer.ddagent.DDAgentApi @@ -18,7 +19,6 @@ import datadog.trace.common.writer.ddagent.TraceMapperV0_4 import datadog.trace.common.writer.ddagent.TraceMapperV0_5 import datadog.trace.core.DDSpan import datadog.trace.core.DDSpanContext -import datadog.trace.core.monitor.MonitoringImpl import datadog.trace.core.propagation.PropagationTags import datadog.trace.core.test.DDCoreSpecification import okhttp3.HttpUrl 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 449fe5e3cc7..bc805875617 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 @@ -5,20 +5,20 @@ import static datadog.trace.api.config.GeneralConfig.EXPERIMENTAL_PROPAGATE_PROC import datadog.trace.api.DDSpanId import datadog.trace.api.DDTraceId import datadog.trace.api.ProcessTags -import datadog.trace.api.StatsDClient import datadog.trace.api.sampling.PrioritySampling import datadog.trace.api.datastreams.NoopPathwayContext import datadog.trace.common.writer.ddagent.DDAgentApi import datadog.communication.ddagent.DDAgentFeaturesDiscovery +import datadog.communication.http.OkHttpUtils +import datadog.metrics.api.MonitoringImpl +import datadog.metrics.statsd.StatsDClient import datadog.trace.common.writer.ddagent.TraceMapperV0_4 import datadog.trace.common.writer.ddagent.TraceMapperV0_5 import datadog.trace.core.CoreTracer import datadog.trace.core.DDSpan import datadog.trace.core.DDSpanContext import datadog.trace.core.PendingTrace -import datadog.communication.http.OkHttpUtils import datadog.trace.core.monitor.HealthMetrics -import datadog.trace.core.monitor.MonitoringImpl import datadog.communication.serialization.ByteBufferConsumer import datadog.communication.serialization.FlushingBuffer import datadog.communication.serialization.Mapper diff --git a/dd-trace-core/src/test/groovy/datadog/trace/common/writer/DDAgentWriterTest.groovy b/dd-trace-core/src/test/groovy/datadog/trace/common/writer/DDAgentWriterTest.groovy index d67fd3dee5f..4a0587f4033 100644 --- a/dd-trace-core/src/test/groovy/datadog/trace/common/writer/DDAgentWriterTest.groovy +++ b/dd-trace-core/src/test/groovy/datadog/trace/common/writer/DDAgentWriterTest.groovy @@ -3,17 +3,17 @@ package datadog.trace.common.writer import datadog.communication.ddagent.DDAgentFeaturesDiscovery import datadog.trace.api.DDSpanId import datadog.trace.api.DDTraceId -import datadog.trace.api.StatsDClient import datadog.trace.api.sampling.PrioritySampling import datadog.trace.api.datastreams.NoopPathwayContext import datadog.trace.common.writer.ddagent.DDAgentApi import datadog.trace.common.writer.ddagent.DDAgentMapperDiscovery +import datadog.metrics.statsd.StatsDClient +import datadog.metrics.api.MonitoringImpl import datadog.trace.core.CoreTracer import datadog.trace.core.DDSpan import datadog.trace.core.DDSpanContext import datadog.trace.core.PendingTrace import datadog.trace.core.monitor.HealthMetrics -import datadog.trace.core.monitor.MonitoringImpl import datadog.trace.core.propagation.PropagationTags import datadog.trace.core.test.DDCoreSpecification import spock.lang.Subject diff --git a/dd-trace-core/src/test/groovy/datadog/trace/common/writer/DDIntakeWriterCombinedTest.groovy b/dd-trace-core/src/test/groovy/datadog/trace/common/writer/DDIntakeWriterCombinedTest.groovy index 636516f2b84..0b485a00584 100644 --- a/dd-trace-core/src/test/groovy/datadog/trace/common/writer/DDIntakeWriterCombinedTest.groovy +++ b/dd-trace-core/src/test/groovy/datadog/trace/common/writer/DDIntakeWriterCombinedTest.groovy @@ -6,11 +6,12 @@ import datadog.communication.serialization.FlushingBuffer import datadog.communication.serialization.msgpack.MsgPackWriter import datadog.trace.api.DDSpanId import datadog.trace.api.DDTraceId -import datadog.trace.api.StatsDClient import datadog.trace.api.civisibility.CiVisibilityWellKnownTags import datadog.trace.api.intake.TrackType import datadog.trace.api.sampling.PrioritySampling import datadog.trace.api.datastreams.NoopPathwayContext +import datadog.metrics.api.MonitoringImpl +import datadog.metrics.statsd.StatsDClient import datadog.trace.common.writer.ddintake.DDIntakeApi import datadog.trace.common.writer.ddintake.DDIntakeMapperDiscovery import datadog.trace.core.CoreTracer @@ -18,7 +19,6 @@ import datadog.trace.core.DDSpan import datadog.trace.core.DDSpanContext import datadog.trace.core.PendingTrace import datadog.trace.core.monitor.HealthMetrics -import datadog.trace.core.monitor.MonitoringImpl import datadog.trace.core.monitor.TracerHealthMetrics import datadog.trace.core.propagation.PropagationTags import datadog.trace.core.test.DDCoreSpecification diff --git a/dd-trace-core/src/test/groovy/datadog/trace/common/writer/DDIntakeWriterTest.groovy b/dd-trace-core/src/test/groovy/datadog/trace/common/writer/DDIntakeWriterTest.groovy index 4629d33a096..a02fd5c0bf7 100644 --- a/dd-trace-core/src/test/groovy/datadog/trace/common/writer/DDIntakeWriterTest.groovy +++ b/dd-trace-core/src/test/groovy/datadog/trace/common/writer/DDIntakeWriterTest.groovy @@ -3,10 +3,11 @@ package datadog.trace.common.writer import datadog.communication.ddagent.DDAgentFeaturesDiscovery import datadog.trace.api.DDSpanId import datadog.trace.api.DDTraceId -import datadog.trace.api.StatsDClient import datadog.trace.api.intake.TrackType import datadog.trace.api.sampling.PrioritySampling import datadog.trace.api.datastreams.NoopPathwayContext +import datadog.metrics.api.MonitoringImpl +import datadog.metrics.statsd.StatsDClient import datadog.trace.common.writer.ddagent.DDAgentApi import datadog.trace.common.writer.ddagent.DDAgentMapperDiscovery import datadog.trace.core.CoreTracer @@ -14,7 +15,6 @@ import datadog.trace.core.DDSpan import datadog.trace.core.DDSpanContext import datadog.trace.core.PendingTrace import datadog.trace.core.monitor.HealthMetrics -import datadog.trace.core.monitor.MonitoringImpl import datadog.trace.core.propagation.PropagationTags import datadog.trace.core.test.DDCoreSpecification import spock.lang.Subject diff --git a/dd-trace-core/src/test/groovy/datadog/trace/common/writer/PayloadDispatcherImplTest.groovy b/dd-trace-core/src/test/groovy/datadog/trace/common/writer/PayloadDispatcherImplTest.groovy index afb0982b102..f824156da6a 100644 --- a/dd-trace-core/src/test/groovy/datadog/trace/common/writer/PayloadDispatcherImplTest.groovy +++ b/dd-trace-core/src/test/groovy/datadog/trace/common/writer/PayloadDispatcherImplTest.groovy @@ -3,9 +3,10 @@ package datadog.trace.common.writer import datadog.communication.ddagent.DDAgentFeaturesDiscovery import datadog.trace.api.DDSpanId import datadog.trace.api.DDTraceId -import datadog.trace.api.StatsDClient import datadog.trace.api.sampling.PrioritySampling import datadog.trace.api.datastreams.NoopPathwayContext +import datadog.metrics.api.MonitoringImpl +import datadog.metrics.statsd.StatsDClient import datadog.trace.common.writer.ddagent.DDAgentApi import datadog.trace.common.writer.ddagent.DDAgentMapperDiscovery import datadog.trace.core.CoreTracer @@ -13,7 +14,6 @@ import datadog.trace.core.DDSpan import datadog.trace.core.DDSpanContext import datadog.trace.core.PendingTrace import datadog.trace.core.monitor.HealthMetrics -import datadog.trace.core.monitor.MonitoringImpl import datadog.trace.core.propagation.PropagationTags import datadog.trace.test.util.DDSpecification import spock.lang.Shared diff --git a/dd-trace-core/src/traceAgentTest/groovy/DDApiIntegrationTest.groovy b/dd-trace-core/src/traceAgentTest/groovy/DDApiIntegrationTest.groovy index d0ed753e028..3643ba04d4e 100644 --- a/dd-trace-core/src/traceAgentTest/groovy/DDApiIntegrationTest.groovy +++ b/dd-trace-core/src/traceAgentTest/groovy/DDApiIntegrationTest.groovy @@ -3,8 +3,9 @@ import datadog.communication.http.OkHttpUtils import datadog.communication.serialization.ByteBufferConsumer import datadog.communication.serialization.FlushingBuffer import datadog.communication.serialization.msgpack.MsgPackWriter +import datadog.metrics.api.MonitoringImpl +import datadog.metrics.statsd.StatsDClient import datadog.trace.api.Config -import datadog.trace.api.StatsDClient import datadog.trace.common.writer.ListWriter import datadog.trace.common.writer.Payload import datadog.trace.common.writer.RemoteApi @@ -15,7 +16,6 @@ import datadog.trace.common.writer.ddagent.TraceMapperV0_4 import datadog.trace.common.writer.ddagent.TraceMapperV0_5 import datadog.trace.core.CoreTracer import datadog.trace.core.DDSpan -import datadog.trace.core.monitor.MonitoringImpl import okhttp3.HttpUrl import okhttp3.OkHttpClient import spock.lang.Shared diff --git a/dd-trace-core/src/traceAgentTest/groovy/TraceMapperRealAgentTest.groovy b/dd-trace-core/src/traceAgentTest/groovy/TraceMapperRealAgentTest.groovy index b82e1f4a9d1..2c4cdc3bc6c 100644 --- a/dd-trace-core/src/traceAgentTest/groovy/TraceMapperRealAgentTest.groovy +++ b/dd-trace-core/src/traceAgentTest/groovy/TraceMapperRealAgentTest.groovy @@ -1,13 +1,13 @@ import datadog.communication.ddagent.DDAgentFeaturesDiscovery import datadog.communication.http.OkHttpUtils +import datadog.metrics.api.MonitoringImpl +import datadog.metrics.statsd.StatsDClient import datadog.trace.api.Config -import datadog.trace.api.StatsDClient import datadog.trace.common.writer.PayloadDispatcherImpl import datadog.trace.common.writer.ddagent.DDAgentApi import datadog.trace.common.writer.ddagent.DDAgentMapperDiscovery import datadog.trace.core.CoreSpan import datadog.trace.core.monitor.HealthMetrics -import datadog.trace.core.monitor.MonitoringImpl import okhttp3.HttpUrl import okhttp3.OkHttpClient diff --git a/gradle/dependencies.gradle b/gradle/dependencies.gradle index 35f3537825a..98bf8b55bdb 100644 --- a/gradle/dependencies.gradle +++ b/gradle/dependencies.gradle @@ -20,6 +20,8 @@ final class CachedData { exclude(project(':components:environment')) exclude(project(':components:json')) exclude(project(':products:feature-flagging:bootstrap')) + exclude(project(':products:metrics:api')) + exclude(project(':products:metrics:lib')) exclude(project(':remote-config:remote-config-api')) exclude(project(':remote-config:remote-config-core')) exclude(project(':telemetry')) diff --git a/internal-api/src/main/java/datadog/trace/bootstrap/instrumentation/api/AgentTracer.java b/internal-api/src/main/java/datadog/trace/bootstrap/instrumentation/api/AgentTracer.java index a6758d048a5..3365298bf25 100644 --- a/internal-api/src/main/java/datadog/trace/bootstrap/instrumentation/api/AgentTracer.java +++ b/internal-api/src/main/java/datadog/trace/bootstrap/instrumentation/api/AgentTracer.java @@ -17,7 +17,6 @@ import datadog.trace.api.sampling.SamplingRule; import datadog.trace.api.scopemanager.ScopeListener; import datadog.trace.context.TraceScope; -import java.nio.ByteBuffer; import java.util.Collections; import java.util.List; import java.util.Map; @@ -428,8 +427,6 @@ default SpanBuilder singleSpanBuilder(CharSequence spanName) { ProfilingContextIntegration getProfilingContext(); - AgentHistogram newHistogram(double relativeAccuracy, int maxNumBins); - /** * Sets the new service name to be used as a default. * @@ -679,11 +676,6 @@ public TraceConfig captureTraceConfig() { return NoopTraceConfig.INSTANCE; } - @Override - public AgentHistogram newHistogram(double relativeAccuracy, int maxNumBins) { - return NoopAgentHistogram.INSTANCE; - } - @Override public void updatePreferredServiceName(String serviceName) { // no ops @@ -700,49 +692,6 @@ public void registerContinuation(final AgentScope.Continuation continuation) {} public void removeContinuation(final AgentScope.Continuation continuation) {} } - public static class NoopAgentHistogram implements AgentHistogram { - public static final NoopAgentHistogram INSTANCE = new NoopAgentHistogram(); - - @Override - public double getCount() { - return 0; - } - - @Override - public boolean isEmpty() { - return true; - } - - @Override - public void accept(double value) {} - - @Override - public void accept(double value, double count) {} - - @Override - public double getValueAtQuantile(double quantile) { - return 0; - } - - @Override - public double getMinValue() { - return 0; - } - - @Override - public double getMaxValue() { - return 0; - } - - @Override - public void clear() {} - - @Override - public ByteBuffer serialize() { - return null; - } - } - /** TraceConfig when there is no tracer; this is not the same as a default config. */ public static final class NoopTraceConfig implements TraceConfig { public static final NoopTraceConfig INSTANCE = new NoopTraceConfig(); diff --git a/products/metrics/api/build.gradle.kts b/products/metrics/api/build.gradle.kts new file mode 100644 index 00000000000..dc802fd7cec --- /dev/null +++ b/products/metrics/api/build.gradle.kts @@ -0,0 +1,11 @@ +plugins { + `java-library` +} + +description = "Metrics API" + +apply(from = rootDir.resolve("gradle/java.gradle")) + +dependencies { + implementation(libs.slf4j) +} diff --git a/communication/src/main/java/datadog/communication/monitor/Counter.java b/products/metrics/api/src/main/java/datadog/metrics/api/Counter.java similarity index 74% rename from communication/src/main/java/datadog/communication/monitor/Counter.java rename to products/metrics/api/src/main/java/datadog/metrics/api/Counter.java index 4141c6b07fa..4adc603753f 100644 --- a/communication/src/main/java/datadog/communication/monitor/Counter.java +++ b/products/metrics/api/src/main/java/datadog/metrics/api/Counter.java @@ -1,4 +1,4 @@ -package datadog.communication.monitor; +package datadog.metrics.api; public interface Counter { diff --git a/internal-api/src/main/java/datadog/trace/bootstrap/instrumentation/api/AgentHistogram.java b/products/metrics/api/src/main/java/datadog/metrics/api/Histogram.java similarity index 76% rename from internal-api/src/main/java/datadog/trace/bootstrap/instrumentation/api/AgentHistogram.java rename to products/metrics/api/src/main/java/datadog/metrics/api/Histogram.java index f36e08ac812..38982343204 100644 --- a/internal-api/src/main/java/datadog/trace/bootstrap/instrumentation/api/AgentHistogram.java +++ b/products/metrics/api/src/main/java/datadog/metrics/api/Histogram.java @@ -1,8 +1,8 @@ -package datadog.trace.bootstrap.instrumentation.api; +package datadog.metrics.api; import java.nio.ByteBuffer; -public interface AgentHistogram { +public interface Histogram { double getCount(); diff --git a/products/metrics/api/src/main/java/datadog/metrics/api/Monitoring.java b/products/metrics/api/src/main/java/datadog/metrics/api/Monitoring.java new file mode 100644 index 00000000000..9ea3741403e --- /dev/null +++ b/products/metrics/api/src/main/java/datadog/metrics/api/Monitoring.java @@ -0,0 +1,13 @@ +package datadog.metrics.api; + +public interface Monitoring { + Monitoring DISABLED = new NoOpMonitoring(); + + Recording newTimer(String name); + + Recording newTimer(String name, String... tags); + + Recording newThreadLocalTimer(String name); + + Counter newCounter(String name); +} diff --git a/communication/src/main/java/datadog/communication/monitor/NoOpCounter.java b/products/metrics/api/src/main/java/datadog/metrics/api/NoOpCounter.java similarity index 64% rename from communication/src/main/java/datadog/communication/monitor/NoOpCounter.java rename to products/metrics/api/src/main/java/datadog/metrics/api/NoOpCounter.java index b44bea18339..fd627ad15cf 100644 --- a/communication/src/main/java/datadog/communication/monitor/NoOpCounter.java +++ b/products/metrics/api/src/main/java/datadog/metrics/api/NoOpCounter.java @@ -1,6 +1,6 @@ -package datadog.communication.monitor; +package datadog.metrics.api; -public final class NoOpCounter implements Counter { +final class NoOpCounter implements Counter { public static final Counter NO_OP = new NoOpCounter(); diff --git a/products/metrics/api/src/main/java/datadog/metrics/api/NoOpHistogram.java b/products/metrics/api/src/main/java/datadog/metrics/api/NoOpHistogram.java new file mode 100644 index 00000000000..94ba2895b14 --- /dev/null +++ b/products/metrics/api/src/main/java/datadog/metrics/api/NoOpHistogram.java @@ -0,0 +1,46 @@ +package datadog.metrics.api; + +import java.nio.ByteBuffer; + +class NoOpHistogram implements Histogram { + public static final Histogram INSTANCE = new NoOpHistogram(); + + @Override + public double getCount() { + return 0; + } + + @Override + public boolean isEmpty() { + return true; + } + + @Override + public void accept(double value) {} + + @Override + public void accept(double value, double count) {} + + @Override + public double getValueAtQuantile(double quantile) { + return 0; + } + + @Override + public double getMinValue() { + return 0; + } + + @Override + public double getMaxValue() { + return 0; + } + + @Override + public void clear() {} + + @Override + public ByteBuffer serialize() { + return null; + } +} diff --git a/products/metrics/api/src/main/java/datadog/metrics/api/NoOpMonitoring.java b/products/metrics/api/src/main/java/datadog/metrics/api/NoOpMonitoring.java new file mode 100644 index 00000000000..e9f63723a77 --- /dev/null +++ b/products/metrics/api/src/main/java/datadog/metrics/api/NoOpMonitoring.java @@ -0,0 +1,25 @@ +package datadog.metrics.api; + +final class NoOpMonitoring implements Monitoring { + NoOpMonitoring() {} + + @Override + public Recording newTimer(String name) { + return NoOpRecording.NO_OP; + } + + @Override + public Recording newTimer(String name, String... tags) { + return NoOpRecording.NO_OP; + } + + @Override + public Recording newThreadLocalTimer(String name) { + return NoOpRecording.NO_OP; + } + + @Override + public Counter newCounter(String name) { + return NoOpCounter.NO_OP; + } +} diff --git a/communication/src/main/java/datadog/communication/monitor/NoOpRecording.java b/products/metrics/api/src/main/java/datadog/metrics/api/NoOpRecording.java similarity index 73% rename from communication/src/main/java/datadog/communication/monitor/NoOpRecording.java rename to products/metrics/api/src/main/java/datadog/metrics/api/NoOpRecording.java index 32abc8716c1..fa09c1f69ab 100644 --- a/communication/src/main/java/datadog/communication/monitor/NoOpRecording.java +++ b/products/metrics/api/src/main/java/datadog/metrics/api/NoOpRecording.java @@ -1,6 +1,6 @@ -package datadog.communication.monitor; +package datadog.metrics.api; -public class NoOpRecording extends Recording { +final class NoOpRecording extends Recording { public static final Recording NO_OP = new NoOpRecording(); diff --git a/communication/src/main/java/datadog/communication/monitor/Recording.java b/products/metrics/api/src/main/java/datadog/metrics/api/Recording.java similarity index 86% rename from communication/src/main/java/datadog/communication/monitor/Recording.java rename to products/metrics/api/src/main/java/datadog/metrics/api/Recording.java index fa127749c98..a367e308bf0 100644 --- a/communication/src/main/java/datadog/communication/monitor/Recording.java +++ b/products/metrics/api/src/main/java/datadog/metrics/api/Recording.java @@ -1,4 +1,4 @@ -package datadog.communication.monitor; +package datadog.metrics.api; public abstract class Recording implements AutoCloseable { @Override diff --git a/internal-api/src/main/java/datadog/trace/api/NoOpStatsDClient.java b/products/metrics/api/src/main/java/datadog/metrics/statsd/NoOpStatsDClient.java similarity index 97% rename from internal-api/src/main/java/datadog/trace/api/NoOpStatsDClient.java rename to products/metrics/api/src/main/java/datadog/metrics/statsd/NoOpStatsDClient.java index 83f19552287..3e2e79d79d8 100644 --- a/internal-api/src/main/java/datadog/trace/api/NoOpStatsDClient.java +++ b/products/metrics/api/src/main/java/datadog/metrics/statsd/NoOpStatsDClient.java @@ -1,4 +1,4 @@ -package datadog.trace.api; +package datadog.metrics.statsd; final class NoOpStatsDClient implements StatsDClient { diff --git a/internal-api/src/main/java/datadog/trace/api/StatsDClient.java b/products/metrics/api/src/main/java/datadog/metrics/statsd/StatsDClient.java similarity index 97% rename from internal-api/src/main/java/datadog/trace/api/StatsDClient.java rename to products/metrics/api/src/main/java/datadog/metrics/statsd/StatsDClient.java index 19fbb471248..991bcd08c40 100644 --- a/internal-api/src/main/java/datadog/trace/api/StatsDClient.java +++ b/products/metrics/api/src/main/java/datadog/metrics/statsd/StatsDClient.java @@ -1,4 +1,4 @@ -package datadog.trace.api; +package datadog.metrics.statsd; import java.io.Closeable; diff --git a/internal-api/src/main/java/datadog/trace/api/StatsDClientManager.java b/products/metrics/api/src/main/java/datadog/metrics/statsd/StatsDClientManager.java similarity index 93% rename from internal-api/src/main/java/datadog/trace/api/StatsDClientManager.java rename to products/metrics/api/src/main/java/datadog/metrics/statsd/StatsDClientManager.java index a60438da570..d271a9e1371 100644 --- a/internal-api/src/main/java/datadog/trace/api/StatsDClientManager.java +++ b/products/metrics/api/src/main/java/datadog/metrics/statsd/StatsDClientManager.java @@ -1,4 +1,4 @@ -package datadog.trace.api; +package datadog.metrics.statsd; public interface StatsDClientManager { default StatsDClient statsDClient( diff --git a/products/metrics/lib/build.gradle.kts b/products/metrics/lib/build.gradle.kts new file mode 100644 index 00000000000..11d1ce33753 --- /dev/null +++ b/products/metrics/lib/build.gradle.kts @@ -0,0 +1,47 @@ +plugins { + `java-library` +} + +description = "StatsD client" + +apply(from = rootDir.resolve("gradle/java.gradle")) + +// TODO Try to clean up as many dependencies as possible after migrating the tests +dependencies { + api(project(":products:metrics:api")) + implementation(libs.slf4j) + implementation(libs.dogstatsd) + implementation(project(":internal-api")) + implementation(project(":utils:filesystem-utils")) + + implementation(group = "com.datadoghq", name = "sketches-java", version = "0.8.3") + + testImplementation(project(":utils:test-utils")) + testImplementation(libs.bundles.junit5) + testImplementation(libs.bytebuddy) + testImplementation("org.msgpack:msgpack-core:0.8.20") + testImplementation("org.msgpack:jackson-dataformat-msgpack:0.8.20") + testImplementation( + group = "com.squareup.okhttp3", + name = "mockwebserver", + version = libs.versions.okhttp.legacy.get() // actually a version range + ) +} + +val minimumBranchCoverage by extra(0.5) +val minimumInstructionCoverage by extra(0.8) +val excludedClassesCoverage by extra( + listOf( + "datadog.communication.monitor.DDAgentStatsDConnection", + "datadog.communication.monitor.DDAgentStatsDConnection.*", + "datadog.communication.monitor.LoggingStatsDClient", + ) +) +// val excludedClassesBranchCoverage by extra( +// listOf( +// ) +// ) +// val excludedClassesInstructionCoverage by extra( +// listOf( +// ) +// ) diff --git a/dd-trace-core/src/main/java/datadog/trace/core/monitor/MonitoringImpl.java b/products/metrics/lib/src/main/java/datadog/metrics/api/MonitoringImpl.java similarity index 82% rename from dd-trace-core/src/main/java/datadog/trace/core/monitor/MonitoringImpl.java rename to products/metrics/lib/src/main/java/datadog/metrics/api/MonitoringImpl.java index 361627d362e..8f6339a6b36 100644 --- a/dd-trace-core/src/main/java/datadog/trace/core/monitor/MonitoringImpl.java +++ b/products/metrics/lib/src/main/java/datadog/metrics/api/MonitoringImpl.java @@ -1,11 +1,6 @@ -package datadog.trace.core.monitor; +package datadog.metrics.api; -import datadog.communication.monitor.Counter; -import datadog.communication.monitor.Monitoring; -import datadog.communication.monitor.NoOpCounter; -import datadog.communication.monitor.NoOpRecording; -import datadog.communication.monitor.Recording; -import datadog.trace.api.StatsDClient; +import datadog.metrics.statsd.StatsDClient; import java.util.concurrent.TimeUnit; public final class MonitoringImpl implements Monitoring { diff --git a/dd-trace-core/src/main/java/datadog/trace/core/monitor/StatsDCounter.java b/products/metrics/lib/src/main/java/datadog/metrics/api/StatsDCounter.java similarity index 75% rename from dd-trace-core/src/main/java/datadog/trace/core/monitor/StatsDCounter.java rename to products/metrics/lib/src/main/java/datadog/metrics/api/StatsDCounter.java index c982cfe61a4..6f7039f2f21 100644 --- a/dd-trace-core/src/main/java/datadog/trace/core/monitor/StatsDCounter.java +++ b/products/metrics/lib/src/main/java/datadog/metrics/api/StatsDCounter.java @@ -1,9 +1,8 @@ -package datadog.trace.core.monitor; +package datadog.metrics.api; -import static datadog.trace.core.monitor.Utils.mergeTags; +import static datadog.metrics.api.Utils.mergeTags; -import datadog.communication.monitor.Counter; -import datadog.trace.api.StatsDClient; +import datadog.metrics.statsd.StatsDClient; public final class StatsDCounter implements Counter { diff --git a/dd-trace-core/src/main/java/datadog/trace/core/monitor/ThreadLocalRecording.java b/products/metrics/lib/src/main/java/datadog/metrics/api/ThreadLocalRecording.java similarity index 84% rename from dd-trace-core/src/main/java/datadog/trace/core/monitor/ThreadLocalRecording.java rename to products/metrics/lib/src/main/java/datadog/metrics/api/ThreadLocalRecording.java index 833eed4b14e..f427176dda9 100644 --- a/dd-trace-core/src/main/java/datadog/trace/core/monitor/ThreadLocalRecording.java +++ b/products/metrics/lib/src/main/java/datadog/metrics/api/ThreadLocalRecording.java @@ -1,6 +1,4 @@ -package datadog.trace.core.monitor; - -import datadog.communication.monitor.Recording; +package datadog.metrics.api; public class ThreadLocalRecording extends Recording { diff --git a/dd-trace-core/src/main/java/datadog/trace/core/monitor/Timer.java b/products/metrics/lib/src/main/java/datadog/metrics/api/Timer.java similarity index 89% rename from dd-trace-core/src/main/java/datadog/trace/core/monitor/Timer.java rename to products/metrics/lib/src/main/java/datadog/metrics/api/Timer.java index ba772d20cd7..f7046d33916 100644 --- a/dd-trace-core/src/main/java/datadog/trace/core/monitor/Timer.java +++ b/products/metrics/lib/src/main/java/datadog/metrics/api/Timer.java @@ -1,13 +1,11 @@ -package datadog.trace.core.monitor; +package datadog.metrics.api; -import static datadog.trace.core.monitor.Utils.mergeTags; +import static datadog.metrics.api.Utils.mergeTags; import static java.util.concurrent.TimeUnit.NANOSECONDS; import static java.util.concurrent.TimeUnit.SECONDS; -import datadog.communication.monitor.Recording; -import datadog.trace.api.StatsDClient; -import datadog.trace.core.histogram.Histogram; -import datadog.trace.core.histogram.Histograms; +import datadog.metrics.histogram.Histograms; +import datadog.metrics.statsd.StatsDClient; /** * A timer which records times in a histogram, and flushes stats from the histogram after a diff --git a/dd-trace-core/src/main/java/datadog/trace/core/monitor/Utils.java b/products/metrics/lib/src/main/java/datadog/metrics/api/Utils.java similarity index 79% rename from dd-trace-core/src/main/java/datadog/trace/core/monitor/Utils.java rename to products/metrics/lib/src/main/java/datadog/metrics/api/Utils.java index c69de28ec60..01b5e464f78 100644 --- a/dd-trace-core/src/main/java/datadog/trace/core/monitor/Utils.java +++ b/products/metrics/lib/src/main/java/datadog/metrics/api/Utils.java @@ -1,8 +1,10 @@ -package datadog.trace.core.monitor; +package datadog.metrics.api; import java.util.Arrays; -public class Utils { +public final class Utils { + private Utils() {} + static String[] mergeTags(String[] left, String[] right) { if (null == right) { return left; diff --git a/dd-trace-core/src/main/java/datadog/trace/core/histogram/Histogram.java b/products/metrics/lib/src/main/java/datadog/metrics/histogram/DDSketchHistogram.java similarity index 83% rename from dd-trace-core/src/main/java/datadog/trace/core/histogram/Histogram.java rename to products/metrics/lib/src/main/java/datadog/metrics/histogram/DDSketchHistogram.java index 556177d424f..16d3c53c4ef 100644 --- a/dd-trace-core/src/main/java/datadog/trace/core/histogram/Histogram.java +++ b/products/metrics/lib/src/main/java/datadog/metrics/histogram/DDSketchHistogram.java @@ -1,14 +1,13 @@ -package datadog.trace.core.histogram; +package datadog.metrics.histogram; import com.datadoghq.sketch.ddsketch.DDSketch; -import datadog.trace.bootstrap.instrumentation.api.AgentHistogram; import java.nio.ByteBuffer; /** Wrapper around the DDSketch library so that it can be used in an instrumentation */ -public class Histogram implements AgentHistogram { +public class DDSketchHistogram implements datadog.metrics.api.Histogram { private final DDSketch sketch; - public Histogram(DDSketch sketch) { + public DDSketchHistogram(DDSketch sketch) { this.sketch = sketch; } diff --git a/dd-trace-core/src/main/java/datadog/trace/core/histogram/Histograms.java b/products/metrics/lib/src/main/java/datadog/metrics/histogram/Histograms.java similarity index 86% rename from dd-trace-core/src/main/java/datadog/trace/core/histogram/Histograms.java rename to products/metrics/lib/src/main/java/datadog/metrics/histogram/Histograms.java index 3fc465756cc..6662d8249b2 100644 --- a/dd-trace-core/src/main/java/datadog/trace/core/histogram/Histograms.java +++ b/products/metrics/lib/src/main/java/datadog/metrics/histogram/Histograms.java @@ -1,10 +1,11 @@ -package datadog.trace.core.histogram; +package datadog.metrics.histogram; import com.datadoghq.sketch.ddsketch.DDSketch; import com.datadoghq.sketch.ddsketch.DDSketches; import com.datadoghq.sketch.ddsketch.mapping.BitwiseLinearlyInterpolatedMapping; import com.datadoghq.sketch.ddsketch.mapping.LogarithmicMapping; import com.datadoghq.sketch.ddsketch.store.CollapsingLowestDenseStore; +import datadog.metrics.api.Histogram; public final class Histograms { @@ -18,16 +19,16 @@ public final class Histograms { public static Histogram newHistogram() { DDSketch sketch = new DDSketch(INDEX_MAPPING, () -> new CollapsingLowestDenseStore(1024)); - return new Histogram(sketch); + return new DDSketchHistogram(sketch); } public static Histogram newLogHistogram() { DDSketch sketch = new DDSketch(LOG_INDEX_MAPPING, () -> new CollapsingLowestDenseStore(1024)); - return new Histogram(sketch); + return new DDSketchHistogram(sketch); } public static Histogram newHistogram(double relativeAccuracy, int maxNumBins) { DDSketch sketch = DDSketches.logarithmicCollapsingLowestDense(relativeAccuracy, maxNumBins); - return new Histogram(sketch); + return new DDSketchHistogram(sketch); } } diff --git a/communication/src/main/java/datadog/communication/monitor/DDAgentStatsDClient.java b/products/metrics/lib/src/main/java/datadog/metrics/statsd/DDAgentStatsDClient.java similarity index 98% rename from communication/src/main/java/datadog/communication/monitor/DDAgentStatsDClient.java rename to products/metrics/lib/src/main/java/datadog/metrics/statsd/DDAgentStatsDClient.java index d17eaf6bf56..070380df49d 100644 --- a/communication/src/main/java/datadog/communication/monitor/DDAgentStatsDClient.java +++ b/products/metrics/lib/src/main/java/datadog/metrics/statsd/DDAgentStatsDClient.java @@ -1,8 +1,7 @@ -package datadog.communication.monitor; +package datadog.metrics.statsd; import com.timgroup.statsd.Event; import com.timgroup.statsd.ServiceCheck; -import datadog.trace.api.StatsDClient; import java.util.function.Function; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/communication/src/main/java/datadog/communication/monitor/DDAgentStatsDClientManager.java b/products/metrics/lib/src/main/java/datadog/metrics/statsd/DDAgentStatsDClientManager.java similarity index 98% rename from communication/src/main/java/datadog/communication/monitor/DDAgentStatsDClientManager.java rename to products/metrics/lib/src/main/java/datadog/metrics/statsd/DDAgentStatsDClientManager.java index d613d4ac564..c4844a30f20 100644 --- a/communication/src/main/java/datadog/communication/monitor/DDAgentStatsDClientManager.java +++ b/products/metrics/lib/src/main/java/datadog/metrics/statsd/DDAgentStatsDClientManager.java @@ -1,11 +1,9 @@ -package datadog.communication.monitor; +package datadog.metrics.statsd; import static datadog.trace.bootstrap.instrumentation.api.WriterConstants.LOGGING_WRITER_TYPE; import datadog.trace.api.Config; import datadog.trace.api.ProcessTags; -import datadog.trace.api.StatsDClient; -import datadog.trace.api.StatsDClientManager; import datadog.trace.api.cache.DDCache; import datadog.trace.api.cache.DDCaches; import java.util.List; diff --git a/communication/src/main/java/datadog/communication/monitor/DDAgentStatsDConnection.java b/products/metrics/lib/src/main/java/datadog/metrics/statsd/DDAgentStatsDConnection.java similarity index 99% rename from communication/src/main/java/datadog/communication/monitor/DDAgentStatsDConnection.java rename to products/metrics/lib/src/main/java/datadog/metrics/statsd/DDAgentStatsDConnection.java index fb0732220bc..827a09c6e70 100644 --- a/communication/src/main/java/datadog/communication/monitor/DDAgentStatsDConnection.java +++ b/products/metrics/lib/src/main/java/datadog/metrics/statsd/DDAgentStatsDConnection.java @@ -1,4 +1,4 @@ -package datadog.communication.monitor; +package datadog.metrics.statsd; import static datadog.trace.api.ConfigDefaults.DEFAULT_DOGSTATSD_SOCKET_PATH; import static datadog.trace.util.AgentThreadFactory.AgentThread.STATSD_CLIENT; diff --git a/communication/src/main/java/datadog/communication/monitor/LoggingStatsDClient.java b/products/metrics/lib/src/main/java/datadog/metrics/statsd/LoggingStatsDClient.java similarity index 95% rename from communication/src/main/java/datadog/communication/monitor/LoggingStatsDClient.java rename to products/metrics/lib/src/main/java/datadog/metrics/statsd/LoggingStatsDClient.java index 6d892c37615..08f68e257e7 100644 --- a/communication/src/main/java/datadog/communication/monitor/LoggingStatsDClient.java +++ b/products/metrics/lib/src/main/java/datadog/metrics/statsd/LoggingStatsDClient.java @@ -1,8 +1,5 @@ -package datadog.communication.monitor; +package datadog.metrics.statsd; -import static datadog.communication.monitor.DDAgentStatsDClient.serviceCheckStatus; - -import datadog.trace.api.StatsDClient; import java.text.DecimalFormat; import java.text.DecimalFormatSymbols; import java.util.Locale; @@ -99,7 +96,7 @@ public void serviceCheck( log.info( SERVICE_CHECK_FORMAT, nameMapping.apply(serviceCheckName), - serviceCheckStatus(status).ordinal(), + DDAgentStatsDClient.serviceCheckStatus(status).ordinal(), join(tagMapping.apply(tags)), null != message ? "|m:" + message : ""); } diff --git a/communication/src/test/groovy/datadog/communication/monitor/DDAgentStatsDClientTest.groovy b/products/metrics/lib/src/test/groovy/datadog/metrics/statsd/DDAgentStatsDClientTest.groovy similarity index 99% rename from communication/src/test/groovy/datadog/communication/monitor/DDAgentStatsDClientTest.groovy rename to products/metrics/lib/src/test/groovy/datadog/metrics/statsd/DDAgentStatsDClientTest.groovy index 66a49ee0c36..c894675e982 100644 --- a/communication/src/test/groovy/datadog/communication/monitor/DDAgentStatsDClientTest.groovy +++ b/products/metrics/lib/src/test/groovy/datadog/metrics/statsd/DDAgentStatsDClientTest.groovy @@ -1,13 +1,12 @@ -package datadog.communication.monitor +package datadog.metrics.statsd +import static datadog.metrics.statsd.DDAgentStatsDClientManager.statsDClientManager +import static datadog.trace.api.config.GeneralConfig.DOGSTATSD_START_DELAY import static datadog.trace.api.config.GeneralConfig.EXPERIMENTAL_PROPAGATE_PROCESS_TAGS_ENABLED import datadog.trace.api.ProcessTags import datadog.trace.test.util.DDSpecification -import static datadog.trace.api.config.GeneralConfig.DOGSTATSD_START_DELAY -import static datadog.communication.monitor.DDAgentStatsDClientManager.statsDClientManager - class DDAgentStatsDClientTest extends DDSpecification { def "single statsd client"() { diff --git a/communication/src/test/groovy/datadog/communication/monitor/DisabledMonitoringTest.groovy b/products/metrics/lib/src/test/groovy/datadog/metrics/statsd/DisabledMonitoringTest.groovy similarity index 77% rename from communication/src/test/groovy/datadog/communication/monitor/DisabledMonitoringTest.groovy rename to products/metrics/lib/src/test/groovy/datadog/metrics/statsd/DisabledMonitoringTest.groovy index 02adc09166a..c5efb9d4e80 100644 --- a/communication/src/test/groovy/datadog/communication/monitor/DisabledMonitoringTest.groovy +++ b/products/metrics/lib/src/test/groovy/datadog/metrics/statsd/DisabledMonitoringTest.groovy @@ -1,5 +1,8 @@ -package datadog.communication.monitor +package datadog.metrics.statsd +import datadog.metrics.api.Monitoring +import datadog.metrics.api.NoOpCounter +import datadog.metrics.api.NoOpRecording import org.junit.jupiter.api.Test class DisabledMonitoringTest { diff --git a/communication/src/test/groovy/datadog/communication/monitor/NoopCounterTest.groovy b/products/metrics/lib/src/test/groovy/datadog/metrics/statsd/NoopCounterTest.groovy similarity index 68% rename from communication/src/test/groovy/datadog/communication/monitor/NoopCounterTest.groovy rename to products/metrics/lib/src/test/groovy/datadog/metrics/statsd/NoopCounterTest.groovy index 4898b30e487..85f75fff609 100644 --- a/communication/src/test/groovy/datadog/communication/monitor/NoopCounterTest.groovy +++ b/products/metrics/lib/src/test/groovy/datadog/metrics/statsd/NoopCounterTest.groovy @@ -1,5 +1,7 @@ -package datadog.communication.monitor +package datadog.metrics.statsd +import datadog.metrics.api.Counter +import datadog.metrics.api.NoOpCounter import org.junit.jupiter.api.Test class NoopCounterTest { diff --git a/settings.gradle.kts b/settings.gradle.kts index f79c7a7306b..d606dec1e87 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -106,6 +106,8 @@ include( ":components:environment", ":components:json", ":components:native-loader", + ":products:metrics:api", + ":products:metrics:lib", ":telemetry", ":remote-config:remote-config-api", ":remote-config:remote-config-core", From bfe949a12178d8f5e14a87387e01b3075b5e5a31 Mon Sep 17 00:00:00 2001 From: Bruce Bujon Date: Mon, 19 Jan 2026 10:12:38 +0100 Subject: [PATCH 2/8] fix(ot): Try to extract metrics from communication --- dd-trace-ot/src/main/java/datadog/opentracing/DDTracer.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dd-trace-ot/src/main/java/datadog/opentracing/DDTracer.java b/dd-trace-ot/src/main/java/datadog/opentracing/DDTracer.java index 5abe1c96e62..9fb13b96293 100644 --- a/dd-trace-ot/src/main/java/datadog/opentracing/DDTracer.java +++ b/dd-trace-ot/src/main/java/datadog/opentracing/DDTracer.java @@ -5,10 +5,10 @@ import static datadog.trace.bootstrap.instrumentation.api.AgentSpan.fromSpanContext; import datadog.context.propagation.CarrierSetter; +import datadog.metrics.statsd.StatsDClient; import datadog.trace.api.Config; import datadog.trace.api.DDTags; import datadog.trace.api.GlobalTracer; -import datadog.trace.api.StatsDClient; import datadog.trace.api.experimental.DataStreamsCheckpointer; import datadog.trace.api.interceptor.TraceInterceptor; import datadog.trace.api.internal.InternalTracer; From 7e67ca9422d3321b0a9e577fafb724ff304ace58 Mon Sep 17 00:00:00 2001 From: Bruce Bujon Date: Mon, 19 Jan 2026 10:32:28 +0100 Subject: [PATCH 3/8] fix(metrics): Try to extract metrics from communication --- .../trace/agent/test/datastreams/MockFeaturesDiscovery.java | 2 +- .../groovy/datadog/opentracing/IterationSpansForkedTest.groovy | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) 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 e7d4a337ac5..470975cf0e1 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 @@ -1,7 +1,7 @@ package datadog.trace.agent.test.datastreams; import datadog.communication.ddagent.DDAgentFeaturesDiscovery; -import datadog.communication.monitor.Monitoring; +import datadog.metrics.api.Monitoring; // TODO Ideally, DDAgentFeaturesDiscovery would be an interface to create a proper testable stubs public class MockFeaturesDiscovery extends DDAgentFeaturesDiscovery { diff --git a/dd-trace-ot/src/test/groovy/datadog/opentracing/IterationSpansForkedTest.groovy b/dd-trace-ot/src/test/groovy/datadog/opentracing/IterationSpansForkedTest.groovy index 77cf0e41c55..97bcb136d08 100644 --- a/dd-trace-ot/src/test/groovy/datadog/opentracing/IterationSpansForkedTest.groovy +++ b/dd-trace-ot/src/test/groovy/datadog/opentracing/IterationSpansForkedTest.groovy @@ -1,6 +1,6 @@ package datadog.opentracing -import datadog.trace.api.StatsDClient +import datadog.metrics.statsd.StatsDClient import datadog.trace.bootstrap.instrumentation.api.AgentSpan import datadog.trace.common.writer.ListWriter import datadog.trace.core.CoreTracer From d4ff73c33215ed622715cbd5f7435dcddf8d4a81 Mon Sep 17 00:00:00 2001 From: Bruce Bujon Date: Mon, 19 Jan 2026 11:20:27 +0100 Subject: [PATCH 4/8] fix(metrics): Try to extract metrics from communication --- dd-java-agent/instrumentation-testing/build.gradle | 1 + .../trace/agent/test/InstrumentationSpecification.groovy | 4 ++-- .../test/groovy/datadog/metrics/api}/CounterTest.groovy | 8 +++----- .../test/groovy/datadog/metrics/api}/TimingTest.groovy | 7 ++----- 4 files changed, 8 insertions(+), 12 deletions(-) rename {dd-trace-core/src/test/groovy/datadog/trace/core/monitor => products/metrics/lib/src/test/groovy/datadog/metrics/api}/CounterTest.groovy (86%) rename {dd-trace-core/src/test/groovy/datadog/trace/core/monitor => products/metrics/lib/src/test/groovy/datadog/metrics/api}/TimingTest.groovy (92%) diff --git a/dd-java-agent/instrumentation-testing/build.gradle b/dd-java-agent/instrumentation-testing/build.gradle index e7c5df0b109..5ae170104da 100644 --- a/dd-java-agent/instrumentation-testing/build.gradle +++ b/dd-java-agent/instrumentation-testing/build.gradle @@ -8,6 +8,7 @@ dependencies { api libs.guava api project(':dd-java-agent:testing') + api project(':products:metrics:api') implementation project(':dd-java-agent:agent-debugger') 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 47e67ffbafc..c0bcca4d410 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 @@ -15,7 +15,8 @@ import com.datadog.debugger.sink.DebuggerSink import com.datadog.debugger.sink.ProbeStatusSink import com.google.common.collect.Sets import datadog.communication.ddagent.DDAgentFeaturesDiscovery -import datadog.communication.monitor.Monitoring +import datadog.metrics.api.Monitoring +import datadog.metrics.statsd.StatsDClient import datadog.instrument.classinject.ClassInjector import datadog.trace.agent.test.asserts.ListWriterAssert import datadog.trace.agent.test.datastreams.MockFeaturesDiscovery @@ -28,7 +29,6 @@ import datadog.trace.agent.tooling.bytebuddy.matcher.GlobalIgnores import datadog.trace.api.Config import datadog.trace.api.IdGenerationStrategy import datadog.trace.api.ProcessTags -import datadog.trace.api.StatsDClient import datadog.trace.api.TraceConfig import datadog.trace.api.config.GeneralConfig import datadog.trace.api.config.TracerConfig diff --git a/dd-trace-core/src/test/groovy/datadog/trace/core/monitor/CounterTest.groovy b/products/metrics/lib/src/test/groovy/datadog/metrics/api/CounterTest.groovy similarity index 86% rename from dd-trace-core/src/test/groovy/datadog/trace/core/monitor/CounterTest.groovy rename to products/metrics/lib/src/test/groovy/datadog/metrics/api/CounterTest.groovy index 6e1d0642a2a..1d8b8cf1d7a 100644 --- a/dd-trace-core/src/test/groovy/datadog/trace/core/monitor/CounterTest.groovy +++ b/products/metrics/lib/src/test/groovy/datadog/metrics/api/CounterTest.groovy @@ -1,9 +1,7 @@ -package datadog.trace.core.monitor +package datadog.metrics.api -import datadog.communication.monitor.Counter -import datadog.communication.monitor.Monitoring -import datadog.communication.monitor.NoOpCounter -import datadog.trace.api.StatsDClient + +import datadog.metrics.statsd.StatsDClient import spock.lang.Specification import static java.util.concurrent.TimeUnit.MILLISECONDS diff --git a/dd-trace-core/src/test/groovy/datadog/trace/core/monitor/TimingTest.groovy b/products/metrics/lib/src/test/groovy/datadog/metrics/api/TimingTest.groovy similarity index 92% rename from dd-trace-core/src/test/groovy/datadog/trace/core/monitor/TimingTest.groovy rename to products/metrics/lib/src/test/groovy/datadog/metrics/api/TimingTest.groovy index d03c964a284..3eed179db10 100644 --- a/dd-trace-core/src/test/groovy/datadog/trace/core/monitor/TimingTest.groovy +++ b/products/metrics/lib/src/test/groovy/datadog/metrics/api/TimingTest.groovy @@ -1,9 +1,6 @@ -package datadog.trace.core.monitor +package datadog.metrics.api -import datadog.communication.monitor.Monitoring -import datadog.communication.monitor.NoOpRecording -import datadog.communication.monitor.Recording -import datadog.trace.api.StatsDClient +import datadog.metrics.statsd.StatsDClient import org.junit.jupiter.api.Assertions import spock.lang.Specification From 9186514cd9da9186890d845859859d77a255e56b Mon Sep 17 00:00:00 2001 From: Bruce Bujon Date: Mon, 19 Jan 2026 11:42:55 +0100 Subject: [PATCH 5/8] fix(metrics): Try to extract metrics from communication --- .../groovy/com/datadog/appsec/AppSecHttpServerTest.groovy | 4 ++-- .../com/datadog/appsec/AppSecInactiveHttpServerTest.groovy | 2 +- .../jmh/java/datadog/appsec/benchmark/AppSecBenchmark.java | 2 +- .../com/datadog/appsec/AppSecSystemSpecification.groovy | 2 +- .../com/datadog/appsec/ddwaf/WAFModuleSpecification.groovy | 2 +- .../common/metrics/ConflatingMetricsAggregatorBenchmark.java | 2 +- .../datadog/trace/TracerConnectionReliabilityTest.groovy | 2 +- .../src/test/groovy/datadog/trace/core/CoreTracerTest.groovy | 4 ++-- .../groovy/datadog/trace/core/PendingTraceBufferTest.groovy | 2 +- .../groovy/datadog/trace/core/TracingConfigPollerTest.groovy | 2 +- .../datadog/telemetry/TelemetrySystemSpecification.groovy | 2 +- 11 files changed, 13 insertions(+), 13 deletions(-) diff --git a/dd-java-agent/appsec/appsec-test-fixtures/src/main/groovy/com/datadog/appsec/AppSecHttpServerTest.groovy b/dd-java-agent/appsec/appsec-test-fixtures/src/main/groovy/com/datadog/appsec/AppSecHttpServerTest.groovy index 17105309c23..f11343b2e65 100644 --- a/dd-java-agent/appsec/appsec-test-fixtures/src/main/groovy/com/datadog/appsec/AppSecHttpServerTest.groovy +++ b/dd-java-agent/appsec/appsec-test-fixtures/src/main/groovy/com/datadog/appsec/AppSecHttpServerTest.groovy @@ -1,7 +1,7 @@ package com.datadog.appsec import datadog.communication.ddagent.SharedCommunicationObjects -import datadog.communication.monitor.Monitoring +import datadog.metrics.api.Monitoring import datadog.trace.agent.test.base.WithHttpServer import datadog.trace.api.Config import datadog.trace.api.appsec.AppSecEventTracker @@ -24,7 +24,7 @@ abstract class AppSecHttpServerTest extends WithHttpServer { def config = Config.get() sco.createRemaining(config) assert sco.configurationPoller(config) == null - assert sco.monitoring instanceof Monitoring.DisabledMonitoring + assert sco.monitoring == Monitoring.DISABLED AppSecEventTracker.install() AppSecSystem.start(ss, sco) diff --git a/dd-java-agent/appsec/appsec-test-fixtures/src/main/groovy/com/datadog/appsec/AppSecInactiveHttpServerTest.groovy b/dd-java-agent/appsec/appsec-test-fixtures/src/main/groovy/com/datadog/appsec/AppSecInactiveHttpServerTest.groovy index ed9c7fce43e..ecd5e0dde4a 100644 --- a/dd-java-agent/appsec/appsec-test-fixtures/src/main/groovy/com/datadog/appsec/AppSecInactiveHttpServerTest.groovy +++ b/dd-java-agent/appsec/appsec-test-fixtures/src/main/groovy/com/datadog/appsec/AppSecInactiveHttpServerTest.groovy @@ -1,7 +1,7 @@ package com.datadog.appsec import datadog.communication.ddagent.SharedCommunicationObjects -import datadog.communication.monitor.Monitoring +import datadog.metrics.api.Monitoring import datadog.trace.agent.test.base.HttpServerTest.ServerEndpoint import datadog.trace.agent.test.base.WithHttpServer import datadog.trace.api.Config 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 ee1b028672f..206b46e60b8 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 @@ -7,7 +7,7 @@ import com.datadog.appsec.AppSecSystem; import datadog.communication.ddagent.DDAgentFeaturesDiscovery; import datadog.communication.ddagent.SharedCommunicationObjects; -import datadog.communication.monitor.Monitoring; +import datadog.metrics.api.Monitoring; import datadog.trace.api.gateway.BlockResponseFunction; import datadog.trace.api.gateway.CallbackProvider; import datadog.trace.api.gateway.Flow; diff --git a/dd-java-agent/appsec/src/test/groovy/com/datadog/appsec/AppSecSystemSpecification.groovy b/dd-java-agent/appsec/src/test/groovy/com/datadog/appsec/AppSecSystemSpecification.groovy index 96d70b90329..f29201b667f 100644 --- a/dd-java-agent/appsec/src/test/groovy/com/datadog/appsec/AppSecSystemSpecification.groovy +++ b/dd-java-agent/appsec/src/test/groovy/com/datadog/appsec/AppSecSystemSpecification.groovy @@ -6,7 +6,7 @@ import com.datadog.appsec.report.AppSecEvent import com.datadog.appsec.util.AbortStartupException import datadog.communication.ddagent.DDAgentFeaturesDiscovery import datadog.communication.ddagent.SharedCommunicationObjects -import datadog.communication.monitor.Monitoring +import datadog.metrics.api.Monitoring import datadog.remoteconfig.ConfigurationEndListener import datadog.remoteconfig.ConfigurationPoller import datadog.remoteconfig.Product diff --git a/dd-java-agent/appsec/src/test/groovy/com/datadog/appsec/ddwaf/WAFModuleSpecification.groovy b/dd-java-agent/appsec/src/test/groovy/com/datadog/appsec/ddwaf/WAFModuleSpecification.groovy index 2483d5af410..9baa6dfa8f7 100644 --- a/dd-java-agent/appsec/src/test/groovy/com/datadog/appsec/ddwaf/WAFModuleSpecification.groovy +++ b/dd-java-agent/appsec/src/test/groovy/com/datadog/appsec/ddwaf/WAFModuleSpecification.groovy @@ -30,7 +30,7 @@ import com.squareup.moshi.JsonAdapter import com.squareup.moshi.Moshi import com.squareup.moshi.Types import datadog.appsec.api.blocking.BlockingContentType -import datadog.communication.monitor.Monitoring +import datadog.metrics.api.Monitoring import datadog.remoteconfig.ConfigurationPoller import datadog.remoteconfig.Product import datadog.remoteconfig.state.ConfigKey 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 3ae8a050f32..73d9d5296d9 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 @@ -4,7 +4,7 @@ import static java.util.concurrent.TimeUnit.SECONDS; import datadog.communication.ddagent.DDAgentFeaturesDiscovery; -import datadog.communication.monitor.Monitoring; +import datadog.metrics.api.Monitoring; import datadog.trace.api.WellKnownTags; import datadog.trace.core.CoreSpan; import datadog.trace.core.monitor.HealthMetrics; 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 5f0e62f48bf..379fa1561b9 100644 --- a/dd-trace-core/src/test/groovy/datadog/trace/TracerConnectionReliabilityTest.groovy +++ b/dd-trace-core/src/test/groovy/datadog/trace/TracerConnectionReliabilityTest.groovy @@ -5,7 +5,7 @@ import com.squareup.moshi.Moshi import com.squareup.moshi.Types import datadog.communication.ddagent.DDAgentFeaturesDiscovery import datadog.communication.ddagent.SharedCommunicationObjects -import datadog.communication.monitor.Monitoring +import datadog.metrics.api.Monitoring import datadog.trace.agent.test.utils.PortUtils import datadog.trace.api.IdGenerationStrategy import datadog.trace.core.CoreTracer diff --git a/dd-trace-core/src/test/groovy/datadog/trace/core/CoreTracerTest.groovy b/dd-trace-core/src/test/groovy/datadog/trace/core/CoreTracerTest.groovy index 7cc50cc0e9b..8f324f0dd6b 100644 --- a/dd-trace-core/src/test/groovy/datadog/trace/core/CoreTracerTest.groovy +++ b/dd-trace-core/src/test/groovy/datadog/trace/core/CoreTracerTest.groovy @@ -2,13 +2,13 @@ package datadog.trace.core import datadog.communication.ddagent.DDAgentFeaturesDiscovery import datadog.communication.ddagent.SharedCommunicationObjects -import datadog.communication.monitor.Monitoring +import datadog.metrics.api.Monitoring +import datadog.metrics.statsd.StatsDClient import datadog.remoteconfig.ConfigurationPoller import datadog.remoteconfig.Product import datadog.remoteconfig.state.ParsedConfigKey import datadog.remoteconfig.state.ProductListener import datadog.trace.api.Config -import datadog.trace.api.StatsDClient import datadog.trace.api.remoteconfig.ServiceNameCollector import datadog.trace.api.sampling.PrioritySampling import datadog.trace.api.sampling.SamplingMechanism diff --git a/dd-trace-core/src/test/groovy/datadog/trace/core/PendingTraceBufferTest.groovy b/dd-trace-core/src/test/groovy/datadog/trace/core/PendingTraceBufferTest.groovy index b6ca943fa6c..82f8186b282 100644 --- a/dd-trace-core/src/test/groovy/datadog/trace/core/PendingTraceBufferTest.groovy +++ b/dd-trace-core/src/test/groovy/datadog/trace/core/PendingTraceBufferTest.groovy @@ -1,8 +1,8 @@ package datadog.trace.core import datadog.environment.JavaVirtualMachine +import datadog.metrics.api.Monitoring import datadog.trace.api.Config -import datadog.communication.monitor.Monitoring import datadog.trace.SamplingPriorityMetadataChecker import datadog.trace.api.DDSpanId import datadog.trace.api.DDTraceId diff --git a/dd-trace-core/src/test/groovy/datadog/trace/core/TracingConfigPollerTest.groovy b/dd-trace-core/src/test/groovy/datadog/trace/core/TracingConfigPollerTest.groovy index ff5b0ea4e25..ec947fdb686 100644 --- a/dd-trace-core/src/test/groovy/datadog/trace/core/TracingConfigPollerTest.groovy +++ b/dd-trace-core/src/test/groovy/datadog/trace/core/TracingConfigPollerTest.groovy @@ -2,7 +2,7 @@ package datadog.trace.core import datadog.communication.ddagent.DDAgentFeaturesDiscovery import datadog.communication.ddagent.SharedCommunicationObjects -import datadog.communication.monitor.Monitoring +import datadog.metrics.api.Monitoring import datadog.remoteconfig.ConfigurationPoller import datadog.remoteconfig.Product import datadog.remoteconfig.state.ParsedConfigKey diff --git a/telemetry/src/test/groovy/datadog/telemetry/TelemetrySystemSpecification.groovy b/telemetry/src/test/groovy/datadog/telemetry/TelemetrySystemSpecification.groovy index 69b3ac67bcc..e9afa34c058 100644 --- a/telemetry/src/test/groovy/datadog/telemetry/TelemetrySystemSpecification.groovy +++ b/telemetry/src/test/groovy/datadog/telemetry/TelemetrySystemSpecification.groovy @@ -2,7 +2,7 @@ package datadog.telemetry import datadog.communication.ddagent.DDAgentFeaturesDiscovery import datadog.communication.ddagent.SharedCommunicationObjects -import datadog.communication.monitor.Monitoring +import datadog.metrics.api.Monitoring import datadog.telemetry.dependency.DependencyService import datadog.telemetry.dependency.LocationsCollectingTransformer import datadog.trace.api.config.GeneralConfig From 79cc70a19ea17125f2f969a6a6824eeb4071153a Mon Sep 17 00:00:00 2001 From: Bruce Bujon Date: Mon, 19 Jan 2026 12:39:00 +0100 Subject: [PATCH 6/8] fix(metrics): Try to extract metrics from communication --- .../trace/common/metrics/MetricsReliabilityTest.groovy | 2 +- .../datadog/trace/core/monitor/HealthMetricsTest.groovy | 2 +- .../trace/core/scopemanager/IterationSpansForkedTest.groovy | 2 +- .../datadog/trace/core/test/DDCoreSpecification.groovy | 2 +- internal-api/build.gradle.kts | 6 +++--- 5 files changed, 7 insertions(+), 7 deletions(-) diff --git a/dd-trace-core/src/test/groovy/datadog/trace/common/metrics/MetricsReliabilityTest.groovy b/dd-trace-core/src/test/groovy/datadog/trace/common/metrics/MetricsReliabilityTest.groovy index 777b5e1436f..fdcceb0373d 100644 --- a/dd-trace-core/src/test/groovy/datadog/trace/common/metrics/MetricsReliabilityTest.groovy +++ b/dd-trace-core/src/test/groovy/datadog/trace/common/metrics/MetricsReliabilityTest.groovy @@ -2,7 +2,7 @@ package datadog.trace.common.metrics import datadog.communication.ddagent.SharedCommunicationObjects import datadog.trace.api.Config -import datadog.trace.api.StatsDClient +import datadog.metrics.statsd.StatsDClient import datadog.trace.core.monitor.HealthMetrics import datadog.trace.core.monitor.TracerHealthMetrics import datadog.trace.core.test.DDCoreSpecification diff --git a/dd-trace-core/src/test/groovy/datadog/trace/core/monitor/HealthMetricsTest.groovy b/dd-trace-core/src/test/groovy/datadog/trace/core/monitor/HealthMetricsTest.groovy index 7c6154876b0..fb813f328ea 100644 --- a/dd-trace-core/src/test/groovy/datadog/trace/core/monitor/HealthMetricsTest.groovy +++ b/dd-trace-core/src/test/groovy/datadog/trace/core/monitor/HealthMetricsTest.groovy @@ -1,6 +1,6 @@ package datadog.trace.core.monitor -import datadog.trace.api.StatsDClient +import datadog.metrics.statsd.StatsDClient import datadog.trace.api.sampling.PrioritySampling import datadog.trace.common.writer.RemoteApi import datadog.trace.common.writer.RemoteWriter diff --git a/dd-trace-core/src/test/groovy/datadog/trace/core/scopemanager/IterationSpansForkedTest.groovy b/dd-trace-core/src/test/groovy/datadog/trace/core/scopemanager/IterationSpansForkedTest.groovy index 9299ee15b64..b0e1b241a7e 100644 --- a/dd-trace-core/src/test/groovy/datadog/trace/core/scopemanager/IterationSpansForkedTest.groovy +++ b/dd-trace-core/src/test/groovy/datadog/trace/core/scopemanager/IterationSpansForkedTest.groovy @@ -1,6 +1,6 @@ package datadog.trace.core.scopemanager -import datadog.trace.api.StatsDClient +import datadog.metrics.statsd.StatsDClient import datadog.trace.bootstrap.instrumentation.api.AgentSpan import datadog.trace.common.writer.ListWriter import datadog.trace.core.CoreTracer diff --git a/dd-trace-core/src/test/groovy/datadog/trace/core/test/DDCoreSpecification.groovy b/dd-trace-core/src/test/groovy/datadog/trace/core/test/DDCoreSpecification.groovy index 3a4b72c2ac2..72484d85430 100644 --- a/dd-trace-core/src/test/groovy/datadog/trace/core/test/DDCoreSpecification.groovy +++ b/dd-trace-core/src/test/groovy/datadog/trace/core/test/DDCoreSpecification.groovy @@ -1,9 +1,9 @@ package datadog.trace.core.test +import datadog.metrics.statsd.StatsDClient import datadog.trace.api.DDSpanId import datadog.trace.api.DDTraceId -import datadog.trace.api.StatsDClient import datadog.trace.api.datastreams.NoopPathwayContext import datadog.trace.api.sampling.PrioritySampling import datadog.trace.bootstrap.instrumentation.api.ProfilingContextIntegration diff --git a/internal-api/build.gradle.kts b/internal-api/build.gradle.kts index c959b7c2bd7..f9d4f48e749 100644 --- a/internal-api/build.gradle.kts +++ b/internal-api/build.gradle.kts @@ -37,10 +37,10 @@ val excludedClassesCoverage by extra( // Interface "datadog.trace.api.EndpointTracker", // Noop implementation - "datadog.trace.api.NoOpStatsDClient", + // "datadog.trace.api.NoOpStatsDClient", "datadog.trace.api.Platform", // Interface - "datadog.trace.api.StatsDClient", + // "datadog.trace.api.StatsDClient", // Noop implementation "datadog.trace.api.TraceSegment.NoOp", "datadog.trace.api.WithGlobalTracer.1", @@ -201,7 +201,7 @@ val excludedClassesCoverage by extra( "datadog.trace.api.cache.FixedSizeCache.IdentityHash", "datadog.trace.api.cache.FixedSizeWeakKeyCache", // Interface with default method - "datadog.trace.api.StatsDClientManager", + // "datadog.trace.api.StatsDClientManager", "datadog.trace.api.iast.Taintable", "datadog.trace.api.Stateful", "datadog.trace.api.Stateful.1", From 98f6c8550d7d9e25774cbc64b3be7e381d031ca2 Mon Sep 17 00:00:00 2001 From: Bruce Bujon Date: Mon, 19 Jan 2026 12:48:56 +0100 Subject: [PATCH 7/8] fix(metrics): Try to extract metrics from communication --- .../com/datadog/appsec/AppSecInactiveHttpServerTest.groovy | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dd-java-agent/appsec/appsec-test-fixtures/src/main/groovy/com/datadog/appsec/AppSecInactiveHttpServerTest.groovy b/dd-java-agent/appsec/appsec-test-fixtures/src/main/groovy/com/datadog/appsec/AppSecInactiveHttpServerTest.groovy index ecd5e0dde4a..140893ec525 100644 --- a/dd-java-agent/appsec/appsec-test-fixtures/src/main/groovy/com/datadog/appsec/AppSecInactiveHttpServerTest.groovy +++ b/dd-java-agent/appsec/appsec-test-fixtures/src/main/groovy/com/datadog/appsec/AppSecInactiveHttpServerTest.groovy @@ -44,7 +44,7 @@ abstract class AppSecInactiveHttpServerTest extends WithHttpServer { def config = Config.get() sco.createRemaining(config) assert sco.configurationPoller(config) == null - assert sco.monitoring instanceof Monitoring.DisabledMonitoring + assert sco.monitoring == Monitoring.DISABLED AppSecSystem.start(ss, sco) assert !AppSecSystem.active From 4d7ac37ff76fd584f379c066a7bbb55b04138ea9 Mon Sep 17 00:00:00 2001 From: Bruce Bujon Date: Mon, 19 Jan 2026 17:13:09 +0100 Subject: [PATCH 8/8] fix(metrics): Try to extract metrics from communication --- dd-java-agent/agent-bootstrap/build.gradle | 2 +- .../java/datadog/trace/bootstrap/Agent.java | 30 ++++++ .../trace/agent/tooling/MeterInstaller.java | 86 ++++++++++++++++ dd-java-agent/build.gradle | 6 +- .../spark/SparkAggregatedTaskMetrics.java | 6 +- dd-trace-core/build.gradle | 2 +- .../trace/common/metrics/AggregateMetric.java | 6 +- .../java/datadog/trace/core/CoreTracer.java | 99 ++----------------- .../trace/core/datastreams/StatsGroup.java | 8 +- products/metrics/agent/build.gradle.kts | 25 +++++ .../datadog/metrics/agent/AgentMeter.java | 41 ++++++++ .../java/datadog/metrics/api/Histograms.java | 11 +++ .../datadog/metrics/api/NoOpHistograms.java | 18 ++++ .../{histogram => api}/DDSketchHistogram.java | 4 +- .../DDSketchHistograms.java} | 19 ++-- .../datadog/metrics/api/MonitoringImpl.java | 29 +----- .../main/java/datadog/metrics/api/Timer.java | 3 +- settings.gradle.kts | 1 + 18 files changed, 254 insertions(+), 142 deletions(-) create mode 100644 dd-java-agent/agent-tooling/src/main/java/datadog/trace/agent/tooling/MeterInstaller.java create mode 100644 products/metrics/agent/build.gradle.kts create mode 100644 products/metrics/agent/src/main/java/datadog/metrics/agent/AgentMeter.java create mode 100644 products/metrics/api/src/main/java/datadog/metrics/api/Histograms.java create mode 100644 products/metrics/api/src/main/java/datadog/metrics/api/NoOpHistograms.java rename products/metrics/lib/src/main/java/datadog/metrics/{histogram => api}/DDSketchHistogram.java (90%) rename products/metrics/lib/src/main/java/datadog/metrics/{histogram/Histograms.java => api/DDSketchHistograms.java} (74%) diff --git a/dd-java-agent/agent-bootstrap/build.gradle b/dd-java-agent/agent-bootstrap/build.gradle index a781747b2aa..e8d7561381c 100644 --- a/dd-java-agent/agent-bootstrap/build.gradle +++ b/dd-java-agent/agent-bootstrap/build.gradle @@ -23,7 +23,7 @@ dependencies { api project(':dd-java-agent:agent-debugger:debugger-bootstrap') api project(':components:environment') api project(':components:json') - api project(':products:metrics:api') + api project(':products:metrics:agent') api libs.instrument.java api libs.slf4j // ^ Generally a bad idea for libraries, but we're shadowing. diff --git a/dd-java-agent/agent-bootstrap/src/main/java/datadog/trace/bootstrap/Agent.java b/dd-java-agent/agent-bootstrap/src/main/java/datadog/trace/bootstrap/Agent.java index a76e24931d9..d42167acea3 100644 --- a/dd-java-agent/agent-bootstrap/src/main/java/datadog/trace/bootstrap/Agent.java +++ b/dd-java-agent/agent-bootstrap/src/main/java/datadog/trace/bootstrap/Agent.java @@ -663,6 +663,7 @@ public InstallDatadogTracerCallback( throw new UndeclaredThrowableException(e); } + installDatadogMeter(initTelemetry); installDatadogTracer(initTelemetry, scoClass, sco); maybeInstallLogsIntake(scoClass, sco); maybeStartIast(instrumentation); @@ -795,6 +796,35 @@ private static synchronized void startDatadogAgent( } } + private static synchronized void installDatadogMeter(InitializationTelemetry initTelemetry) { + if (AGENT_CLASSLOADER == null) { + throw new IllegalStateException("Datadog agent should have been started already"); + } + + StaticEventLogger.begin("AgentMeter"); + try { + AGENT_CLASSLOADER.loadClass("datadog.trace.agent.tooling.MeterInstaller"); + } catch (ClassNotFoundException e) { + log.error("Error loading DatadogMeter", e); + } + + try { + // Install AgentMeter, StatsDClient and Monitoring + final Class tracerInstallerClass = + AGENT_CLASSLOADER.loadClass("datadog.trace.agent.tooling.MeterInstaller"); + final Method installMeterMethod = tracerInstallerClass.getMethod("installMeter"); + installMeterMethod.invoke(null); + } catch (final FatalAgentMisconfigurationError ex) { + throw ex; + } catch (final Throwable ex) { + log.error("Throwable thrown while installing the Datadog meter", ex); + + initTelemetry.onFatalError(ex); + } + + StaticEventLogger.end("AgentMeter"); + } + private static synchronized void installDatadogTracer( InitializationTelemetry initTelemetry, Class scoClass, Object sco) { if (AGENT_CLASSLOADER == null) { diff --git a/dd-java-agent/agent-tooling/src/main/java/datadog/trace/agent/tooling/MeterInstaller.java b/dd-java-agent/agent-tooling/src/main/java/datadog/trace/agent/tooling/MeterInstaller.java new file mode 100644 index 00000000000..e20ef32ddd7 --- /dev/null +++ b/dd-java-agent/agent-tooling/src/main/java/datadog/trace/agent/tooling/MeterInstaller.java @@ -0,0 +1,86 @@ +package datadog.trace.agent.tooling; + +import static datadog.metrics.statsd.DDAgentStatsDClientManager.statsDClientManager; +import static java.util.concurrent.TimeUnit.SECONDS; + +import datadog.metrics.agent.AgentMeter; +import datadog.metrics.api.DDSketchHistograms; +import datadog.metrics.api.Monitoring; +import datadog.metrics.api.MonitoringImpl; +import datadog.metrics.statsd.StatsDClient; +import datadog.trace.api.Config; +import datadog.trace.api.config.GeneralConfig; +import datadog.trace.core.DDTraceCoreInfo; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +public class MeterInstaller { + private static final String LANG_STATSD_TAG = "lang"; + private static final String LANG_VERSION_STATSD_TAG = "lang_version"; + private static final String LANG_INTERPRETER_STATSD_TAG = "lang_interpreter"; + private static final String LANG_INTERPRETER_VENDOR_STATSD_TAG = "lang_interpreter_vendor"; + private static final String TRACER_VERSION_STATSD_TAG = "tracer_version"; + + public static void installMeter() { + Config config = Config.get(); + StatsDClient statsDClient = createStatsDClient(config); + Monitoring monitoring = + config.isHealthMetricsEnabled() + ? new MonitoringImpl(statsDClient, 10, SECONDS) + : MonitoringImpl.DISABLED; + AgentMeter.registerIfAbsent(statsDClient, monitoring, DDSketchHistograms.INSTANCE); + } + + private static StatsDClient createStatsDClient(Config config) { + if (!config.isHealthMetricsEnabled()) { + return StatsDClient.NO_OP; + } else { + String host = config.getHealthMetricsStatsdHost(); + if (host == null) { + host = config.getJmxFetchStatsdHost(); + } + Integer port = config.getHealthMetricsStatsdPort(); + if (port == null) { + port = config.getJmxFetchStatsdPort(); + } + + return statsDClientManager() + .statsDClient( + host, + port, + config.getDogStatsDNamedPipe(), + // use replace to stop string being changed to 'ddtrot.dd.tracer' in dd-trace-ot + "datadog:tracer".replace(':', '.'), + generateConstantTags(config)); + } + } + + private static String[] generateConstantTags(final Config config) { + final List constantTags = new ArrayList<>(); + + constantTags.add(statsdTag(LANG_STATSD_TAG, "java")); + constantTags.add(statsdTag(LANG_VERSION_STATSD_TAG, DDTraceCoreInfo.JAVA_VERSION)); + constantTags.add(statsdTag(LANG_INTERPRETER_STATSD_TAG, DDTraceCoreInfo.JAVA_VM_NAME)); + constantTags.add(statsdTag(LANG_INTERPRETER_VENDOR_STATSD_TAG, DDTraceCoreInfo.JAVA_VM_VENDOR)); + constantTags.add(statsdTag(TRACER_VERSION_STATSD_TAG, DDTraceCoreInfo.VERSION)); + constantTags.add(statsdTag("service", config.getServiceName())); + + final Map mergedSpanTags = config.getMergedSpanTags(); + final String version = mergedSpanTags.get(GeneralConfig.VERSION); + if (version != null && !version.isEmpty()) { + constantTags.add(statsdTag("version", version)); + } + + final String env = mergedSpanTags.get(GeneralConfig.ENV); + if (env != null && !env.isEmpty()) { + constantTags.add(statsdTag("env", env)); + } + + return constantTags.toArray(new String[0]); + } + + private static String statsdTag(final String tagPrefix, final String tagValue) { + return tagPrefix + ":" + tagValue; + } +} diff --git a/dd-java-agent/build.gradle b/dd-java-agent/build.gradle index f2594317ad1..32b156ebd2c 100644 --- a/dd-java-agent/build.gradle +++ b/dd-java-agent/build.gradle @@ -213,7 +213,7 @@ def includeSubprojShadowJar(Project includedProjectJar, String destinationDir, F } includeSubprojShadowJar(project(':dd-java-agent:instrumentation'), 'inst', includedJarFileTree) -includeSubprojShadowJar(project(':dd-java-agent:agent-jmxfetch'), 'metrics', includedJarFileTree) +includeSubprojShadowJar(project(':dd-java-agent:agent-jmxfetch'), 'jmxfetch', includedJarFileTree) includeSubprojShadowJar(project(':dd-java-agent:agent-profiling'), 'profiling', includedJarFileTree) includeSubprojShadowJar(project(':dd-java-agent:appsec'), 'appsec', includedJarFileTree) includeSubprojShadowJar(project(':dd-java-agent:agent-aiguard'), 'aiguard', includedJarFileTree) @@ -223,6 +223,7 @@ includeSubprojShadowJar(project(':dd-java-agent:agent-ci-visibility'), 'ci-visib includeSubprojShadowJar(project(':dd-java-agent:agent-llmobs'), 'llm-obs', includedJarFileTree) includeSubprojShadowJar(project(':dd-java-agent:agent-logs-intake'), 'logs-intake', includedJarFileTree) includeSubprojShadowJar(project(':dd-java-agent:cws-tls'), 'cws-tls', includedJarFileTree) +includeSubprojShadowJar(project(':products:metrics:agent'), 'metrics', includedJarFileTree) includeSubprojShadowJar(project(':products:feature-flagging:agent'), 'feature-flagging', includedJarFileTree) def sharedShadowJar = tasks.register('sharedShadowJar', ShadowJar) { @@ -366,6 +367,9 @@ dependencies { // do not bring along slf4j and dependent subprojects // (which are loaded on the bootstrap cl) } + sharedShadowInclude project(':products:metrics:agent'), { + transitive = false + } sharedShadowInclude project(':products:metrics:api'), { transitive = false } diff --git a/dd-java-agent/instrumentation/spark/spark-common/src/main/java/datadog/trace/instrumentation/spark/SparkAggregatedTaskMetrics.java b/dd-java-agent/instrumentation/spark/spark-common/src/main/java/datadog/trace/instrumentation/spark/SparkAggregatedTaskMetrics.java index 769f933e934..11eb9e9d64f 100644 --- a/dd-java-agent/instrumentation/spark/spark-common/src/main/java/datadog/trace/instrumentation/spark/SparkAggregatedTaskMetrics.java +++ b/dd-java-agent/instrumentation/spark/spark-common/src/main/java/datadog/trace/instrumentation/spark/SparkAggregatedTaskMetrics.java @@ -1,7 +1,7 @@ package datadog.trace.instrumentation.spark; +import datadog.metrics.agent.AgentMeter; import datadog.metrics.api.Histogram; -import datadog.metrics.histogram.Histograms; import datadog.trace.api.Config; import datadog.trace.bootstrap.instrumentation.api.AgentSpan; import java.nio.ByteBuffer; @@ -265,7 +265,9 @@ private Histogram lazyHistogramAccept(Histogram hist, double value) { if (value != 0) { // All the callbacks in DatadogSparkListener are called from the same thread, meaning we // don't risk to lose values by creating the histogram this way - hist = Histograms.newHistogram(HISTOGRAM_RELATIVE_ACCURACY, HISTOGRAM_MAX_NUM_BINS); + hist = + AgentMeter.histograms() + .newHistogram(HISTOGRAM_RELATIVE_ACCURACY, HISTOGRAM_MAX_NUM_BINS); if (taskCompletedCount > 1) { // Filling all the previous 0s that we might have missed hist.accept(0, taskCompletedCount - 1); diff --git a/dd-trace-core/build.gradle b/dd-trace-core/build.gradle index 2dd30133590..a3b62a89f0e 100644 --- a/dd-trace-core/build.gradle +++ b/dd-trace-core/build.gradle @@ -68,7 +68,7 @@ dependencies { api project(':internal-api') api project(':products:metrics:api') implementation project(':components:json') - implementation project(':products:metrics:lib') + implementation project(':products:metrics:agent') implementation project(':utils:container-utils') implementation project(':utils:socket-utils') // for span exception debugging diff --git a/dd-trace-core/src/main/java/datadog/trace/common/metrics/AggregateMetric.java b/dd-trace-core/src/main/java/datadog/trace/common/metrics/AggregateMetric.java index 547c2db464e..d728c49a3bf 100644 --- a/dd-trace-core/src/main/java/datadog/trace/common/metrics/AggregateMetric.java +++ b/dd-trace-core/src/main/java/datadog/trace/common/metrics/AggregateMetric.java @@ -1,7 +1,7 @@ package datadog.trace.common.metrics; +import datadog.metrics.api.DDSketchHistograms; import datadog.metrics.api.Histogram; -import datadog.metrics.histogram.Histograms; import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; import java.util.concurrent.atomic.AtomicLongArray; @@ -22,8 +22,8 @@ public final class AggregateMetric { private long duration; public AggregateMetric() { - okLatencies = Histograms.newHistogram(); - errorLatencies = Histograms.newHistogram(); + okLatencies = DDSketchHistograms.INSTANCE.newHistogram(); + errorLatencies = DDSketchHistograms.INSTANCE.newHistogram(); } public AggregateMetric recordDurations(int count, AtomicLongArray durations) { 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 6a9908a4bd0..14babec29d4 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 @@ -1,6 +1,5 @@ package datadog.trace.core; -import static datadog.metrics.statsd.DDAgentStatsDClientManager.statsDClientManager; import static datadog.trace.api.DDTags.DJM_ENABLED; import static datadog.trace.api.DDTags.DSM_ENABLED; import static datadog.trace.api.DDTags.PROFILING_CONTEXT_ENGINE; @@ -24,8 +23,8 @@ import datadog.communication.ddagent.SharedCommunicationObjects; import datadog.context.propagation.Propagators; import datadog.environment.ThreadSupport; +import datadog.metrics.agent.AgentMeter; import datadog.metrics.api.Monitoring; -import datadog.metrics.api.MonitoringImpl; import datadog.metrics.api.Recording; import datadog.metrics.statsd.StatsDClient; import datadog.trace.api.ClassloaderConfigurationOverrides; @@ -37,7 +36,6 @@ import datadog.trace.api.IdGenerationStrategy; import datadog.trace.api.TagMap; import datadog.trace.api.TraceConfig; -import datadog.trace.api.config.GeneralConfig; import datadog.trace.api.datastreams.AgentDataStreamsMonitoring; import datadog.trace.api.datastreams.PathwayContext; import datadog.trace.api.experimental.DataStreamsCheckpointer; @@ -79,7 +77,6 @@ import datadog.trace.common.sampling.SingleSpanSampler; import datadog.trace.common.sampling.SpanSamplingRules; import datadog.trace.common.sampling.TraceSamplingRules; -import datadog.trace.common.writer.DDAgentWriter; import datadog.trace.common.writer.Writer; import datadog.trace.common.writer.WriterFactory; import datadog.trace.common.writer.ddintake.DDIntakeTraceInterceptor; @@ -142,12 +139,6 @@ public static final CoreTracerBuilder builder() { return new CoreTracerBuilder(); } - private static final String LANG_STATSD_TAG = "lang"; - private static final String LANG_VERSION_STATSD_TAG = "lang_version"; - private static final String LANG_INTERPRETER_STATSD_TAG = "lang_interpreter"; - private static final String LANG_INTERPRETER_VENDOR_STATSD_TAG = "lang_interpreter_vendor"; - private static final String TRACER_VERSION_STATSD_TAG = "tracer_version"; - /** Tracer start time in nanoseconds measured up to a millisecond accuracy */ private final long startTimeNano; @@ -203,8 +194,6 @@ public static final CoreTracerBuilder builder() { /** number of spans in a pending trace before they get flushed */ private final int partialFlushMinSpans; - private final StatsDClient statsDClient; - private final Monitoring monitoring; private final Monitoring performanceMonitoring; private final HealthMetrics healthMetrics; @@ -536,7 +525,6 @@ public CoreTracer build() { taggedHeaders, baggageMapping, partialFlushMinSpans, - statsDClient, healthMetrics, tagInterceptor, strictTraceWrites, @@ -569,7 +557,6 @@ private CoreTracer( final Map taggedHeaders, final Map baggageMapping, final int partialFlushMinSpans, - final StatsDClient statsDClient, final HealthMetrics healthMetrics, final TagInterceptor tagInterceptor, final boolean strictTraceWrites, @@ -597,7 +584,6 @@ private CoreTracer( taggedHeaders, baggageMapping, partialFlushMinSpans, - statsDClient, healthMetrics, tagInterceptor, strictTraceWrites, @@ -629,7 +615,6 @@ private CoreTracer( final Map taggedHeaders, final Map baggageMapping, final int partialFlushMinSpans, - final StatsDClient statsDClient, final HealthMetrics healthMetrics, final TagInterceptor tagInterceptor, final boolean strictTraceWrites, @@ -713,32 +698,14 @@ private CoreTracer( ? Config.get().getIdGenerationStrategy() : idGenerationStrategy; - if (statsDClient != null) { - this.statsDClient = statsDClient; - } else if (writer == null || writer instanceof DDAgentWriter) { - this.statsDClient = createStatsDClient(config); - } else { - // avoid creating internal StatsD client when using external trace writer - this.statsDClient = StatsDClient.NO_OP; - } - - monitoring = - config.isHealthMetricsEnabled() - ? new MonitoringImpl(this.statsDClient, 10, SECONDS) - : Monitoring.DISABLED; - this.healthMetrics = - healthMetrics != null - ? healthMetrics - : (config.isHealthMetricsEnabled() - ? new TracerHealthMetrics(this.statsDClient) - : HealthMetrics.NO_OP); + config.isHealthMetricsEnabled() + ? new TracerHealthMetrics(AgentMeter.statsDClient()) + : HealthMetrics.NO_OP; this.healthMetrics.start(); performanceMonitoring = - config.isPerfMetricsEnabled() - ? new MonitoringImpl(this.statsDClient, 10, SECONDS) - : Monitoring.DISABLED; + config.isPerfMetricsEnabled() ? AgentMeter.monitoring() : Monitoring.DISABLED; traceWriteTimer = performanceMonitoring.newThreadLocalTimer("trace.write"); @@ -756,7 +723,7 @@ private CoreTracer( if (sharedCommunicationObjects == null) { sharedCommunicationObjects = new SharedCommunicationObjects(); } - sharedCommunicationObjects.monitoring = monitoring; + sharedCommunicationObjects.monitoring = AgentMeter.monitoring(); sharedCommunicationObjects.createRemaining(config); tracingConfigPoller = new TracingConfigPoller(dynamicConfig); @@ -1393,7 +1360,7 @@ public void close() { pendingTraceBuffer.close(); writer.close(); RumInjector.shutdownTelemetry(); - statsDClient.close(); + AgentMeter.statsDClient().close(); metricsAggregator.close(); dataStreamsMonitoring.close(); externalAgentLauncher.close(); @@ -1457,62 +1424,10 @@ public void addReportToFlare(ZipOutputStream zip) throws IOException { TracerFlare.addText(zip, "span_metrics.txt", SpanMetricRegistry.getInstance().summary()); } - private static StatsDClient createStatsDClient(final Config config) { - if (!config.isHealthMetricsEnabled()) { - return StatsDClient.NO_OP; - } else { - String host = config.getHealthMetricsStatsdHost(); - if (host == null) { - host = config.getJmxFetchStatsdHost(); - } - Integer port = config.getHealthMetricsStatsdPort(); - if (port == null) { - port = config.getJmxFetchStatsdPort(); - } - - return statsDClientManager() - .statsDClient( - host, - port, - config.getDogStatsDNamedPipe(), - // use replace to stop string being changed to 'ddtrot.dd.tracer' in dd-trace-ot - "datadog:tracer".replace(':', '.'), - generateConstantTags(config)); - } - } - - private static String[] generateConstantTags(final Config config) { - final List constantTags = new ArrayList<>(); - - constantTags.add(statsdTag(LANG_STATSD_TAG, "java")); - constantTags.add(statsdTag(LANG_VERSION_STATSD_TAG, DDTraceCoreInfo.JAVA_VERSION)); - constantTags.add(statsdTag(LANG_INTERPRETER_STATSD_TAG, DDTraceCoreInfo.JAVA_VM_NAME)); - constantTags.add(statsdTag(LANG_INTERPRETER_VENDOR_STATSD_TAG, DDTraceCoreInfo.JAVA_VM_VENDOR)); - constantTags.add(statsdTag(TRACER_VERSION_STATSD_TAG, DDTraceCoreInfo.VERSION)); - constantTags.add(statsdTag("service", config.getServiceName())); - - final Map mergedSpanTags = config.getMergedSpanTags(); - final String version = mergedSpanTags.get(GeneralConfig.VERSION); - if (version != null && !version.isEmpty()) { - constantTags.add(statsdTag("version", version)); - } - - final String env = mergedSpanTags.get(GeneralConfig.ENV); - if (env != null && !env.isEmpty()) { - constantTags.add(statsdTag("env", env)); - } - - return constantTags.toArray(new String[0]); - } - Recording writeTimer() { return traceWriteTimer.start(); } - private static String statsdTag(final String tagPrefix, final String tagValue) { - return tagPrefix + ":" + tagValue; - } - private static Map invertMap(Map map) { Map inverted = new HashMap<>(map.size()); for (Map.Entry entry : map.entrySet()) { diff --git a/dd-trace-core/src/main/java/datadog/trace/core/datastreams/StatsGroup.java b/dd-trace-core/src/main/java/datadog/trace/core/datastreams/StatsGroup.java index ed86285fdac..2cdfbdac2ab 100644 --- a/dd-trace-core/src/main/java/datadog/trace/core/datastreams/StatsGroup.java +++ b/dd-trace-core/src/main/java/datadog/trace/core/datastreams/StatsGroup.java @@ -1,7 +1,7 @@ package datadog.trace.core.datastreams; +import datadog.metrics.api.DDSketchHistograms; import datadog.metrics.api.Histogram; -import datadog.metrics.histogram.Histograms; import datadog.trace.api.datastreams.DataStreamsTags; public class StatsGroup { @@ -18,9 +18,9 @@ public StatsGroup(DataStreamsTags tags, long hash, long parentHash) { this.tags = tags; this.hash = hash; this.parentHash = parentHash; - pathwayLatency = Histograms.newLogHistogram(); - edgeLatency = Histograms.newLogHistogram(); - payloadSize = Histograms.newLogHistogram(); + this.pathwayLatency = DDSketchHistograms.INSTANCE.newLogHistogram(); + this.edgeLatency = DDSketchHistograms.INSTANCE.newLogHistogram(); + this.payloadSize = DDSketchHistograms.INSTANCE.newLogHistogram(); } public void add(long pathwayLatencyNano, long edgeLatencyNano, long payloadSizeBytes) { diff --git a/products/metrics/agent/build.gradle.kts b/products/metrics/agent/build.gradle.kts new file mode 100644 index 00000000000..f6b9aa2168c --- /dev/null +++ b/products/metrics/agent/build.gradle.kts @@ -0,0 +1,25 @@ +import com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar +import org.gradle.kotlin.dsl.named + +plugins { + `java-library` + id("com.gradleup.shadow") +} + +description = "Metrics agent" + +apply(from = rootDir.resolve("gradle/java.gradle")) +apply(from = "$rootDir/gradle/version.gradle") + +dependencies { + api(project(":products:metrics:lib")) +} + +tasks.named("shadowJar") { + dependencies { + val deps = project.extra["deps"] as Map<*, *> + val excludeShared = deps["excludeShared"] as groovy.lang.Closure<*> + excludeShared.delegate = this + excludeShared.call() + } +} diff --git a/products/metrics/agent/src/main/java/datadog/metrics/agent/AgentMeter.java b/products/metrics/agent/src/main/java/datadog/metrics/agent/AgentMeter.java new file mode 100644 index 00000000000..efc5b0e35b2 --- /dev/null +++ b/products/metrics/agent/src/main/java/datadog/metrics/agent/AgentMeter.java @@ -0,0 +1,41 @@ +package datadog.metrics.agent; + +import static datadog.metrics.api.Monitoring.DISABLED; + +import datadog.metrics.api.Histograms; +import datadog.metrics.api.Monitoring; +import datadog.metrics.statsd.StatsDClient; + +public class AgentMeter { + private static volatile StatsDClient statsdClient = StatsDClient.NO_OP; + private static volatile Monitoring monitoring = DISABLED; + private static Histograms histograms = Histograms.NO_OP; + + // StatsD client connection + public static StatsDClient statsDClient() { + return statsdClient; + } + + // Health metrics monitoring + public static Monitoring monitoring() { + return monitoring; + } + + // Local stored histograms + public static Histograms histograms() { + return histograms; + } + + public static synchronized void registerIfAbsent( + StatsDClient statsDClient, Monitoring monitoring, Histograms histograms) { + if (statsDClient != null && AgentMeter.statsdClient == StatsDClient.NO_OP) { + AgentMeter.statsdClient = statsDClient; + } + if (monitoring != null && monitoring != DISABLED) { + AgentMeter.monitoring = monitoring; + } + if (histograms != null && histograms != Histograms.NO_OP) { + AgentMeter.histograms = histograms; + } + } +} diff --git a/products/metrics/api/src/main/java/datadog/metrics/api/Histograms.java b/products/metrics/api/src/main/java/datadog/metrics/api/Histograms.java new file mode 100644 index 00000000000..51fa97961cd --- /dev/null +++ b/products/metrics/api/src/main/java/datadog/metrics/api/Histograms.java @@ -0,0 +1,11 @@ +package datadog.metrics.api; + +public interface Histograms { + Histograms NO_OP = new NoOpHistograms(); + + Histogram newHistogram(); + + Histogram newLogHistogram(); + + Histogram newHistogram(double relativeAccuracy, int maxNumBins); +} diff --git a/products/metrics/api/src/main/java/datadog/metrics/api/NoOpHistograms.java b/products/metrics/api/src/main/java/datadog/metrics/api/NoOpHistograms.java new file mode 100644 index 00000000000..d684f907303 --- /dev/null +++ b/products/metrics/api/src/main/java/datadog/metrics/api/NoOpHistograms.java @@ -0,0 +1,18 @@ +package datadog.metrics.api; + +final class NoOpHistograms implements Histograms { + @Override + public Histogram newHistogram() { + return NoOpHistogram.INSTANCE; + } + + @Override + public Histogram newLogHistogram() { + return NoOpHistogram.INSTANCE; + } + + @Override + public Histogram newHistogram(double relativeAccuracy, int maxNumBins) { + return NoOpHistogram.INSTANCE; + } +} diff --git a/products/metrics/lib/src/main/java/datadog/metrics/histogram/DDSketchHistogram.java b/products/metrics/lib/src/main/java/datadog/metrics/api/DDSketchHistogram.java similarity index 90% rename from products/metrics/lib/src/main/java/datadog/metrics/histogram/DDSketchHistogram.java rename to products/metrics/lib/src/main/java/datadog/metrics/api/DDSketchHistogram.java index 16d3c53c4ef..36b3774b3b2 100644 --- a/products/metrics/lib/src/main/java/datadog/metrics/histogram/DDSketchHistogram.java +++ b/products/metrics/lib/src/main/java/datadog/metrics/api/DDSketchHistogram.java @@ -1,10 +1,10 @@ -package datadog.metrics.histogram; +package datadog.metrics.api; import com.datadoghq.sketch.ddsketch.DDSketch; import java.nio.ByteBuffer; /** Wrapper around the DDSketch library so that it can be used in an instrumentation */ -public class DDSketchHistogram implements datadog.metrics.api.Histogram { +public class DDSketchHistogram implements Histogram { private final DDSketch sketch; public DDSketchHistogram(DDSketch sketch) { diff --git a/products/metrics/lib/src/main/java/datadog/metrics/histogram/Histograms.java b/products/metrics/lib/src/main/java/datadog/metrics/api/DDSketchHistograms.java similarity index 74% rename from products/metrics/lib/src/main/java/datadog/metrics/histogram/Histograms.java rename to products/metrics/lib/src/main/java/datadog/metrics/api/DDSketchHistograms.java index 6662d8249b2..94cf65b2c1d 100644 --- a/products/metrics/lib/src/main/java/datadog/metrics/histogram/Histograms.java +++ b/products/metrics/lib/src/main/java/datadog/metrics/api/DDSketchHistograms.java @@ -1,14 +1,12 @@ -package datadog.metrics.histogram; +package datadog.metrics.api; import com.datadoghq.sketch.ddsketch.DDSketch; import com.datadoghq.sketch.ddsketch.DDSketches; import com.datadoghq.sketch.ddsketch.mapping.BitwiseLinearlyInterpolatedMapping; import com.datadoghq.sketch.ddsketch.mapping.LogarithmicMapping; import com.datadoghq.sketch.ddsketch.store.CollapsingLowestDenseStore; -import datadog.metrics.api.Histogram; - -public final class Histograms { +public final class DDSketchHistograms implements Histograms { private static final BitwiseLinearlyInterpolatedMapping INDEX_MAPPING = new BitwiseLinearlyInterpolatedMapping(1.0 / 128.0); // use the same gamma and index offset as the Datadog backend, to avoid doing any conversions in @@ -17,17 +15,24 @@ public final class Histograms { private static final LogarithmicMapping LOG_INDEX_MAPPING = new LogarithmicMapping(1.015625, 1.8761281912861705); - public static Histogram newHistogram() { + public static final DDSketchHistograms INSTANCE = new DDSketchHistograms(); + + private DDSketchHistograms() {} + + @Override + public Histogram newHistogram() { DDSketch sketch = new DDSketch(INDEX_MAPPING, () -> new CollapsingLowestDenseStore(1024)); return new DDSketchHistogram(sketch); } - public static Histogram newLogHistogram() { + @Override + public Histogram newLogHistogram() { DDSketch sketch = new DDSketch(LOG_INDEX_MAPPING, () -> new CollapsingLowestDenseStore(1024)); return new DDSketchHistogram(sketch); } - public static Histogram newHistogram(double relativeAccuracy, int maxNumBins) { + @Override + public Histogram newHistogram(double relativeAccuracy, int maxNumBins) { DDSketch sketch = DDSketches.logarithmicCollapsingLowestDense(relativeAccuracy, maxNumBins); return new DDSketchHistogram(sketch); } diff --git a/products/metrics/lib/src/main/java/datadog/metrics/api/MonitoringImpl.java b/products/metrics/lib/src/main/java/datadog/metrics/api/MonitoringImpl.java index 8f6339a6b36..0a638e2e5e6 100644 --- a/products/metrics/lib/src/main/java/datadog/metrics/api/MonitoringImpl.java +++ b/products/metrics/lib/src/main/java/datadog/metrics/api/MonitoringImpl.java @@ -4,58 +4,33 @@ import java.util.concurrent.TimeUnit; public final class MonitoringImpl implements Monitoring { - private final StatsDClient statsd; private final long flushAfterNanos; - private final boolean enabled; public MonitoringImpl(final StatsDClient statsd, long flushInterval, TimeUnit flushUnit) { this.statsd = statsd; this.flushAfterNanos = flushUnit.toNanos(flushInterval); - this.enabled = true; - } - - private MonitoringImpl() { - this.statsd = StatsDClient.NO_OP; - this.flushAfterNanos = 0; - this.enabled = false; } @Override public Recording newTimer(final String name) { - if (!enabled) { - return NoOpRecording.NO_OP; - } return new Timer(name, statsd, flushAfterNanos); } @Override public Recording newTimer(final String name, final String... tags) { - if (!enabled) { - return NoOpRecording.NO_OP; - } return new Timer(name, tags, statsd, flushAfterNanos); } @Override public Recording newThreadLocalTimer(final String name) { - if (!enabled) { - return NoOpRecording.NO_OP; - } return new ThreadLocalRecording( - new ThreadLocal() { - @Override - protected Recording initialValue() { - return newTimer(name, "thread:" + Thread.currentThread().getName()); - } - }); + ThreadLocal.withInitial( + () -> newTimer(name, "thread:" + Thread.currentThread().getName()))); } @Override public Counter newCounter(final String name) { - if (!enabled) { - return NoOpCounter.NO_OP; - } return new StatsDCounter(name, statsd); } } diff --git a/products/metrics/lib/src/main/java/datadog/metrics/api/Timer.java b/products/metrics/lib/src/main/java/datadog/metrics/api/Timer.java index f7046d33916..5e59cb8db5f 100644 --- a/products/metrics/lib/src/main/java/datadog/metrics/api/Timer.java +++ b/products/metrics/lib/src/main/java/datadog/metrics/api/Timer.java @@ -4,7 +4,6 @@ import static java.util.concurrent.TimeUnit.NANOSECONDS; import static java.util.concurrent.TimeUnit.SECONDS; -import datadog.metrics.histogram.Histograms; import datadog.metrics.statsd.StatsDClient; /** @@ -35,7 +34,7 @@ public class Timer extends Recording { this.name = name; this.statsd = statsd; this.flushAfterNanos = flushAfterNanos; - this.histogram = Histograms.newHistogram(); + this.histogram = DDSketchHistograms.INSTANCE.newHistogram(); this.p50Tags = mergeTags(P_50, tags); this.p99Tags = mergeTags(P_99, tags); this.maxTags = mergeTags(MAX, tags); diff --git a/settings.gradle.kts b/settings.gradle.kts index d606dec1e87..cb9f637bea8 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -106,6 +106,7 @@ include( ":components:environment", ":components:json", ":components:native-loader", + ":products:metrics:agent", ":products:metrics:api", ":products:metrics:lib", ":telemetry",