From fe6ca2f419285e18fd334d67e0b9405ffe9e18cc Mon Sep 17 00:00:00 2001 From: Nenad Noveljic <18366081+nenadnoveljic@users.noreply.github.com> Date: Fri, 13 Dec 2024 16:49:56 +0100 Subject: [PATCH 01/13] Full APM/DBM mode for Oracle --- .../instrumentation/jdbc/DBInfo.java | 3 -- ...tractPreparedStatementInstrumentation.java | 3 ++ .../instrumentation/jdbc/JDBCDecorator.java | 36 +++++++++++++++++++ .../jdbc/StatementInstrumentation.java | 17 ++++++--- 4 files changed, 51 insertions(+), 8 deletions(-) diff --git a/dd-java-agent/agent-bootstrap/src/main/java/datadog/trace/bootstrap/instrumentation/jdbc/DBInfo.java b/dd-java-agent/agent-bootstrap/src/main/java/datadog/trace/bootstrap/instrumentation/jdbc/DBInfo.java index 7325e16fc56..9fb0fe5855c 100644 --- a/dd-java-agent/agent-bootstrap/src/main/java/datadog/trace/bootstrap/instrumentation/jdbc/DBInfo.java +++ b/dd-java-agent/agent-bootstrap/src/main/java/datadog/trace/bootstrap/instrumentation/jdbc/DBInfo.java @@ -91,9 +91,6 @@ public static class Builder { public Builder type(String type) { this.type = type; - // Those DBs use the full text of the query including the comments as a cache key, - // so we disable full propagation support for them to avoid destroying the cache. - if (type.equals("oracle")) this.fullPropagationSupport = false; return this; } diff --git a/dd-java-agent/instrumentation/jdbc/src/main/java/datadog/trace/instrumentation/jdbc/AbstractPreparedStatementInstrumentation.java b/dd-java-agent/instrumentation/jdbc/src/main/java/datadog/trace/instrumentation/jdbc/AbstractPreparedStatementInstrumentation.java index 681b0800590..29e8e2d6ff2 100644 --- a/dd-java-agent/instrumentation/jdbc/src/main/java/datadog/trace/instrumentation/jdbc/AbstractPreparedStatementInstrumentation.java +++ b/dd-java-agent/instrumentation/jdbc/src/main/java/datadog/trace/instrumentation/jdbc/AbstractPreparedStatementInstrumentation.java @@ -91,6 +91,9 @@ public static AgentScope onEnter(@Advice.This final Statement statement) { } else if (DECORATE.isPostgres(dbInfo) && DBM_TRACE_PREPARED_STATEMENTS) { span = startSpan(DATABASE_QUERY); DECORATE.setApplicationName(span, connection); + } else if (DECORATE.isOracle(dbInfo)) { + span = startSpan(DATABASE_QUERY); + DECORATE.setAction(span, connection); } else { span = startSpan(DATABASE_QUERY); } 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 ea2b18e48f3..11e0ab9ef43 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 @@ -252,6 +252,10 @@ public String traceParent(AgentSpan span, int samplingPriority) { return sb.toString(); } + public boolean isOracle(final DBInfo dbInfo) { + return "oracle".equals(dbInfo.getType()); + } + public boolean isPostgres(final DBInfo dbInfo) { return dbInfo.getType().startsWith("postgres"); } @@ -260,6 +264,38 @@ public boolean isSqlServer(final DBInfo dbInfo) { return "sqlserver".equals(dbInfo.getType()); } + /** + * Executes `connection.setClientInfo("OCSID.ACTION", traceContext)` statement on the Oracle DB to + * set the trace parent in `v$session.action`. This is used because it isn't possible to propagate + * trace parent with the comment. + * + * @param span The span of the instrumented statement + * @param connection The same connection as the one that will be used for the actual statement + */ + public void setAction(AgentSpan span, Connection connection) { + try { + + Integer priority = span.forceSamplingDecision(); + if (priority == null) { + return; + } + final String traceContext = "_DD_" + DECORATE.traceParent(span, priority); + + connection.setClientInfo("OCSID.ACTION", traceContext); + + } catch (Throwable e) { + log.debug( + "Failed to set extra DBM data in application_name for trace {}. " + + "To disable this behavior, set trace_prepared_statements to 'false'. " + + "See https://docs.datadoghq.com/database_monitoring/connect_dbm_and_apm/ for more info.{}", + span.getTraceId().toHexString(), + e); + DECORATE.onError(span, e); + } finally { + span.setTag("_dd.dbm_trace_injected", true); + } + } + /** * Executes a `SET CONTEXT_INFO` statement on the DB with the active trace ID and the given span * ID. This context will be "attached" to future queries on the same connection. See Date: Fri, 13 Dec 2024 18:33:41 +0100 Subject: [PATCH 02/13] enabled injection in tests --- .../jdbc/src/test/groovy/JDBCDecoratorTest.groovy | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dd-java-agent/instrumentation/jdbc/src/test/groovy/JDBCDecoratorTest.groovy b/dd-java-agent/instrumentation/jdbc/src/test/groovy/JDBCDecoratorTest.groovy index 69de0441f8a..1cc7c76ea1c 100644 --- a/dd-java-agent/instrumentation/jdbc/src/test/groovy/JDBCDecoratorTest.groovy +++ b/dd-java-agent/instrumentation/jdbc/src/test/groovy/JDBCDecoratorTest.groovy @@ -20,7 +20,7 @@ abstract class JDBCDecoratorTest extends AgentTestRunner { where: dbType | expectedByType - "oracle" | false + "oracle" | true "sqlserver" | true "mysql" | true "postgresql" | true From ef324134464b28702d1a595d27db0561ac0c10ca Mon Sep 17 00:00:00 2001 From: Nenad Noveljic <18366081+nenadnoveljic@users.noreply.github.com> Date: Fri, 13 Dec 2024 18:47:15 +0100 Subject: [PATCH 03/13] tests --- .../RemoteJDBCInstrumentationTest.groovy | 31 ++++++++++++------- 1 file changed, 19 insertions(+), 12 deletions(-) diff --git a/dd-java-agent/instrumentation/jdbc/src/test/groovy/RemoteJDBCInstrumentationTest.groovy b/dd-java-agent/instrumentation/jdbc/src/test/groovy/RemoteJDBCInstrumentationTest.groovy index 3f6c4ac2ecc..ccb1442482b 100644 --- a/dd-java-agent/instrumentation/jdbc/src/test/groovy/RemoteJDBCInstrumentationTest.groovy +++ b/dd-java-agent/instrumentation/jdbc/src/test/groovy/RemoteJDBCInstrumentationTest.groovy @@ -36,6 +36,7 @@ abstract class RemoteJDBCInstrumentationTest extends VersionedNamingTestBase { static final String POSTGRESQL = "postgresql" static final String MYSQL = "mysql" static final String SQLSERVER = "sqlserver" + static final String ORACLE = "oracle" @Shared private Map dbName = [ @@ -46,30 +47,34 @@ abstract class RemoteJDBCInstrumentationTest extends VersionedNamingTestBase { @Shared private Map jdbcUrls = [ - "postgresql" : "jdbc:postgresql://localhost:5432/" + dbName.get("postgresql"), - "mysql" : "jdbc:mysql://localhost:3306/" + dbName.get("mysql"), - "sqlserver" : "jdbc:sqlserver://localhost:1433/" + dbName.get("sqlserver"), + POSTGRESQL : "jdbc:postgresql://localhost:5432/" + dbName.get(POSTGRESQL), + MYSQL : "jdbc:mysql://localhost:3306/" + dbName.get(MYSQL), + SQLSERVER : "jdbc:sqlserver://localhost:1433/" + dbName.get(SQLSERVER), + ORACLE : "jdbc:oracle://localhost:1521/" + dbName.get(ORACLE), ] @Shared private Map jdbcDriverClassNames = [ - "postgresql": "org.postgresql.Driver", - "mysql" : "com.mysql.jdbc.Driver", - "sqlserver" : "com.microsoft.sqlserver.jdbc.SQLServerDriver", + POSTGRESQL: "org.postgresql.Driver", + MYSQL: "com.mysql.jdbc.Driver", + SQLSERVER : "com.microsoft.sqlserver.jdbc.SQLServerDriver", + ORACLE: "oracle.jdbc.OracleDriver", ] @Shared private Map jdbcUserNames = [ - "postgresql": "sa", - "mysql" : "sa", - "sqlserver" : "sa", + POSTGRESQL: "sa", + MYSQL : "sa", + SQLSERVER : "sa", + ORACLE : "system", ] @Shared private Map jdbcPasswords = [ - "mysql" : "sa", - "postgresql": "sa", - "sqlserver" : "Datad0g_", + MYSQL : "sa", + POSTGRESQL: "sa", + SQLSERVER : "Datad0g_", + ORACLE: "manager", ] @Shared @@ -78,6 +83,8 @@ abstract class RemoteJDBCInstrumentationTest extends VersionedNamingTestBase { def mysql @Shared def sqlserver + @Shared + def oracle // JDBC Connection pool name (i.e. HikariCP) -> Map @Shared From b07cca4e876decb3697513c9ed51851127823746 Mon Sep 17 00:00:00 2001 From: Nenad Noveljic <18366081+nenadnoveljic@users.noreply.github.com> Date: Mon, 16 Dec 2024 12:02:32 +0100 Subject: [PATCH 04/13] oracle container --- .../instrumentation/jdbc/build.gradle | 2 + .../RemoteJDBCInstrumentationTest.groovy | 43 +++++++++++-------- 2 files changed, 28 insertions(+), 17 deletions(-) diff --git a/dd-java-agent/instrumentation/jdbc/build.gradle b/dd-java-agent/instrumentation/jdbc/build.gradle index bd45fc90412..1898efd78b4 100644 --- a/dd-java-agent/instrumentation/jdbc/build.gradle +++ b/dd-java-agent/instrumentation/jdbc/build.gradle @@ -37,10 +37,12 @@ dependencies { testImplementation group: 'mysql', name: 'mysql-connector-java', version: '8.0.23' testImplementation group: 'org.postgresql', name: 'postgresql', version: '[9.4,42.2.18]' testImplementation group: 'com.microsoft.sqlserver', name: 'mssql-jdbc', version: '10.2.0.jre8' + testImplementation group: 'com.oracle.database.jdbc', name: 'ojdbc8', version: '19.19.0.0' testImplementation group: 'org.testcontainers', name:'mysql', version: libs.versions.testcontainers.get() testImplementation group: 'org.testcontainers', name:'postgresql', version: libs.versions.testcontainers.get() testImplementation group: 'org.testcontainers', name:'mssqlserver', version: libs.versions.testcontainers.get() + testImplementation group: 'org.testcontainers', name:'oracle-xe', version: '1.20.4' testRuntimeOnly project(':dd-java-agent:instrumentation:iast-instrumenter') diff --git a/dd-java-agent/instrumentation/jdbc/src/test/groovy/RemoteJDBCInstrumentationTest.groovy b/dd-java-agent/instrumentation/jdbc/src/test/groovy/RemoteJDBCInstrumentationTest.groovy index ccb1442482b..e623162d646 100644 --- a/dd-java-agent/instrumentation/jdbc/src/test/groovy/RemoteJDBCInstrumentationTest.groovy +++ b/dd-java-agent/instrumentation/jdbc/src/test/groovy/RemoteJDBCInstrumentationTest.groovy @@ -11,6 +11,7 @@ import datadog.trace.bootstrap.instrumentation.api.InstrumentationTags import datadog.trace.bootstrap.instrumentation.api.Tags import org.testcontainers.containers.MSSQLServerContainer import org.testcontainers.containers.MySQLContainer +import org.testcontainers.containers.OracleContainer import org.testcontainers.containers.PostgreSQLContainer import spock.lang.Requires import spock.lang.Shared @@ -23,6 +24,7 @@ import java.sql.PreparedStatement import java.sql.ResultSet import java.sql.Statement import java.sql.Types +import java.time.Duration import java.util.concurrent.TimeUnit import static datadog.trace.agent.test.utils.TraceUtils.basicSpan @@ -42,39 +44,40 @@ abstract class RemoteJDBCInstrumentationTest extends VersionedNamingTestBase { private Map dbName = [ (POSTGRESQL): "jdbcUnitTest", (MYSQL) : "jdbcUnitTest", - (SQLSERVER) : "master" + (SQLSERVER) : "master", + (ORACLE) : "XE", ] @Shared private Map jdbcUrls = [ - POSTGRESQL : "jdbc:postgresql://localhost:5432/" + dbName.get(POSTGRESQL), - MYSQL : "jdbc:mysql://localhost:3306/" + dbName.get(MYSQL), - SQLSERVER : "jdbc:sqlserver://localhost:1433/" + dbName.get(SQLSERVER), - ORACLE : "jdbc:oracle://localhost:1521/" + dbName.get(ORACLE), + (POSTGRESQL) : "jdbc:postgresql://localhost:5432/" + dbName.get(POSTGRESQL), + (MYSQL) : "jdbc:mysql://localhost:3306/" + dbName.get(MYSQL), + (SQLSERVER) : "jdbc:sqlserver://localhost:1433/" + dbName.get(SQLSERVER), + (ORACLE) : "jdbc:oracle:thin:@//localhost:1521/" + dbName.get(ORACLE), ] @Shared private Map jdbcDriverClassNames = [ - POSTGRESQL: "org.postgresql.Driver", - MYSQL: "com.mysql.jdbc.Driver", - SQLSERVER : "com.microsoft.sqlserver.jdbc.SQLServerDriver", - ORACLE: "oracle.jdbc.OracleDriver", + (POSTGRESQL): "org.postgresql.Driver", + (MYSQL) : "com.mysql.jdbc.Driver", + (SQLSERVER) : "com.microsoft.sqlserver.jdbc.SQLServerDriver", + (ORACLE) : "oracle.jdbc.OracleDriver", ] @Shared private Map jdbcUserNames = [ - POSTGRESQL: "sa", - MYSQL : "sa", - SQLSERVER : "sa", - ORACLE : "system", + (POSTGRESQL): "sa", + (MYSQL) : "sa", + (SQLSERVER) : "sa", + (ORACLE) : "system", ] @Shared private Map jdbcPasswords = [ - MYSQL : "sa", - POSTGRESQL: "sa", - SQLSERVER : "Datad0g_", - ORACLE: "manager", + (MYSQL) : "sa", + (POSTGRESQL): "sa", + (SQLSERVER) : "Datad0g_", + (ORACLE) : "manager", ] @Shared @@ -195,6 +198,12 @@ abstract class RemoteJDBCInstrumentationTest extends VersionedNamingTestBase { sqlserver.start() PortUtils.waitForPortToOpen(sqlserver.getHost(), sqlserver.getMappedPort(MSSQLServerContainer.MS_SQL_SERVER_PORT), 5, TimeUnit.SECONDS) jdbcUrls.put(SQLSERVER, "${sqlserver.getJdbcUrl()};DatabaseName=${dbName.get(SQLSERVER)}") + oracle = new OracleContainer("gvenzl/oracle-xe:21-slim") + .withStartupTimeout(Duration.ofMinutes(5)) + .withDatabaseName("testDB") + .withUsername("testUser") + .withPassword("testPassword") + oracle.start() prepareConnectionPoolDatasources() } From 4d0fab85ac0f6319301dd52b5152c427ade2002b Mon Sep 17 00:00:00 2001 From: Nenad Noveljic <18366081+nenadnoveljic@users.noreply.github.com> Date: Mon, 16 Dec 2024 15:04:44 +0100 Subject: [PATCH 05/13] fixing oracle image --- .../src/test/groovy/RemoteJDBCInstrumentationTest.groovy | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/dd-java-agent/instrumentation/jdbc/src/test/groovy/RemoteJDBCInstrumentationTest.groovy b/dd-java-agent/instrumentation/jdbc/src/test/groovy/RemoteJDBCInstrumentationTest.groovy index e623162d646..dfa73bd5350 100644 --- a/dd-java-agent/instrumentation/jdbc/src/test/groovy/RemoteJDBCInstrumentationTest.groovy +++ b/dd-java-agent/instrumentation/jdbc/src/test/groovy/RemoteJDBCInstrumentationTest.groovy @@ -13,6 +13,7 @@ import org.testcontainers.containers.MSSQLServerContainer import org.testcontainers.containers.MySQLContainer import org.testcontainers.containers.OracleContainer import org.testcontainers.containers.PostgreSQLContainer +import org.testcontainers.utility.DockerImageName import spock.lang.Requires import spock.lang.Shared @@ -198,12 +199,13 @@ abstract class RemoteJDBCInstrumentationTest extends VersionedNamingTestBase { sqlserver.start() PortUtils.waitForPortToOpen(sqlserver.getHost(), sqlserver.getMappedPort(MSSQLServerContainer.MS_SQL_SERVER_PORT), 5, TimeUnit.SECONDS) jdbcUrls.put(SQLSERVER, "${sqlserver.getJdbcUrl()};DatabaseName=${dbName.get(SQLSERVER)}") - oracle = new OracleContainer("gvenzl/oracle-xe:21-slim") + DockerImageName oracleImage = DockerImageName.parse("gvenzl/oracle-free:23.5-slim-faststart").asCompatibleSubstituteFor("gvenzl/oracle-xe") + oracle = new OracleContainer(oracleImage) .withStartupTimeout(Duration.ofMinutes(5)) - .withDatabaseName("testDB") .withUsername("testUser") .withPassword("testPassword") oracle.start() + jdbcUrls.put(ORACLE, "${oracle.getJdbcUrl()}") prepareConnectionPoolDatasources() } From 20c710bfbfb0be1add1c48748a0f81871b9daf08 Mon Sep 17 00:00:00 2001 From: Nenad Noveljic <18366081+nenadnoveljic@users.noreply.github.com> Date: Mon, 16 Dec 2024 16:11:29 +0100 Subject: [PATCH 06/13] fixed containers --- .../test/groovy/RemoteJDBCInstrumentationTest.groovy | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/dd-java-agent/instrumentation/jdbc/src/test/groovy/RemoteJDBCInstrumentationTest.groovy b/dd-java-agent/instrumentation/jdbc/src/test/groovy/RemoteJDBCInstrumentationTest.groovy index dfa73bd5350..8dd78a2e106 100644 --- a/dd-java-agent/instrumentation/jdbc/src/test/groovy/RemoteJDBCInstrumentationTest.groovy +++ b/dd-java-agent/instrumentation/jdbc/src/test/groovy/RemoteJDBCInstrumentationTest.groovy @@ -70,7 +70,7 @@ abstract class RemoteJDBCInstrumentationTest extends VersionedNamingTestBase { (POSTGRESQL): "sa", (MYSQL) : "sa", (SQLSERVER) : "sa", - (ORACLE) : "system", + (ORACLE) : "testuser", ] @Shared @@ -78,7 +78,7 @@ abstract class RemoteJDBCInstrumentationTest extends VersionedNamingTestBase { (MYSQL) : "sa", (POSTGRESQL): "sa", (SQLSERVER) : "Datad0g_", - (ORACLE) : "manager", + (ORACLE) : "testPassword", ] @Shared @@ -199,13 +199,13 @@ abstract class RemoteJDBCInstrumentationTest extends VersionedNamingTestBase { sqlserver.start() PortUtils.waitForPortToOpen(sqlserver.getHost(), sqlserver.getMappedPort(MSSQLServerContainer.MS_SQL_SERVER_PORT), 5, TimeUnit.SECONDS) jdbcUrls.put(SQLSERVER, "${sqlserver.getJdbcUrl()};DatabaseName=${dbName.get(SQLSERVER)}") + + // Earlier Oracle version images (oracle-xe) don't work on arm64 DockerImageName oracleImage = DockerImageName.parse("gvenzl/oracle-free:23.5-slim-faststart").asCompatibleSubstituteFor("gvenzl/oracle-xe") oracle = new OracleContainer(oracleImage) - .withStartupTimeout(Duration.ofMinutes(5)) - .withUsername("testUser") - .withPassword("testPassword") + .withStartupTimeout(Duration.ofMinutes(5)).withUsername(jdbcUserNames.get(ORACLE)).withPassword(jdbcPasswords.get(ORACLE)) oracle.start() - jdbcUrls.put(ORACLE, "${oracle.getJdbcUrl()}") + jdbcUrls.put(ORACLE, "${oracle.getJdbcUrl()}".replace("xepdb1", "freepdb1")) prepareConnectionPoolDatasources() } From 5bd91c48aa0924132f2ae65419ff8464ec289e0e Mon Sep 17 00:00:00 2001 From: Nenad Noveljic <18366081+nenadnoveljic@users.noreply.github.com> Date: Mon, 16 Dec 2024 17:17:28 +0100 Subject: [PATCH 07/13] fixed first tests --- .../src/test/groovy/RemoteJDBCInstrumentationTest.groovy | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/dd-java-agent/instrumentation/jdbc/src/test/groovy/RemoteJDBCInstrumentationTest.groovy b/dd-java-agent/instrumentation/jdbc/src/test/groovy/RemoteJDBCInstrumentationTest.groovy index 8dd78a2e106..08ff3233b29 100644 --- a/dd-java-agent/instrumentation/jdbc/src/test/groovy/RemoteJDBCInstrumentationTest.groovy +++ b/dd-java-agent/instrumentation/jdbc/src/test/groovy/RemoteJDBCInstrumentationTest.groovy @@ -46,7 +46,7 @@ abstract class RemoteJDBCInstrumentationTest extends VersionedNamingTestBase { (POSTGRESQL): "jdbcUnitTest", (MYSQL) : "jdbcUnitTest", (SQLSERVER) : "master", - (ORACLE) : "XE", + (ORACLE) : "freepdb1", ] @Shared @@ -205,7 +205,7 @@ abstract class RemoteJDBCInstrumentationTest extends VersionedNamingTestBase { oracle = new OracleContainer(oracleImage) .withStartupTimeout(Duration.ofMinutes(5)).withUsername(jdbcUserNames.get(ORACLE)).withPassword(jdbcPasswords.get(ORACLE)) oracle.start() - jdbcUrls.put(ORACLE, "${oracle.getJdbcUrl()}".replace("xepdb1", "freepdb1")) + jdbcUrls.put(ORACLE, "${oracle.getJdbcUrl()}".replace("xepdb1", dbName.get(ORACLE))) prepareConnectionPoolDatasources() } @@ -340,15 +340,19 @@ abstract class RemoteJDBCInstrumentationTest extends VersionedNamingTestBase { MYSQL | connectTo(driver, peerConnectionProps(driver)) | false | "SELECT 3" | "SELECT" | "SELECT ?" | false POSTGRESQL | connectTo(driver, peerConnectionProps(driver)) | false | "SELECT 3 FROM pg_user" | "SELECT" | "SELECT ? FROM pg_user" | false SQLSERVER | connectTo(driver, peerConnectionProps(driver)) | false | "SELECT 3" | "SELECT" | "SELECT ?" | false + ORACLE | connectTo(driver, peerConnectionProps(driver)) | false | "SELECT 3 FROM dual" | "SELECT" | "SELECT ? FROM dual" | false MYSQL | cpDatasources.get("tomcat").get(driver).getConnection() | false | "SELECT 3" | "SELECT" | "SELECT ?" | false POSTGRESQL | cpDatasources.get("tomcat").get(driver).getConnection() | false | "SELECT 3 FROM pg_user" | "SELECT" | "SELECT ? FROM pg_user" | false SQLSERVER | cpDatasources.get("tomcat").get(driver).getConnection() | false | "SELECT 3" | "SELECT" | "SELECT ?" | false + ORACLE | cpDatasources.get("tomcat").get(driver).getConnection() | false | "SELECT 3 FROM dual" | "SELECT" | "SELECT ? FROM dual" | false MYSQL | cpDatasources.get("hikari").get(driver).getConnection() | false | "SELECT 3" | "SELECT" | "SELECT ?" | true POSTGRESQL | cpDatasources.get("hikari").get(driver).getConnection() | false | "SELECT 3 FROM pg_user" | "SELECT" | "SELECT ? FROM pg_user" | true SQLSERVER | cpDatasources.get("hikari").get(driver).getConnection() | false | "SELECT 3" | "SELECT" | "SELECT ?" | true + ORACLE | cpDatasources.get("hikari").get(driver).getConnection() | false | "SELECT 3 FROM dual" | "SELECT" | "SELECT ? FROM dual" | true MYSQL | cpDatasources.get("c3p0").get(driver).getConnection() | false | "SELECT 3" | "SELECT" | "SELECT ?" | false POSTGRESQL | cpDatasources.get("c3p0").get(driver).getConnection() | false | "SELECT 3 FROM pg_user" | "SELECT" | "SELECT ? FROM pg_user" | false SQLSERVER | cpDatasources.get("c3p0").get(driver).getConnection() | false | "SELECT 3" | "SELECT" | "SELECT ?" | false + ORACLE | cpDatasources.get("c3p0").get(driver).getConnection() | false | "SELECT 3 FROM dual" | "SELECT" | "SELECT ? FROM dual" | false } def "prepared statement execute on #driver with #connection.getClass().getCanonicalName() generates a span"() { From 860bb75d6ce3ce9a01ae8bc9b09b71eb14537a4a Mon Sep 17 00:00:00 2001 From: Nenad Noveljic <18366081+nenadnoveljic@users.noreply.github.com> Date: Mon, 16 Dec 2024 17:54:07 +0100 Subject: [PATCH 08/13] more oracle tests --- .../test/groovy/RemoteJDBCInstrumentationTest.groovy | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/dd-java-agent/instrumentation/jdbc/src/test/groovy/RemoteJDBCInstrumentationTest.groovy b/dd-java-agent/instrumentation/jdbc/src/test/groovy/RemoteJDBCInstrumentationTest.groovy index 08ff3233b29..cf1f7a2b160 100644 --- a/dd-java-agent/instrumentation/jdbc/src/test/groovy/RemoteJDBCInstrumentationTest.groovy +++ b/dd-java-agent/instrumentation/jdbc/src/test/groovy/RemoteJDBCInstrumentationTest.groovy @@ -474,15 +474,19 @@ abstract class RemoteJDBCInstrumentationTest extends VersionedNamingTestBase { MYSQL | connectTo(driver, peerConnectionProps(driver)) | "SELECT 3" | "SELECT" | "SELECT ?" | false POSTGRESQL | connectTo(driver, peerConnectionProps(driver)) | "SELECT 3 from pg_user" | "SELECT" | "SELECT ? from pg_user" | false SQLSERVER | connectTo(driver, peerConnectionProps(driver)) | "SELECT 3" | "SELECT" | "SELECT ?" | false + ORACLE | connectTo(driver, peerConnectionProps(driver)) | "SELECT 3 FROM dual" | "SELECT" | "SELECT ? FROM dual" | false MYSQL | cpDatasources.get("tomcat").get(driver).getConnection() | "SELECT 3" | "SELECT" | "SELECT ?" | false POSTGRESQL | cpDatasources.get("tomcat").get(driver).getConnection() | "SELECT 3 from pg_user" | "SELECT" | "SELECT ? from pg_user" | false SQLSERVER | cpDatasources.get("tomcat").get(driver).getConnection() | "SELECT 3" | "SELECT" | "SELECT ?" | false + ORACLE | cpDatasources.get("tomcat").get(driver).getConnection() | "SELECT 3 FROM dual" | "SELECT" | "SELECT ? FROM dual" | false MYSQL | cpDatasources.get("hikari").get(driver).getConnection() | "SELECT 3" | "SELECT" | "SELECT ?" | true POSTGRESQL | cpDatasources.get("hikari").get(driver).getConnection() | "SELECT 3 from pg_user" | "SELECT" | "SELECT ? from pg_user" | true SQLSERVER | cpDatasources.get("hikari").get(driver).getConnection() | "SELECT 3" | "SELECT" | "SELECT ?" | true + ORACLE | cpDatasources.get("hikari").get(driver).getConnection() | "SELECT 3 FROM dual" | "SELECT" | "SELECT ? FROM dual" | true MYSQL | cpDatasources.get("c3p0").get(driver).getConnection() | "SELECT 3" | "SELECT" | "SELECT ?" | false POSTGRESQL | cpDatasources.get("c3p0").get(driver).getConnection() | "SELECT 3 from pg_user" | "SELECT" | "SELECT ? from pg_user" | false SQLSERVER | cpDatasources.get("c3p0").get(driver).getConnection() | "SELECT 3" | "SELECT" | "SELECT ?" | false + ORACLE | cpDatasources.get("c3p0").get(driver).getConnection() | "SELECT 3 FROM dual" | "SELECT" | "SELECT ? FROM dual" | false } def "prepared statement query on #driver with #connection.getClass().getCanonicalName() generates a span"() { @@ -605,15 +609,19 @@ abstract class RemoteJDBCInstrumentationTest extends VersionedNamingTestBase { MYSQL | "" | connectTo(driver, peerConnectionProps(driver)) | "SELECT 3" | "SELECT" | "SELECT ?" POSTGRESQL | "" | connectTo(driver, peerConnectionProps(driver)) | "SELECT 3 from pg_user" | "SELECT" | "SELECT ? from pg_user" SQLSERVER | "" | connectTo(driver, peerConnectionProps(driver)) | "SELECT 3" | "SELECT" | "SELECT ?" + ORACLE | "" | connectTo(driver, peerConnectionProps(driver)) | "SELECT 3 FROM dual" | "SELECT" | "SELECT ? FROM dual" MYSQL | "tomcat" | cpDatasources.get(conPoolType).get(driver).getConnection() | "SELECT 3" | "SELECT" | "SELECT ?" POSTGRESQL | "tomcat" | cpDatasources.get(conPoolType).get(driver).getConnection() | "SELECT 3 from pg_user" | "SELECT" | "SELECT ? from pg_user" SQLSERVER | "tomcat" | cpDatasources.get(conPoolType).get(driver).getConnection() | "SELECT 3" | "SELECT" | "SELECT ?" + ORACLE | "tomcat" | cpDatasources.get(conPoolType).get(driver).getConnection() | "SELECT 3 FROM dual" | "SELECT" | "SELECT ? FROM dual" MYSQL | "hikari" | cpDatasources.get(conPoolType).get(driver).getConnection() | "SELECT 3" | "SELECT" | "SELECT ?" POSTGRESQL | "hikari" | cpDatasources.get(conPoolType).get(driver).getConnection() | "SELECT 3 from pg_user" | "SELECT" | "SELECT ? from pg_user" SQLSERVER | "hikari" | cpDatasources.get(conPoolType).get(driver).getConnection() | "SELECT 3" | "SELECT" | "SELECT ?" + ORACLE | "hikari" | cpDatasources.get(conPoolType).get(driver).getConnection() | "SELECT 3 FROM dual" | "SELECT" | "SELECT ? FROM dual" MYSQL | "c3p0" | cpDatasources.get(conPoolType).get(driver).getConnection() | "SELECT 3" | "SELECT" | "SELECT ?" POSTGRESQL | "c3p0" | cpDatasources.get(conPoolType).get(driver).getConnection() | "SELECT 3 from pg_user" | "SELECT" | "SELECT ? from pg_user" SQLSERVER | "c3p0" | cpDatasources.get(conPoolType).get(driver).getConnection() | "SELECT 3" | "SELECT" | "SELECT ?" + ORACLE | "c3p0" | cpDatasources.get(conPoolType).get(driver).getConnection() | "SELECT 3 FROM dual" | "SELECT" | "SELECT ? FROM dual" } def "prepared call on #driver with #connection.getClass().getCanonicalName() generates a span"() { @@ -729,15 +737,19 @@ abstract class RemoteJDBCInstrumentationTest extends VersionedNamingTestBase { MYSQL | "" | connectTo(driver, peerConnectionProps(driver)) | "SELECT 3" | "SELECT" | "SELECT ?" POSTGRESQL | "" | connectTo(driver, peerConnectionProps(driver)) | "SELECT 3 from pg_user" | "SELECT" | "SELECT ? from pg_user" SQLSERVER | "" | connectTo(driver, peerConnectionProps(driver)) | "SELECT 3" | "SELECT" | "SELECT ?" + ORACLE | "" | connectTo(driver, peerConnectionProps(driver)) | "SELECT 3 from DUAL" | "SELECT" | "SELECT ? from DUAL" MYSQL | "tomcat" | cpDatasources.get(conPoolType).get(driver).getConnection() | "SELECT 3" | "SELECT" | "SELECT ?" POSTGRESQL | "tomcat" | cpDatasources.get(conPoolType).get(driver).getConnection() | "SELECT 3 from pg_user" | "SELECT" | "SELECT ? from pg_user" SQLSERVER | "tomcat" | cpDatasources.get(conPoolType).get(driver).getConnection() | "SELECT 3" | "SELECT" | "SELECT ?" + ORACLE | "tomcat" | cpDatasources.get(conPoolType).get(driver).getConnection() | "SELECT 3 from DUAL" | "SELECT" | "SELECT ? from DUAL" MYSQL | "hikari" | cpDatasources.get(conPoolType).get(driver).getConnection() | "SELECT 3" | "SELECT" | "SELECT ?" POSTGRESQL | "hikari" | cpDatasources.get(conPoolType).get(driver).getConnection() | "SELECT 3 from pg_user" | "SELECT" | "SELECT ? from pg_user" SQLSERVER | "hikari" | cpDatasources.get(conPoolType).get(driver).getConnection() | "SELECT 3" | "SELECT" | "SELECT ?" + ORACLE | "hikari" | cpDatasources.get(conPoolType).get(driver).getConnection() | "SELECT 3 from DUAL" | "SELECT" | "SELECT ? from DUAL" MYSQL | "c3p0" | cpDatasources.get(conPoolType).get(driver).getConnection() | "SELECT 3" | "SELECT" | "SELECT ?" POSTGRESQL | "c3p0" | cpDatasources.get(conPoolType).get(driver).getConnection() | "SELECT 3 from pg_user" | "SELECT" | "SELECT ? from pg_user" SQLSERVER | "c3p0" | cpDatasources.get(conPoolType).get(driver).getConnection() | "SELECT 3" | "SELECT" | "SELECT ?" + ORACLE | "c3p0" | cpDatasources.get(conPoolType).get(driver).getConnection() | "SELECT 3 from DUAL" | "SELECT" | "SELECT ? from DUAL" } def "statement update on #driver with #connection.getClass().getCanonicalName() generates a span"() { From f7636a4891904aecc3d08b736df11ea9bece9da1 Mon Sep 17 00:00:00 2001 From: Nenad Noveljic <18366081+nenadnoveljic@users.noreply.github.com> Date: Mon, 16 Dec 2024 18:02:24 +0100 Subject: [PATCH 09/13] finished tests --- .../jdbc/src/test/groovy/RemoteJDBCInstrumentationTest.groovy | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/dd-java-agent/instrumentation/jdbc/src/test/groovy/RemoteJDBCInstrumentationTest.groovy b/dd-java-agent/instrumentation/jdbc/src/test/groovy/RemoteJDBCInstrumentationTest.groovy index cf1f7a2b160..08e1eb4fc8e 100644 --- a/dd-java-agent/instrumentation/jdbc/src/test/groovy/RemoteJDBCInstrumentationTest.groovy +++ b/dd-java-agent/instrumentation/jdbc/src/test/groovy/RemoteJDBCInstrumentationTest.groovy @@ -873,15 +873,19 @@ abstract class RemoteJDBCInstrumentationTest extends VersionedNamingTestBase { MYSQL | "" | connectTo(driver, peerConnectionProps(driver)) | "CREATE TEMPORARY TABLE s_test_ (id INTEGER not NULL, PRIMARY KEY ( id ))" | "CREATE" POSTGRESQL | "" | connectTo(driver, peerConnectionProps(driver)) | "CREATE TEMPORARY TABLE s_test (id INTEGER not NULL, PRIMARY KEY ( id ))" | "CREATE" SQLSERVER | "" | connectTo(driver, peerConnectionProps(driver)) | "CREATE TABLE #s_test_ (id INTEGER not NULL, PRIMARY KEY ( id ))" | "CREATE" + ORACLE | "" | connectTo(driver, peerConnectionProps(driver)) | "CREATE GLOBAL TEMPORARY TABLE s_test (id INTEGER not NULL, PRIMARY KEY ( id ))" | "CREATE" MYSQL | "tomcat" | cpDatasources.get(conPoolType).get(driver).getConnection() | "CREATE TEMPORARY TABLE s_tomcat_test (id INTEGER not NULL, PRIMARY KEY ( id ))" | "CREATE" POSTGRESQL | "tomcat" | cpDatasources.get(conPoolType).get(driver).getConnection() | "CREATE TEMPORARY TABLE s_tomcat_test (id INTEGER not NULL, PRIMARY KEY ( id ))" | "CREATE" SQLSERVER | "tomcat" | cpDatasources.get(conPoolType).get(driver).getConnection() | "CREATE TABLE #s_tomcat_test (id INTEGER not NULL, PRIMARY KEY ( id ))" | "CREATE" + ORACLE | "tomcat" | cpDatasources.get(conPoolType).get(driver).getConnection() | "CREATE GLOBAL TEMPORARY TABLE s_tomcat_test (id INTEGER not NULL, PRIMARY KEY ( id ))" | "CREATE" MYSQL | "hikari" | cpDatasources.get(conPoolType).get(driver).getConnection() | "CREATE TEMPORARY TABLE s_hikari_test (id INTEGER not NULL, PRIMARY KEY ( id ))" | "CREATE" POSTGRESQL | "hikari" | cpDatasources.get(conPoolType).get(driver).getConnection() | "CREATE TEMPORARY TABLE s_hikari_test (id INTEGER not NULL, PRIMARY KEY ( id ))" | "CREATE" SQLSERVER | "hikari" | cpDatasources.get(conPoolType).get(driver).getConnection() | "CREATE TABLE #s_hikari_test (id INTEGER not NULL, PRIMARY KEY ( id ))" | "CREATE" + ORACLE | "hikari" | cpDatasources.get(conPoolType).get(driver).getConnection() | "CREATE GLOBAL TEMPORARY TABLE s_hikari_test (id INTEGER not NULL, PRIMARY KEY ( id ))" | "CREATE" MYSQL | "c3p0" | cpDatasources.get(conPoolType).get(driver).getConnection() | "CREATE TEMPORARY TABLE s_c3p0_test (id INTEGER not NULL, PRIMARY KEY ( id ))" | "CREATE" POSTGRESQL | "c3p0" | cpDatasources.get(conPoolType).get(driver).getConnection() | "CREATE TEMPORARY TABLE s_c3p0_test (id INTEGER not NULL, PRIMARY KEY ( id ))" | "CREATE" SQLSERVER | "c3p0" | cpDatasources.get(conPoolType).get(driver).getConnection() | "CREATE TABLE #s_c3p0_test (id INTEGER not NULL, PRIMARY KEY ( id ))" | "CREATE" + ORACLE | "c3p0" | cpDatasources.get(conPoolType).get(driver).getConnection() | "CREATE GLOBAL TEMPORARY TABLE s_c3p0_test (id INTEGER not NULL, PRIMARY KEY ( id ))" | "CREATE" } From 907ad6b0c1fff22b839dfb70f2b6210c8b7514c0 Mon Sep 17 00:00:00 2001 From: Nenad Noveljic <18366081+nenadnoveljic@users.noreply.github.com> Date: Tue, 17 Dec 2024 11:49:40 +0100 Subject: [PATCH 10/13] fixed tests --- .../RemoteJDBCInstrumentationTest.groovy | 41 ++++++++++++++----- 1 file changed, 30 insertions(+), 11 deletions(-) diff --git a/dd-java-agent/instrumentation/jdbc/src/test/groovy/RemoteJDBCInstrumentationTest.groovy b/dd-java-agent/instrumentation/jdbc/src/test/groovy/RemoteJDBCInstrumentationTest.groovy index 08e1eb4fc8e..581384efd86 100644 --- a/dd-java-agent/instrumentation/jdbc/src/test/groovy/RemoteJDBCInstrumentationTest.groovy +++ b/dd-java-agent/instrumentation/jdbc/src/test/groovy/RemoteJDBCInstrumentationTest.groovy @@ -238,7 +238,7 @@ abstract class RemoteJDBCInstrumentationTest extends VersionedNamingTestBase { def addDbmTag = dbmTraceInjected() resultSet.next() resultSet.getInt(1) == 3 - if (driver == POSTGRESQL || driver == MYSQL || !addDbmTag) { + if (driver == POSTGRESQL || driver == MYSQL || driver == ORACLE || !addDbmTag) { assertTraces(1) { trace(2) { basicSpan(it, "parent") @@ -453,9 +453,11 @@ abstract class RemoteJDBCInstrumentationTest extends VersionedNamingTestBase { if (usingHikari) { "$Tags.DB_POOL_NAME" String } - if (this.dbmTracePreparedStatements(driver)){ + if (this.dbmTracePreparedStatements(this.getDbType(driver))){ "$InstrumentationTags.DBM_TRACE_INJECTED" true - "$InstrumentationTags.INSTRUMENTATION_TIME_MS" Long + if (driver == POSTGRESQL) { + "$InstrumentationTags.INSTRUMENTATION_TIME_MS" Long + } } peerServiceFrom(Tags.DB_INSTANCE) defaultTags() @@ -590,7 +592,9 @@ abstract class RemoteJDBCInstrumentationTest extends VersionedNamingTestBase { } if (this.dbmTracePreparedStatements(driver)){ "$InstrumentationTags.DBM_TRACE_INJECTED" true - "$InstrumentationTags.INSTRUMENTATION_TIME_MS" Long + if (driver == POSTGRESQL) { + "$InstrumentationTags.INSTRUMENTATION_TIME_MS" Long + } } peerServiceFrom(Tags.DB_INSTANCE) defaultTags() @@ -717,9 +721,11 @@ abstract class RemoteJDBCInstrumentationTest extends VersionedNamingTestBase { if (conPoolType == "hikari") { "$Tags.DB_POOL_NAME" String } - if (this.dbmTracePreparedStatements(driver)){ + if (this.dbmTracePreparedStatements(this.getDbType(driver))){ "$InstrumentationTags.DBM_TRACE_INJECTED" true - "$InstrumentationTags.INSTRUMENTATION_TIME_MS" Long + if (driver == POSTGRESQL) { + "$InstrumentationTags.INSTRUMENTATION_TIME_MS" Long + } } defaultTags() } @@ -766,7 +772,7 @@ abstract class RemoteJDBCInstrumentationTest extends VersionedNamingTestBase { then: def addDbmTag = dbmTraceInjected() statement.updateCount == 0 - if (driver == POSTGRESQL || driver == MYSQL || !dbmTraceInjected()) { + if (driver == POSTGRESQL || driver == MYSQL || driver == ORACLE || !dbmTraceInjected()) { assertTraces(1) { trace(2) { basicSpan(it, "parent") @@ -1034,9 +1040,7 @@ abstract class RemoteJDBCInstrumentationTest extends VersionedNamingTestBase { protected abstract boolean dbmTraceInjected() - protected boolean dbmTracePreparedStatements(String dbType){ - return false - } + protected abstract boolean dbmTracePreparedStatements(String dbType) } class RemoteJDBCInstrumentationV0Test extends RemoteJDBCInstrumentationTest { @@ -1060,6 +1064,11 @@ class RemoteJDBCInstrumentationV0Test extends RemoteJDBCInstrumentationTest { protected boolean dbmTraceInjected() { return false } + + @Override + protected boolean dbmTracePreparedStatements(String dbType) { + return false + } } class RemoteJDBCInstrumentationV1ForkedTest extends RemoteJDBCInstrumentationTest { @@ -1084,6 +1093,11 @@ class RemoteJDBCInstrumentationV1ForkedTest extends RemoteJDBCInstrumentationTes return false } + @Override + protected boolean dbmTracePreparedStatements(String dbType) { + return false + } + @Override protected String getDbType(String dbType) { final databaseNaming = new DatabaseNamingV1() @@ -1104,6 +1118,11 @@ class RemoteDBMTraceInjectedForkedTest extends RemoteJDBCInstrumentationTest { return true } + @Override + protected boolean dbmTracePreparedStatements(String dbType){ + return dbType == ORACLE + } + @Override int version() { return 1 @@ -1163,6 +1182,6 @@ class RemoteDBMTraceInjectedForkedTestTracePreparedStatements extends RemoteJDBC @Override protected boolean dbmTracePreparedStatements(String dbType){ - return dbType == POSTGRESQL + return dbType == POSTGRESQL || dbType == ORACLE } } From 082bc4697523ada1b33796d052412ba3d9a07b94 Mon Sep 17 00:00:00 2001 From: Nenad Noveljic <18366081+nenadnoveljic@users.noreply.github.com> Date: Fri, 20 Dec 2024 10:44:12 +0100 Subject: [PATCH 11/13] Update dd-java-agent/instrumentation/jdbc/src/main/java/datadog/trace/instrumentation/jdbc/JDBCDecorator.java MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Raphaƫl Vandon --- .../java/datadog/trace/instrumentation/jdbc/JDBCDecorator.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 11e0ab9ef43..e4b1a3317d8 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 @@ -287,7 +287,7 @@ public void setAction(AgentSpan span, Connection connection) { log.debug( "Failed to set extra DBM data in application_name for trace {}. " + "To disable this behavior, set trace_prepared_statements to 'false'. " - + "See https://docs.datadoghq.com/database_monitoring/connect_dbm_and_apm/ for more info.{}", + + "See https://docs.datadoghq.com/database_monitoring/connect_dbm_and_apm/ for more info. {}", span.getTraceId().toHexString(), e); DECORATE.onError(span, e); From 612ae6d36648e448d5777ce48a3bf996802910de Mon Sep 17 00:00:00 2001 From: Nenad Noveljic <18366081+nenadnoveljic@users.noreply.github.com> Date: Fri, 20 Dec 2024 10:48:38 +0100 Subject: [PATCH 12/13] DD_INSTRUMENTATION_PREFIX --- .../datadog/trace/instrumentation/jdbc/JDBCDecorator.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) 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 e4b1a3317d8..392d97836e5 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 @@ -49,6 +49,8 @@ public class JDBCDecorator extends DatabaseClientDecorator { public static final String DBM_PROPAGATION_MODE_STATIC = "service"; public static final String DBM_PROPAGATION_MODE_FULL = "full"; + public static final String DD_INSTRUMENTATION_PREFIX = "_DD_"; + public static final String DBM_PROPAGATION_MODE = Config.get().getDBMPropagationMode(); public static final boolean INJECT_COMMENT = DBM_PROPAGATION_MODE.equals(DBM_PROPAGATION_MODE_FULL) @@ -279,7 +281,7 @@ public void setAction(AgentSpan span, Connection connection) { if (priority == null) { return; } - final String traceContext = "_DD_" + DECORATE.traceParent(span, priority); + final String traceContext = DD_INSTRUMENTATION_PREFIX + DECORATE.traceParent(span, priority); connection.setClientInfo("OCSID.ACTION", traceContext); From f8907b1c1861059bfbb863cc669eeb5b66d30473 Mon Sep 17 00:00:00 2001 From: Nenad Noveljic <18366081+nenadnoveljic@users.noreply.github.com> Date: Fri, 20 Dec 2024 10:55:03 +0100 Subject: [PATCH 13/13] compute isOracle --- .../trace/instrumentation/jdbc/StatementInstrumentation.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/dd-java-agent/instrumentation/jdbc/src/main/java/datadog/trace/instrumentation/jdbc/StatementInstrumentation.java b/dd-java-agent/instrumentation/jdbc/src/main/java/datadog/trace/instrumentation/jdbc/StatementInstrumentation.java index 93b7bb931d9..5aec7efed4a 100644 --- a/dd-java-agent/instrumentation/jdbc/src/main/java/datadog/trace/instrumentation/jdbc/StatementInstrumentation.java +++ b/dd-java-agent/instrumentation/jdbc/src/main/java/datadog/trace/instrumentation/jdbc/StatementInstrumentation.java @@ -87,6 +87,7 @@ public static AgentScope onEnter( boolean injectTraceContext = DECORATE.shouldInjectTraceContext(dbInfo); final AgentSpan span; final boolean isSqlServer = DECORATE.isSqlServer(dbInfo); + final boolean isOracle = DECORATE.isOracle(dbInfo); if (INJECT_COMMENT && injectTraceContext) { if (isSqlServer) { @@ -94,7 +95,7 @@ public static AgentScope onEnter( final long spanID = DECORATE.setContextInfo(connection, dbInfo); // we then force that pre-determined span ID for the span covering the actual query span = AgentTracer.get().buildSpan(DATABASE_QUERY).withSpanId(spanID).start(); - } else if (DECORATE.isOracle(dbInfo)) { + } else if (isOracle) { span = startSpan(DATABASE_QUERY); DECORATE.setAction(span, connection); } else {