From f19195368916e9514d19084eb1a29737c74bd25b Mon Sep 17 00:00:00 2001 From: lpcy <70789644+lpcy@users.noreply.github.com> Date: Sat, 4 Sep 2021 22:03:25 +0800 Subject: [PATCH] fix multi-db-instance on same host port (#18) --- CHANGES.md | 1 + .../jdbc/mysql/v5/ConnectionCreate5xInterceptor.java | 2 +- .../jdbc/mysql/v6/ConnectionCreateOldInterceptor.java | 7 ++++++- .../jdbc/mysql/v8/ConnectionCreateInterceptor.java | 2 +- .../apm/plugin/jdbc/mysql/ConnectionCache.java | 10 +++++----- 5 files changed, 14 insertions(+), 8 deletions(-) diff --git a/CHANGES.md b/CHANGES.md index 5e07b6183..a393f3263 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -16,6 +16,7 @@ Release Notes. * Advanced Kafka Producer configuration enhancement. * Support mTLS for gRPC channel. * fix the bug that plugin record wrong time elapse for lettuce plugin +* fix the bug that the wrong db.instance value displayed on Skywalking-UI when existing multi-database-instance on same host port pair. #### Documentation diff --git a/apm-sniffer/apm-sdk-plugin/mysql-5.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/jdbc/mysql/v5/ConnectionCreate5xInterceptor.java b/apm-sniffer/apm-sdk-plugin/mysql-5.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/jdbc/mysql/v5/ConnectionCreate5xInterceptor.java index 11226b8a9..2438c4ad3 100644 --- a/apm-sniffer/apm-sdk-plugin/mysql-5.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/jdbc/mysql/v5/ConnectionCreate5xInterceptor.java +++ b/apm-sniffer/apm-sdk-plugin/mysql-5.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/jdbc/mysql/v5/ConnectionCreate5xInterceptor.java @@ -42,7 +42,7 @@ public class ConnectionCreate5xInterceptor implements StaticMethodsAroundInterce public Object afterMethod(Class clazz, Method method, Object[] allArguments, Class[] parameterTypes, Object ret) { if (ret instanceof EnhancedInstance) { - ConnectionInfo connectionInfo = ConnectionCache.get(allArguments[0].toString(), allArguments[1].toString()); + ConnectionInfo connectionInfo = ConnectionCache.get(allArguments[0].toString(), allArguments[1].toString(), allArguments[3].toString()); if (connectionInfo == null) { connectionInfo = URLParser.parser(allArguments[4].toString()); } diff --git a/apm-sniffer/apm-sdk-plugin/mysql-6.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/jdbc/mysql/v6/ConnectionCreateOldInterceptor.java b/apm-sniffer/apm-sdk-plugin/mysql-6.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/jdbc/mysql/v6/ConnectionCreateOldInterceptor.java index 8ab712678..db405f0a7 100644 --- a/apm-sniffer/apm-sdk-plugin/mysql-6.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/jdbc/mysql/v6/ConnectionCreateOldInterceptor.java +++ b/apm-sniffer/apm-sdk-plugin/mysql-6.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/jdbc/mysql/v6/ConnectionCreateOldInterceptor.java @@ -41,7 +41,12 @@ public class ConnectionCreateOldInterceptor implements StaticMethodsAroundInterc public Object afterMethod(Class clazz, Method method, Object[] allArguments, Class[] parameterTypes, Object ret) { if (ret instanceof EnhancedInstance) { - ConnectionInfo connectionInfo = ConnectionCache.get(allArguments[1].toString(), allArguments[2].toString()); + String database = ""; + try { + Method getDbMethod = parameterTypes[0].getDeclaredMethod("getDatabase"); + database = (String) getDbMethod.invoke(allArguments[0]); + } catch (Throwable t) { } + ConnectionInfo connectionInfo = ConnectionCache.get(allArguments[1].toString(), allArguments[2].toString(), database); ((EnhancedInstance) ret).setSkyWalkingDynamicField(connectionInfo); } return ret; diff --git a/apm-sniffer/apm-sdk-plugin/mysql-8.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/jdbc/mysql/v8/ConnectionCreateInterceptor.java b/apm-sniffer/apm-sdk-plugin/mysql-8.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/jdbc/mysql/v8/ConnectionCreateInterceptor.java index 6e3b804a8..61ab259c1 100644 --- a/apm-sniffer/apm-sdk-plugin/mysql-8.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/jdbc/mysql/v8/ConnectionCreateInterceptor.java +++ b/apm-sniffer/apm-sdk-plugin/mysql-8.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/jdbc/mysql/v8/ConnectionCreateInterceptor.java @@ -40,7 +40,7 @@ public class ConnectionCreateInterceptor implements StaticMethodsAroundIntercept Object ret) { if (ret instanceof EnhancedInstance) { final HostInfo hostInfo = (HostInfo) allArguments[0]; - ConnectionInfo connectionInfo = ConnectionCache.get(hostInfo.getHostPortPair()); + ConnectionInfo connectionInfo = ConnectionCache.get(hostInfo.getHostPortPair(), hostInfo.getDatabase()); ((EnhancedInstance) ret).setSkyWalkingDynamicField(connectionInfo); } return ret; diff --git a/apm-sniffer/apm-sdk-plugin/mysql-common/src/main/java/org/apache/skywalking/apm/plugin/jdbc/mysql/ConnectionCache.java b/apm-sniffer/apm-sdk-plugin/mysql-common/src/main/java/org/apache/skywalking/apm/plugin/jdbc/mysql/ConnectionCache.java index 055e09dd5..890af81cf 100644 --- a/apm-sniffer/apm-sdk-plugin/mysql-common/src/main/java/org/apache/skywalking/apm/plugin/jdbc/mysql/ConnectionCache.java +++ b/apm-sniffer/apm-sdk-plugin/mysql-common/src/main/java/org/apache/skywalking/apm/plugin/jdbc/mysql/ConnectionCache.java @@ -28,19 +28,19 @@ public class ConnectionCache { private static final String CONNECTION_SPLIT_STR = ","; - public static ConnectionInfo get(String host, String port) { - final String hostPortPair = String.format("%s:%s", host, port); + public static ConnectionInfo get(String host, String port, String databaseName) { + final String hostPortPair = String.format("%s:%s/%s", host, port, databaseName); return CONNECTIONS_MAP.get(hostPortPair); } - public static ConnectionInfo get(String hostPortPair) { - return CONNECTIONS_MAP.get(hostPortPair); + public static ConnectionInfo get(String hostPortPair, String databaseName) { + return CONNECTIONS_MAP.get(hostPortPair + "/" + databaseName); } public static void save(ConnectionInfo connectionInfo) { for (String conn : connectionInfo.getDatabasePeer().split(CONNECTION_SPLIT_STR)) { if (!StringUtil.isEmpty(conn)) { - CONNECTIONS_MAP.putIfAbsent(conn, connectionInfo); + CONNECTIONS_MAP.putIfAbsent(conn + "/" + connectionInfo.getDatabaseName(), connectionInfo); } } }