This is an automated email from the ASF dual-hosted git repository. wusheng pushed a commit to branch main in repository https://gitbox.apache.org/repos/asf/skywalking-java.git
The following commit(s) were added to refs/heads/main by this push: new 6c4af4e7d1 Fix oracle lower case tns url parse error. (#11399) (#621) 6c4af4e7d1 is described below commit 6c4af4e7d10dcda5b7c16de13356ef8b5cdb7f40 Author: 抹布先生M <lcbia...@gmail.com> AuthorDate: Fri Oct 13 17:44:56 2023 +0800 Fix oracle lower case tns url parse error. (#11399) (#621) --- CHANGES.md | 1 + .../jdbc/connectionurl/parser/OracleURLParser.java | 42 +++++++++++++--------- .../jdbc/connectionurl/parser/URLParserTest.java | 8 +++++ 3 files changed, 34 insertions(+), 17 deletions(-) diff --git a/CHANGES.md b/CHANGES.md index 4ce56aabea..d34b14f914 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -13,6 +13,7 @@ Release Notes. * Add max length configurations in `agent.config` file for service_name and instance_name * Optimize spring-cloud-gateway 2.1.x, 3.x witness class. * Support report MongoDB instance info in Mongodb 4.x plugin. +* To compatible upper and lower case Oracle TNS url parse. #### Documentation diff --git a/apm-sniffer/apm-sdk-plugin/jdbc-commons/src/main/java/org/apache/skywalking/apm/plugin/jdbc/connectionurl/parser/OracleURLParser.java b/apm-sniffer/apm-sdk-plugin/jdbc-commons/src/main/java/org/apache/skywalking/apm/plugin/jdbc/connectionurl/parser/OracleURLParser.java index 9c14d40ce5..e8af5cea54 100644 --- a/apm-sniffer/apm-sdk-plugin/jdbc-commons/src/main/java/org/apache/skywalking/apm/plugin/jdbc/connectionurl/parser/OracleURLParser.java +++ b/apm-sniffer/apm-sdk-plugin/jdbc-commons/src/main/java/org/apache/skywalking/apm/plugin/jdbc/connectionurl/parser/OracleURLParser.java @@ -18,12 +18,13 @@ package org.apache.skywalking.apm.plugin.jdbc.connectionurl.parser; -import java.util.ArrayList; -import java.util.List; import org.apache.skywalking.apm.network.trace.component.ComponentsDefine; import org.apache.skywalking.apm.plugin.jdbc.trace.ConnectionInfo; import org.apache.skywalking.apm.util.StringUtil; +import java.util.ArrayList; +import java.util.List; + /** * {@link OracleURLParser} presents that how to parse oracle connection url. * <p> @@ -36,9 +37,16 @@ public class OracleURLParser extends AbstractURLParser { private static final int DEFAULT_PORT = 1521; public static final String SERVICE_NAME_FLAG = "@//"; public static final String TNSNAME_URL_FLAG = "DESCRIPTION"; + public static final String SERVICE_NAME_FIELD = "SERVICE_NAME"; + public static final String HOST_FIELD = "HOST"; + public static final String PORT_FIELD = "PORT"; + + // only use to indexOf TNS url keyword + private final String upperUrl; public OracleURLParser(String url) { super(url); + upperUrl = url == null ? null : url.toUpperCase(); } @Override @@ -63,24 +71,24 @@ public class OracleURLParser extends AbstractURLParser { @Override protected URLLocation fetchDatabaseNameIndexRange() { int hostLabelStartIndex; - int hostLabelEndIndex = url.length(); + int hostLabelEndIndex = upperUrl.length(); if (isServiceNameURL()) { - hostLabelStartIndex = url.lastIndexOf("/") + 1; + hostLabelStartIndex = upperUrl.lastIndexOf("/") + 1; } else if (isTNSNameURL()) { - hostLabelStartIndex = url.indexOf("=", url.indexOf("SERVICE_NAME")) + 1; - hostLabelEndIndex = url.indexOf(")", hostLabelStartIndex); + hostLabelStartIndex = upperUrl.indexOf("=", upperUrl.indexOf(SERVICE_NAME_FIELD)) + 1; + hostLabelEndIndex = upperUrl.indexOf(")", hostLabelStartIndex); } else { - hostLabelStartIndex = url.lastIndexOf(":") + 1; + hostLabelStartIndex = upperUrl.lastIndexOf(":") + 1; } return new URLLocation(hostLabelStartIndex, hostLabelEndIndex); } private boolean isServiceNameURL() { - return url.contains(SERVICE_NAME_FLAG); + return upperUrl.contains(SERVICE_NAME_FLAG); } private boolean isTNSNameURL() { - return url.contains(TNSNAME_URL_FLAG); + return upperUrl.contains(TNSNAME_URL_FLAG); } @Override @@ -110,23 +118,23 @@ public class OracleURLParser extends AbstractURLParser { } private String parseDatabaseHostsFromURL() { - int beginIndex = url.indexOf("DESCRIPTION"); + int beginIndex = upperUrl.indexOf(TNSNAME_URL_FLAG); List<String> hosts = new ArrayList<String>(); do { - int hostStartIndex = url.indexOf("HOST", beginIndex); + int hostStartIndex = upperUrl.indexOf(HOST_FIELD, beginIndex); if (hostStartIndex == -1) { break; } - int equalStartIndex = url.indexOf("=", hostStartIndex); - int hostEndIndex = url.indexOf(")", hostStartIndex); + int equalStartIndex = upperUrl.indexOf("=", hostStartIndex); + int hostEndIndex = upperUrl.indexOf(")", hostStartIndex); String host = url.substring(equalStartIndex + 1, hostEndIndex); int port = DEFAULT_PORT; - int portStartIndex = url.indexOf("PORT", hostEndIndex); - int portEndIndex = url.length(); + int portStartIndex = upperUrl.indexOf(PORT_FIELD, hostEndIndex); + int portEndIndex = upperUrl.length(); if (portStartIndex != -1) { - int portEqualStartIndex = url.indexOf("=", portStartIndex); - portEndIndex = url.indexOf(")", portEqualStartIndex); + int portEqualStartIndex = upperUrl.indexOf("=", portStartIndex); + portEndIndex = upperUrl.indexOf(")", portEqualStartIndex); port = Integer.parseInt(url.substring(portEqualStartIndex + 1, portEndIndex).trim()); } hosts.add(host.trim() + ":" + port); 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 ec71036abe..a1d0a910c7 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 @@ -113,6 +113,14 @@ public class URLParserTest { assertThat(connectionInfo.getDatabasePeer(), is("localhost:1521")); } + @Test + public void testParseOracleLowerTNSName() { + ConnectionInfo connectionInfo = new URLParser().parser("jdbc:oracle:thin:@(description=(address=(protocol=tcp)(host= localhost )(port= 1521))(connect_data=(server=dedicated)(service_name=orcl)))"); + assertThat(connectionInfo.getDBType(), is("Oracle")); + assertThat(connectionInfo.getDatabaseName(), is("orcl")); + assertThat(connectionInfo.getDatabasePeer(), is("localhost:1521")); + } + @Test public void testParseOracleTNSNameWithMultiAddress() { ConnectionInfo connectionInfo = new URLParser().parser("jdbc:oracle:thin:@(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL= TCP)(HOST=hostA)(PORT= 1523 ))(ADDRESS=(PROTOCOL=TCP)(HOST=hostB)(PORT= 1521 )))(SOURCE_ROUTE=yes)(CONNECT_DATA=(SERVICE_NAME=orcl)))");