From 828294795b5b9f2d1b3c80cef8dc4f094b904cc4 Mon Sep 17 00:00:00 2001 From: "wu.cc" Date: Thu, 18 Sep 2025 15:27:03 +0800 Subject: [PATCH 1/4] =?UTF-8?q?feat:=20support=20parse=20oceanbase?= =?UTF-8?q?=E3=80=81lindorm=E3=80=81polardb=E3=80=81opentracing=20connecti?= =?UTF-8?q?on=20url?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Change-Id: Ia3b5f6b74b40763c4df7fa0185223575a2c1b068 --- .../internal/JdbcConnectionUrlParser.java | 97 +++++++++++++- .../internal/JdbcConnectionUrlParserTest.java | 124 ++++++++++++++++++ 2 files changed, 220 insertions(+), 1 deletion(-) 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 87d075e84bd2..aa05845d8662 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 @@ -911,6 +911,80 @@ DbInfo.Builder doParse(String jdbcUrl, DbInfo.Builder builder) { } return GENERIC_URL_LIKE.doParse(clickhouseUrl, builder); } + }, + /** + * jdbc:oceanbase://host:port/dbname + * jdbc:oceanbase:oracle://host:port/dbname + */ + OCEANBASE("oceanbase") { + @Override + DbInfo.Builder doParse(String jdbcUrl, DbInfo.Builder builder) { + int protoLoc = jdbcUrl.indexOf("://"); + int typeEndLoc = jdbcUrl.indexOf(':'); + if (protoLoc > typeEndLoc) { + String subtype = jdbcUrl.substring(typeEndLoc + 1, protoLoc); + builder.subtype(subtype); + if (subtype.equals(DbSystemValues.ORACLE)) { + builder.system(DbSystemValues.ORACLE); + } + return MODIFIED_URL_LIKE.doParse(jdbcUrl, builder); + } else { + return GENERIC_URL_LIKE.doParse(jdbcUrl, builder); + } + + } + }, + /** + * Driver + * configuration doc + * jdbc:lindorm:table:url=http//server_name:30060/test + * jdbc:lindorm:tsdb:url=http://server_name:8242/test + * jabc:lindorm:search:url=http://server_name:30070/test + * + */ + LINDORM("lindorm") { + private static final String DEFAULT_HOST = "localhost"; + private static final int DEFAULT_PORT = 30060; + + @Override + DbInfo.Builder doParse(String jdbcUrl, DbInfo.Builder builder) { + String lindormUrl = jdbcUrl.substring("lindorm:".length()); + DbInfo dbInfo = builder.build(); + if (dbInfo.getHost() == null) { + builder.host(DEFAULT_HOST); + } + if (dbInfo.getPort() == null) { + builder.port(DEFAULT_PORT); + } + + int urlIndex = lindormUrl.indexOf(":url="); + if (urlIndex < 0) { + return builder; + } + builder.subtype(lindormUrl.substring(0, urlIndex)); + String realUrl = lindormUrl.substring(urlIndex + 5); + return GENERIC_URL_LIKE.doParse(realUrl, builder); + } + }, + /** + * jdbc:polardb://server_name:1901/dbname + */ + POLARDB("polardb") { + private static final int DEFAULT_PORT = 1521; + private static final String DEFAULT_HOST = "localhost"; + + @Override + DbInfo.Builder doParse(String jdbcUrl, DbInfo.Builder builder) { + DbInfo dbInfo = builder.build(); + if (dbInfo.getHost() == null) { + builder.host(DEFAULT_HOST); + } + if (dbInfo.getPort() == null) { + builder.port(DEFAULT_PORT); + } + return GENERIC_URL_LIKE.doParse(jdbcUrl, builder); + } }; private static final Logger logger = Logger.getLogger(JdbcConnectionUrlParser.class.getName()); @@ -943,8 +1017,13 @@ public static DbInfo parse(String connectionUrl, Properties props) { connectionUrl = connectionUrl.toLowerCase(Locale.ROOT); String jdbcUrl; - if (connectionUrl.startsWith("jdbc:")) { + if (connectionUrl.startsWith("jdbc:tracing:")) { + //see https://github.com/opentracing-contrib/java-jdbc + jdbcUrl = connectionUrl.substring("jdbc:tracing:".length()); + } else if (connectionUrl.startsWith("jdbc:")) { jdbcUrl = connectionUrl.substring("jdbc:".length()); + } else if (connectionUrl.startsWith("jdbc-secretsmanager:tracing:")) { + jdbcUrl = connectionUrl.substring("jdbc-secretsmanager:tracing:".length()); } else if (connectionUrl.startsWith("jdbc-secretsmanager:")) { jdbcUrl = connectionUrl.substring("jdbc-secretsmanager:".length()); } else { @@ -1067,6 +1146,12 @@ private static void populateStandardProperties(DbInfo.Builder builder, Map } } + public static void main(String[] args) { + DbInfo dbInfo = JdbcConnectionUrlParser.parse( + "jdbc:tracing:mysql://rm-bp17j28j2y7pm-proxy-lindorm-pub.aliyuncs.com", new Properties()); + System.out.println(dbInfo); + } + // see // https://github.com/open-telemetry/semantic-conventions/blob/main/docs/database/database-spans.md private static String toDbSystem(String type) { @@ -1100,6 +1185,12 @@ private static String toDbSystem(String type) { return DbSystemValues.HANADB; case "clickhouse": // ClickHouse return DbSystemValues.CLICKHOUSE; + case "oceanbase": // Oceanbase + return DbSystemValues.OCEANBASE; + case "polardb": // polarDB + return DbSystemValues.POLARDB; + case "lindorm": // lindorm + return DbSystemValues.LINDORM; default: return DbSystemValues.OTHER_SQL; // Unknown DBMS } @@ -1120,6 +1211,10 @@ private static final class DbSystemValues { static final String MARIADB = "mariadb"; static final String H2 = "h2"; static final String CLICKHOUSE = "clickhouse"; + static final String OCEANBASE = "oceanbase"; + static final String POLARDB = "polardb"; + static final String LINDORM = "lindorm"; + 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 165a91d2d3c0..691e99b95809 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 @@ -1300,6 +1300,130 @@ void testSecretsManagerParsing(ParseTestArgument argument) { testVerifySystemSubtypeParsingOfUrl(argument); } + private static Stream openTracingArguments() { + return args( + // https://github.com/opentracing-contrib/java-jdbc + arg("jdbc:tracing:mysql://example.com:50000") + .setShortUrl("mysql://example.com:50000") + .setSystem("mysql") + .setHost("example.com") + .setPort(50000) + .build(), + arg("jdbc:tracing:postgresql://example.com:50000/dbname") + .setShortUrl("postgresql://example.com:50000") + .setSystem("postgresql") + .setHost("example.com") + .setPort(50000) + .setDb("dbname") + .build(), + arg("jdbc:tracing:oracle:thin:@example.com:50000/ORCL") + .setShortUrl("oracle:thin://example.com:50000") + .setSystem("oracle") + .setSubtype("thin") + .setHost("example.com") + .setPort(50000) + .setName("orcl") + .build(), + arg("jdbc:tracing:sqlserver://example.com:50000") + .setShortUrl("sqlserver://example.com:50000") + .setSystem("mssql") + .setHost("example.com") + .setPort(50000) + .build()); + } + + @ParameterizedTest(name = "{index}: {0}") + @MethodSource("openTracingArguments") + void testOpenTracingParsing(ParseTestArgument argument) { + testVerifySystemSubtypeParsingOfUrl(argument); + } + + private static Stream oceanbaseArguments() { + return args( + // https://docs.aws.amazon.com/secretsmanager/latest/userguide/retrieving-secrets_jdbc.html + arg("jdbc:oceanbase://host:3306/test") + .setShortUrl("oceanbase://host:3306") + .setSystem("oceanbase") + .setHost("host") + .setPort(3306) + .setDb("test") + .build(), + arg("jdbc:oceanbase:oracle://host:1521") + .setShortUrl("oceanbase:oracle://host:1521") + .setSystem("oracle") + .setSubtype("oracle") + .setHost("host") + .setPort(1521) + .build() + ); + } + + @ParameterizedTest(name = "{index}: {0}") + @MethodSource("oceanbaseArguments") + void testOceasbaseParsing(ParseTestArgument argument) { + testVerifySystemSubtypeParsingOfUrl(argument); + } + + private static Stream lindormArguments() { + return args( + // https://docs.aws.amazon.com/secretsmanager/latest/userguide/retrieving-secrets_jdbc.html + arg("jdbc:lindorm:table:url=http://host:30060/test") + .setShortUrl("lindorm:table://host:30060") + .setSystem("lindorm") + .setSubtype("table") + .setHost("host") + .setDb("test") + .setPort(30060) + .build(), + arg("jdbc:lindorm:tsdb:url=http://host:8242/test") + .setShortUrl("lindorm:tsdb://host:8242") + .setSystem("lindorm") + .setSubtype("tsdb") + .setHost("host") + .setDb("test") + .setPort(8242) + .setDb("test") + .build(), + arg("jdbc:lindorm:search:url=http://host:30070/test") + .setShortUrl("lindorm:search://host:30070") + .setSystem("lindorm") + .setSubtype("search") + .setHost("host") + .setDb("test") + .setPort(30070) + .build() + ); + } + + @ParameterizedTest(name = "{index}: {0}") + @MethodSource("lindormArguments") + void testLindormManagerParsing(ParseTestArgument argument) { + testVerifySystemSubtypeParsingOfUrl(argument); + } + + private static Stream polardbArguments() { + return args( + arg("jdbc:polardb://example.com:1901") + .setShortUrl("polardb://example.com:1901") + .setSystem("polardb") + .setHost("example.com") + .setPort(1901) + .build(), + arg("jdbc:polardb://example.com") + .setShortUrl("polardb://example.com:1521") + .setSystem("polardb") + .setHost("example.com") + .setPort(1521) + .build() + ); + } + + @ParameterizedTest(name = "{index}: {0}") + @MethodSource("polardbArguments") + void testPolardbParsing(ParseTestArgument argument) { + testVerifySystemSubtypeParsingOfUrl(argument); + } + private static void testVerifySystemSubtypeParsingOfUrl(ParseTestArgument argument) { DbInfo info = parse(argument.url, argument.properties); DbInfo expected = argument.dbInfo; From 4251ef4d86b08b2176b6c21a767bf1f5d20e088e Mon Sep 17 00:00:00 2001 From: "wu.cc" Date: Thu, 25 Sep 2025 15:58:31 +0800 Subject: [PATCH 2/4] delete test main method --- .../jdbc/internal/JdbcConnectionUrlParser.java | 6 ------ 1 file changed, 6 deletions(-) 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 aa05845d8662..d18199dacd9b 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 @@ -1146,12 +1146,6 @@ private static void populateStandardProperties(DbInfo.Builder builder, Map } } - public static void main(String[] args) { - DbInfo dbInfo = JdbcConnectionUrlParser.parse( - "jdbc:tracing:mysql://rm-bp17j28j2y7pm-proxy-lindorm-pub.aliyuncs.com", new Properties()); - System.out.println(dbInfo); - } - // see // https://github.com/open-telemetry/semantic-conventions/blob/main/docs/database/database-spans.md private static String toDbSystem(String type) { From 8d79717fba032c1480d6a5acd79b667b87d93b00 Mon Sep 17 00:00:00 2001 From: otelbot <197425009+otelbot@users.noreply.github.com> Date: Thu, 25 Sep 2025 08:07:53 +0000 Subject: [PATCH 3/4] ./gradlew spotlessApply --- .../jdbc/internal/JdbcConnectionUrlParser.java | 17 ++++------------- .../internal/JdbcConnectionUrlParserTest.java | 9 +++------ 2 files changed, 7 insertions(+), 19 deletions(-) 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 d18199dacd9b..fa873bb58d82 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 @@ -912,10 +912,7 @@ DbInfo.Builder doParse(String jdbcUrl, DbInfo.Builder builder) { return GENERIC_URL_LIKE.doParse(clickhouseUrl, builder); } }, - /** - * jdbc:oceanbase://host:port/dbname - * jdbc:oceanbase:oracle://host:port/dbname - */ + /** jdbc:oceanbase://host:port/dbname jdbc:oceanbase:oracle://host:port/dbname */ OCEANBASE("oceanbase") { @Override DbInfo.Builder doParse(String jdbcUrl, DbInfo.Builder builder) { @@ -931,17 +928,14 @@ DbInfo.Builder doParse(String jdbcUrl, DbInfo.Builder builder) { } else { return GENERIC_URL_LIKE.doParse(jdbcUrl, builder); } - } }, /** * Driver - * configuration doc - * jdbc:lindorm:table:url=http//server_name:30060/test + * configuration doc jdbc:lindorm:table:url=http//server_name:30060/test * jdbc:lindorm:tsdb:url=http://server_name:8242/test * jabc:lindorm:search:url=http://server_name:30070/test - * */ LINDORM("lindorm") { private static final String DEFAULT_HOST = "localhost"; @@ -967,9 +961,7 @@ DbInfo.Builder doParse(String jdbcUrl, DbInfo.Builder builder) { return GENERIC_URL_LIKE.doParse(realUrl, builder); } }, - /** - * jdbc:polardb://server_name:1901/dbname - */ + /** jdbc:polardb://server_name:1901/dbname */ POLARDB("polardb") { private static final int DEFAULT_PORT = 1521; private static final String DEFAULT_HOST = "localhost"; @@ -1018,7 +1010,7 @@ public static DbInfo parse(String connectionUrl, Properties props) { String jdbcUrl; if (connectionUrl.startsWith("jdbc:tracing:")) { - //see https://github.com/opentracing-contrib/java-jdbc + // see https://github.com/opentracing-contrib/java-jdbc jdbcUrl = connectionUrl.substring("jdbc:tracing:".length()); } else if (connectionUrl.startsWith("jdbc:")) { jdbcUrl = connectionUrl.substring("jdbc:".length()); @@ -1209,7 +1201,6 @@ private static final class DbSystemValues { static final String POLARDB = "polardb"; static final String LINDORM = "lindorm"; - 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 691e99b95809..b132ce645711 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 @@ -1354,8 +1354,7 @@ private static Stream oceanbaseArguments() { .setSubtype("oracle") .setHost("host") .setPort(1521) - .build() - ); + .build()); } @ParameterizedTest(name = "{index}: {0}") @@ -1391,8 +1390,7 @@ private static Stream lindormArguments() { .setHost("host") .setDb("test") .setPort(30070) - .build() - ); + .build()); } @ParameterizedTest(name = "{index}: {0}") @@ -1414,8 +1412,7 @@ private static Stream polardbArguments() { .setSystem("polardb") .setHost("example.com") .setPort(1521) - .build() - ); + .build()); } @ParameterizedTest(name = "{index}: {0}") From a4a325fa2ac682c0257ac585b3f8ddfe3a2618a6 Mon Sep 17 00:00:00 2001 From: "wu.cc" Date: Sun, 28 Sep 2025 20:27:09 +0800 Subject: [PATCH 4/4] =?UTF-8?q?fix=EF=BC=9Afix=20some=20code=20comments?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Change-Id: I39d2ce579c60d5afa2e792f3296eef5d0b495443 --- .../jdbc/internal/JdbcConnectionUrlParser.java | 6 +++--- .../jdbc/internal/JdbcConnectionUrlParserTest.java | 4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-) 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 d18199dacd9b..7c9e7fe944c8 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 @@ -936,7 +936,7 @@ DbInfo.Builder doParse(String jdbcUrl, DbInfo.Builder builder) { }, /** * Driver + * href="https://www.alibabacloud.com/help/en/lindorm/user-guide/view-endpoints">Driver * configuration doc * jdbc:lindorm:table:url=http//server_name:30060/test * jdbc:lindorm:tsdb:url=http://server_name:8242/test @@ -1181,9 +1181,9 @@ private static String toDbSystem(String type) { return DbSystemValues.CLICKHOUSE; case "oceanbase": // Oceanbase return DbSystemValues.OCEANBASE; - case "polardb": // polarDB + case "polardb": // PolarDB return DbSystemValues.POLARDB; - case "lindorm": // lindorm + case "lindorm": // Lindorm return DbSystemValues.LINDORM; default: return DbSystemValues.OTHER_SQL; // Unknown DBMS 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 691e99b95809..84aed242d6cc 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 @@ -1340,7 +1340,7 @@ void testOpenTracingParsing(ParseTestArgument argument) { private static Stream oceanbaseArguments() { return args( - // https://docs.aws.amazon.com/secretsmanager/latest/userguide/retrieving-secrets_jdbc.html + // https://en.oceanbase.com/ arg("jdbc:oceanbase://host:3306/test") .setShortUrl("oceanbase://host:3306") .setSystem("oceanbase") @@ -1366,7 +1366,7 @@ void testOceasbaseParsing(ParseTestArgument argument) { private static Stream lindormArguments() { return args( - // https://docs.aws.amazon.com/secretsmanager/latest/userguide/retrieving-secrets_jdbc.html + // https://www.alibabacloud.com/help/en/lindorm/user-guide/view-endpoints arg("jdbc:lindorm:table:url=http://host:30060/test") .setShortUrl("lindorm:table://host:30060") .setSystem("lindorm")