From 0b47d1c44a89da5588e95d229a2927f0da9314a1 Mon Sep 17 00:00:00 2001 From: wusheng Date: Wed, 15 Jun 2016 17:11:33 +0800 Subject: [PATCH] =?UTF-8?q?=E4=B8=8A=E4=BC=A0=E9=83=A8=E5=88=86jdbc?= =?UTF-8?q?=E9=A9=B1=E5=8A=A8=E7=9A=84=E4=BF=AE=E6=94=B9=EF=BC=8C=E9=9C=80?= =?UTF-8?q?=E8=A6=81=E5=90=8E=E7=BB=AD=E5=AE=8C=E5=96=84=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../plugin/jdbc/JDBCPluginDefine.java | 37 ++-- .../plugin/jdbc/driver/DriverChooser.java | 10 +- .../plugin/jdbc/driver/TracingDriver.java | 164 +++++++++--------- ...operties => driver-mapping-url.properties} | 0 .../v2/plugin/JedisClusterInterceptor.java | 4 +- .../jedis/v2/plugin/JedisInterceptor.java | 8 +- 6 files changed, 120 insertions(+), 103 deletions(-) rename skywalking-sdk-plugin/jdbc-plugin/src/main/resources/{conurl-driver-mapping.properties => driver-mapping-url.properties} (100%) diff --git a/skywalking-sdk-plugin/jdbc-plugin/src/main/java/com/ai/cloud/skywalking/plugin/jdbc/JDBCPluginDefine.java b/skywalking-sdk-plugin/jdbc-plugin/src/main/java/com/ai/cloud/skywalking/plugin/jdbc/JDBCPluginDefine.java index 3602c81e9..375a5403b 100644 --- a/skywalking-sdk-plugin/jdbc-plugin/src/main/java/com/ai/cloud/skywalking/plugin/jdbc/JDBCPluginDefine.java +++ b/skywalking-sdk-plugin/jdbc-plugin/src/main/java/com/ai/cloud/skywalking/plugin/jdbc/JDBCPluginDefine.java @@ -1,36 +1,39 @@ package com.ai.cloud.skywalking.plugin.jdbc; -import com.ai.cloud.skywalking.plugin.boot.BootException; -import com.ai.cloud.skywalking.plugin.boot.BootPluginDefine; -import com.ai.cloud.skywalking.plugin.jdbc.driver.TracingDriver; -import org.apache.logging.log4j.LogManager; -import org.apache.logging.log4j.Logger; - import java.lang.reflect.Constructor; import java.lang.reflect.Field; import java.sql.Driver; import java.sql.DriverManager; import java.util.concurrent.CopyOnWriteArrayList; -public class JDBCPluginDefine extends BootPluginDefine { +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; - private Logger logger = LogManager.getLogger(JDBCPluginDefine.class); +import com.ai.cloud.skywalking.plugin.boot.BootException; +import com.ai.cloud.skywalking.plugin.boot.BootPluginDefine; +import com.ai.cloud.skywalking.plugin.jdbc.driver.TracingDriver; + +public class JDBCPluginDefine extends BootPluginDefine { + private static Logger logger = LogManager.getLogger(JDBCPluginDefine.class); @Override protected void boot() throws BootException { try { - Class classes = Class.forName("java.sql.DriverInfo"); - Constructor constructor = classes.getDeclaredConstructor(Driver.class); + Class classes = Class.forName("java.sql.DriverInfo"); + Constructor constructor = classes.getDeclaredConstructor(Driver.class); constructor.setAccessible(true); Object traceDriverInfo = constructor.newInstance(new TracingDriver()); Field field = DriverManager.class.getDeclaredField("registeredDrivers"); field.setAccessible(true); - CopyOnWriteArrayList copyOnWriteArrayList = (CopyOnWriteArrayList) field.get(DriverManager.class); + @SuppressWarnings("unchecked") + CopyOnWriteArrayList copyOnWriteArrayList = (CopyOnWriteArrayList) field.get(DriverManager.class); copyOnWriteArrayList.add(0, traceDriverInfo); - } catch (Exception e) { - // 开启补偿机制 - logger.error("Failed to change the byte code of DriverManger, Will open compensation mechanism.", e); - TracingDriver.registerDriver(); - } - } + } catch (Throwable e) { + // 开启补偿机制 + logger.error( + "Failed to inject TracingDriver to the top of registered Drivers. Need to alter jdbc url to trace.", + e); + TracingDriver.registerDriver(); + } + } } diff --git a/skywalking-sdk-plugin/jdbc-plugin/src/main/java/com/ai/cloud/skywalking/plugin/jdbc/driver/DriverChooser.java b/skywalking-sdk-plugin/jdbc-plugin/src/main/java/com/ai/cloud/skywalking/plugin/jdbc/driver/DriverChooser.java index a8da8a7e4..182d718b9 100644 --- a/skywalking-sdk-plugin/jdbc-plugin/src/main/java/com/ai/cloud/skywalking/plugin/jdbc/driver/DriverChooser.java +++ b/skywalking-sdk-plugin/jdbc-plugin/src/main/java/com/ai/cloud/skywalking/plugin/jdbc/driver/DriverChooser.java @@ -5,16 +5,20 @@ import java.sql.Driver; import java.util.Map; import java.util.Properties; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; + public class DriverChooser { + private static Logger logger = LogManager.getLogger(DriverChooser.class); private static Properties urlDriverMapping = new Properties(); static { - InputStream inputStream = DriverChooser.class.getResourceAsStream("/conurl-driver-mapping.properties"); + InputStream inputStream = DriverChooser.class.getResourceAsStream("/driver-mapping-url.properties"); try { urlDriverMapping.load(inputStream); } catch (Exception e) { - System.err.println("Failed to load conurl-driver-mapping.properties"); + logger.error("Failed to load driver-mapping-url.properties"); } } @@ -24,7 +28,7 @@ public class DriverChooser { Driver driver = null; for (Map.Entry entry : urlDriverMapping.entrySet()) { if (url.startsWith(entry.getValue().toString())) { - Class driverClass = Class.forName(entry.getKey().toString()); + Class driverClass = Class.forName(entry.getKey().toString()); driver = (Driver) driverClass.newInstance(); } } diff --git a/skywalking-sdk-plugin/jdbc-plugin/src/main/java/com/ai/cloud/skywalking/plugin/jdbc/driver/TracingDriver.java b/skywalking-sdk-plugin/jdbc-plugin/src/main/java/com/ai/cloud/skywalking/plugin/jdbc/driver/TracingDriver.java index e2808eabe..44ebdaef1 100755 --- a/skywalking-sdk-plugin/jdbc-plugin/src/main/java/com/ai/cloud/skywalking/plugin/jdbc/driver/TracingDriver.java +++ b/skywalking-sdk-plugin/jdbc-plugin/src/main/java/com/ai/cloud/skywalking/plugin/jdbc/driver/TracingDriver.java @@ -1,107 +1,115 @@ package com.ai.cloud.skywalking.plugin.jdbc.driver; -import com.ai.cloud.skywalking.conf.AuthDesc; - -import java.sql.*; +import java.sql.Driver; +import java.sql.DriverManager; +import java.sql.DriverPropertyInfo; +import java.sql.SQLException; +import java.sql.SQLFeatureNotSupportedException; import java.util.Properties; import java.util.logging.Logger; +import org.apache.logging.log4j.LogManager; + +import com.ai.cloud.skywalking.conf.AuthDesc; + public class TracingDriver implements Driver { + private static org.apache.logging.log4j.Logger logger = LogManager.getLogger(TracingDriver.class); - private static final String TRACING_SIGN = "tracing:"; + private static final String TRACING_SIGN = "tracing:"; - private static boolean isOpenCompensation = false; + private static boolean isOpenCompensation = false; - public static final void registerDriver() { + public static final void registerDriver() { try { DriverManager.registerDriver(new TracingDriver()); isOpenCompensation = true; } catch (SQLException e) { - throw new RuntimeException("register " - + TracingDriver.class.getName() + " driver failure."); + logger.error("register TracingDriver failure.", e); } } - private Driver realDriver; + private Driver realDriver; - private Driver chooseDriver(String url) throws IllegalAccessException, - InstantiationException, ClassNotFoundException, SQLException { - if (realDriver == null) { - this.realDriver = DriverChooser.choose(url); - } - return realDriver; - } + private Driver chooseDriver(String url) throws IllegalAccessException, + InstantiationException, ClassNotFoundException, SQLException { + if (realDriver == null) { + this.realDriver = DriverChooser.choose(url); + } + return realDriver; + } - private String getRealUrl(String url) throws SQLException { - if (!isOpenCompensation) { - return url; - } else { - if (url.toLowerCase().startsWith(TRACING_SIGN)) { - return url.substring(TRACING_SIGN.length()); - } else { - throw new SQLException("tracing jdbc url must start with 'tracing:'"); - } - } - } + private String getRealUrl(String url) throws SQLException { + if (!isOpenCompensation) { + return url; + } else { + if (url.toLowerCase().startsWith(TRACING_SIGN)) { + return url.substring(TRACING_SIGN.length()); + } else { + throw new SQLException( + "tracing jdbc url must start with 'tracing:'"); + } + } + } - public java.sql.Connection connect(String url, Properties info) throws SQLException { - java.sql.Connection conn = null; + public java.sql.Connection connect(String url, Properties info) + throws SQLException { + java.sql.Connection conn = null; - try { - conn = chooseDriver(getRealUrl(url)).connect(getRealUrl(url), info); - } catch (Exception e) { - throw new SQLException(e); - } + try { + conn = chooseDriver(getRealUrl(url)).connect(getRealUrl(url), info); + } catch (Exception e) { + throw new SQLException(e); + } - if (!AuthDesc.isAuth()) { - return conn; - } else { - return new SWConnection(getRealUrl(url), info, conn); - } - } + if (!AuthDesc.isAuth()) { + return conn; + } else { + return new SWConnection(getRealUrl(url), info, conn); + } + } - public boolean acceptsURL(String url) throws SQLException { - Driver driver = null; - try { - driver = chooseDriver(getRealUrl(url)); - } catch (Exception e) { - throw new SQLException(e); - } - return driver.acceptsURL(getRealUrl(url)); - } + public boolean acceptsURL(String url) throws SQLException { + Driver driver = null; + try { + driver = chooseDriver(getRealUrl(url)); + } catch (Exception e) { + throw new SQLException(e); + } + return driver.acceptsURL(getRealUrl(url)); + } - public DriverPropertyInfo[] getPropertyInfo(String url, Properties info) - throws SQLException { - Driver driver = null; - try { - driver = chooseDriver(getRealUrl(url)); - } catch (Exception e) { - throw new SQLException(e); - } - return driver.getPropertyInfo(getRealUrl(url), info); - } + public DriverPropertyInfo[] getPropertyInfo(String url, Properties info) + throws SQLException { + Driver driver = null; + try { + driver = chooseDriver(getRealUrl(url)); + } catch (Exception e) { + throw new SQLException(e); + } + return driver.getPropertyInfo(getRealUrl(url), info); + } - public int getMajorVersion() { - return safeIntParse("1"); - } + public int getMajorVersion() { + return safeIntParse("1"); + } - public int getMinorVersion() { - return safeIntParse("0"); - } + public int getMinorVersion() { + return safeIntParse("0"); + } - public boolean jdbcCompliant() { - return false; - } + public boolean jdbcCompliant() { + return false; + } - public Logger getParentLogger() throws SQLFeatureNotSupportedException { - return null; - } + public Logger getParentLogger() throws SQLFeatureNotSupportedException { + return null; + } - private static int safeIntParse(String intAsString) { - try { - return Integer.parseInt(intAsString); - } catch (NumberFormatException nfe) { - } - return 0; - } + private static int safeIntParse(String intAsString) { + try { + return Integer.parseInt(intAsString); + } catch (NumberFormatException nfe) { + } + return 0; + } } diff --git a/skywalking-sdk-plugin/jdbc-plugin/src/main/resources/conurl-driver-mapping.properties b/skywalking-sdk-plugin/jdbc-plugin/src/main/resources/driver-mapping-url.properties similarity index 100% rename from skywalking-sdk-plugin/jdbc-plugin/src/main/resources/conurl-driver-mapping.properties rename to skywalking-sdk-plugin/jdbc-plugin/src/main/resources/driver-mapping-url.properties diff --git a/skywalking-sdk-plugin/jedis-2.x-plugin/src/main/java/com/ai/cloud/skywalking/jedis/v2/plugin/JedisClusterInterceptor.java b/skywalking-sdk-plugin/jedis-2.x-plugin/src/main/java/com/ai/cloud/skywalking/jedis/v2/plugin/JedisClusterInterceptor.java index 732783ff9..90cda05ff 100644 --- a/skywalking-sdk-plugin/jedis-2.x-plugin/src/main/java/com/ai/cloud/skywalking/jedis/v2/plugin/JedisClusterInterceptor.java +++ b/skywalking-sdk-plugin/jedis-2.x-plugin/src/main/java/com/ai/cloud/skywalking/jedis/v2/plugin/JedisClusterInterceptor.java @@ -2,6 +2,7 @@ package com.ai.cloud.skywalking.jedis.v2.plugin; import com.ai.cloud.skywalking.plugin.interceptor.ConstructorInvokeContext; import com.ai.cloud.skywalking.plugin.interceptor.EnhancedClassInstanceContext; + import redis.clients.jedis.HostAndPort; import java.util.Set; @@ -15,7 +16,8 @@ public class JedisClusterInterceptor extends JedisBaseInterceptor { StringBuilder redisConnInfo = new StringBuilder(); if (interceptorContext.allArguments().length > 0) { if (interceptorContext.allArguments()[0] instanceof Set) { - Set hostAndPorts = (Set) interceptorContext.allArguments()[0]; + @SuppressWarnings("unchecked") + Set hostAndPorts = (Set) interceptorContext.allArguments()[0]; for (HostAndPort hostAndPort : hostAndPorts) { redisConnInfo.append(hostAndPort.toString()).append(";"); } diff --git a/skywalking-sdk-plugin/jedis-2.x-plugin/src/main/java/com/ai/cloud/skywalking/jedis/v2/plugin/JedisInterceptor.java b/skywalking-sdk-plugin/jedis-2.x-plugin/src/main/java/com/ai/cloud/skywalking/jedis/v2/plugin/JedisInterceptor.java index 5a5896f11..0926bfa49 100644 --- a/skywalking-sdk-plugin/jedis-2.x-plugin/src/main/java/com/ai/cloud/skywalking/jedis/v2/plugin/JedisInterceptor.java +++ b/skywalking-sdk-plugin/jedis-2.x-plugin/src/main/java/com/ai/cloud/skywalking/jedis/v2/plugin/JedisInterceptor.java @@ -1,11 +1,11 @@ package com.ai.cloud.skywalking.jedis.v2.plugin; -import com.ai.cloud.skywalking.buriedpoint.RPCBuriedPointSender; -import com.ai.cloud.skywalking.plugin.interceptor.ConstructorInvokeContext; -import com.ai.cloud.skywalking.plugin.interceptor.EnhancedClassInstanceContext; +import java.net.URI; + import redis.clients.jedis.JedisShardInfo; -import java.net.URI; +import com.ai.cloud.skywalking.plugin.interceptor.ConstructorInvokeContext; +import com.ai.cloud.skywalking.plugin.interceptor.EnhancedClassInstanceContext; public class JedisInterceptor extends JedisBaseInterceptor {