From ea791bf38789235af14ad904f6f2d28a39eea0e5 Mon Sep 17 00:00:00 2001 From: Alexey Kuznetsov Date: Mon, 6 Oct 2025 16:25:24 -0400 Subject: [PATCH] =?UTF-8?q?Add=20custom=20`ImageNameSubstitutor`=20impleme?= =?UTF-8?q?ntation=20that=20rewrites=20Docker=20image=20names=20to=20use?= =?UTF-8?q?=20Datadog=E2=80=99s=20internal=20registry=20`registry.ddbuild.?= =?UTF-8?q?io`=20when=20running=20in=20a=20CI=20environment.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../RemoteJDBCInstrumentationTest.groovy | 111 +++++++++--------- ...DataDogRegistryImageNameSubstitutor.groovy | 37 ++++++ .../test/resources/testcontainers.properties | 1 + 3 files changed, 94 insertions(+), 55 deletions(-) create mode 100644 dd-java-agent/instrumentation/jdbc/src/test/groovy/test/DataDogRegistryImageNameSubstitutor.groovy create mode 100644 dd-java-agent/instrumentation/jdbc/src/test/resources/testcontainers.properties 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 92a7ceb50d7..5d143421963 100644 --- a/dd-java-agent/instrumentation/jdbc/src/test/groovy/RemoteJDBCInstrumentationTest.groovy +++ b/dd-java-agent/instrumentation/jdbc/src/test/groovy/RemoteJDBCInstrumentationTest.groovy @@ -2,6 +2,7 @@ import com.mchange.v2.c3p0.ComboPooledDataSource import com.microsoft.sqlserver.jdbc.SQLServerException import com.zaxxer.hikari.HikariConfig import com.zaxxer.hikari.HikariDataSource +import datadog.environment.JavaVirtualMachine import datadog.trace.agent.test.naming.VersionedNamingTestBase import datadog.trace.agent.test.utils.PortUtils import datadog.trace.api.Config @@ -34,7 +35,7 @@ import static datadog.trace.api.config.TraceInstrumentationConfig.DB_CLIENT_HOST import static datadog.trace.api.config.TraceInstrumentationConfig.DB_DBM_TRACE_PREPARED_STATEMENTS // workaround for SSLHandShakeException on J9 only with Hikari/MySQL -@Requires({ !System.getProperty("java.vendor").contains("IBM") }) +@Requires({ !JavaVirtualMachine.isJ9() }) abstract class RemoteJDBCInstrumentationTest extends VersionedNamingTestBase { static final String POSTGRESQL = "postgresql" static final String MYSQL = "mysql" @@ -46,15 +47,15 @@ abstract class RemoteJDBCInstrumentationTest extends VersionedNamingTestBase { (POSTGRESQL): "jdbcUnitTest", (MYSQL) : "jdbcUnitTest", (SQLSERVER) : "master", - (ORACLE) : "freepdb1", + (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), - (ORACLE) : "jdbc:oracle:thin:@//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 @@ -62,15 +63,15 @@ abstract class RemoteJDBCInstrumentationTest extends VersionedNamingTestBase { (POSTGRESQL): "org.postgresql.Driver", (MYSQL) : "com.mysql.jdbc.Driver", (SQLSERVER) : "com.microsoft.sqlserver.jdbc.SQLServerDriver", - (ORACLE) : "oracle.jdbc.OracleDriver", + (ORACLE) : "oracle.jdbc.OracleDriver", ] @Shared private Map jdbcUserNames = [ (POSTGRESQL): "sa", (MYSQL) : "sa", - (SQLSERVER) : "sa", - (ORACLE) : "testuser", + (SQLSERVER) : "sa", + (ORACLE) : "testuser", ] @Shared @@ -78,7 +79,7 @@ abstract class RemoteJDBCInstrumentationTest extends VersionedNamingTestBase { (MYSQL) : "sa", (POSTGRESQL): "sa", (SQLSERVER) : "Datad0g_", - (ORACLE) : "testPassword", + (ORACLE) : "testPassword", ] @Shared @@ -94,14 +95,14 @@ abstract class RemoteJDBCInstrumentationTest extends VersionedNamingTestBase { @Shared private Map> cpDatasources = new HashMap<>() - def peerConnectionProps(String db){ + def peerConnectionProps(String db) { def props = new Properties() props.setProperty("user", jdbcUserNames.get(db)) props.setProperty("password", jdbcPasswords.get(db)) return props } - protected getDbType(String dbType){ + protected getDbType(String dbType) { return dbType } @@ -195,7 +196,7 @@ abstract class RemoteJDBCInstrumentationTest extends VersionedNamingTestBase { mysql.start() PortUtils.waitForPortToOpen(mysql.getHost(), mysql.getMappedPort(MySQLContainer.MYSQL_PORT), 5, TimeUnit.SECONDS) jdbcUrls.put(MYSQL, "${mysql.getJdbcUrl()}") - sqlserver = new MSSQLServerContainer(MSSQLServerContainer.IMAGE).acceptLicense().withPassword(jdbcPasswords.get(SQLSERVER)) + sqlserver = new MSSQLServerContainer("mcr.microsoft.com/mssql/server:2022-latest").acceptLicense().withPassword(jdbcPasswords.get(SQLSERVER)) 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)}") @@ -370,7 +371,7 @@ abstract class RemoteJDBCInstrumentationTest extends VersionedNamingTestBase { resultSet.next() resultSet.getInt(1) == 3 def addDbmTag = dbmTraceInjected() - if (driver == SQLSERVER && addDbmTag){ + if (driver == SQLSERVER && addDbmTag) { assertTraces(1) { trace(3) { basicSpan(it, "parent") @@ -453,7 +454,7 @@ abstract class RemoteJDBCInstrumentationTest extends VersionedNamingTestBase { if (usingHikari) { "$Tags.DB_POOL_NAME" String } - if (this.dbmTracePreparedStatements(this.getDbType(driver))){ + if (this.dbmTracePreparedStatements(this.getDbType(driver))) { "$InstrumentationTags.DBM_TRACE_INJECTED" true if (driver == POSTGRESQL) { "$InstrumentationTags.INSTRUMENTATION_TIME_MS" Long @@ -476,11 +477,11 @@ 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 + 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 + 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 @@ -505,7 +506,7 @@ abstract class RemoteJDBCInstrumentationTest extends VersionedNamingTestBase { resultSet.getInt(1) == 3 def addDbmTag = dbmTraceInjected() - if (driver == SQLSERVER && addDbmTag){ + if (driver == SQLSERVER && addDbmTag) { assertTraces(1) { trace(3) { basicSpan(it, "parent") @@ -590,7 +591,7 @@ abstract class RemoteJDBCInstrumentationTest extends VersionedNamingTestBase { if (conPoolType == "hikari") { "$Tags.DB_POOL_NAME" String } - if (this.dbmTracePreparedStatements(driver)){ + if (this.dbmTracePreparedStatements(driver)) { "$InstrumentationTags.DBM_TRACE_INJECTED" true if (driver == POSTGRESQL) { "$InstrumentationTags.INSTRUMENTATION_TIME_MS" Long @@ -641,7 +642,7 @@ abstract class RemoteJDBCInstrumentationTest extends VersionedNamingTestBase { resultSet.next() resultSet.getInt(1) == 3 def addDbmTag = dbmTraceInjected() - if (driver == SQLSERVER && addDbmTag){ + if (driver == SQLSERVER && addDbmTag) { assertTraces(1) { trace(3) { basicSpan(it, "parent") @@ -721,7 +722,7 @@ abstract class RemoteJDBCInstrumentationTest extends VersionedNamingTestBase { if (conPoolType == "hikari") { "$Tags.DB_POOL_NAME" String } - if (this.dbmTracePreparedStatements(this.getDbType(driver))){ + if (this.dbmTracePreparedStatements(this.getDbType(driver))) { "$InstrumentationTags.DBM_TRACE_INJECTED" true if (driver == POSTGRESQL) { "$InstrumentationTags.INSTRUMENTATION_TIME_MS" Long @@ -739,23 +740,23 @@ abstract class RemoteJDBCInstrumentationTest extends VersionedNamingTestBase { connection.close() where: - driver | conPoolType | connection | query | operation | obfuscatedQuery - 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" + driver | conPoolType | connection | query | operation | obfuscatedQuery + 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"() { @@ -875,22 +876,22 @@ abstract class RemoteJDBCInstrumentationTest extends VersionedNamingTestBase { connection.close() where: - driver | conPoolType | connection | query | operation - 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" + driver | conPoolType | connection | query | operation + 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" + 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" + 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" + 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" } @@ -972,7 +973,7 @@ abstract class RemoteJDBCInstrumentationTest extends VersionedNamingTestBase { injectSysConfig("dd.dbm.propagation.mode", "full") CallableStatement proc = connection.prepareCall(query) - proc.setInt(1,1) + proc.setInt(1, 1) proc.registerOutParameter(1, Types.INTEGER) when: runUnderTrace("parent") { @@ -990,7 +991,7 @@ abstract class RemoteJDBCInstrumentationTest extends VersionedNamingTestBase { connection.close() where: - driver | connection | query + driver | connection | query POSTGRESQL | cpDatasources.get("hikari").get(driver).getConnection() | "CALL dummy(?)" MYSQL | cpDatasources.get("hikari").get(driver).getConnection() | "CALL dummy(?)" SQLSERVER | cpDatasources.get("hikari").get(driver).getConnection() | "{CALL dummy(?)}" @@ -1119,7 +1120,7 @@ class RemoteDBMTraceInjectedForkedTest extends RemoteJDBCInstrumentationTest { } @Override - protected boolean dbmTracePreparedStatements(String dbType){ + protected boolean dbmTracePreparedStatements(String dbType) { return dbType == ORACLE } @@ -1181,7 +1182,7 @@ class RemoteDBMTraceInjectedForkedTestTracePreparedStatements extends RemoteJDBC } @Override - protected boolean dbmTracePreparedStatements(String dbType){ + protected boolean dbmTracePreparedStatements(String dbType) { return dbType == POSTGRESQL || dbType == ORACLE } } diff --git a/dd-java-agent/instrumentation/jdbc/src/test/groovy/test/DataDogRegistryImageNameSubstitutor.groovy b/dd-java-agent/instrumentation/jdbc/src/test/groovy/test/DataDogRegistryImageNameSubstitutor.groovy new file mode 100644 index 00000000000..891cde47eae --- /dev/null +++ b/dd-java-agent/instrumentation/jdbc/src/test/groovy/test/DataDogRegistryImageNameSubstitutor.groovy @@ -0,0 +1,37 @@ +package test + +import org.testcontainers.utility.DockerImageName +import org.testcontainers.utility.ImageNameSubstitutor + +/** + * A custom {@link ImageNameSubstitutor} implementation that rewrites Docker image names + * to use Datadog’s internal registry {@code registry.ddbuild.io} when running in a CI environment. + *

