未验证 提交 03824c2f 编写于 作者: wu-sheng's avatar wu-sheng 提交者: GitHub

Merge pull request #647 from ascrutae/feature/support-oracle-tns-url

support TNS URL of oracle plugin
...@@ -31,14 +31,14 @@ public abstract class AbstractURLParser implements ConnectionURLParser { ...@@ -31,14 +31,14 @@ public abstract class AbstractURLParser implements ConnectionURLParser {
* *
* @return index range that database hosts. * @return index range that database hosts.
*/ */
protected abstract int[] fetchDatabaseHostsIndexRange(); protected abstract URLLocation fetchDatabaseHostsIndexRange();
/** /**
* Fetch the index range that database name from connection url. * Fetch the index range that database name from connection url.
* *
* @return index range that database name. * @return index range that database name.
*/ */
protected abstract int[] fetchDatabaseNameIndexRange(); protected abstract URLLocation fetchDatabaseNameIndexRange();
/** /**
* Fetch database host(s) from connection url. * Fetch database host(s) from connection url.
...@@ -46,8 +46,8 @@ public abstract class AbstractURLParser implements ConnectionURLParser { ...@@ -46,8 +46,8 @@ public abstract class AbstractURLParser implements ConnectionURLParser {
* @return database host(s). * @return database host(s).
*/ */
protected String fetchDatabaseHostsFromURL() { protected String fetchDatabaseHostsFromURL() {
int[] indexRange = fetchDatabaseHostsIndexRange(); URLLocation hostsLocation = fetchDatabaseHostsIndexRange();
return url.substring(indexRange[0], indexRange[1]); return url.substring(hostsLocation.startIndex(), hostsLocation.endIndex());
} }
/** /**
...@@ -56,8 +56,8 @@ public abstract class AbstractURLParser implements ConnectionURLParser { ...@@ -56,8 +56,8 @@ public abstract class AbstractURLParser implements ConnectionURLParser {
* @return database name. * @return database name.
*/ */
protected String fetchDatabaseNameFromURL() { protected String fetchDatabaseNameFromURL() {
int[] indexRange = fetchDatabaseNameIndexRange(); URLLocation hostsLocation = fetchDatabaseNameIndexRange();
return url.substring(indexRange[0], indexRange[1]); return url.substring(hostsLocation.startIndex(), hostsLocation.endIndex());
} }
/** /**
......
...@@ -55,20 +55,20 @@ public class H2URLParser extends AbstractURLParser { ...@@ -55,20 +55,20 @@ public class H2URLParser extends AbstractURLParser {
} }
@Override @Override
protected int[] fetchDatabaseHostsIndexRange() { protected URLLocation fetchDatabaseHostsIndexRange() {
int hostLabelStartIndex = url.indexOf("//"); int hostLabelStartIndex = url.indexOf("//");
int hostLabelEndIndex = url.indexOf("/", hostLabelStartIndex + 2); int hostLabelEndIndex = url.indexOf("/", hostLabelStartIndex + 2);
return new int[] {hostLabelStartIndex + 2, hostLabelEndIndex}; return new URLLocation(hostLabelStartIndex + 2, hostLabelEndIndex);
} }
@Override @Override
protected int[] fetchDatabaseNameIndexRange() { protected URLLocation fetchDatabaseNameIndexRange() {
int databaseStartTag = url.lastIndexOf("/"); int databaseStartTag = url.lastIndexOf("/");
int databaseEndTag = url.indexOf(";"); int databaseEndTag = url.indexOf(";");
if (databaseEndTag == -1) { if (databaseEndTag == -1) {
databaseEndTag = url.length(); databaseEndTag = url.length();
} }
return new int[] {databaseStartTag + 1, databaseEndTag}; return new URLLocation(databaseStartTag + 1, databaseEndTag);
} }
@Override @Override
......
...@@ -41,26 +41,26 @@ public class MysqlURLParser extends AbstractURLParser { ...@@ -41,26 +41,26 @@ public class MysqlURLParser extends AbstractURLParser {
} }
@Override @Override
protected int[] fetchDatabaseHostsIndexRange() { protected URLLocation fetchDatabaseHostsIndexRange() {
int hostLabelStartIndex = url.indexOf("//"); int hostLabelStartIndex = url.indexOf("//");
int hostLabelEndIndex = url.indexOf("/", hostLabelStartIndex + 2); int hostLabelEndIndex = url.indexOf("/", hostLabelStartIndex + 2);
return new int[] {hostLabelStartIndex + 2, hostLabelEndIndex}; return new URLLocation(hostLabelStartIndex + 2, hostLabelEndIndex);
} }
@Override @Override
protected int[] fetchDatabaseNameIndexRange() { protected URLLocation fetchDatabaseNameIndexRange() {
int databaseStartTag = url.lastIndexOf("/"); int databaseStartTag = url.lastIndexOf("/");
int databaseEndTag = url.indexOf("?", databaseStartTag); int databaseEndTag = url.indexOf("?", databaseStartTag);
if (databaseEndTag == -1) { if (databaseEndTag == -1) {
databaseEndTag = url.length(); databaseEndTag = url.length();
} }
return new int[] {databaseStartTag + 1, databaseEndTag}; return new URLLocation(databaseStartTag + 1, databaseEndTag);
} }
@Override @Override
public ConnectionInfo parse() { public ConnectionInfo parse() {
int[] hostRangeIndex = fetchDatabaseHostsIndexRange(); URLLocation location = fetchDatabaseHostsIndexRange();
String hosts = url.substring(hostRangeIndex[0], hostRangeIndex[1]); String hosts = url.substring(location.startIndex(), location.endIndex());
String[] hostSegment = hosts.split(","); String[] hostSegment = hosts.split(",");
if (hostSegment.length > 1) { if (hostSegment.length > 1) {
StringBuilder sb = new StringBuilder(); StringBuilder sb = new StringBuilder();
......
...@@ -18,8 +18,11 @@ ...@@ -18,8 +18,11 @@
package org.skywalking.apm.plugin.jdbc.connectionurl.parser; package org.skywalking.apm.plugin.jdbc.connectionurl.parser;
import java.util.ArrayList;
import java.util.List;
import org.skywalking.apm.network.trace.component.ComponentsDefine; import org.skywalking.apm.network.trace.component.ComponentsDefine;
import org.skywalking.apm.plugin.jdbc.trace.ConnectionInfo; import org.skywalking.apm.plugin.jdbc.trace.ConnectionInfo;
import org.skywalking.apm.util.StringUtil;
/** /**
* {@link OracleURLParser} presents that how to parse oracle connection url. * {@link OracleURLParser} presents that how to parse oracle connection url.
...@@ -38,29 +41,61 @@ public class OracleURLParser extends AbstractURLParser { ...@@ -38,29 +41,61 @@ public class OracleURLParser extends AbstractURLParser {
private static final String DB_TYPE = "Oracle"; private static final String DB_TYPE = "Oracle";
private static final int DEFAULT_PORT = 1521; private static final int DEFAULT_PORT = 1521;
public static final String SERVICE_NAME_FLAG = "@//";
public static final String TNSNAME_URL_FLAG = "DESCRIPTION";
public OracleURLParser(String url) { public OracleURLParser(String url) {
super(url); super(url);
} }
@Override @Override
protected int[] fetchDatabaseHostsIndexRange() { protected URLLocation fetchDatabaseHostsIndexRange() {
int hostLabelStartIndex = url.indexOf("@"); int hostLabelStartIndex;
if (isServiceNameURL()) {
hostLabelStartIndex = url.indexOf(SERVICE_NAME_FLAG) + 3;
} else {
hostLabelStartIndex = url.indexOf("@") + 1;
}
int hostLabelEndIndex = url.lastIndexOf(":"); int hostLabelEndIndex = url.lastIndexOf(":");
return new int[] {hostLabelStartIndex + 1, hostLabelEndIndex}; return new URLLocation(hostLabelStartIndex, hostLabelEndIndex);
} }
@Override @Override
protected int[] fetchDatabaseNameIndexRange() { protected URLLocation fetchDatabaseNameIndexRange() {
return new int[0]; int hostLabelStartIndex;
int hostLabelEndIndex = url.length();
if (isServiceNameURL()) {
hostLabelStartIndex = url.lastIndexOf("/") + 1;
} else if (isTNSNameURL()) {
hostLabelStartIndex = url.indexOf("=", url.indexOf("SERVICE_NAME")) + 1;
hostLabelEndIndex = url.indexOf(")", hostLabelStartIndex);
} else {
hostLabelStartIndex = url.lastIndexOf(":") + 1;
}
return new URLLocation(hostLabelStartIndex, hostLabelEndIndex);
}
private boolean isServiceNameURL() {
return url.contains(SERVICE_NAME_FLAG);
}
private boolean isTNSNameURL() {
return url.contains(TNSNAME_URL_FLAG);
} }
@Override @Override
public ConnectionInfo parse() { public ConnectionInfo parse() {
int[] hostRangeIndex = fetchDatabaseHostsIndexRange(); if (isTNSNameURL()) {
return tnsNameURLParse();
} else {
return commonsURLParse();
}
}
private ConnectionInfo commonsURLParse() {
String host = fetchDatabaseHostsFromURL(); String host = fetchDatabaseHostsFromURL();
String[] hostSegment = splitDatabaseAddress(host); String[] hostSegment = splitDatabaseAddress(host);
String databaseName = url.substring(hostRangeIndex[1] + 1); String databaseName = fetchDatabaseNameFromURL();
if (hostSegment.length == 1) { if (hostSegment.length == 1) {
return new ConnectionInfo(ComponentsDefine.ORACLE, DB_TYPE, host, DEFAULT_PORT, databaseName); return new ConnectionInfo(ComponentsDefine.ORACLE, DB_TYPE, host, DEFAULT_PORT, databaseName);
} else { } else {
...@@ -68,6 +103,40 @@ public class OracleURLParser extends AbstractURLParser { ...@@ -68,6 +103,40 @@ public class OracleURLParser extends AbstractURLParser {
} }
} }
private ConnectionInfo tnsNameURLParse() {
String host = parseDatabaseHostsFromURL();
String databaseName = fetchDatabaseNameFromURL();
return new ConnectionInfo(ComponentsDefine.ORACLE, DB_TYPE, host, databaseName);
}
private String parseDatabaseHostsFromURL() {
int beginIndex = url.indexOf("DESCRIPTION");
List<String> hosts = new ArrayList<String>();
do {
int hostStartIndex = url.indexOf("HOST", beginIndex);
if (hostStartIndex == -1) {
break;
}
int equalStartIndex = url.indexOf("=", hostStartIndex);
int hostEndIndex = url.indexOf(")", hostStartIndex);
String host = url.substring(equalStartIndex + 1, hostEndIndex);
int port = DEFAULT_PORT;
int portStartIndex = url.indexOf("PORT", hostEndIndex);
int portEndIndex = url.length();
if (portStartIndex != -1) {
int portEqualStartIndex = url.indexOf("=", portStartIndex);
portEndIndex = url.indexOf(")", portEqualStartIndex);
port = Integer.parseInt(url.substring(portEqualStartIndex + 1, portEndIndex).trim());
}
hosts.add(host.trim() + ":" + port);
beginIndex = portEndIndex;
}
while (true);
return StringUtil.join(',', hosts.toArray(new String[0]));
}
private String[] splitDatabaseAddress(String address) { private String[] splitDatabaseAddress(String address) {
String[] hostSegment = address.split(":"); String[] hostSegment = address.split(":");
return hostSegment; return hostSegment;
......
...@@ -41,26 +41,26 @@ public class PostgreSQLURLParser extends AbstractURLParser { ...@@ -41,26 +41,26 @@ public class PostgreSQLURLParser extends AbstractURLParser {
} }
@Override @Override
protected int[] fetchDatabaseHostsIndexRange() { protected URLLocation fetchDatabaseHostsIndexRange() {
int hostLabelStartIndex = url.indexOf("//"); int hostLabelStartIndex = url.indexOf("//");
int hostLabelEndIndex = url.indexOf("/", hostLabelStartIndex + 2); int hostLabelEndIndex = url.indexOf("/", hostLabelStartIndex + 2);
return new int[] {hostLabelStartIndex + 2, hostLabelEndIndex}; return new URLLocation(hostLabelStartIndex + 2, hostLabelEndIndex);
} }
@Override @Override
protected int[] fetchDatabaseNameIndexRange() { protected URLLocation fetchDatabaseNameIndexRange() {
int databaseStartTag = url.lastIndexOf("/"); int databaseStartTag = url.lastIndexOf("/");
int databaseEndTag = url.indexOf("?", databaseStartTag); int databaseEndTag = url.indexOf("?", databaseStartTag);
if (databaseEndTag == -1) { if (databaseEndTag == -1) {
databaseEndTag = url.length(); databaseEndTag = url.length();
} }
return new int[] {databaseStartTag + 1, databaseEndTag}; return new URLLocation(databaseStartTag + 1, databaseEndTag);
} }
@Override @Override
public ConnectionInfo parse() { public ConnectionInfo parse() {
int[] hostRangeIndex = fetchDatabaseHostsIndexRange(); URLLocation location = fetchDatabaseHostsIndexRange();
String hosts = url.substring(hostRangeIndex[0], hostRangeIndex[1]); String hosts = url.substring(location.startIndex(), location.endIndex());
String[] hostSegment = hosts.split(","); String[] hostSegment = hosts.split(",");
if (hostSegment.length > 1) { if (hostSegment.length > 1) {
StringBuilder sb = new StringBuilder(); StringBuilder sb = new StringBuilder();
......
/*
* Copyright 2017, OpenSkywalking Organization All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
* Project repository: https://github.com/OpenSkywalking/skywalking
*/
package org.skywalking.apm.plugin.jdbc.connectionurl.parser;
public class URLLocation {
private final int startIndex;
private final int endIndex;
public URLLocation(int startIndex, int endIndex) {
this.startIndex = startIndex;
this.endIndex = endIndex;
}
public int startIndex() {
return startIndex;
}
public int endIndex() {
return endIndex;
}
}
...@@ -73,6 +73,30 @@ public class URLParserTest { ...@@ -73,6 +73,30 @@ public class URLParserTest {
assertThat(connectionInfo.getDatabasePeer(), is("localhost:1522")); assertThat(connectionInfo.getDatabasePeer(), is("localhost:1522"));
} }
@Test
public void testParseOracleServiceName() {
ConnectionInfo connectionInfo = new URLParser().parser("jdbc:oracle:thin:@//localhost:1521/orcl");
assertThat(connectionInfo.getDBType(), is("Oracle"));
assertThat(connectionInfo.getDatabaseName(), is("orcl"));
assertThat(connectionInfo.getDatabasePeer(), is("localhost:1521"));
}
@Test
public void testParseOracleTNSName() {
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)))");
assertThat(connectionInfo.getDBType(), is("Oracle"));
assertThat(connectionInfo.getDatabaseName(), is("orcl"));
assertThat(connectionInfo.getDatabasePeer(), is("hostA:1523,hostB:1521"));
}
@Test @Test
public void testParseOracleJDBCURLWithUserNameAndPassword() { public void testParseOracleJDBCURLWithUserNameAndPassword() {
ConnectionInfo connectionInfo = new URLParser().parser("jdbc:oracle:thin:scott/tiger@myhost:1521:orcl"); ConnectionInfo connectionInfo = new URLParser().parser("jdbc:oracle:thin:scott/tiger@myhost:1521:orcl");
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册