From 79665803f00c2e56dbdf3152b128a5d0efb9e89b Mon Sep 17 00:00:00 2001 From: Stuart McCulloch Date: Thu, 13 Nov 2025 14:50:40 +0000 Subject: [PATCH 1/4] Register ConfigInversion netric collector for InstrumenterConfig InstrumenterConfig runs before Config and checks settings that control instrumentation. We skip the registration when doing native-image builds because we deliberately turn off non-critical features like telemetry for native-image. This change also simplifies ConfigInversionMetricCollectorProvider.get() for performance reasons, while moving debug logs to NoOpConfigInversionMetricCollector when the telemetry based implementation is not yet registered. --- .../datadog/trace/api/InstrumenterConfig.java | 10 ++++++++++ .../ConfigInversionMetricCollectorProvider.java | 15 ++------------- .../NoOpConfigInversionMetricCollector.java | 8 +++++++- 3 files changed, 19 insertions(+), 14 deletions(-) diff --git a/internal-api/src/main/java/datadog/trace/api/InstrumenterConfig.java b/internal-api/src/main/java/datadog/trace/api/InstrumenterConfig.java index a2d2ae83169..822509482f9 100644 --- a/internal-api/src/main/java/datadog/trace/api/InstrumenterConfig.java +++ b/internal-api/src/main/java/datadog/trace/api/InstrumenterConfig.java @@ -80,6 +80,8 @@ import static datadog.trace.util.CollectionUtils.tryMakeImmutableSet; import datadog.trace.api.profiling.ProfilingEnablement; +import datadog.trace.api.telemetry.ConfigInversionMetricCollectorImpl; +import datadog.trace.api.telemetry.ConfigInversionMetricCollectorProvider; import datadog.trace.api.telemetry.OtelEnvMetricCollectorImpl; import datadog.trace.api.telemetry.OtelEnvMetricCollectorProvider; import datadog.trace.bootstrap.config.provider.ConfigProvider; @@ -107,6 +109,14 @@ * @see Config for other configurations */ public class InstrumenterConfig { + static { + if (!Platform.isNativeImageBuilder()) { + // Bind telemetry collector to config module before initializing ConfigProvider + ConfigInversionMetricCollectorProvider.register( + ConfigInversionMetricCollectorImpl.getInstance()); + } + } + private final ConfigProvider configProvider; private final boolean triageEnabled; diff --git a/utils/config-utils/src/main/java/datadog/trace/api/telemetry/ConfigInversionMetricCollectorProvider.java b/utils/config-utils/src/main/java/datadog/trace/api/telemetry/ConfigInversionMetricCollectorProvider.java index a66cee8f35f..1170ef70ebc 100644 --- a/utils/config-utils/src/main/java/datadog/trace/api/telemetry/ConfigInversionMetricCollectorProvider.java +++ b/utils/config-utils/src/main/java/datadog/trace/api/telemetry/ConfigInversionMetricCollectorProvider.java @@ -1,23 +1,12 @@ package datadog.trace.api.telemetry; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - public final class ConfigInversionMetricCollectorProvider { - private static final Logger log = - LoggerFactory.getLogger(ConfigInversionMetricCollectorProvider.class); - private static ConfigInversionMetricCollector INSTANCE = null; + private static ConfigInversionMetricCollector INSTANCE = + NoOpConfigInversionMetricCollector.getInstance(); private ConfigInversionMetricCollectorProvider() {} public static ConfigInversionMetricCollector get() { - if (INSTANCE == null) { - log.debug( - "ConfigInversionMetricCollector has not been registered. Defaulting to NoOp implementation."); - // Return NoOp implementation for build tasks like instrumentJava that run before - // implementation is registered - return NoOpConfigInversionMetricCollector.getInstance(); - } return INSTANCE; } diff --git a/utils/config-utils/src/main/java/datadog/trace/api/telemetry/NoOpConfigInversionMetricCollector.java b/utils/config-utils/src/main/java/datadog/trace/api/telemetry/NoOpConfigInversionMetricCollector.java index 243510d1da9..002ae7d6198 100644 --- a/utils/config-utils/src/main/java/datadog/trace/api/telemetry/NoOpConfigInversionMetricCollector.java +++ b/utils/config-utils/src/main/java/datadog/trace/api/telemetry/NoOpConfigInversionMetricCollector.java @@ -1,5 +1,8 @@ package datadog.trace.api.telemetry; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + /** * NOOP implementation of ConfigInversionMetricCollector. Used as a default when the real collector * is not registered during build tasks like instrumentJava. @@ -8,6 +11,9 @@ public final class NoOpConfigInversionMetricCollector implements ConfigInversion private static final NoOpConfigInversionMetricCollector INSTANCE = new NoOpConfigInversionMetricCollector(); + private static final Logger log = + LoggerFactory.getLogger(NoOpConfigInversionMetricCollector.class); + private NoOpConfigInversionMetricCollector() {} public static NoOpConfigInversionMetricCollector getInstance() { @@ -16,6 +22,6 @@ public static NoOpConfigInversionMetricCollector getInstance() { @Override public void setUndocumentedEnvVarMetric(String configName) { - // NOOP - do nothing + log.debug("Environment variable {} is undocumented", configName); } } From c919872178c5f82aec444bf5f3a49f549ba067ba Mon Sep 17 00:00:00 2001 From: Stuart McCulloch Date: Thu, 13 Nov 2025 15:36:45 +0000 Subject: [PATCH 2/4] Document DBCP2 and HIKARI integration flags --- metadata/supported-configurations.json | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/metadata/supported-configurations.json b/metadata/supported-configurations.json index 8a90076eeac..17d7798ffef 100644 --- a/metadata/supported-configurations.json +++ b/metadata/supported-configurations.json @@ -632,6 +632,7 @@ "DD_TRACE_DATANUCLEUS_ANALYTICS_SAMPLE_RATE": ["A"], "DD_TRACE_DATANUCLEUS_ENABLED": ["A"], "DD_TRACE_DB2_ENABLED": ["A"], + "DD_TRACE_DBCP2_ENABLED": ["A"], "DD_TRACE_DBM_ENABLED": ["A"], "DD_TRACE_DBSTATEMENTRULE_ENABLED": ["A"], "DD_TRACE_DB_CLIENT_SPLIT_BY_HOST": ["A"], @@ -746,6 +747,7 @@ "DD_TRACE_HIBERNATE_CORE_ANALYTICS_SAMPLE_RATE": ["A"], "DD_TRACE_HIBERNATE_CORE_ENABLED": ["A"], "DD_TRACE_HIBERNATE_ENABLED": ["A"], + "DD_TRACE_HIKARI_ENABLED": ["A"], "DD_TRACE_HTTPASYNCCLIENT4_LEGACY_TRACING_ENABLED": ["A"], "DD_TRACE_HTTPASYNCCLIENT5_ENABLED": ["A"], "DD_TRACE_HTTPASYNCCLIENT_ANALYTICS_ENABLED": ["A"], @@ -1471,6 +1473,7 @@ "DD_TRACE_DATANUCLEUS_ANALYTICS_SAMPLE_RATE": ["DD_DATANUCLEUS_ANALYTICS_SAMPLE_RATE"], "DD_TRACE_DATANUCLEUS_ENABLED": ["DD_TRACE_INTEGRATION_DATANUCLEUS_ENABLED","DD_INTEGRATION_DATANUCLEUS_ENABLED"], "DD_TRACE_DB2_ENABLED": ["DD_TRACE_INTEGRATION_DB2_ENABLED","DD_INTEGRATION_DB2_ENABLED"], + "DD_TRACE_DBCP2_ENABLED": ["DD_TRACE_INTEGRATION_DBCP2_ENABLED","DD_INTEGRATION_DBCP2_ENABLED"], "DD_TRACE_DBM_ENABLED": ["DD_TRACE_INTEGRATION_DBM_ENABLED","DD_INTEGRATION_DBM_ENABLED"], "DD_TRACE_DEFINECLASS_ENABLED": ["DD_TRACE_INTEGRATION_DEFINECLASS_ENABLED","DD_INTEGRATION_DEFINECLASS_ENABLED"], "DD_TRACE_DIRECTALLOCATION_ENABLED": ["DD_TRACE_INTEGRATION_DIRECTALLOCATION_ENABLED","DD_INTEGRATION_DIRECTALLOCATION_ENABLED"], @@ -1542,6 +1545,7 @@ "DD_TRACE_HIBERNATE_CORE_ANALYTICS_SAMPLE_RATE": ["DD_HIBERNATE_CORE_ANALYTICS_SAMPLE_RATE"], "DD_TRACE_HIBERNATE_CORE_ENABLED": ["DD_TRACE_INTEGRATION_HIBERNATE_CORE_ENABLED","DD_INTEGRATION_HIBERNATE_CORE_ENABLED"], "DD_TRACE_HIBERNATE_ENABLED": ["DD_TRACE_INTEGRATION_HIBERNATE_ENABLED","DD_INTEGRATION_HIBERNATE_ENABLED"], + "DD_TRACE_HIKARI_ENABLED": ["DD_TRACE_INTEGRATION_HIKARI_ENABLED","DD_INTEGRATION_HIKARI_ENABLED"], "DD_TRACE_HTTPASYNCCLIENT4_LEGACY_TRACING_ENABLED": ["DD_HTTPASYNCCLIENT4_LEGACY_TRACING_ENABLED"], "DD_TRACE_HTTPASYNCCLIENT5_ENABLED": ["DD_TRACE_INTEGRATION_HTTPASYNCCLIENT5_ENABLED","DD_INTEGRATION_HTTPASYNCCLIENT5_ENABLED"], "DD_TRACE_HTTPASYNCCLIENT_ANALYTICS_SAMPLE_RATE": ["DD_HTTPASYNCCLIENT_ANALYTICS_SAMPLE_RATE"], From ea05e22325ffbd363891f7e45a31002f2e62e860 Mon Sep 17 00:00:00 2001 From: Stuart McCulloch Date: Thu, 13 Nov 2025 15:42:30 +0000 Subject: [PATCH 3/4] comment --- .../src/main/java/datadog/trace/api/InstrumenterConfig.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/internal-api/src/main/java/datadog/trace/api/InstrumenterConfig.java b/internal-api/src/main/java/datadog/trace/api/InstrumenterConfig.java index 822509482f9..e7401b04854 100644 --- a/internal-api/src/main/java/datadog/trace/api/InstrumenterConfig.java +++ b/internal-api/src/main/java/datadog/trace/api/InstrumenterConfig.java @@ -110,8 +110,8 @@ */ public class InstrumenterConfig { static { + // skip registration when building native-images as telemetry is not available if (!Platform.isNativeImageBuilder()) { - // Bind telemetry collector to config module before initializing ConfigProvider ConfigInversionMetricCollectorProvider.register( ConfigInversionMetricCollectorImpl.getInstance()); } From 0e726e3f8c8e5e45e8656a9eae7518809fe19137 Mon Sep 17 00:00:00 2001 From: Stuart McCulloch Date: Thu, 13 Nov 2025 17:02:11 +0000 Subject: [PATCH 4/4] Add NoOpConfigInversionMetricCollector to expected class list in GraalVM --- .../nativeimage/NativeImageGeneratorRunnerInstrumentation.java | 1 + 1 file changed, 1 insertion(+) diff --git a/dd-java-agent/instrumentation/graal/native-image/src/main/java/datadog/trace/instrumentation/graal/nativeimage/NativeImageGeneratorRunnerInstrumentation.java b/dd-java-agent/instrumentation/graal/native-image/src/main/java/datadog/trace/instrumentation/graal/nativeimage/NativeImageGeneratorRunnerInstrumentation.java index 904a1260842..1099c78a720 100644 --- a/dd-java-agent/instrumentation/graal/native-image/src/main/java/datadog/trace/instrumentation/graal/nativeimage/NativeImageGeneratorRunnerInstrumentation.java +++ b/dd-java-agent/instrumentation/graal/native-image/src/main/java/datadog/trace/instrumentation/graal/nativeimage/NativeImageGeneratorRunnerInstrumentation.java @@ -107,6 +107,7 @@ public static void onEnter(@Advice.Argument(value = 0, readOnly = false) String[ + "datadog.trace.api.telemetry.ConfigInversionMetricCollectorProvider:rerun," + "datadog.trace.api.telemetry.ConfigInversionMetricCollectorImpl:build_time," + "datadog.trace.api.telemetry.ConfigInversionMetricCollectorImpl$ConfigInversionMetric:build_time," + + "datadog.trace.api.telemetry.NoOpConfigInversionMetricCollector:build_time," + "datadog.trace.api.telemetry.OtelEnvMetricCollectorImpl:build_time," + "datadog.trace.api.profiling.ProfilingEnablement:build_time," + "datadog.trace.bootstrap.config.provider.ConfigConverter:build_time,"