From e29146f81ff791dfbe5da52d0fe5fb0f47ab4418 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rapha=C3=ABl=20Vandon?= Date: Thu, 16 Oct 2025 10:57:23 +0200 Subject: [PATCH 1/7] add config flags but in the wrong place --- .../instrumentation/jdbc/JDBCDecorator.java | 19 ++++++++++++------- .../config/TraceInstrumentationConfig.java | 5 +++++ .../datadog/trace/api/InstrumenterConfig.java | 19 +++++++++++++++++++ 3 files changed, 36 insertions(+), 7 deletions(-) diff --git a/dd-java-agent/instrumentation/jdbc/src/main/java/datadog/trace/instrumentation/jdbc/JDBCDecorator.java b/dd-java-agent/instrumentation/jdbc/src/main/java/datadog/trace/instrumentation/jdbc/JDBCDecorator.java index 7acbb038426..35459d6dc7b 100644 --- a/dd-java-agent/instrumentation/jdbc/src/main/java/datadog/trace/instrumentation/jdbc/JDBCDecorator.java +++ b/dd-java-agent/instrumentation/jdbc/src/main/java/datadog/trace/instrumentation/jdbc/JDBCDecorator.java @@ -8,6 +8,7 @@ import datadog.trace.api.Config; import datadog.trace.api.DDSpanId; import datadog.trace.api.DDTraceId; +import datadog.trace.api.InstrumenterConfig; import datadog.trace.api.naming.SpanNaming; import datadog.trace.bootstrap.ContextStore; import datadog.trace.bootstrap.instrumentation.api.AgentScope; @@ -28,6 +29,7 @@ import java.sql.SQLException; import java.sql.Statement; import java.util.HashSet; +import java.util.Properties; import java.util.Set; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -181,7 +183,7 @@ public static DBInfo parseDBInfo( } catch (Throwable ignore) { } if (dbInfo == null) { - // couldn't find DBInfo anywhere, so fall back to default + // couldn't find DBInfo from a previous call anywhere, so we try to fetch it from the DB dbInfo = parseDBInfoFromConnection(connection); } // store the DBInfo on the outermost connection instance to avoid future searches @@ -200,7 +202,7 @@ public String getDbService(final DBInfo dbInfo) { } public static DBInfo parseDBInfoFromConnection(final Connection connection) { - if (connection == null) { + if (connection == null || !InstrumenterConfig.get().isJdbcMetadataFetchingEnabled()) { // we can log here, but it risks to be too verbose return DBInfo.DEFAULT; } @@ -209,12 +211,15 @@ public static DBInfo parseDBInfoFromConnection(final Connection connection) { final DatabaseMetaData metaData = connection.getMetaData(); final String url = metaData.getURL(); if (url != null) { - try { - dbInfo = JDBCConnectionUrlParser.extractDBInfo(url, connection.getClientInfo()); - } catch (final Throwable ex) { - // getClientInfo is likely not allowed. - dbInfo = JDBCConnectionUrlParser.extractDBInfo(url, null); + Properties clientInfo = null; + if (InstrumenterConfig.get().isJdbcClientInfoFetchingEnabled()) { + try { + clientInfo = connection.getClientInfo(); + } catch (final Throwable ex) { + // getClientInfo is likely not allowed, we can still extract info from the url alone + } } + dbInfo = JDBCConnectionUrlParser.extractDBInfo(url, clientInfo); } else { dbInfo = DBInfo.DEFAULT; } diff --git a/dd-trace-api/src/main/java/datadog/trace/api/config/TraceInstrumentationConfig.java b/dd-trace-api/src/main/java/datadog/trace/api/config/TraceInstrumentationConfig.java index e96900c073d..12789529b54 100644 --- a/dd-trace-api/src/main/java/datadog/trace/api/config/TraceInstrumentationConfig.java +++ b/dd-trace-api/src/main/java/datadog/trace/api/config/TraceInstrumentationConfig.java @@ -75,6 +75,11 @@ public final class TraceInstrumentationConfig { public static final String JDBC_POOL_WAITING_ENABLED = "trace.experimental.jdbc.pool.waiting.enabled"; + public static final String JDBC_METADATA_FETCHING_ENABLED = + "trace.jdbc.metadata.fetching.enabled"; + public static final String JDBC_CLIENT_INFO_FETCHING_ENABLED = + "trace.jdbc.client.info.fetching.enabled"; + public static final String AKKA_FORK_JOIN_TASK_NAME = "trace.akka.fork.join.task.name"; public static final String AKKA_FORK_JOIN_EXECUTOR_TASK_NAME = "trace.akka.fork.join.executor.task.name"; 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 f7e3fabff2a..5b15b89d169 100644 --- a/internal-api/src/main/java/datadog/trace/api/InstrumenterConfig.java +++ b/internal-api/src/main/java/datadog/trace/api/InstrumenterConfig.java @@ -44,7 +44,9 @@ import static datadog.trace.api.config.TraceInstrumentationConfig.INSTRUMENTATION_CONFIG_ID; import static datadog.trace.api.config.TraceInstrumentationConfig.INTEGRATIONS_ENABLED; import static datadog.trace.api.config.TraceInstrumentationConfig.JAX_RS_ADDITIONAL_ANNOTATIONS; +import static datadog.trace.api.config.TraceInstrumentationConfig.JDBC_CLIENT_INFO_FETCHING_ENABLED; import static datadog.trace.api.config.TraceInstrumentationConfig.JDBC_CONNECTION_CLASS_NAME; +import static datadog.trace.api.config.TraceInstrumentationConfig.JDBC_METADATA_FETCHING_ENABLED; import static datadog.trace.api.config.TraceInstrumentationConfig.JDBC_POOL_WAITING_ENABLED; import static datadog.trace.api.config.TraceInstrumentationConfig.JDBC_PREPARED_STATEMENT_CLASS_NAME; import static datadog.trace.api.config.TraceInstrumentationConfig.MEASURE_METHODS; @@ -132,6 +134,8 @@ public class InstrumenterConfig { private final String jdbcPreparedStatementClassName; private final String jdbcConnectionClassName; private final boolean jdbcPoolWaitingEnabled; + private final boolean jdbcMetadataFetchingEnabled; + private final boolean jdbcClientInfoFetchingEnabled; private final String httpURLConnectionClassName; private final String axisTransportClassName; @@ -245,6 +249,9 @@ private InstrumenterConfig() { configProvider.getString(JDBC_PREPARED_STATEMENT_CLASS_NAME, ""); jdbcConnectionClassName = configProvider.getString(JDBC_CONNECTION_CLASS_NAME, ""); jdbcPoolWaitingEnabled = configProvider.getBoolean(JDBC_POOL_WAITING_ENABLED, false); + jdbcMetadataFetchingEnabled = configProvider.getBoolean(JDBC_METADATA_FETCHING_ENABLED, true); + jdbcClientInfoFetchingEnabled = + configProvider.getBoolean(JDBC_CLIENT_INFO_FETCHING_ENABLED, true); httpURLConnectionClassName = configProvider.getString(HTTP_URL_CONNECTION_CLASS_NAME, ""); axisTransportClassName = configProvider.getString(AXIS_TRANSPORT_CLASS_NAME, ""); @@ -425,6 +432,14 @@ public boolean isJdbcPoolWaitingEnabled() { return jdbcPoolWaitingEnabled; } + public boolean isJdbcMetadataFetchingEnabled() { + return jdbcMetadataFetchingEnabled; + } + + public boolean isJdbcClientInfoFetchingEnabled() { + return jdbcClientInfoFetchingEnabled; + } + public String getHttpURLConnectionClassName() { return httpURLConnectionClassName; } @@ -636,6 +651,10 @@ public String toString() { + '\'' + ", jdbcPoolWaitingEnabled=" + jdbcPoolWaitingEnabled + + ", jdbcMetadataFetchingEnabled=" + + jdbcMetadataFetchingEnabled + + ", jdbcClientInfoFetchingEnabled=" + + jdbcClientInfoFetchingEnabled + ", httpURLConnectionClassName='" + httpURLConnectionClassName + '\'' From a685b20e1af52edab68c284515406852a6cb1a59 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rapha=C3=ABl=20Vandon?= Date: Thu, 16 Oct 2025 11:44:30 +0200 Subject: [PATCH 2/7] move flags --- .../instrumentation/jdbc/JDBCDecorator.java | 5 +- .../config/TraceInstrumentationConfig.java | 9 ++- .../main/java/datadog/trace/api/Config.java | 19 +++++++ .../datadog/trace/api/InstrumenterConfig.java | 19 ------- .../datadog/trace/api/ConfigTest.groovy | 56 +++++++++++++++++++ 5 files changed, 81 insertions(+), 27 deletions(-) diff --git a/dd-java-agent/instrumentation/jdbc/src/main/java/datadog/trace/instrumentation/jdbc/JDBCDecorator.java b/dd-java-agent/instrumentation/jdbc/src/main/java/datadog/trace/instrumentation/jdbc/JDBCDecorator.java index 35459d6dc7b..288e5752e77 100644 --- a/dd-java-agent/instrumentation/jdbc/src/main/java/datadog/trace/instrumentation/jdbc/JDBCDecorator.java +++ b/dd-java-agent/instrumentation/jdbc/src/main/java/datadog/trace/instrumentation/jdbc/JDBCDecorator.java @@ -8,7 +8,6 @@ import datadog.trace.api.Config; import datadog.trace.api.DDSpanId; import datadog.trace.api.DDTraceId; -import datadog.trace.api.InstrumenterConfig; import datadog.trace.api.naming.SpanNaming; import datadog.trace.bootstrap.ContextStore; import datadog.trace.bootstrap.instrumentation.api.AgentScope; @@ -202,7 +201,7 @@ public String getDbService(final DBInfo dbInfo) { } public static DBInfo parseDBInfoFromConnection(final Connection connection) { - if (connection == null || !InstrumenterConfig.get().isJdbcMetadataFetchingEnabled()) { + if (connection == null || !Config.get().isDbMetadataFetchingEnabled()) { // we can log here, but it risks to be too verbose return DBInfo.DEFAULT; } @@ -212,7 +211,7 @@ public static DBInfo parseDBInfoFromConnection(final Connection connection) { final String url = metaData.getURL(); if (url != null) { Properties clientInfo = null; - if (InstrumenterConfig.get().isJdbcClientInfoFetchingEnabled()) { + if (Config.get().isDbClientInfoFetchingEnabled()) { try { clientInfo = connection.getClientInfo(); } catch (final Throwable ex) { diff --git a/dd-trace-api/src/main/java/datadog/trace/api/config/TraceInstrumentationConfig.java b/dd-trace-api/src/main/java/datadog/trace/api/config/TraceInstrumentationConfig.java index 12789529b54..3436b689851 100644 --- a/dd-trace-api/src/main/java/datadog/trace/api/config/TraceInstrumentationConfig.java +++ b/dd-trace-api/src/main/java/datadog/trace/api/config/TraceInstrumentationConfig.java @@ -63,6 +63,10 @@ public final class TraceInstrumentationConfig { "trace.db.client.split-by-instance.type.suffix"; public static final String DB_CLIENT_HOST_SPLIT_BY_HOST = "trace.db.client.split-by-host"; + public static final String DB_METADATA_FETCHING_ENABLED = "trace.db.metadata.fetching.enabled"; + public static final String DB_CLIENT_INFO_FETCHING_ENABLED = + "trace.db.client.info.fetching.enabled"; + public static final String JDBC_PREPARED_STATEMENT_CLASS_NAME = "trace.jdbc.prepared.statement.class.name"; @@ -75,11 +79,6 @@ public final class TraceInstrumentationConfig { public static final String JDBC_POOL_WAITING_ENABLED = "trace.experimental.jdbc.pool.waiting.enabled"; - public static final String JDBC_METADATA_FETCHING_ENABLED = - "trace.jdbc.metadata.fetching.enabled"; - public static final String JDBC_CLIENT_INFO_FETCHING_ENABLED = - "trace.jdbc.client.info.fetching.enabled"; - public static final String AKKA_FORK_JOIN_TASK_NAME = "trace.akka.fork.join.task.name"; public static final String AKKA_FORK_JOIN_EXECUTOR_TASK_NAME = "trace.akka.fork.join.executor.task.name"; diff --git a/internal-api/src/main/java/datadog/trace/api/Config.java b/internal-api/src/main/java/datadog/trace/api/Config.java index ef0a02114da..b70b5643247 100644 --- a/internal-api/src/main/java/datadog/trace/api/Config.java +++ b/internal-api/src/main/java/datadog/trace/api/Config.java @@ -509,9 +509,11 @@ import static datadog.trace.api.config.TraceInstrumentationConfig.DB_CLIENT_HOST_SPLIT_BY_HOST; import static datadog.trace.api.config.TraceInstrumentationConfig.DB_CLIENT_HOST_SPLIT_BY_INSTANCE; import static datadog.trace.api.config.TraceInstrumentationConfig.DB_CLIENT_HOST_SPLIT_BY_INSTANCE_TYPE_SUFFIX; +import static datadog.trace.api.config.TraceInstrumentationConfig.DB_CLIENT_INFO_FETCHING_ENABLED; import static datadog.trace.api.config.TraceInstrumentationConfig.DB_DBM_INJECT_SQL_BASEHASH; import static datadog.trace.api.config.TraceInstrumentationConfig.DB_DBM_PROPAGATION_MODE_MODE; import static datadog.trace.api.config.TraceInstrumentationConfig.DB_DBM_TRACE_PREPARED_STATEMENTS; +import static datadog.trace.api.config.TraceInstrumentationConfig.DB_METADATA_FETCHING_ENABLED; import static datadog.trace.api.config.TraceInstrumentationConfig.ELASTICSEARCH_BODY_AND_PARAMS_ENABLED; import static datadog.trace.api.config.TraceInstrumentationConfig.ELASTICSEARCH_BODY_ENABLED; import static datadog.trace.api.config.TraceInstrumentationConfig.ELASTICSEARCH_PARAMS_ENABLED; @@ -1078,6 +1080,8 @@ public static String getHostName() { private final boolean dbmInjectSqlBaseHash; private final String dbmPropagationMode; private final boolean dbmTracePreparedStatements; + private final boolean dbMetadataFetchingEnabled; + private final boolean dbClientInfoFetchingEnabled; private final boolean dynamicInstrumentationEnabled; private final String dynamicInstrumentationSnapshotUrl; @@ -1626,6 +1630,9 @@ private Config(final ConfigProvider configProvider, final InstrumenterConfig ins DB_CLIENT_HOST_SPLIT_BY_INSTANCE_TYPE_SUFFIX, DEFAULT_DB_CLIENT_HOST_SPLIT_BY_INSTANCE_TYPE_SUFFIX); + dbMetadataFetchingEnabled = configProvider.getBoolean(DB_METADATA_FETCHING_ENABLED, true); + dbClientInfoFetchingEnabled = configProvider.getBoolean(DB_CLIENT_INFO_FETCHING_ENABLED, true); + dbClientSplitByHost = configProvider.getBoolean( DB_CLIENT_HOST_SPLIT_BY_HOST, DEFAULT_DB_CLIENT_HOST_SPLIT_BY_HOST); @@ -3150,6 +3157,14 @@ public boolean isDbClientSplitByHost() { return dbClientSplitByHost; } + public boolean isDbMetadataFetchingEnabled() { + return dbMetadataFetchingEnabled; + } + + public boolean isDbClientInfoFetchingEnabled() { + return dbClientInfoFetchingEnabled; + } + public Set getSplitByTags() { return splitByTags; } @@ -5552,6 +5567,10 @@ public String toString() { + dbClientSplitByInstanceTypeSuffix + ", dbClientSplitByHost=" + dbClientSplitByHost + + ", dbMetadataFetchingEnabled=" + + dbMetadataFetchingEnabled + + ", dbClientInfoFetchingEnabled=" + + dbClientInfoFetchingEnabled + ", dbmInjectSqlBaseHash=" + dbmInjectSqlBaseHash + ", dbmPropagationMode=" 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 5b15b89d169..f7e3fabff2a 100644 --- a/internal-api/src/main/java/datadog/trace/api/InstrumenterConfig.java +++ b/internal-api/src/main/java/datadog/trace/api/InstrumenterConfig.java @@ -44,9 +44,7 @@ import static datadog.trace.api.config.TraceInstrumentationConfig.INSTRUMENTATION_CONFIG_ID; import static datadog.trace.api.config.TraceInstrumentationConfig.INTEGRATIONS_ENABLED; import static datadog.trace.api.config.TraceInstrumentationConfig.JAX_RS_ADDITIONAL_ANNOTATIONS; -import static datadog.trace.api.config.TraceInstrumentationConfig.JDBC_CLIENT_INFO_FETCHING_ENABLED; import static datadog.trace.api.config.TraceInstrumentationConfig.JDBC_CONNECTION_CLASS_NAME; -import static datadog.trace.api.config.TraceInstrumentationConfig.JDBC_METADATA_FETCHING_ENABLED; import static datadog.trace.api.config.TraceInstrumentationConfig.JDBC_POOL_WAITING_ENABLED; import static datadog.trace.api.config.TraceInstrumentationConfig.JDBC_PREPARED_STATEMENT_CLASS_NAME; import static datadog.trace.api.config.TraceInstrumentationConfig.MEASURE_METHODS; @@ -134,8 +132,6 @@ public class InstrumenterConfig { private final String jdbcPreparedStatementClassName; private final String jdbcConnectionClassName; private final boolean jdbcPoolWaitingEnabled; - private final boolean jdbcMetadataFetchingEnabled; - private final boolean jdbcClientInfoFetchingEnabled; private final String httpURLConnectionClassName; private final String axisTransportClassName; @@ -249,9 +245,6 @@ private InstrumenterConfig() { configProvider.getString(JDBC_PREPARED_STATEMENT_CLASS_NAME, ""); jdbcConnectionClassName = configProvider.getString(JDBC_CONNECTION_CLASS_NAME, ""); jdbcPoolWaitingEnabled = configProvider.getBoolean(JDBC_POOL_WAITING_ENABLED, false); - jdbcMetadataFetchingEnabled = configProvider.getBoolean(JDBC_METADATA_FETCHING_ENABLED, true); - jdbcClientInfoFetchingEnabled = - configProvider.getBoolean(JDBC_CLIENT_INFO_FETCHING_ENABLED, true); httpURLConnectionClassName = configProvider.getString(HTTP_URL_CONNECTION_CLASS_NAME, ""); axisTransportClassName = configProvider.getString(AXIS_TRANSPORT_CLASS_NAME, ""); @@ -432,14 +425,6 @@ public boolean isJdbcPoolWaitingEnabled() { return jdbcPoolWaitingEnabled; } - public boolean isJdbcMetadataFetchingEnabled() { - return jdbcMetadataFetchingEnabled; - } - - public boolean isJdbcClientInfoFetchingEnabled() { - return jdbcClientInfoFetchingEnabled; - } - public String getHttpURLConnectionClassName() { return httpURLConnectionClassName; } @@ -651,10 +636,6 @@ public String toString() { + '\'' + ", jdbcPoolWaitingEnabled=" + jdbcPoolWaitingEnabled - + ", jdbcMetadataFetchingEnabled=" - + jdbcMetadataFetchingEnabled - + ", jdbcClientInfoFetchingEnabled=" - + jdbcClientInfoFetchingEnabled + ", httpURLConnectionClassName='" + httpURLConnectionClassName + '\'' diff --git a/internal-api/src/test/groovy/datadog/trace/api/ConfigTest.groovy b/internal-api/src/test/groovy/datadog/trace/api/ConfigTest.groovy index 2d5b1518f99..5b98f26bf54 100644 --- a/internal-api/src/test/groovy/datadog/trace/api/ConfigTest.groovy +++ b/internal-api/src/test/groovy/datadog/trace/api/ConfigTest.groovy @@ -2793,4 +2793,60 @@ class ConfigTest extends DDSpecification { then: config.tracePropagationBehaviorExtract == TracePropagationBehaviorExtract.CONTINUE } + + def "db metadata fetching enabled with sys = #sys env = #env"() { + setup: + if (sys != null) { + System.setProperty("dd.trace.db.metadata.fetching.enabled", sys) + } + if (env != null) { + environmentVariables.set("DD_TRACE_DB_METADATA_FETCHING_ENABLED", env) + } + + when: + def config = new Config() + + then: + config.isDbMetadataFetchingEnabled() == expected + + where: + // spotless:off + sys | env | expected + null | null | true // default is true + null | "true" | true + null | "false" | false + "true" | null | true + "false" | null | false + "true" | "false" | true // sys prop takes precedence + "false" | "true" | false // sys prop takes precedence + // spotless:on + } + + def "db client info fetching enabled with sys = #sys env = #env"() { + setup: + if (sys != null) { + System.setProperty("dd.trace.db.client.info.fetching.enabled", sys) + } + if (env != null) { + environmentVariables.set("DD_TRACE_DB_CLIENT_INFO_FETCHING_ENABLED", env) + } + + when: + def config = new Config() + + then: + config.isDbClientInfoFetchingEnabled() == expected + + where: + // spotless:off + sys | env | expected + null | null | true // default is true + null | "true" | true + null | "false" | false + "true" | null | true + "false" | null | false + "true" | "false" | true // sys prop takes precedence + "false" | "true" | false // sys prop takes precedence + // spotless:on + } } From 1b7f677d1698dc42550f9db812336dbc22508b0f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rapha=C3=ABl=20Vandon?= Date: Thu, 16 Oct 2025 17:02:49 +0200 Subject: [PATCH 3/7] read config only once --- .../datadog/trace/instrumentation/jdbc/JDBCDecorator.java | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/dd-java-agent/instrumentation/jdbc/src/main/java/datadog/trace/instrumentation/jdbc/JDBCDecorator.java b/dd-java-agent/instrumentation/jdbc/src/main/java/datadog/trace/instrumentation/jdbc/JDBCDecorator.java index 288e5752e77..82a8ee99664 100644 --- a/dd-java-agent/instrumentation/jdbc/src/main/java/datadog/trace/instrumentation/jdbc/JDBCDecorator.java +++ b/dd-java-agent/instrumentation/jdbc/src/main/java/datadog/trace/instrumentation/jdbc/JDBCDecorator.java @@ -60,6 +60,8 @@ public class JDBCDecorator extends DatabaseClientDecorator { DBM_PROPAGATION_MODE.equals(DBM_PROPAGATION_MODE_FULL); public static final boolean DBM_TRACE_PREPARED_STATEMENTS = Config.get().isDbmTracePreparedStatements(); + private static final boolean FETCH_DB_METADATA = Config.get().isDbMetadataFetchingEnabled(); + private static final boolean FETCH_DB_CLIENT_INFO = Config.get().isDbClientInfoFetchingEnabled(); private volatile boolean warnedAboutDBMPropagationMode = false; // to log a warning only once @@ -201,7 +203,7 @@ public String getDbService(final DBInfo dbInfo) { } public static DBInfo parseDBInfoFromConnection(final Connection connection) { - if (connection == null || !Config.get().isDbMetadataFetchingEnabled()) { + if (connection == null || !FETCH_DB_METADATA) { // we can log here, but it risks to be too verbose return DBInfo.DEFAULT; } @@ -211,7 +213,7 @@ public static DBInfo parseDBInfoFromConnection(final Connection connection) { final String url = metaData.getURL(); if (url != null) { Properties clientInfo = null; - if (Config.get().isDbClientInfoFetchingEnabled()) { + if (FETCH_DB_CLIENT_INFO) { try { clientInfo = connection.getClientInfo(); } catch (final Throwable ex) { From cd6e51223fee68514459cea56fcd6022025c075e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rapha=C3=ABl=20Vandon?= Date: Thu, 16 Oct 2025 17:04:25 +0200 Subject: [PATCH 4/7] remove spotless:off comment --- .../datadog/trace/api/ConfigTest.groovy | 38 +++++++++---------- 1 file changed, 17 insertions(+), 21 deletions(-) diff --git a/internal-api/src/test/groovy/datadog/trace/api/ConfigTest.groovy b/internal-api/src/test/groovy/datadog/trace/api/ConfigTest.groovy index 5b98f26bf54..fb4ce38170b 100644 --- a/internal-api/src/test/groovy/datadog/trace/api/ConfigTest.groovy +++ b/internal-api/src/test/groovy/datadog/trace/api/ConfigTest.groovy @@ -1,12 +1,5 @@ package datadog.trace.api -import datadog.trace.api.env.FixedCapturedEnvironment -import datadog.trace.bootstrap.config.provider.AgentArgsInjector -import datadog.trace.bootstrap.config.provider.ConfigConverter -import datadog.trace.bootstrap.config.provider.ConfigProvider -import datadog.trace.test.util.DDSpecification -import datadog.trace.util.throwable.FatalAgentMisconfigurationError - import static datadog.trace.api.ConfigDefaults.DEFAULT_HTTP_CLIENT_ERROR_STATUSES import static datadog.trace.api.ConfigDefaults.DEFAULT_HTTP_SERVER_ERROR_STATUSES import static datadog.trace.api.ConfigDefaults.DEFAULT_PARTIAL_FLUSH_MIN_SPANS @@ -22,10 +15,10 @@ import static datadog.trace.api.DDTags.SERVICE import static datadog.trace.api.DDTags.SERVICE_TAG import static datadog.trace.api.TracePropagationStyle.B3MULTI import static datadog.trace.api.TracePropagationStyle.B3SINGLE +import static datadog.trace.api.TracePropagationStyle.BAGGAGE import static datadog.trace.api.TracePropagationStyle.DATADOG import static datadog.trace.api.TracePropagationStyle.HAYSTACK import static datadog.trace.api.TracePropagationStyle.TRACECONTEXT -import static datadog.trace.api.TracePropagationStyle.BAGGAGE import static datadog.trace.api.config.CiVisibilityConfig.CIVISIBILITY_AGENTLESS_ENABLED import static datadog.trace.api.config.CiVisibilityConfig.CIVISIBILITY_ENABLED import static datadog.trace.api.config.DebuggerConfig.DYNAMIC_INSTRUMENTATION_CLASSFILE_DUMP_ENABLED @@ -51,16 +44,16 @@ import static datadog.trace.api.config.GeneralConfig.GLOBAL_TAGS import static datadog.trace.api.config.GeneralConfig.HEALTH_METRICS_ENABLED import static datadog.trace.api.config.GeneralConfig.HEALTH_METRICS_STATSD_HOST import static datadog.trace.api.config.GeneralConfig.HEALTH_METRICS_STATSD_PORT +import static datadog.trace.api.config.GeneralConfig.INSTRUMENTATION_SOURCE import static datadog.trace.api.config.GeneralConfig.JDK_SOCKET_ENABLED import static datadog.trace.api.config.GeneralConfig.PERF_METRICS_ENABLED import static datadog.trace.api.config.GeneralConfig.SERVICE_NAME import static datadog.trace.api.config.GeneralConfig.SITE +import static datadog.trace.api.config.GeneralConfig.SSI_INJECTION_ENABLED +import static datadog.trace.api.config.GeneralConfig.SSI_INJECTION_FORCE import static datadog.trace.api.config.GeneralConfig.TAGS import static datadog.trace.api.config.GeneralConfig.TRACER_METRICS_IGNORED_RESOURCES import static datadog.trace.api.config.GeneralConfig.VERSION -import static datadog.trace.api.config.GeneralConfig.SSI_INJECTION_ENABLED -import static datadog.trace.api.config.GeneralConfig.SSI_INJECTION_FORCE -import static datadog.trace.api.config.GeneralConfig.INSTRUMENTATION_SOURCE import static datadog.trace.api.config.JmxFetchConfig.JMX_FETCH_CHECK_PERIOD import static datadog.trace.api.config.JmxFetchConfig.JMX_FETCH_ENABLED import static datadog.trace.api.config.JmxFetchConfig.JMX_FETCH_METRICS_CONFIGS @@ -69,8 +62,8 @@ import static datadog.trace.api.config.JmxFetchConfig.JMX_FETCH_STATSD_HOST import static datadog.trace.api.config.JmxFetchConfig.JMX_FETCH_STATSD_PORT import static datadog.trace.api.config.JmxFetchConfig.JMX_TAGS import static datadog.trace.api.config.LlmObsConfig.LLMOBS_AGENTLESS_ENABLED -import static datadog.trace.api.config.LlmObsConfig.LLMOBS_ML_APP import static datadog.trace.api.config.LlmObsConfig.LLMOBS_ENABLED +import static datadog.trace.api.config.LlmObsConfig.LLMOBS_ML_APP import static datadog.trace.api.config.ProfilingConfig.PROFILING_AGENTLESS import static datadog.trace.api.config.ProfilingConfig.PROFILING_API_KEY_FILE_OLD import static datadog.trace.api.config.ProfilingConfig.PROFILING_API_KEY_FILE_VERY_OLD @@ -111,10 +104,6 @@ import static datadog.trace.api.config.TracerConfig.HTTP_CLIENT_ERROR_STATUSES import static datadog.trace.api.config.TracerConfig.HTTP_SERVER_ERROR_STATUSES import static datadog.trace.api.config.TracerConfig.ID_GENERATION_STRATEGY import static datadog.trace.api.config.TracerConfig.PARTIAL_FLUSH_ENABLED -import static datadog.trace.api.config.TracerConfig.TRACE_EXPERIMENTAL_FEATURES_ENABLED -import static datadog.trace.api.config.TracerConfig.TRACE_LONG_RUNNING_ENABLED -import static datadog.trace.api.config.TracerConfig.TRACE_LONG_RUNNING_FLUSH_INTERVAL -import static datadog.trace.api.config.TracerConfig.TRACE_LONG_RUNNING_INITIAL_FLUSH_INTERVAL import static datadog.trace.api.config.TracerConfig.PARTIAL_FLUSH_MIN_SPANS import static datadog.trace.api.config.TracerConfig.PRIORITIZATION_TYPE import static datadog.trace.api.config.TracerConfig.PRIORITY_SAMPLING @@ -127,8 +116,12 @@ import static datadog.trace.api.config.TracerConfig.SPAN_TAGS import static datadog.trace.api.config.TracerConfig.SPLIT_BY_TAGS import static datadog.trace.api.config.TracerConfig.TRACE_AGENT_PORT import static datadog.trace.api.config.TracerConfig.TRACE_AGENT_URL -import static datadog.trace.api.config.TracerConfig.TRACE_PROPAGATION_EXTRACT_FIRST +import static datadog.trace.api.config.TracerConfig.TRACE_EXPERIMENTAL_FEATURES_ENABLED +import static datadog.trace.api.config.TracerConfig.TRACE_LONG_RUNNING_ENABLED +import static datadog.trace.api.config.TracerConfig.TRACE_LONG_RUNNING_FLUSH_INTERVAL +import static datadog.trace.api.config.TracerConfig.TRACE_LONG_RUNNING_INITIAL_FLUSH_INTERVAL import static datadog.trace.api.config.TracerConfig.TRACE_PROPAGATION_BEHAVIOR_EXTRACT +import static datadog.trace.api.config.TracerConfig.TRACE_PROPAGATION_EXTRACT_FIRST import static datadog.trace.api.config.TracerConfig.TRACE_RATE_LIMIT import static datadog.trace.api.config.TracerConfig.TRACE_REPORT_HOSTNAME import static datadog.trace.api.config.TracerConfig.TRACE_RESOLVER_ENABLED @@ -138,6 +131,13 @@ import static datadog.trace.api.config.TracerConfig.TRACE_SAMPLING_SERVICE_RULES import static datadog.trace.api.config.TracerConfig.TRACE_X_DATADOG_TAGS_MAX_LENGTH import static datadog.trace.api.config.TracerConfig.WRITER_TYPE +import datadog.trace.api.env.FixedCapturedEnvironment +import datadog.trace.bootstrap.config.provider.AgentArgsInjector +import datadog.trace.bootstrap.config.provider.ConfigConverter +import datadog.trace.bootstrap.config.provider.ConfigProvider +import datadog.trace.test.util.DDSpecification +import datadog.trace.util.throwable.FatalAgentMisconfigurationError + class ConfigTest extends DDSpecification { private static final String PREFIX = "dd." private static final DD_API_KEY_ENV = "DD_API_KEY" @@ -2810,7 +2810,6 @@ class ConfigTest extends DDSpecification { config.isDbMetadataFetchingEnabled() == expected where: - // spotless:off sys | env | expected null | null | true // default is true null | "true" | true @@ -2819,7 +2818,6 @@ class ConfigTest extends DDSpecification { "false" | null | false "true" | "false" | true // sys prop takes precedence "false" | "true" | false // sys prop takes precedence - // spotless:on } def "db client info fetching enabled with sys = #sys env = #env"() { @@ -2838,7 +2836,6 @@ class ConfigTest extends DDSpecification { config.isDbClientInfoFetchingEnabled() == expected where: - // spotless:off sys | env | expected null | null | true // default is true null | "true" | true @@ -2847,6 +2844,5 @@ class ConfigTest extends DDSpecification { "false" | null | false "true" | "false" | true // sys prop takes precedence "false" | "true" | false // sys prop takes precedence - // spotless:on } } From ea2c98273b7f1196d5f76dd1c4607b3ec86b5c80 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rapha=C3=ABl=20Vandon?= Date: Mon, 20 Oct 2025 17:50:07 +0200 Subject: [PATCH 5/7] add test --- .../JDBCDecoratorParseDBInfoTestBase.groovy | 170 ++++++++++++++++++ 1 file changed, 170 insertions(+) create mode 100644 dd-java-agent/instrumentation/jdbc/src/test/groovy/JDBCDecoratorParseDBInfoTestBase.groovy diff --git a/dd-java-agent/instrumentation/jdbc/src/test/groovy/JDBCDecoratorParseDBInfoTestBase.groovy b/dd-java-agent/instrumentation/jdbc/src/test/groovy/JDBCDecoratorParseDBInfoTestBase.groovy new file mode 100644 index 00000000000..cc428c1bc2c --- /dev/null +++ b/dd-java-agent/instrumentation/jdbc/src/test/groovy/JDBCDecoratorParseDBInfoTestBase.groovy @@ -0,0 +1,170 @@ +import static datadog.trace.api.config.TraceInstrumentationConfig.DB_CLIENT_INFO_FETCHING_ENABLED +import static datadog.trace.api.config.TraceInstrumentationConfig.DB_METADATA_FETCHING_ENABLED + +import datadog.trace.agent.test.InstrumentationSpecification +import datadog.trace.bootstrap.instrumentation.jdbc.DBInfo +import datadog.trace.instrumentation.jdbc.JDBCDecorator +import java.sql.Connection +import test.TestDatabaseMetaData + +/** + * Base test class for parseDBInfoFromConnection with different flag configurations + */ +abstract class JDBCDecoratorParseDBInfoTestBase extends InstrumentationSpecification { + + def "test parseDBInfoFromConnection with null connection"() { + when: + def result = JDBCDecorator.parseDBInfoFromConnection(null) + + then: + result == DBInfo.DEFAULT + } + + def "test parseDBInfoFromConnection with null ClientInfo"() { + setup: + def metadata = new TestDatabaseMetaData() + metadata.setURL("jdbc:postgresql://testhost:5432/testdb") + def connection = Mock(Connection) { + getMetaData() >> metadata + getClientInfo() >> null + } + + when: + def result = JDBCDecorator.parseDBInfoFromConnection(connection) + + then: + if (shouldFetchMetadata()) { + result.type == "postgresql" + result.host == "testhost" + result.port == 5432 + result.db == "testdb" + } else { + result == DBInfo.DEFAULT + } + } + + def "test parseDBInfoFromConnection regular case"() { + setup: + def metadata = new TestDatabaseMetaData() + metadata.setURL("jdbc:postgresql://testhost:5432/testdb") + def clientInfo = new Properties() + clientInfo.setProperty("warehouse", "my-test-warehouse") // we'll check that property to know if clientInfo were used + def connection = Mock(Connection) { + getMetaData() >> (shouldFetchMetadata() ? metadata : { assert false }) + getClientInfo() >> (shouldFetchClientInfo() ? clientInfo : { assert false }) + } + + when: + def result = JDBCDecorator.parseDBInfoFromConnection(connection) + + then: + if (shouldFetchMetadata()) { + result.type == "postgresql" + result.host == "testhost" + result.port == 5432 + result.db == "testdb" + if (shouldFetchClientInfo()) { // only if we _also_ fetch metadata + result.warehouse == "my-test-warehouse" + } + else { + result.warehouse == null + } + } else { + result == DBInfo.DEFAULT + } + } + + abstract boolean shouldFetchMetadata() + + abstract boolean shouldFetchClientInfo() +} + +/** + * Test with both flags enabled (default behavior) + */ +class JDBCDecoratorParseDBInfoWithMetadataAndClientInfoForkedTest extends JDBCDecoratorParseDBInfoTestBase { + + @Override + void configurePreAgent() { + super.configurePreAgent() + injectSysConfig(DB_METADATA_FETCHING_ENABLED, "true") + injectSysConfig(DB_CLIENT_INFO_FETCHING_ENABLED, "true") + } + + @Override + boolean shouldFetchMetadata() { + return true + } + + @Override + boolean shouldFetchClientInfo() { + return true + } +} + +/** + * Test with both flags disabled + */ +class JDBCDecoratorParseDBInfoWithoutCallsForkedTest extends JDBCDecoratorParseDBInfoTestBase { + + @Override + void configurePreAgent() { + super.configurePreAgent() + injectSysConfig(DB_METADATA_FETCHING_ENABLED, "false") + injectSysConfig(DB_CLIENT_INFO_FETCHING_ENABLED, "false") + } + + @Override + boolean shouldFetchMetadata() { + return false + } + + @Override + boolean shouldFetchClientInfo() { + return false + } +} + +/** + * Test with metadata enabled but client info disabled + */ +class JDBCDecoratorParseDBInfoWithMetadataOnlyForkedTest extends JDBCDecoratorParseDBInfoTestBase { + + @Override + void configurePreAgent() { + super.configurePreAgent() + injectSysConfig(DB_METADATA_FETCHING_ENABLED, "true") + injectSysConfig(DB_CLIENT_INFO_FETCHING_ENABLED, "false") + } + + @Override + boolean shouldFetchMetadata() { + return true + } + + @Override + boolean shouldFetchClientInfo() { + return false + } +} + +class JDBCDecoratorParseDBInfoWithClientInfoOnlyForkedTest extends JDBCDecoratorParseDBInfoTestBase { + + @Override + void configurePreAgent() { + super.configurePreAgent() + injectSysConfig(DB_METADATA_FETCHING_ENABLED, "false") + injectSysConfig(DB_CLIENT_INFO_FETCHING_ENABLED, "true") + } + + @Override + boolean shouldFetchMetadata() { + return false + } + + @Override + boolean shouldFetchClientInfo() { + return true + } +} + From 4a1d0cb37b62376e1ce27982ebc95bc33a651239 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rapha=C3=ABl=20Vandon?= Date: Mon, 20 Oct 2025 17:57:41 +0200 Subject: [PATCH 6/7] add debug logs in error cases --- .../java/datadog/trace/instrumentation/jdbc/JDBCDecorator.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/dd-java-agent/instrumentation/jdbc/src/main/java/datadog/trace/instrumentation/jdbc/JDBCDecorator.java b/dd-java-agent/instrumentation/jdbc/src/main/java/datadog/trace/instrumentation/jdbc/JDBCDecorator.java index 82a8ee99664..b2a50d8ad88 100644 --- a/dd-java-agent/instrumentation/jdbc/src/main/java/datadog/trace/instrumentation/jdbc/JDBCDecorator.java +++ b/dd-java-agent/instrumentation/jdbc/src/main/java/datadog/trace/instrumentation/jdbc/JDBCDecorator.java @@ -218,6 +218,7 @@ public static DBInfo parseDBInfoFromConnection(final Connection connection) { clientInfo = connection.getClientInfo(); } catch (final Throwable ex) { // getClientInfo is likely not allowed, we can still extract info from the url alone + log.debug("Could not get client info from DB", ex); } } dbInfo = JDBCConnectionUrlParser.extractDBInfo(url, clientInfo); @@ -225,6 +226,7 @@ public static DBInfo parseDBInfoFromConnection(final Connection connection) { dbInfo = DBInfo.DEFAULT; } } catch (final SQLException se) { + log.debug("Could not get metadata from DB", se); dbInfo = DBInfo.DEFAULT; } return dbInfo; From a4ec186c196e9b714d5a45cb1c83fdf6a239efed Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rapha=C3=ABl=20Vandon?= Date: Tue, 4 Nov 2025 11:22:42 +0100 Subject: [PATCH 7/7] add flag to disable metadata fetching in driver --- .../jdbc/DriverInstrumentation.java | 7 +- .../instrumentation/jdbc/JDBCDecorator.java | 20 ++--- .../JDBCDecoratorParseDBInfoTestBase.groovy | 76 ++----------------- .../config/TraceInstrumentationConfig.java | 6 +- .../main/java/datadog/trace/api/Config.java | 26 +++---- .../datadog/trace/api/ConfigTest.groovy | 12 +-- 6 files changed, 42 insertions(+), 105 deletions(-) diff --git a/dd-java-agent/instrumentation/jdbc/src/main/java/datadog/trace/instrumentation/jdbc/DriverInstrumentation.java b/dd-java-agent/instrumentation/jdbc/src/main/java/datadog/trace/instrumentation/jdbc/DriverInstrumentation.java index 17ac8d7629a..c5c266ed312 100644 --- a/dd-java-agent/instrumentation/jdbc/src/main/java/datadog/trace/instrumentation/jdbc/DriverInstrumentation.java +++ b/dd-java-agent/instrumentation/jdbc/src/main/java/datadog/trace/instrumentation/jdbc/DriverInstrumentation.java @@ -64,6 +64,7 @@ public void methodAdvice(MethodTransformer transformer) { } public static class DriverAdvice { + @Advice.OnMethodExit(suppress = Throwable.class) public static void addDBInfo( @Advice.Argument(0) final String url, @@ -75,8 +76,10 @@ public static void addDBInfo( } String connectionUrl = url; Properties connectionProps = props; - if (null == props - || !Boolean.parseBoolean(props.getProperty("oracle.jdbc.useShardingDriverConnection"))) { + if (JDBCDecorator.FETCH_DB_METADATA_ON_CONNECT + && (null == props + || !Boolean.parseBoolean( + props.getProperty("oracle.jdbc.useShardingDriverConnection")))) { try { DatabaseMetaData metaData = connection.getMetaData(); connectionUrl = metaData.getURL(); diff --git a/dd-java-agent/instrumentation/jdbc/src/main/java/datadog/trace/instrumentation/jdbc/JDBCDecorator.java b/dd-java-agent/instrumentation/jdbc/src/main/java/datadog/trace/instrumentation/jdbc/JDBCDecorator.java index 54ee169bc2b..2e5e414f787 100644 --- a/dd-java-agent/instrumentation/jdbc/src/main/java/datadog/trace/instrumentation/jdbc/JDBCDecorator.java +++ b/dd-java-agent/instrumentation/jdbc/src/main/java/datadog/trace/instrumentation/jdbc/JDBCDecorator.java @@ -60,8 +60,10 @@ public class JDBCDecorator extends DatabaseClientDecorator { DBM_PROPAGATION_MODE.equals(DBM_PROPAGATION_MODE_FULL); public static final boolean DBM_TRACE_PREPARED_STATEMENTS = Config.get().isDbmTracePreparedStatements(); - private static final boolean FETCH_DB_METADATA = Config.get().isDbMetadataFetchingEnabled(); - private static final boolean FETCH_DB_CLIENT_INFO = Config.get().isDbClientInfoFetchingEnabled(); + private static final boolean FETCH_DB_METADATA_ON_QUERY = + Config.get().isDbMetadataFetchingOnQueryEnabled(); + public static final boolean FETCH_DB_METADATA_ON_CONNECT = + Config.get().isDbMetadataFetchingOnConnectEnabled(); private volatile boolean warnedAboutDBMPropagationMode = false; // to log a warning only once @@ -203,7 +205,7 @@ public String getDbService(final DBInfo dbInfo) { } public static DBInfo parseDBInfoFromConnection(final Connection connection) { - if (connection == null || !FETCH_DB_METADATA) { + if (connection == null || !FETCH_DB_METADATA_ON_QUERY) { // we can log here, but it risks to be too verbose return DBInfo.DEFAULT; } @@ -213,13 +215,11 @@ public static DBInfo parseDBInfoFromConnection(final Connection connection) { final String url; if (metaData != null && (url = metaData.getURL()) != null) { Properties clientInfo = null; - if (FETCH_DB_CLIENT_INFO) { - try { - clientInfo = connection.getClientInfo(); - } catch (final Throwable ex) { - // getClientInfo is likely not allowed, we can still extract info from the url alone - log.debug("Could not get client info from DB", ex); - } + try { + clientInfo = connection.getClientInfo(); + } catch (final Throwable ex) { + // getClientInfo is likely not allowed, we can still extract info from the url alone + log.debug("Could not get client info from DB", ex); } dbInfo = JDBCConnectionUrlParser.extractDBInfo(url, clientInfo); } else { diff --git a/dd-java-agent/instrumentation/jdbc/src/test/groovy/JDBCDecoratorParseDBInfoTestBase.groovy b/dd-java-agent/instrumentation/jdbc/src/test/groovy/JDBCDecoratorParseDBInfoTestBase.groovy index cc428c1bc2c..6efb257d605 100644 --- a/dd-java-agent/instrumentation/jdbc/src/test/groovy/JDBCDecoratorParseDBInfoTestBase.groovy +++ b/dd-java-agent/instrumentation/jdbc/src/test/groovy/JDBCDecoratorParseDBInfoTestBase.groovy @@ -1,5 +1,4 @@ -import static datadog.trace.api.config.TraceInstrumentationConfig.DB_CLIENT_INFO_FETCHING_ENABLED -import static datadog.trace.api.config.TraceInstrumentationConfig.DB_METADATA_FETCHING_ENABLED +import static datadog.trace.api.config.TraceInstrumentationConfig.DB_METADATA_FETCHING_ON_QUERY import datadog.trace.agent.test.InstrumentationSpecification import datadog.trace.bootstrap.instrumentation.jdbc.DBInfo @@ -51,7 +50,6 @@ abstract class JDBCDecoratorParseDBInfoTestBase extends InstrumentationSpecifica clientInfo.setProperty("warehouse", "my-test-warehouse") // we'll check that property to know if clientInfo were used def connection = Mock(Connection) { getMetaData() >> (shouldFetchMetadata() ? metadata : { assert false }) - getClientInfo() >> (shouldFetchClientInfo() ? clientInfo : { assert false }) } when: @@ -63,108 +61,44 @@ abstract class JDBCDecoratorParseDBInfoTestBase extends InstrumentationSpecifica result.host == "testhost" result.port == 5432 result.db == "testdb" - if (shouldFetchClientInfo()) { // only if we _also_ fetch metadata - result.warehouse == "my-test-warehouse" - } - else { - result.warehouse == null - } + result.warehouse == "my-test-warehouse" } else { result == DBInfo.DEFAULT } } abstract boolean shouldFetchMetadata() - - abstract boolean shouldFetchClientInfo() } /** * Test with both flags enabled (default behavior) */ -class JDBCDecoratorParseDBInfoWithMetadataAndClientInfoForkedTest extends JDBCDecoratorParseDBInfoTestBase { +class JDBCDecoratorParseDBInfoWithMetadataForkedTest extends JDBCDecoratorParseDBInfoTestBase { @Override void configurePreAgent() { super.configurePreAgent() - injectSysConfig(DB_METADATA_FETCHING_ENABLED, "true") - injectSysConfig(DB_CLIENT_INFO_FETCHING_ENABLED, "true") + injectSysConfig(DB_METADATA_FETCHING_ON_QUERY, "true") } @Override boolean shouldFetchMetadata() { return true } - - @Override - boolean shouldFetchClientInfo() { - return true - } } -/** - * Test with both flags disabled - */ class JDBCDecoratorParseDBInfoWithoutCallsForkedTest extends JDBCDecoratorParseDBInfoTestBase { @Override void configurePreAgent() { super.configurePreAgent() - injectSysConfig(DB_METADATA_FETCHING_ENABLED, "false") - injectSysConfig(DB_CLIENT_INFO_FETCHING_ENABLED, "false") - } - - @Override - boolean shouldFetchMetadata() { - return false - } - - @Override - boolean shouldFetchClientInfo() { - return false - } -} - -/** - * Test with metadata enabled but client info disabled - */ -class JDBCDecoratorParseDBInfoWithMetadataOnlyForkedTest extends JDBCDecoratorParseDBInfoTestBase { - - @Override - void configurePreAgent() { - super.configurePreAgent() - injectSysConfig(DB_METADATA_FETCHING_ENABLED, "true") - injectSysConfig(DB_CLIENT_INFO_FETCHING_ENABLED, "false") + injectSysConfig(DB_METADATA_FETCHING_ON_QUERY, "false") } @Override boolean shouldFetchMetadata() { - return true - } - - @Override - boolean shouldFetchClientInfo() { return false } } -class JDBCDecoratorParseDBInfoWithClientInfoOnlyForkedTest extends JDBCDecoratorParseDBInfoTestBase { - - @Override - void configurePreAgent() { - super.configurePreAgent() - injectSysConfig(DB_METADATA_FETCHING_ENABLED, "false") - injectSysConfig(DB_CLIENT_INFO_FETCHING_ENABLED, "true") - } - - @Override - boolean shouldFetchMetadata() { - return false - } - - @Override - boolean shouldFetchClientInfo() { - return true - } -} diff --git a/dd-trace-api/src/main/java/datadog/trace/api/config/TraceInstrumentationConfig.java b/dd-trace-api/src/main/java/datadog/trace/api/config/TraceInstrumentationConfig.java index 3436b689851..6022ef6cf39 100644 --- a/dd-trace-api/src/main/java/datadog/trace/api/config/TraceInstrumentationConfig.java +++ b/dd-trace-api/src/main/java/datadog/trace/api/config/TraceInstrumentationConfig.java @@ -63,9 +63,9 @@ public final class TraceInstrumentationConfig { "trace.db.client.split-by-instance.type.suffix"; public static final String DB_CLIENT_HOST_SPLIT_BY_HOST = "trace.db.client.split-by-host"; - public static final String DB_METADATA_FETCHING_ENABLED = "trace.db.metadata.fetching.enabled"; - public static final String DB_CLIENT_INFO_FETCHING_ENABLED = - "trace.db.client.info.fetching.enabled"; + public static final String DB_METADATA_FETCHING_ON_QUERY = "trace.db.metadata.fetching.on.query"; + public static final String DB_METADATA_FETCHING_ON_CONNECT = + "trace.db.metadata.fetching.on.connect"; public static final String JDBC_PREPARED_STATEMENT_CLASS_NAME = "trace.jdbc.prepared.statement.class.name"; diff --git a/internal-api/src/main/java/datadog/trace/api/Config.java b/internal-api/src/main/java/datadog/trace/api/Config.java index e497540b20c..d8034f45b4e 100644 --- a/internal-api/src/main/java/datadog/trace/api/Config.java +++ b/internal-api/src/main/java/datadog/trace/api/Config.java @@ -508,11 +508,11 @@ import static datadog.trace.api.config.TraceInstrumentationConfig.DB_CLIENT_HOST_SPLIT_BY_HOST; import static datadog.trace.api.config.TraceInstrumentationConfig.DB_CLIENT_HOST_SPLIT_BY_INSTANCE; import static datadog.trace.api.config.TraceInstrumentationConfig.DB_CLIENT_HOST_SPLIT_BY_INSTANCE_TYPE_SUFFIX; -import static datadog.trace.api.config.TraceInstrumentationConfig.DB_CLIENT_INFO_FETCHING_ENABLED; import static datadog.trace.api.config.TraceInstrumentationConfig.DB_DBM_INJECT_SQL_BASEHASH; import static datadog.trace.api.config.TraceInstrumentationConfig.DB_DBM_PROPAGATION_MODE_MODE; import static datadog.trace.api.config.TraceInstrumentationConfig.DB_DBM_TRACE_PREPARED_STATEMENTS; -import static datadog.trace.api.config.TraceInstrumentationConfig.DB_METADATA_FETCHING_ENABLED; +import static datadog.trace.api.config.TraceInstrumentationConfig.DB_METADATA_FETCHING_ON_CONNECT; +import static datadog.trace.api.config.TraceInstrumentationConfig.DB_METADATA_FETCHING_ON_QUERY; import static datadog.trace.api.config.TraceInstrumentationConfig.ELASTICSEARCH_BODY_AND_PARAMS_ENABLED; import static datadog.trace.api.config.TraceInstrumentationConfig.ELASTICSEARCH_BODY_ENABLED; import static datadog.trace.api.config.TraceInstrumentationConfig.ELASTICSEARCH_PARAMS_ENABLED; @@ -1078,8 +1078,8 @@ public static String getHostName() { private final boolean dbmInjectSqlBaseHash; private final String dbmPropagationMode; private final boolean dbmTracePreparedStatements; - private final boolean dbMetadataFetchingEnabled; - private final boolean dbClientInfoFetchingEnabled; + private final boolean dbMetadataFetchingOnQuery; + private final boolean dbMetadataFetchingOnConnect; private final boolean dynamicInstrumentationEnabled; private final String dynamicInstrumentationSnapshotUrl; @@ -1630,8 +1630,8 @@ private Config(final ConfigProvider configProvider, final InstrumenterConfig ins DB_CLIENT_HOST_SPLIT_BY_INSTANCE_TYPE_SUFFIX, DEFAULT_DB_CLIENT_HOST_SPLIT_BY_INSTANCE_TYPE_SUFFIX); - dbMetadataFetchingEnabled = configProvider.getBoolean(DB_METADATA_FETCHING_ENABLED, true); - dbClientInfoFetchingEnabled = configProvider.getBoolean(DB_CLIENT_INFO_FETCHING_ENABLED, true); + dbMetadataFetchingOnQuery = configProvider.getBoolean(DB_METADATA_FETCHING_ON_QUERY, true); + dbMetadataFetchingOnConnect = configProvider.getBoolean(DB_METADATA_FETCHING_ON_CONNECT, true); dbClientSplitByHost = configProvider.getBoolean( @@ -3153,12 +3153,12 @@ public boolean isDbClientSplitByHost() { return dbClientSplitByHost; } - public boolean isDbMetadataFetchingEnabled() { - return dbMetadataFetchingEnabled; + public boolean isDbMetadataFetchingOnQueryEnabled() { + return dbMetadataFetchingOnQuery; } - public boolean isDbClientInfoFetchingEnabled() { - return dbClientInfoFetchingEnabled; + public boolean isDbMetadataFetchingOnConnectEnabled() { + return dbMetadataFetchingOnConnect; } public Set getSplitByTags() { @@ -5567,9 +5567,9 @@ public String toString() { + ", dbClientSplitByHost=" + dbClientSplitByHost + ", dbMetadataFetchingEnabled=" - + dbMetadataFetchingEnabled - + ", dbClientInfoFetchingEnabled=" - + dbClientInfoFetchingEnabled + + dbMetadataFetchingOnQuery + + ", dbMetadataFetchingOnConnect=" + + dbMetadataFetchingOnConnect + ", dbmInjectSqlBaseHash=" + dbmInjectSqlBaseHash + ", dbmPropagationMode=" diff --git a/internal-api/src/test/groovy/datadog/trace/api/ConfigTest.groovy b/internal-api/src/test/groovy/datadog/trace/api/ConfigTest.groovy index 52ba989fad3..b99474da231 100644 --- a/internal-api/src/test/groovy/datadog/trace/api/ConfigTest.groovy +++ b/internal-api/src/test/groovy/datadog/trace/api/ConfigTest.groovy @@ -2817,17 +2817,17 @@ class ConfigTest extends DDSpecification { def "db metadata fetching enabled with sys = #sys env = #env"() { setup: if (sys != null) { - System.setProperty("dd.trace.db.metadata.fetching.enabled", sys) + System.setProperty("dd.trace.db.metadata.fetching.on.query", sys) } if (env != null) { - environmentVariables.set("DD_TRACE_DB_METADATA_FETCHING_ENABLED", env) + environmentVariables.set("DD_TRACE_DB_METADATA_FETCHING_ON_QUERY", env) } when: def config = new Config() then: - config.isDbMetadataFetchingEnabled() == expected + config.isDbMetadataFetchingOnQueryEnabled() == expected where: sys | env | expected @@ -2843,17 +2843,17 @@ class ConfigTest extends DDSpecification { def "db client info fetching enabled with sys = #sys env = #env"() { setup: if (sys != null) { - System.setProperty("dd.trace.db.client.info.fetching.enabled", sys) + System.setProperty("dd.trace.db.metadata.fetching.on.connect", sys) } if (env != null) { - environmentVariables.set("DD_TRACE_DB_CLIENT_INFO_FETCHING_ENABLED", env) + environmentVariables.set("DD_TRACE_DB_METADATA_FETCHING_ON_CONNECT", env) } when: def config = new Config() then: - config.isDbClientInfoFetchingEnabled() == expected + config.isDbMetadataFetchingOnConnectEnabled() == expected where: sys | env | expected