+ * Images from DockerHub already mirrored by {@code registry.ddbuild.io} via environment variable {@code TESTCONTAINERS_HUB_IMAGE_NAME_PREFIX} + *

+ *

+ * For images from other repositories custom image name substitutor should be implemented. + * Internal registry is faster and not affected by rate limiting. + *

+ */ +class DataDogRegistryImageNameSubstitutor extends ImageNameSubstitutor { + @Override + DockerImageName apply(DockerImageName original) { + def name = original.asCanonicalNameString() + + if (System.getenv('CI')) { + // For now we need to mirror Microsoft SQL Server images only. + name = name.replace( + 'mcr.microsoft.com/mssql/server:', + 'registry.ddbuild.io/images/mirror/sqlserver:' + ) + } + + DockerImageName.parse(name) + } + + @Override + protected String getDescription() { + 'Image name substitutor to load images from registry.ddbuild.io' + } +} diff --git a/dd-java-agent/instrumentation/jdbc/src/test/resources/testcontainers.properties b/dd-java-agent/instrumentation/jdbc/src/test/resources/testcontainers.properties new file mode 100644 index 00000000000..03fb660c6d1 --- /dev/null +++ b/dd-java-agent/instrumentation/jdbc/src/test/resources/testcontainers.properties @@ -0,0 +1 @@ +image.substitutor=test.DataDogRegistryImageNameSubstitutor