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 extends Arguments> 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 extends Arguments> 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) {