From 6c4af4e7d10dcda5b7c16de13356ef8b5cdb7f40 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=8A=B9=E5=B8=83=E5=85=88=E7=94=9FM?= Date: Fri, 13 Oct 2023 17:44:56 +0800 Subject: [PATCH] Fix oracle lower case tns url parse error. (#11399) (#621) --- CHANGES.md | 1 + .../connectionurl/parser/OracleURLParser.java | 42 +++++++++++-------- .../connectionurl/parser/URLParserTest.java | 8 ++++ 3 files changed, 34 insertions(+), 17 deletions(-) diff --git a/CHANGES.md b/CHANGES.md index 4ce56aabe..d34b14f91 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 9c14d40ce..e8af5cea5 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. *

@@ -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 hosts = new ArrayList(); 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 ec71036ab..a1d0a910c 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)))");