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/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/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..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) @@ -252,6 +254,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 +266,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_INSTRUMENTATION_PREFIX + 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 dbName = [ (POSTGRESQL): "jdbcUnitTest", (MYSQL) : "jdbcUnitTest", - (SQLSERVER) : "master" + (SQLSERVER) : "master", + (ORACLE) : "freepdb1", ] @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: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", + (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) : "testuser", ] @Shared private Map jdbcPasswords = [ - "mysql" : "sa", - "postgresql": "sa", - "sqlserver" : "Datad0g_", + (MYSQL) : "sa", + (POSTGRESQL): "sa", + (SQLSERVER) : "Datad0g_", + (ORACLE) : "testPassword", ] @Shared @@ -78,6 +87,8 @@ abstract class RemoteJDBCInstrumentationTest extends VersionedNamingTestBase { def mysql @Shared def sqlserver + @Shared + def oracle // JDBC Connection pool name (i.e. HikariCP) -> Map @Shared @@ -189,6 +200,13 @@ abstract class RemoteJDBCInstrumentationTest extends VersionedNamingTestBase { 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(jdbcUserNames.get(ORACLE)).withPassword(jdbcPasswords.get(ORACLE)) + oracle.start() + jdbcUrls.put(ORACLE, "${oracle.getJdbcUrl()}".replace("xepdb1", dbName.get(ORACLE))) + prepareConnectionPoolDatasources() } @@ -220,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") @@ -322,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"() { @@ -431,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() @@ -452,15 +476,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"() { @@ -564,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() @@ -583,15 +613,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"() { @@ -687,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() } @@ -707,15 +743,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"() { @@ -732,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") @@ -839,15 +879,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" } @@ -996,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 { @@ -1022,6 +1064,11 @@ class RemoteJDBCInstrumentationV0Test extends RemoteJDBCInstrumentationTest { protected boolean dbmTraceInjected() { return false } + + @Override + protected boolean dbmTracePreparedStatements(String dbType) { + return false + } } class RemoteJDBCInstrumentationV1ForkedTest extends RemoteJDBCInstrumentationTest { @@ -1046,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() @@ -1066,6 +1118,11 @@ class RemoteDBMTraceInjectedForkedTest extends RemoteJDBCInstrumentationTest { return true } + @Override + protected boolean dbmTracePreparedStatements(String dbType){ + return dbType == ORACLE + } + @Override int version() { return 1 @@ -1125,6 +1182,6 @@ class RemoteDBMTraceInjectedForkedTestTracePreparedStatements extends RemoteJDBC @Override protected boolean dbmTracePreparedStatements(String dbType){ - return dbType == POSTGRESQL + return dbType == POSTGRESQL || dbType == ORACLE } }