diff --git a/instrumentation/jdbc/library/src/main/java/io/opentelemetry/instrumentation/jdbc/internal/JdbcConnectionUrlParser.java b/instrumentation/jdbc/library/src/main/java/io/opentelemetry/instrumentation/jdbc/internal/JdbcConnectionUrlParser.java index ef0c5e08a719..305bfe3a771b 100644 --- a/instrumentation/jdbc/library/src/main/java/io/opentelemetry/instrumentation/jdbc/internal/JdbcConnectionUrlParser.java +++ b/instrumentation/jdbc/library/src/main/java/io/opentelemetry/instrumentation/jdbc/internal/JdbcConnectionUrlParser.java @@ -892,6 +892,24 @@ DbInfo.Builder doParse(String jdbcUrl, DbInfo.Builder builder) { return builder; } + }, + /** + * Driver + * configuration doc mentions that besides clickhouse ch could also + * be used but ClickHouse Connection implementation always returns full prefix + * jdbc:clickhouse: + */ + CLICKHOUSE("clickhouse") { + @Override + DbInfo.Builder doParse(String jdbcUrl, DbInfo.Builder builder) { + String clickhouseUrl = jdbcUrl.substring("clickhouse:".length()); + int typeEndIndex = clickhouseUrl.indexOf("://"); + if (typeEndIndex > 0) { + builder.subtype(clickhouseUrl.substring(0, typeEndIndex)); + } + return GENERIC_URL_LIKE.doParse(clickhouseUrl, builder); + } }; private static final Logger logger = Logger.getLogger(JdbcConnectionUrlParser.class.getName()); @@ -1079,6 +1097,8 @@ private static String toDbSystem(String type) { return DbSystemValues.MSSQL; case "sap": // SAP Hana return DbSystemValues.HANADB; + case "clickhouse": // ClickHouse + return DbSystemValues.CLICKHOUSE; default: return DbSystemValues.OTHER_SQL; // Unknown DBMS } @@ -1098,6 +1118,7 @@ private static final class DbSystemValues { static final String DERBY = "derby"; static final String MARIADB = "mariadb"; static final String H2 = "h2"; + static final String CLICKHOUSE = "clickhouse"; private DbSystemValues() {} } diff --git a/instrumentation/jdbc/library/src/test/java/io/opentelemetry/instrumentation/jdbc/internal/JdbcConnectionUrlParserTest.java b/instrumentation/jdbc/library/src/test/java/io/opentelemetry/instrumentation/jdbc/internal/JdbcConnectionUrlParserTest.java index bc90cbc72908..4abcd63047b4 100644 --- a/instrumentation/jdbc/library/src/test/java/io/opentelemetry/instrumentation/jdbc/internal/JdbcConnectionUrlParserTest.java +++ b/instrumentation/jdbc/library/src/test/java/io/opentelemetry/instrumentation/jdbc/internal/JdbcConnectionUrlParserTest.java @@ -207,6 +207,35 @@ public Stream provideArguments(ExtensionContext context) { } } + @ParameterizedTest(name = "{index}: {0}") + @ArgumentsSource(ClickHouseProvider.class) + void testClickHouseParsing(ParseTestArgument argument) { + testVerifySystemSubtypeParsingOfUrl(argument); + } + + static final class ClickHouseProvider implements ArgumentsProvider { + @Override + public Stream provideArguments(ExtensionContext context) { + return args( + // https://clickhouse.com/docs/integrations/language-clients/java/jdbc#configuration + arg("jdbc:clickhouse:http://localhost:8123/mydb") + .setShortUrl("clickhouse:http://localhost:8123") + .setSystem("clickhouse") + .setSubtype("http") + .setHost("localhost") + .setPort(8123) + .setDb("mydb") + .build(), + arg("jdbc:clickhouse:https://localhost:8443?ssl=true") + .setShortUrl("clickhouse:https://localhost:8443") + .setSystem("clickhouse") + .setSubtype("https") + .setHost("localhost") + .setPort(8443) + .build()); + } + } + @ParameterizedTest(name = "{index}: {0}") @ArgumentsSource(PostgresProvider.class) void testPostgresParsing(ParseTestArgument argument) {