From 1b90f6892b696218bddfe7d88354cf644082c8c3 Mon Sep 17 00:00:00 2001 From: wuguanyu <809697469@qq.com> Date: Sat, 25 Sep 2021 20:59:49 +0800 Subject: [PATCH] fix NumberFormat exception in MysqlURLParser (#36) Delegate @ascrutae 's approval, his GitHub account has an issue for now. --- CHANGES.md | 1 + .../jdbc/connectionurl/parser/MysqlURLParser.java | 13 ++++++++++++- .../jdbc/connectionurl/parser/URLParserTest.java | 8 ++++++++ 3 files changed, 21 insertions(+), 1 deletion(-) diff --git a/CHANGES.md b/CHANGES.md index a7197926f..3172147b4 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -21,6 +21,7 @@ Release Notes. * Add benchmark result for `exception-ignore` plugin and polish plugin guide. * Provide Alibaba Druid database connection pool plugin. * Provide HikariCP database connection pool plugin. +* Fix NumberFormat exception in jdbc-commons plugin when MysqlURLParser parser jdbcurl * Provide Alibaba Fastjson parser/generator plugin. * Fix a tracing context leak of SpringMVC plugin, when an internal exception throws due to response can't be found. * Make GRPC log reporter sharing GRPC channel with other reporters of agent. Remove config items of `agent.conf`, `plugin.toolkit.log.grpc.reporter.server_host`, `plugin.toolkit.log.grpc.reporter.server_port`, and `plugin.toolkit.log.grpc.reporter.upstream_timeout`. diff --git a/apm-sniffer/apm-sdk-plugin/jdbc-commons/src/main/java/org/apache/skywalking/apm/plugin/jdbc/connectionurl/parser/MysqlURLParser.java b/apm-sniffer/apm-sdk-plugin/jdbc-commons/src/main/java/org/apache/skywalking/apm/plugin/jdbc/connectionurl/parser/MysqlURLParser.java index d4ca1b860..9b47afa5d 100644 --- a/apm-sniffer/apm-sdk-plugin/jdbc-commons/src/main/java/org/apache/skywalking/apm/plugin/jdbc/connectionurl/parser/MysqlURLParser.java +++ b/apm-sniffer/apm-sdk-plugin/jdbc-commons/src/main/java/org/apache/skywalking/apm/plugin/jdbc/connectionurl/parser/MysqlURLParser.java @@ -45,8 +45,15 @@ public class MysqlURLParser extends AbstractURLParser { protected URLLocation fetchDatabaseHostsIndexRange() { int hostLabelStartIndex = url.indexOf("//"); int hostLabelEndIndex = url.indexOf("/", hostLabelStartIndex + 2); + int hostLabelEndIndexWithParameter = url.indexOf("?", hostLabelStartIndex + 2); if (hostLabelEndIndex == -1) { - hostLabelEndIndex = url.indexOf("?", hostLabelStartIndex + 2); + hostLabelEndIndex = hostLabelEndIndexWithParameter; + } + if (hostLabelEndIndexWithParameter < hostLabelEndIndex && hostLabelEndIndexWithParameter != -1) { + hostLabelEndIndex = hostLabelEndIndexWithParameter; + } + if (hostLabelEndIndex == -1) { + hostLabelEndIndex = url.length(); } return new URLLocation(hostLabelStartIndex + 2, hostLabelEndIndex); } @@ -61,6 +68,10 @@ public class MysqlURLParser extends AbstractURLParser { protected URLLocation fetchDatabaseNameIndexRange(int startSize) { int databaseStartTag = url.indexOf("/", startSize); + int parameterStartTag = url.indexOf("?", startSize); + if (parameterStartTag < databaseStartTag && parameterStartTag != -1) { + return null; + } if (databaseStartTag == -1) { return null; } diff --git a/apm-sniffer/apm-sdk-plugin/jdbc-commons/src/test/java/org/apache/skywalking/apm/plugin/jdbc/connectionurl/parser/URLParserTest.java b/apm-sniffer/apm-sdk-plugin/jdbc-commons/src/test/java/org/apache/skywalking/apm/plugin/jdbc/connectionurl/parser/URLParserTest.java index b832b45e1..b9120aeb7 100644 --- a/apm-sniffer/apm-sdk-plugin/jdbc-commons/src/test/java/org/apache/skywalking/apm/plugin/jdbc/connectionurl/parser/URLParserTest.java +++ b/apm-sniffer/apm-sdk-plugin/jdbc-commons/src/test/java/org/apache/skywalking/apm/plugin/jdbc/connectionurl/parser/URLParserTest.java @@ -57,6 +57,14 @@ public class URLParserTest { assertThat(connectionInfo.getDatabasePeer(), is("primaryhost:3307,secondaryhost1:3306,secondaryhost2:3306")); } + @Test + public void testParseMysqlJDBCURLWitOutDatabase() { + ConnectionInfo connectionInfo = new URLParser().parser("jdbc:mysql//primaryhost:3307?profileSQL=true"); + assertThat(connectionInfo.getDBType(), is("Mysql")); + assertThat(connectionInfo.getDatabaseName(), is("")); + assertThat(connectionInfo.getDatabasePeer(), is("primaryhost:3307")); + } + @Test public void testParseMysqlJDBCURLWithConnectorJs() { ConnectionInfo connectionInfo = new URLParser().parser("jdbc:mysql:replication://master,slave1,slave2,slave3/test");