Commit 93079389 authored by ascrutae's avatar ascrutae
Browse files

support TNS URL of oracle plugin

parent 8e86bc6f
Loading
Loading
Loading
Loading
+6 −6
Original line number Diff line number Diff line
@@ -31,14 +31,14 @@ public abstract class AbstractURLParser implements ConnectionURLParser {
     *
     * @return index range that database hosts.
     */
    protected abstract int[] fetchDatabaseHostsIndexRange();
    protected abstract URLLocation fetchDatabaseHostsIndexRange();

    /**
     * Fetch the index range that database name from connection url.
     *
     * @return index range that database name.
     */
    protected abstract int[] fetchDatabaseNameIndexRange();
    protected abstract URLLocation fetchDatabaseNameIndexRange();

    /**
     * Fetch database host(s) from connection url.
@@ -46,8 +46,8 @@ public abstract class AbstractURLParser implements ConnectionURLParser {
     * @return database host(s).
     */
    protected String fetchDatabaseHostsFromURL() {
        int[] indexRange = fetchDatabaseHostsIndexRange();
        return url.substring(indexRange[0], indexRange[1]);
        URLLocation hostsLocation = fetchDatabaseHostsIndexRange();
        return url.substring(hostsLocation.startIndex(), hostsLocation.endIndex());
    }

    /**
@@ -56,8 +56,8 @@ public abstract class AbstractURLParser implements ConnectionURLParser {
     * @return database name.
     */
    protected String fetchDatabaseNameFromURL() {
        int[] indexRange = fetchDatabaseNameIndexRange();
        return url.substring(indexRange[0], indexRange[1]);
        URLLocation hostsLocation = fetchDatabaseNameIndexRange();
        return url.substring(hostsLocation.startIndex(), hostsLocation.endIndex());
    }

    /**
+4 −4
Original line number Diff line number Diff line
@@ -55,20 +55,20 @@ public class H2URLParser extends AbstractURLParser {
    }

    @Override
    protected int[] fetchDatabaseHostsIndexRange() {
    protected URLLocation fetchDatabaseHostsIndexRange() {
        int hostLabelStartIndex = url.indexOf("//");
        int hostLabelEndIndex = url.indexOf("/", hostLabelStartIndex + 2);
        return new int[] {hostLabelStartIndex + 2, hostLabelEndIndex};
        return new URLLocation(hostLabelStartIndex + 2, hostLabelEndIndex);
    }

    @Override
    protected int[] fetchDatabaseNameIndexRange() {
    protected URLLocation fetchDatabaseNameIndexRange() {
        int databaseStartTag = url.lastIndexOf("/");
        int databaseEndTag = url.indexOf(";");
        if (databaseEndTag == -1) {
            databaseEndTag = url.length();
        }
        return new int[] {databaseStartTag + 1, databaseEndTag};
        return new URLLocation(databaseStartTag + 1, databaseEndTag);
    }

    @Override
+6 −6
Original line number Diff line number Diff line
@@ -41,26 +41,26 @@ public class MysqlURLParser extends AbstractURLParser {
    }

    @Override
    protected int[] fetchDatabaseHostsIndexRange() {
    protected URLLocation fetchDatabaseHostsIndexRange() {
        int hostLabelStartIndex = url.indexOf("//");
        int hostLabelEndIndex = url.indexOf("/", hostLabelStartIndex + 2);
        return new int[] {hostLabelStartIndex + 2, hostLabelEndIndex};
        return new URLLocation(hostLabelStartIndex + 2, hostLabelEndIndex);
    }

    @Override
    protected int[] fetchDatabaseNameIndexRange() {
    protected URLLocation fetchDatabaseNameIndexRange() {
        int databaseStartTag = url.lastIndexOf("/");
        int databaseEndTag = url.indexOf("?", databaseStartTag);
        if (databaseEndTag == -1) {
            databaseEndTag = url.length();
        }
        return new int[] {databaseStartTag + 1, databaseEndTag};
        return new URLLocation(databaseStartTag + 1, databaseEndTag);
    }

    @Override
    public ConnectionInfo parse() {
        int[] hostRangeIndex = fetchDatabaseHostsIndexRange();
        String hosts = url.substring(hostRangeIndex[0], hostRangeIndex[1]);
        URLLocation location = fetchDatabaseHostsIndexRange();
        String hosts = url.substring(location.startIndex(), location.endIndex());
        String[] hostSegment = hosts.split(",");
        if (hostSegment.length > 1) {
            StringBuilder sb = new StringBuilder();
+76 −7
Original line number Diff line number Diff line
@@ -18,8 +18,11 @@

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.plugin.jdbc.trace.ConnectionInfo;
import org.skywalking.apm.util.StringUtil;

/**
 * {@link OracleURLParser} presents that how to parse oracle connection url.
@@ -38,29 +41,61 @@ public class OracleURLParser extends AbstractURLParser {

    private static final String DB_TYPE = "Oracle";
    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) {
        super(url);
    }

    @Override
    protected int[] fetchDatabaseHostsIndexRange() {
        int hostLabelStartIndex = url.indexOf("@");
    protected URLLocation fetchDatabaseHostsIndexRange() {
        int hostLabelStartIndex;
        if (isServiceNameURL()) {
            hostLabelStartIndex = url.indexOf(SERVICE_NAME_FLAG) + 3;
        } else {
            hostLabelStartIndex = url.indexOf("@") + 1;
        }
        int hostLabelEndIndex = url.lastIndexOf(":");
        return new int[] {hostLabelStartIndex + 1, hostLabelEndIndex};
        return new URLLocation(hostLabelStartIndex, hostLabelEndIndex);
    }

    @Override
    protected int[] fetchDatabaseNameIndexRange() {
        return new int[0];
    protected URLLocation fetchDatabaseNameIndexRange() {
        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
    public ConnectionInfo parse() {
        int[] hostRangeIndex = fetchDatabaseHostsIndexRange();
        if (isTNSNameURL()) {
            return tnsNameURLParse();
        } else {
            return commonsURLParse();
        }
    }

    private ConnectionInfo commonsURLParse() {
        String host = fetchDatabaseHostsFromURL();
        String[] hostSegment = splitDatabaseAddress(host);
        String databaseName = url.substring(hostRangeIndex[1] + 1);
        String databaseName = fetchDatabaseNameFromURL();
        if (hostSegment.length == 1) {
            return new ConnectionInfo(ComponentsDefine.ORACLE, DB_TYPE, host, DEFAULT_PORT, databaseName);
        } else {
@@ -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) {
        String[] hostSegment = address.split(":");
        return hostSegment;
+6 −6
Original line number Diff line number Diff line
@@ -41,26 +41,26 @@ public class PostgreSQLURLParser extends AbstractURLParser {
    }

    @Override
    protected int[] fetchDatabaseHostsIndexRange() {
    protected URLLocation fetchDatabaseHostsIndexRange() {
        int hostLabelStartIndex = url.indexOf("//");
        int hostLabelEndIndex = url.indexOf("/", hostLabelStartIndex + 2);
        return new int[] {hostLabelStartIndex + 2, hostLabelEndIndex};
        return new URLLocation(hostLabelStartIndex + 2, hostLabelEndIndex);
    }

    @Override
    protected int[] fetchDatabaseNameIndexRange() {
    protected URLLocation fetchDatabaseNameIndexRange() {
        int databaseStartTag = url.lastIndexOf("/");
        int databaseEndTag = url.indexOf("?", databaseStartTag);
        if (databaseEndTag == -1) {
            databaseEndTag = url.length();
        }
        return new int[] {databaseStartTag + 1, databaseEndTag};
        return new URLLocation(databaseStartTag + 1, databaseEndTag);
    }

    @Override
    public ConnectionInfo parse() {
        int[] hostRangeIndex = fetchDatabaseHostsIndexRange();
        String hosts = url.substring(hostRangeIndex[0], hostRangeIndex[1]);
        URLLocation location = fetchDatabaseHostsIndexRange();
        String hosts = url.substring(location.startIndex(), location.endIndex());
        String[] hostSegment = hosts.split(",");
        if (hostSegment.length > 1) {
            StringBuilder sb = new StringBuilder();
Loading