From ef07b164571ef82edb58525c8482f9c266de23e3 Mon Sep 17 00:00:00 2001 From: wusheng Date: Tue, 15 Mar 2016 17:25:16 +0800 Subject: [PATCH] =?UTF-8?q?1.=E8=B0=83=E6=95=B4=E6=8B=A6=E6=88=AA=E5=99=A8?= =?UTF-8?q?=E6=8E=A5=E5=8F=A3=EF=BC=8C=E5=A2=9E=E5=8A=A0interceptPoint?= =?UTF-8?q?=E6=8F=8F=E8=BF=B0=EF=BC=8C=E9=87=8D=E6=9E=84=E6=8B=A6=E6=88=AA?= =?UTF-8?q?=E5=99=A8=E6=8E=A5=E5=8F=A3=E3=80=82=E9=87=8D=E6=9E=84=E5=A2=9E?= =?UTF-8?q?=E5=BC=BA=E9=80=BB=E8=BE=91=202.=E7=A7=BB=E9=99=A4jdbc-plugin?= =?UTF-8?q?=203.=E6=96=B0=E5=A2=9Emysql-plugin=EF=BC=8C=E6=96=B0=E5=A2=9E?= =?UTF-8?q?=E6=8F=92=E4=BB=B6skywalking-mysql-plugin=E3=80=82=E6=8F=92?= =?UTF-8?q?=E4=BB=B6=E5=B0=86=E5=9C=A8=E5=8C=85=E5=BC=95=E7=94=A8=E5=90=8E?= =?UTF-8?q?=E8=87=AA=E5=8A=A8=E7=94=9F=E6=95=88=E3=80=82=EF=BC=88=E6=9C=AC?= =?UTF-8?q?=E5=9C=B0=E6=B5=8B=E8=AF=95=E5=AE=8C=E6=88=90=EF=BC=8C=E5=BE=85?= =?UTF-8?q?=E9=9B=86=E6=88=90=E6=B5=8B=E8=AF=95=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../buriedpoint/LocalBuriedPointSender.java | 2 +- .../skywalking/plugin/PluginBootstrap.java | 1 - .../ai/cloud/skywalking/plugin/PluginCfg.java | 8 +- .../interceptor/ClassMethodInterceptor.java | 10 +- .../interceptor/EnhanceClazz4Interceptor.java | 35 +- .../interceptor/IAroundInterceptor.java | 2 +- .../plugin/interceptor/InterceptPoint.java | 45 +++ .../plugin/interceptor/InterceptorDefine.java | 2 +- .../test/ai/cloud/plugin/PluginMainTest.java | 5 +- .../cloud/plugin/TestAroundInterceptor.java | 7 + .../cloud/plugin/TestInterceptorDefine.java | 5 +- .../skywalking/plugin/jdbc/SWConnection.java | 326 ------------------ .../skywalking/plugin/jdbc/TracingDriver.java | 72 ---- .../plugin/jdbc/mysql/MySQLTracingDriver.java | 31 -- .../jdbc/tracing/ConnectionTracing.java | 43 --- .../{jdbc-plugin => mysql-plugin}/pom.xml | 15 +- .../plugin/mysql/ConnectionInterceptor.java | 107 ++++++ .../plugin/mysql/ConnectionPluginDefine.java | 28 ++ .../plugin/mysql}/JDBCBuriedPointType.java | 2 +- .../plugin/mysql}/SWCallableStatement.java | 10 +- .../plugin/mysql}/SWPreparedStatement.java | 10 +- .../skywalking/plugin/mysql}/SWStatement.java | 10 +- .../tracing/CallableStatementTracing.java | 4 +- .../tracing/PreparedStatementTracing.java | 4 +- .../mysql}/tracing/StatementTracing.java | 4 +- .../src/main/resources/log4j2.xml | 16 + .../src/main/resources/sky-walking.auth | 47 +++ .../src/main/resources/skywalking-plugin.def | 1 + .../plugin/mysql/TestMySQLDriver.java | 40 +++ skywalking-sdk-plugin/pom.xml | 4 +- 30 files changed, 377 insertions(+), 519 deletions(-) create mode 100644 skywalking-api/src/main/java/com/ai/cloud/skywalking/plugin/interceptor/InterceptPoint.java delete mode 100644 skywalking-sdk-plugin/jdbc-plugin/src/main/java/com/ai/cloud/skywalking/plugin/jdbc/SWConnection.java delete mode 100644 skywalking-sdk-plugin/jdbc-plugin/src/main/java/com/ai/cloud/skywalking/plugin/jdbc/TracingDriver.java delete mode 100644 skywalking-sdk-plugin/jdbc-plugin/src/main/java/com/ai/cloud/skywalking/plugin/jdbc/mysql/MySQLTracingDriver.java delete mode 100644 skywalking-sdk-plugin/jdbc-plugin/src/main/java/com/ai/cloud/skywalking/plugin/jdbc/tracing/ConnectionTracing.java rename skywalking-sdk-plugin/{jdbc-plugin => mysql-plugin}/pom.xml (85%) create mode 100644 skywalking-sdk-plugin/mysql-plugin/src/main/java/com/ai/cloud/skywalking/plugin/mysql/ConnectionInterceptor.java create mode 100644 skywalking-sdk-plugin/mysql-plugin/src/main/java/com/ai/cloud/skywalking/plugin/mysql/ConnectionPluginDefine.java rename skywalking-sdk-plugin/{jdbc-plugin/src/main/java/com/ai/cloud/skywalking/plugin/jdbc => mysql-plugin/src/main/java/com/ai/cloud/skywalking/plugin/mysql}/JDBCBuriedPointType.java (93%) rename skywalking-sdk-plugin/{jdbc-plugin/src/main/java/com/ai/cloud/skywalking/plugin/jdbc => mysql-plugin/src/main/java/com/ai/cloud/skywalking/plugin/mysql}/SWCallableStatement.java (99%) rename skywalking-sdk-plugin/{jdbc-plugin/src/main/java/com/ai/cloud/skywalking/plugin/jdbc => mysql-plugin/src/main/java/com/ai/cloud/skywalking/plugin/mysql}/SWPreparedStatement.java (98%) rename skywalking-sdk-plugin/{jdbc-plugin/src/main/java/com/ai/cloud/skywalking/plugin/jdbc => mysql-plugin/src/main/java/com/ai/cloud/skywalking/plugin/mysql}/SWStatement.java (95%) rename skywalking-sdk-plugin/{jdbc-plugin/src/main/java/com/ai/cloud/skywalking/plugin/jdbc => mysql-plugin/src/main/java/com/ai/cloud/skywalking/plugin/mysql}/tracing/CallableStatementTracing.java (90%) rename skywalking-sdk-plugin/{jdbc-plugin/src/main/java/com/ai/cloud/skywalking/plugin/jdbc => mysql-plugin/src/main/java/com/ai/cloud/skywalking/plugin/mysql}/tracing/PreparedStatementTracing.java (90%) rename skywalking-sdk-plugin/{jdbc-plugin/src/main/java/com/ai/cloud/skywalking/plugin/jdbc => mysql-plugin/src/main/java/com/ai/cloud/skywalking/plugin/mysql}/tracing/StatementTracing.java (91%) create mode 100644 skywalking-sdk-plugin/mysql-plugin/src/main/resources/log4j2.xml create mode 100644 skywalking-sdk-plugin/mysql-plugin/src/main/resources/sky-walking.auth create mode 100644 skywalking-sdk-plugin/mysql-plugin/src/main/resources/skywalking-plugin.def create mode 100644 skywalking-sdk-plugin/mysql-plugin/src/test/java/test/ai/cloud/skywalking/plugin/mysql/TestMySQLDriver.java diff --git a/skywalking-api/src/main/java/com/ai/cloud/skywalking/buriedpoint/LocalBuriedPointSender.java b/skywalking-api/src/main/java/com/ai/cloud/skywalking/buriedpoint/LocalBuriedPointSender.java index ba193c12c..bdcd5b7f4 100644 --- a/skywalking-api/src/main/java/com/ai/cloud/skywalking/buriedpoint/LocalBuriedPointSender.java +++ b/skywalking-api/src/main/java/com/ai/cloud/skywalking/buriedpoint/LocalBuriedPointSender.java @@ -44,7 +44,7 @@ public class LocalBuriedPointSender extends ApplicationExceptionHandler implemen if (Config.BuriedPoint.PRINTF) { logger.debug("TraceId:" + spanData.getTraceId() + "\tviewpointId:" + spanData.getViewPointId() + "\tParentLevelId:" + spanData. - getParentLevel() + "\tLevelId:" + spanData.getLevelId()); + getParentLevel() + "\tLevelId:" + spanData.getLevelId() + "\tbusinessKey:" + spanData.getBusinessKey()); } // 存放到本地发送进程中 diff --git a/skywalking-api/src/main/java/com/ai/cloud/skywalking/plugin/PluginBootstrap.java b/skywalking-api/src/main/java/com/ai/cloud/skywalking/plugin/PluginBootstrap.java index 5f542a023..c382a9756 100644 --- a/skywalking-api/src/main/java/com/ai/cloud/skywalking/plugin/PluginBootstrap.java +++ b/skywalking-api/src/main/java/com/ai/cloud/skywalking/plugin/PluginBootstrap.java @@ -1,7 +1,6 @@ package com.ai.cloud.skywalking.plugin; import java.net.URL; -import java.util.Enumeration; import java.util.List; import org.apache.logging.log4j.LogManager; diff --git a/skywalking-api/src/main/java/com/ai/cloud/skywalking/plugin/PluginCfg.java b/skywalking-api/src/main/java/com/ai/cloud/skywalking/plugin/PluginCfg.java index 229d6dbfb..2e0070db6 100644 --- a/skywalking-api/src/main/java/com/ai/cloud/skywalking/plugin/PluginCfg.java +++ b/skywalking-api/src/main/java/com/ai/cloud/skywalking/plugin/PluginCfg.java @@ -19,10 +19,10 @@ public class PluginCfg { void load(InputStream input) throws IOException{ try{ BufferedReader reader = new BufferedReader(new InputStreamReader(input)); - String nhanceOriginClassName = null; - while((nhanceOriginClassName = reader.readLine()) != null){ - if(!StringUtil.isEmpty(nhanceOriginClassName)){ - interceptorClassList.add(nhanceOriginClassName.trim()); + String interceptorDefineClassName = null; + while((interceptorDefineClassName = reader.readLine()) != null){ + if(!StringUtil.isEmpty(interceptorDefineClassName)){ + interceptorClassList.add(interceptorDefineClassName.trim()); } } }finally{ diff --git a/skywalking-api/src/main/java/com/ai/cloud/skywalking/plugin/interceptor/ClassMethodInterceptor.java b/skywalking-api/src/main/java/com/ai/cloud/skywalking/plugin/interceptor/ClassMethodInterceptor.java index ca0602902..787a3b9bc 100644 --- a/skywalking-api/src/main/java/com/ai/cloud/skywalking/plugin/interceptor/ClassMethodInterceptor.java +++ b/skywalking-api/src/main/java/com/ai/cloud/skywalking/plugin/interceptor/ClassMethodInterceptor.java @@ -48,7 +48,15 @@ public class ClassMethodInterceptor { Object ret = null; try { ret = zuper.call(); - } finally { + } catch(Throwable t){ + try { + interceptor.handleMethodException(t, instanceContext, interceptorContext, ret); + throw t; + } catch (Throwable t2) { + logger.error("class[{}] handle method[{}] exception failue:{}", + obj.getClass(), method.getName(), t2.getMessage(), t2); + } + }finally { try { ret = interceptor.afterMethod(instanceContext, interceptorContext, ret); } catch (Throwable t) { diff --git a/skywalking-api/src/main/java/com/ai/cloud/skywalking/plugin/interceptor/EnhanceClazz4Interceptor.java b/skywalking-api/src/main/java/com/ai/cloud/skywalking/plugin/interceptor/EnhanceClazz4Interceptor.java index d9c3a5e5f..6f91afd59 100644 --- a/skywalking-api/src/main/java/com/ai/cloud/skywalking/plugin/interceptor/EnhanceClazz4Interceptor.java +++ b/skywalking-api/src/main/java/com/ai/cloud/skywalking/plugin/interceptor/EnhanceClazz4Interceptor.java @@ -2,6 +2,8 @@ package com.ai.cloud.skywalking.plugin.interceptor; import static net.bytebuddy.matcher.ElementMatchers.isConstructor; import static net.bytebuddy.matcher.ElementMatchers.named; +import static net.bytebuddy.matcher.ElementMatchers.any; +import static net.bytebuddy.matcher.ElementMatchers.takesArguments; import java.util.Set; @@ -80,8 +82,8 @@ public class EnhanceClazz4Interceptor { * 1.add field '_$EnhancedClassInstanceContext' of type * EnhancedClassInstanceContext
* - * 2.intercept constructor by default, and intercept method which it's required by - * interceptorDefineClass.
+ * 2.intercept constructor by default, and intercept method which it's + * required by interceptorDefineClass.
*/ IAroundInterceptor interceptor = define.instance(); @@ -90,7 +92,7 @@ public class EnhanceClazz4Interceptor { newClassBuilder = newClassBuilder .defineField(contextAttrName, EnhancedClassInstanceContext.class) - .constructor(isConstructor()) + .constructor(any()) .intercept( SuperMethodCall.INSTANCE.andThen(MethodDelegation.to( new ClassConstructorInterceptor(interceptor)) @@ -99,12 +101,27 @@ public class EnhanceClazz4Interceptor { FieldGetter.class, FieldSetter.class)))); - String[] methodNameList = define.getBeInterceptedMethods(); - for (String methodName : methodNameList) { - newClassBuilder = newClassBuilder.method(named(methodName)) - .intercept( - MethodDelegation.to(new ClassMethodInterceptor( - interceptor))); + InterceptPoint[] methodNameList = define.getBeInterceptedMethods(); + ClassMethodInterceptor classMethodInterceptor = new ClassMethodInterceptor( + interceptor); + for (InterceptPoint method : methodNameList) { + logger.debug("prepare to enhance class {} method [{}] ", + enhanceOriginClassName, method.getMethodName()); + if (method.getArgTypeArray() != null) { + newClassBuilder = newClassBuilder.method( + named(method.getMethodName()).and( + takesArguments(method.getArgTypeArray()))).intercept( + MethodDelegation.to(classMethodInterceptor)); + } else if (method.getArgNum() > -1) { + newClassBuilder = newClassBuilder.method( + named(method.getMethodName()).and( + takesArguments(method.getArgNum()))).intercept( + MethodDelegation.to(classMethodInterceptor)); + } else { + newClassBuilder = newClassBuilder.method( + named(method.getMethodName())).intercept( + MethodDelegation.to(classMethodInterceptor)); + } } /** diff --git a/skywalking-api/src/main/java/com/ai/cloud/skywalking/plugin/interceptor/IAroundInterceptor.java b/skywalking-api/src/main/java/com/ai/cloud/skywalking/plugin/interceptor/IAroundInterceptor.java index c0a3d1b8a..0cca5ea13 100644 --- a/skywalking-api/src/main/java/com/ai/cloud/skywalking/plugin/interceptor/IAroundInterceptor.java +++ b/skywalking-api/src/main/java/com/ai/cloud/skywalking/plugin/interceptor/IAroundInterceptor.java @@ -7,5 +7,5 @@ public interface IAroundInterceptor { public Object afterMethod(EnhancedClassInstanceContext context, MethodInvokeContext interceptorContext, Object ret); - + public void handleMethodException(Throwable t, EnhancedClassInstanceContext context, MethodInvokeContext interceptorContext, Object ret); } diff --git a/skywalking-api/src/main/java/com/ai/cloud/skywalking/plugin/interceptor/InterceptPoint.java b/skywalking-api/src/main/java/com/ai/cloud/skywalking/plugin/interceptor/InterceptPoint.java new file mode 100644 index 000000000..eec8b9363 --- /dev/null +++ b/skywalking-api/src/main/java/com/ai/cloud/skywalking/plugin/interceptor/InterceptPoint.java @@ -0,0 +1,45 @@ +package com.ai.cloud.skywalking.plugin.interceptor; + + +public class InterceptPoint { + private String methodName; + + private int argNum = -1; + + private Class[] argTypeArray; + + public InterceptPoint(String methodName) { + super(); + this.methodName = methodName; + } + + public InterceptPoint(String methodName, int argNum) { + this(methodName); + this.argNum = argNum; + } + + public InterceptPoint(String methodName, Class... args) { + this(methodName); + this.argTypeArray = args; + } + + public String getMethodName() { + return methodName; + } + + public int getArgNum() { + return argNum; + } + + public Class[] getArgTypeArray() { + return argTypeArray; + } + + public void setArgNum(int argNum) { + this.argNum = argNum; + } + + public void setArgTypeList(Class... args){ + argTypeArray = args; + } +} diff --git a/skywalking-api/src/main/java/com/ai/cloud/skywalking/plugin/interceptor/InterceptorDefine.java b/skywalking-api/src/main/java/com/ai/cloud/skywalking/plugin/interceptor/InterceptorDefine.java index 948c75906..0953c50d3 100644 --- a/skywalking-api/src/main/java/com/ai/cloud/skywalking/plugin/interceptor/InterceptorDefine.java +++ b/skywalking-api/src/main/java/com/ai/cloud/skywalking/plugin/interceptor/InterceptorDefine.java @@ -13,7 +13,7 @@ public interface InterceptorDefine { * * @return */ - public String[] getBeInterceptedMethods(); + public InterceptPoint[] getBeInterceptedMethods(); /** * 返回增强拦截器的实现
diff --git a/skywalking-api/src/test/java/test/ai/cloud/plugin/PluginMainTest.java b/skywalking-api/src/test/java/test/ai/cloud/plugin/PluginMainTest.java index fd67b5759..9455dbae0 100644 --- a/skywalking-api/src/test/java/test/ai/cloud/plugin/PluginMainTest.java +++ b/skywalking-api/src/test/java/test/ai/cloud/plugin/PluginMainTest.java @@ -15,10 +15,11 @@ public class PluginMainTest { .main(new String[] { "test.ai.cloud.plugin.PluginMainTest" }); } - public static void main(String[] args) { + public static void main(String[] args) throws InstantiationException, IllegalAccessException, ClassNotFoundException { long start = System.currentTimeMillis(); - BeInterceptedClass inst = new BeInterceptedClass(); + + BeInterceptedClass inst = (BeInterceptedClass) Class.forName("test.ai.cloud.plugin.BeInterceptedClass").newInstance(); inst.printabc(); long end = System.currentTimeMillis(); System.out.println(end - start + "ms"); diff --git a/skywalking-api/src/test/java/test/ai/cloud/plugin/TestAroundInterceptor.java b/skywalking-api/src/test/java/test/ai/cloud/plugin/TestAroundInterceptor.java index 9fc05a636..8004c0723 100644 --- a/skywalking-api/src/test/java/test/ai/cloud/plugin/TestAroundInterceptor.java +++ b/skywalking-api/src/test/java/test/ai/cloud/plugin/TestAroundInterceptor.java @@ -24,4 +24,11 @@ public class TestAroundInterceptor implements IAroundInterceptor { return ret; } + @Override + public void handleMethodException(Throwable t, EnhancedClassInstanceContext context, + MethodInvokeContext interceptorContext, Object ret) { + // TODO Auto-generated method stub + + } + } diff --git a/skywalking-api/src/test/java/test/ai/cloud/plugin/TestInterceptorDefine.java b/skywalking-api/src/test/java/test/ai/cloud/plugin/TestInterceptorDefine.java index eacf32118..14b863daa 100644 --- a/skywalking-api/src/test/java/test/ai/cloud/plugin/TestInterceptorDefine.java +++ b/skywalking-api/src/test/java/test/ai/cloud/plugin/TestInterceptorDefine.java @@ -1,6 +1,7 @@ package test.ai.cloud.plugin; import com.ai.cloud.skywalking.plugin.interceptor.IAroundInterceptor; +import com.ai.cloud.skywalking.plugin.interceptor.InterceptPoint; import com.ai.cloud.skywalking.plugin.interceptor.InterceptorDefine; public class TestInterceptorDefine implements InterceptorDefine { @@ -11,8 +12,8 @@ public class TestInterceptorDefine implements InterceptorDefine { } @Override - public String[] getBeInterceptedMethods() { - return new String[] { "printabc" }; + public InterceptPoint[] getBeInterceptedMethods() { + return new InterceptPoint[] { new InterceptPoint("printabc") }; } @Override diff --git a/skywalking-sdk-plugin/jdbc-plugin/src/main/java/com/ai/cloud/skywalking/plugin/jdbc/SWConnection.java b/skywalking-sdk-plugin/jdbc-plugin/src/main/java/com/ai/cloud/skywalking/plugin/jdbc/SWConnection.java deleted file mode 100644 index a52054466..000000000 --- a/skywalking-sdk-plugin/jdbc-plugin/src/main/java/com/ai/cloud/skywalking/plugin/jdbc/SWConnection.java +++ /dev/null @@ -1,326 +0,0 @@ -package com.ai.cloud.skywalking.plugin.jdbc; - -import java.sql.Array; -import java.sql.Blob; -import java.sql.CallableStatement; -import java.sql.Clob; -import java.sql.DatabaseMetaData; -import java.sql.NClob; -import java.sql.PreparedStatement; -import java.sql.SQLClientInfoException; -import java.sql.SQLException; -import java.sql.SQLWarning; -import java.sql.SQLXML; -import java.sql.Savepoint; -import java.sql.Statement; -import java.sql.Struct; -import java.util.Map; -import java.util.Properties; -import java.util.concurrent.Executor; - -import com.ai.cloud.skywalking.plugin.jdbc.tracing.ConnectionTracing; -import com.ai.cloud.skywalking.plugin.jdbc.tracing.ConnectionTracing.Executable; - -public class SWConnection implements java.sql.Connection { - private String connectInfo; - - private final java.sql.Connection realConnection; - - public SWConnection(String url, Properties info, - java.sql.Connection realConnection) { - super(); - this.connectInfo = url + "(" + info.getProperty("user") + ")"; - this.realConnection = realConnection; - } - - public T unwrap(Class iface) throws SQLException { - return realConnection.unwrap(iface); - } - - public boolean isWrapperFor(Class iface) throws SQLException { - return realConnection.isWrapperFor(iface); - } - - public Statement createStatement() throws SQLException { - return new SWStatement(this, realConnection.createStatement(), - this.connectInfo); - } - - public PreparedStatement prepareStatement(String sql) throws SQLException { - return new SWPreparedStatement(this, - realConnection.prepareStatement(sql), this.connectInfo, sql); - } - - public CallableStatement prepareCall(String sql) throws SQLException { - return new SWCallableStatement(this, realConnection.prepareCall(sql), - this.connectInfo, sql); - } - - public String nativeSQL(String sql) throws SQLException { - return ConnectionTracing.execute(realConnection, connectInfo, - "nativeSQL", sql, new Executable() { - public String exe(java.sql.Connection realConnection, - String sql) throws SQLException { - return realConnection.nativeSQL(sql); - } - }); - } - - public void setAutoCommit(boolean autoCommit) throws SQLException { - realConnection.setAutoCommit(autoCommit); - } - - public boolean getAutoCommit() throws SQLException { - return realConnection.getAutoCommit(); - } - - public void commit() throws SQLException { - ConnectionTracing.execute(realConnection, connectInfo, "commit", "", - new Executable() { - public String exe(java.sql.Connection realConnection, - String sql) throws SQLException { - realConnection.commit(); - return null; - } - }); - } - - public void rollback() throws SQLException { - ConnectionTracing.execute(realConnection, connectInfo, "rollback", "", - new Executable() { - public String exe(java.sql.Connection realConnection, - String sql) throws SQLException { - realConnection.rollback(); - return null; - } - }); - } - - public void close() throws SQLException { - ConnectionTracing.execute(realConnection, connectInfo, "close", "", - new Executable() { - public String exe(java.sql.Connection realConnection, - String sql) throws SQLException { - realConnection.close(); - return null; - } - }); - } - - public boolean isClosed() throws SQLException { - return realConnection.isClosed(); - } - - public DatabaseMetaData getMetaData() throws SQLException { - return realConnection.getMetaData(); - } - - public void setReadOnly(boolean readOnly) throws SQLException { - realConnection.setReadOnly(readOnly); - } - - public boolean isReadOnly() throws SQLException { - return realConnection.isReadOnly(); - } - - public void setCatalog(String catalog) throws SQLException { - realConnection.setCatalog(catalog); - } - - public String getCatalog() throws SQLException { - return realConnection.getCatalog(); - } - - public void setTransactionIsolation(int level) throws SQLException { - realConnection.setTransactionIsolation(level); - } - - public int getTransactionIsolation() throws SQLException { - return realConnection.getTransactionIsolation(); - } - - public SQLWarning getWarnings() throws SQLException { - return realConnection.getWarnings(); - } - - public void clearWarnings() throws SQLException { - realConnection.clearWarnings(); - } - - public Statement createStatement(int resultSetType, int resultSetConcurrency) - throws SQLException { - return new SWStatement(this, realConnection.createStatement( - resultSetType, resultSetConcurrency), this.connectInfo); - } - - public PreparedStatement prepareStatement(String sql, int resultSetType, - int resultSetConcurrency) throws SQLException { - return new SWPreparedStatement(this, realConnection.prepareStatement( - sql, resultSetType, resultSetConcurrency), this.connectInfo, - sql); - } - - public CallableStatement prepareCall(String sql, int resultSetType, - int resultSetConcurrency) throws SQLException { - return new SWCallableStatement(this, realConnection.prepareCall(sql, - resultSetType, resultSetConcurrency), this.connectInfo, sql); - } - - public Map> getTypeMap() throws SQLException { - return realConnection.getTypeMap(); - } - - public void setTypeMap(Map> map) throws SQLException { - realConnection.setTypeMap(map); - } - - public void setHoldability(int holdability) throws SQLException { - realConnection.setHoldability(holdability); - } - - public int getHoldability() throws SQLException { - return realConnection.getHoldability(); - } - - public Savepoint setSavepoint() throws SQLException { - return realConnection.setSavepoint(); - } - - public Savepoint setSavepoint(String name) throws SQLException { - return realConnection.setSavepoint(name); - } - - public void rollback(final Savepoint savepoint) throws SQLException { - ConnectionTracing.execute(realConnection, connectInfo, - "rollback to savepoint", "", new Executable() { - public String exe(java.sql.Connection realConnection, - String sql) throws SQLException { - realConnection.rollback(savepoint); - return null; - } - }); - } - - public void releaseSavepoint(final Savepoint savepoint) throws SQLException { - ConnectionTracing.execute(realConnection, connectInfo, - "releaseSavepoint savepoint", "", new Executable() { - public String exe(java.sql.Connection realConnection, - String sql) throws SQLException { - realConnection.releaseSavepoint(savepoint); - return null; - } - }); - } - - public Statement createStatement(int resultSetType, - int resultSetConcurrency, int resultSetHoldability) - throws SQLException { - return new SWStatement(this, realConnection.createStatement( - resultSetType, resultSetConcurrency, resultSetHoldability), - this.connectInfo); - } - - public PreparedStatement prepareStatement(String sql, int resultSetType, - int resultSetConcurrency, int resultSetHoldability) - throws SQLException { - return new SWPreparedStatement(this, - realConnection.prepareStatement(sql, resultSetType, - resultSetConcurrency, resultSetHoldability), - this.connectInfo, sql); - } - - public CallableStatement prepareCall(String sql, int resultSetType, - int resultSetConcurrency, int resultSetHoldability) - throws SQLException { - return new SWCallableStatement(this, realConnection.prepareCall(sql, - resultSetType, resultSetConcurrency, resultSetHoldability), this.connectInfo, sql); - } - - public PreparedStatement prepareStatement(String sql, int autoGeneratedKeys) - throws SQLException { - return new SWPreparedStatement(this, realConnection.prepareStatement( - sql, autoGeneratedKeys), this.connectInfo, sql); - } - - public PreparedStatement prepareStatement(String sql, int[] columnIndexes) - throws SQLException { - return new SWPreparedStatement(this, realConnection.prepareStatement( - sql, columnIndexes), this.connectInfo, sql); - } - - public PreparedStatement prepareStatement(String sql, String[] columnNames) - throws SQLException { - return new SWPreparedStatement(this, realConnection.prepareStatement( - sql, columnNames), this.connectInfo, sql); - } - - public Clob createClob() throws SQLException { - return realConnection.createClob(); - } - - public Blob createBlob() throws SQLException { - return realConnection.createBlob(); - } - - public NClob createNClob() throws SQLException { - return realConnection.createNClob(); - } - - public SQLXML createSQLXML() throws SQLException { - return realConnection.createSQLXML(); - } - - public boolean isValid(int timeout) throws SQLException { - return realConnection.isValid(timeout); - } - - public void setClientInfo(String name, String value) - throws SQLClientInfoException { - realConnection.setClientInfo(name, value); - } - - public void setClientInfo(Properties properties) - throws SQLClientInfoException { - realConnection.setClientInfo(properties); - } - - public String getClientInfo(String name) throws SQLException { - return realConnection.getClientInfo(name); - } - - public Properties getClientInfo() throws SQLException { - return realConnection.getClientInfo(); - } - - public Array createArrayOf(String typeName, Object[] elements) - throws SQLException { - return realConnection.createArrayOf(typeName, elements); - } - - public Struct createStruct(String typeName, Object[] attributes) - throws SQLException { - return realConnection.createStruct(typeName, attributes); - } - - public void setSchema(String schema) throws SQLException { - realConnection.setSchema(schema); - } - - public String getSchema() throws SQLException { - return realConnection.getSchema(); - } - - public void abort(Executor executor) throws SQLException { - realConnection.abort(executor); - } - - public void setNetworkTimeout(Executor executor, int milliseconds) - throws SQLException { - realConnection.setNetworkTimeout(executor, milliseconds); - } - - public int getNetworkTimeout() throws SQLException { - return realConnection.getNetworkTimeout(); - } - -} diff --git a/skywalking-sdk-plugin/jdbc-plugin/src/main/java/com/ai/cloud/skywalking/plugin/jdbc/TracingDriver.java b/skywalking-sdk-plugin/jdbc-plugin/src/main/java/com/ai/cloud/skywalking/plugin/jdbc/TracingDriver.java deleted file mode 100644 index 3433e6e34..000000000 --- a/skywalking-sdk-plugin/jdbc-plugin/src/main/java/com/ai/cloud/skywalking/plugin/jdbc/TracingDriver.java +++ /dev/null @@ -1,72 +0,0 @@ -package com.ai.cloud.skywalking.plugin.jdbc; - -import java.sql.Driver; -import java.sql.DriverPropertyInfo; -import java.sql.SQLException; -import java.sql.SQLFeatureNotSupportedException; -import java.util.Properties; -import java.util.logging.Logger; - -import com.ai.cloud.skywalking.conf.AuthDesc; - -public abstract class TracingDriver implements Driver { - private static final String TRACING_SIGN = "tracing:"; - - private Driver realDriver; - - protected TracingDriver() { - this.realDriver = this.registerTracingDriver(); - } - - protected abstract Driver registerTracingDriver(); - - public java.sql.Connection connect(String url, Properties info) throws SQLException { - java.sql.Connection conn = this.realDriver.connect(this.getRealUrl(url), info); - if(!AuthDesc.isAuth()){ - return conn; - }else{ - return new SWConnection(url, info, conn); - } - } - - public boolean acceptsURL(String url) throws SQLException { - return this.realDriver.acceptsURL(this.getRealUrl(url)); - } - - public DriverPropertyInfo[] getPropertyInfo(String url, Properties info) - throws SQLException { - return this.realDriver.getPropertyInfo(this.getRealUrl(url), info); - } - - private String getRealUrl(String url) throws SQLException { - if(url.toLowerCase().startsWith(TRACING_SIGN)){ - return url.substring(TRACING_SIGN.length()); - }else{ - throw new SQLException("tracing jdbc url must start with 'tracing:'"); - } - } - - public int getMajorVersion() { - return safeIntParse("1"); - } - - public int getMinorVersion() { - return safeIntParse("0"); - } - - public boolean jdbcCompliant() { - return false; - } - - public Logger getParentLogger() throws SQLFeatureNotSupportedException { - return null; - } - - 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/java/com/ai/cloud/skywalking/plugin/jdbc/mysql/MySQLTracingDriver.java b/skywalking-sdk-plugin/jdbc-plugin/src/main/java/com/ai/cloud/skywalking/plugin/jdbc/mysql/MySQLTracingDriver.java deleted file mode 100644 index 6d0b94efa..000000000 --- a/skywalking-sdk-plugin/jdbc-plugin/src/main/java/com/ai/cloud/skywalking/plugin/jdbc/mysql/MySQLTracingDriver.java +++ /dev/null @@ -1,31 +0,0 @@ -package com.ai.cloud.skywalking.plugin.jdbc.mysql; - -import java.sql.Driver; -import java.sql.DriverManager; -import java.sql.SQLException; - -import com.ai.cloud.skywalking.plugin.jdbc.TracingDriver; - -public class MySQLTracingDriver extends TracingDriver { - static { - try { - DriverManager.registerDriver(new MySQLTracingDriver()); - } catch (SQLException e) { - throw new RuntimeException("register " - + MySQLTracingDriver.class.getName() + " driver failure."); - } - } - - /** - * 继承自TracingDriver,返回真实的Driver - */ - @Override - protected Driver registerTracingDriver() { - try { - return new com.mysql.jdbc.Driver(); - } catch (SQLException e) { - throw new RuntimeException("create com.mysql.jdbc.Driver failure."); - } - } - -} diff --git a/skywalking-sdk-plugin/jdbc-plugin/src/main/java/com/ai/cloud/skywalking/plugin/jdbc/tracing/ConnectionTracing.java b/skywalking-sdk-plugin/jdbc-plugin/src/main/java/com/ai/cloud/skywalking/plugin/jdbc/tracing/ConnectionTracing.java deleted file mode 100644 index d2d76a589..000000000 --- a/skywalking-sdk-plugin/jdbc-plugin/src/main/java/com/ai/cloud/skywalking/plugin/jdbc/tracing/ConnectionTracing.java +++ /dev/null @@ -1,43 +0,0 @@ -package com.ai.cloud.skywalking.plugin.jdbc.tracing; - -import java.sql.SQLException; - -import com.ai.cloud.skywalking.buriedpoint.RPCBuriedPointSender; -import com.ai.cloud.skywalking.plugin.jdbc.JDBCBuriedPointType; -import com.ai.cloud.skywalking.model.Identification; - -/** - * 连接级追踪,用于追踪用于Connection的操作追踪 - * - * @author wusheng - * - */ -public class ConnectionTracing { - private static RPCBuriedPointSender sender = new RPCBuriedPointSender(); - - public static R execute(java.sql.Connection realConnection, - String connectInfo, String method, String sql, Executable exec) - throws SQLException { - try { - sender.beforeSend(Identification - .newBuilder() - .viewPoint(connectInfo) - .businessKey( - "connection." - + method - + (sql == null || sql.length() == 0 ? "" - : ":" + sql)).spanType(JDBCBuriedPointType.instance()).build()); - return exec.exe(realConnection, sql); - } catch (SQLException e) { - sender.handleException(e); - throw e; - } finally { - sender.afterSend(); - } - } - - public interface Executable { - public R exe(java.sql.Connection realConnection, String sql) - throws SQLException; - } -} diff --git a/skywalking-sdk-plugin/jdbc-plugin/pom.xml b/skywalking-sdk-plugin/mysql-plugin/pom.xml similarity index 85% rename from skywalking-sdk-plugin/jdbc-plugin/pom.xml rename to skywalking-sdk-plugin/mysql-plugin/pom.xml index 04ed251e3..13ca49bf3 100644 --- a/skywalking-sdk-plugin/jdbc-plugin/pom.xml +++ b/skywalking-sdk-plugin/mysql-plugin/pom.xml @@ -7,7 +7,7 @@ 4.0.0 - skywalking-jdbc-plugin + skywalking-mysql-plugin jar jdbc-plugin @@ -29,6 +29,19 @@ 5.1.36 compile + + + junit + junit + 4.12 + test + + + org.apache.logging.log4j + log4j-core + 2.4.1 + test + diff --git a/skywalking-sdk-plugin/mysql-plugin/src/main/java/com/ai/cloud/skywalking/plugin/mysql/ConnectionInterceptor.java b/skywalking-sdk-plugin/mysql-plugin/src/main/java/com/ai/cloud/skywalking/plugin/mysql/ConnectionInterceptor.java new file mode 100644 index 000000000..f36ee8c49 --- /dev/null +++ b/skywalking-sdk-plugin/mysql-plugin/src/main/java/com/ai/cloud/skywalking/plugin/mysql/ConnectionInterceptor.java @@ -0,0 +1,107 @@ +package com.ai.cloud.skywalking.plugin.mysql; + +import java.sql.CallableStatement; +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.Statement; +import java.util.Properties; + +import com.ai.cloud.skywalking.buriedpoint.RPCBuriedPointSender; +import com.ai.cloud.skywalking.model.Identification; +import com.ai.cloud.skywalking.plugin.interceptor.ConstructorInvokeContext; +import com.ai.cloud.skywalking.plugin.interceptor.EnhancedClassInstanceContext; +import com.ai.cloud.skywalking.plugin.interceptor.IAroundInterceptor; +import com.ai.cloud.skywalking.plugin.interceptor.MethodInvokeContext; + +public class ConnectionInterceptor implements IAroundInterceptor { + private static final String CONNECTION_INFO_KEY = "connectInfo"; + + private static RPCBuriedPointSender sender = new RPCBuriedPointSender(); + + @Override + public void onConstruct(EnhancedClassInstanceContext context, + ConstructorInvokeContext interceptorContext) { + String url = (String) interceptorContext.allArguments()[4]; + Properties info = (Properties) interceptorContext.allArguments()[2]; + context.set(CONNECTION_INFO_KEY, url + "(" + info.getProperty("user") + + ")"); + } + + @Override + public void beforeMethod(EnhancedClassInstanceContext context, + MethodInvokeContext interceptorContext) { + if(context == null){ + // be intercepted method could be called in constructor, ignore. + return; + } + String connectInfo = context.get(CONNECTION_INFO_KEY, String.class); + String method = interceptorContext.methodName(); + String sql = ""; + switch (method) { + case "commit": + this.beforeSend(connectInfo, method, sql); + break; + case "rollback": + this.beforeSend(connectInfo, method, sql); + break; + case "close": + this.beforeSend(connectInfo, method, sql); + break; + } + } + + private void beforeSend(String connectInfo, String method, String sql) { + sender.beforeSend(Identification + .newBuilder() + .viewPoint(connectInfo) + .businessKey( + "connection." + + method + + (sql == null || sql.length() == 0 ? "" : ":" + + sql)) + .spanType(JDBCBuriedPointType.instance()).build()); + } + + @Override + public Object afterMethod(EnhancedClassInstanceContext context, + MethodInvokeContext interceptorContext, Object ret) { + if(context == null){ + // be intercepted method could be called in constructor, ignore. + return ret; + } + String connectInfo = context.get(CONNECTION_INFO_KEY, String.class); + switch (interceptorContext.methodName()) { + case "createStatement": + return new SWStatement((Connection) interceptorContext.inst(), + (Statement) ret, connectInfo); + case "prepareStatement": + String sql = (String) interceptorContext.allArguments()[0]; + return new SWPreparedStatement( + (Connection) interceptorContext.inst(), + (PreparedStatement) ret, connectInfo, sql); + case "prepareCall": + String callableSql = (String) interceptorContext.allArguments()[0]; + return new SWCallableStatement( + (Connection) interceptorContext.inst(), + (CallableStatement) ret, connectInfo, callableSql); + case "commit": + case "rollback": + case "close": + sender.afterSend(); + } + return ret; + } + + @Override + public void handleMethodException(Throwable t, + EnhancedClassInstanceContext context, + MethodInvokeContext interceptorContext, Object ret) { + switch (interceptorContext.methodName()) { + case "commit": + case "rollback": + case "close": + sender.handleException(t); + break; + } + } +} diff --git a/skywalking-sdk-plugin/mysql-plugin/src/main/java/com/ai/cloud/skywalking/plugin/mysql/ConnectionPluginDefine.java b/skywalking-sdk-plugin/mysql-plugin/src/main/java/com/ai/cloud/skywalking/plugin/mysql/ConnectionPluginDefine.java new file mode 100644 index 000000000..e03561f57 --- /dev/null +++ b/skywalking-sdk-plugin/mysql-plugin/src/main/java/com/ai/cloud/skywalking/plugin/mysql/ConnectionPluginDefine.java @@ -0,0 +1,28 @@ +package com.ai.cloud.skywalking.plugin.mysql; + +import com.ai.cloud.skywalking.plugin.interceptor.IAroundInterceptor; +import com.ai.cloud.skywalking.plugin.interceptor.InterceptPoint; +import com.ai.cloud.skywalking.plugin.interceptor.InterceptorDefine; + +public class ConnectionPluginDefine implements InterceptorDefine { + + @Override + public String getBeInterceptedClassName() { + return "com.mysql.jdbc.JDBC4Connection"; + } + + @Override + public InterceptPoint[] getBeInterceptedMethods() { + return new InterceptPoint[] { new InterceptPoint("createStatement", 2), + new InterceptPoint("prepareStatement", 3), + new InterceptPoint("prepareCall", 3), + new InterceptPoint("commit"), new InterceptPoint("rollback"), + new InterceptPoint("close") }; + } + + @Override + public IAroundInterceptor instance() { + return new ConnectionInterceptor(); + } + +} diff --git a/skywalking-sdk-plugin/jdbc-plugin/src/main/java/com/ai/cloud/skywalking/plugin/jdbc/JDBCBuriedPointType.java b/skywalking-sdk-plugin/mysql-plugin/src/main/java/com/ai/cloud/skywalking/plugin/mysql/JDBCBuriedPointType.java similarity index 93% rename from skywalking-sdk-plugin/jdbc-plugin/src/main/java/com/ai/cloud/skywalking/plugin/jdbc/JDBCBuriedPointType.java rename to skywalking-sdk-plugin/mysql-plugin/src/main/java/com/ai/cloud/skywalking/plugin/mysql/JDBCBuriedPointType.java index bacb6a948..e72351a4f 100644 --- a/skywalking-sdk-plugin/jdbc-plugin/src/main/java/com/ai/cloud/skywalking/plugin/jdbc/JDBCBuriedPointType.java +++ b/skywalking-sdk-plugin/mysql-plugin/src/main/java/com/ai/cloud/skywalking/plugin/mysql/JDBCBuriedPointType.java @@ -1,4 +1,4 @@ -package com.ai.cloud.skywalking.plugin.jdbc; +package com.ai.cloud.skywalking.plugin.mysql; import com.ai.cloud.skywalking.api.IBuriedPointType; import com.ai.cloud.skywalking.protocol.CallType; diff --git a/skywalking-sdk-plugin/jdbc-plugin/src/main/java/com/ai/cloud/skywalking/plugin/jdbc/SWCallableStatement.java b/skywalking-sdk-plugin/mysql-plugin/src/main/java/com/ai/cloud/skywalking/plugin/mysql/SWCallableStatement.java similarity index 99% rename from skywalking-sdk-plugin/jdbc-plugin/src/main/java/com/ai/cloud/skywalking/plugin/jdbc/SWCallableStatement.java rename to skywalking-sdk-plugin/mysql-plugin/src/main/java/com/ai/cloud/skywalking/plugin/mysql/SWCallableStatement.java index 65b3d5045..ab20b6aa5 100644 --- a/skywalking-sdk-plugin/jdbc-plugin/src/main/java/com/ai/cloud/skywalking/plugin/jdbc/SWCallableStatement.java +++ b/skywalking-sdk-plugin/mysql-plugin/src/main/java/com/ai/cloud/skywalking/plugin/mysql/SWCallableStatement.java @@ -1,4 +1,4 @@ -package com.ai.cloud.skywalking.plugin.jdbc; +package com.ai.cloud.skywalking.plugin.mysql; import java.io.InputStream; import java.io.Reader; @@ -24,16 +24,16 @@ import java.sql.Timestamp; import java.util.Calendar; import java.util.Map; -import com.ai.cloud.skywalking.plugin.jdbc.tracing.CallableStatementTracing; -import com.ai.cloud.skywalking.plugin.jdbc.tracing.CallableStatementTracing.Executable; +import com.ai.cloud.skywalking.plugin.mysql.tracing.CallableStatementTracing; +import com.ai.cloud.skywalking.plugin.mysql.tracing.CallableStatementTracing.Executable; public class SWCallableStatement implements CallableStatement { - private SWConnection realConnection; + private Connection realConnection; private java.sql.CallableStatement realStatement; private String connectInfo; private String sql; - SWCallableStatement(SWConnection realConnection, + SWCallableStatement(Connection realConnection, java.sql.CallableStatement realStatement, String connectInfo, String sql) { this.realConnection = realConnection; diff --git a/skywalking-sdk-plugin/jdbc-plugin/src/main/java/com/ai/cloud/skywalking/plugin/jdbc/SWPreparedStatement.java b/skywalking-sdk-plugin/mysql-plugin/src/main/java/com/ai/cloud/skywalking/plugin/mysql/SWPreparedStatement.java similarity index 98% rename from skywalking-sdk-plugin/jdbc-plugin/src/main/java/com/ai/cloud/skywalking/plugin/jdbc/SWPreparedStatement.java rename to skywalking-sdk-plugin/mysql-plugin/src/main/java/com/ai/cloud/skywalking/plugin/mysql/SWPreparedStatement.java index 7f9febd4e..72cbbd44d 100644 --- a/skywalking-sdk-plugin/jdbc-plugin/src/main/java/com/ai/cloud/skywalking/plugin/jdbc/SWPreparedStatement.java +++ b/skywalking-sdk-plugin/mysql-plugin/src/main/java/com/ai/cloud/skywalking/plugin/mysql/SWPreparedStatement.java @@ -1,4 +1,4 @@ -package com.ai.cloud.skywalking.plugin.jdbc; +package com.ai.cloud.skywalking.plugin.mysql; import java.io.InputStream; import java.io.Reader; @@ -23,16 +23,16 @@ import java.sql.Time; import java.sql.Timestamp; import java.util.Calendar; -import com.ai.cloud.skywalking.plugin.jdbc.tracing.PreparedStatementTracing; -import com.ai.cloud.skywalking.plugin.jdbc.tracing.PreparedStatementTracing.Executable; +import com.ai.cloud.skywalking.plugin.mysql.tracing.PreparedStatementTracing; +import com.ai.cloud.skywalking.plugin.mysql.tracing.PreparedStatementTracing.Executable; public class SWPreparedStatement implements PreparedStatement { - private SWConnection realConnection; + private Connection realConnection; private java.sql.PreparedStatement realStatement; private String connectInfo; private String sql; - SWPreparedStatement(SWConnection realConnection, + SWPreparedStatement(Connection realConnection, java.sql.PreparedStatement realStatement, String connectInfo, String sql) { this.realConnection = realConnection; diff --git a/skywalking-sdk-plugin/jdbc-plugin/src/main/java/com/ai/cloud/skywalking/plugin/jdbc/SWStatement.java b/skywalking-sdk-plugin/mysql-plugin/src/main/java/com/ai/cloud/skywalking/plugin/mysql/SWStatement.java similarity index 95% rename from skywalking-sdk-plugin/jdbc-plugin/src/main/java/com/ai/cloud/skywalking/plugin/jdbc/SWStatement.java rename to skywalking-sdk-plugin/mysql-plugin/src/main/java/com/ai/cloud/skywalking/plugin/mysql/SWStatement.java index e577c5cad..6da9754b8 100644 --- a/skywalking-sdk-plugin/jdbc-plugin/src/main/java/com/ai/cloud/skywalking/plugin/jdbc/SWStatement.java +++ b/skywalking-sdk-plugin/mysql-plugin/src/main/java/com/ai/cloud/skywalking/plugin/mysql/SWStatement.java @@ -1,20 +1,20 @@ -package com.ai.cloud.skywalking.plugin.jdbc; +package com.ai.cloud.skywalking.plugin.mysql; import java.sql.Connection; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.SQLWarning; -import com.ai.cloud.skywalking.plugin.jdbc.tracing.StatementTracing; -import com.ai.cloud.skywalking.plugin.jdbc.tracing.StatementTracing.Executable; +import com.ai.cloud.skywalking.plugin.mysql.tracing.StatementTracing; +import com.ai.cloud.skywalking.plugin.mysql.tracing.StatementTracing.Executable; public class SWStatement implements java.sql.Statement { - private SWConnection realConnection; + private Connection realConnection; private java.sql.Statement realStatement; private String connectInfo; - SWStatement(SWConnection realConnection, java.sql.Statement realStatement, String connectInfo){ + SWStatement(Connection realConnection, java.sql.Statement realStatement, String connectInfo){ this.realConnection = realConnection; this.realStatement = realStatement; this.connectInfo = connectInfo; diff --git a/skywalking-sdk-plugin/jdbc-plugin/src/main/java/com/ai/cloud/skywalking/plugin/jdbc/tracing/CallableStatementTracing.java b/skywalking-sdk-plugin/mysql-plugin/src/main/java/com/ai/cloud/skywalking/plugin/mysql/tracing/CallableStatementTracing.java similarity index 90% rename from skywalking-sdk-plugin/jdbc-plugin/src/main/java/com/ai/cloud/skywalking/plugin/jdbc/tracing/CallableStatementTracing.java rename to skywalking-sdk-plugin/mysql-plugin/src/main/java/com/ai/cloud/skywalking/plugin/mysql/tracing/CallableStatementTracing.java index 759c55dd1..b089a834f 100644 --- a/skywalking-sdk-plugin/jdbc-plugin/src/main/java/com/ai/cloud/skywalking/plugin/jdbc/tracing/CallableStatementTracing.java +++ b/skywalking-sdk-plugin/mysql-plugin/src/main/java/com/ai/cloud/skywalking/plugin/mysql/tracing/CallableStatementTracing.java @@ -1,9 +1,9 @@ -package com.ai.cloud.skywalking.plugin.jdbc.tracing; +package com.ai.cloud.skywalking.plugin.mysql.tracing; import java.sql.SQLException; import com.ai.cloud.skywalking.buriedpoint.RPCBuriedPointSender; -import com.ai.cloud.skywalking.plugin.jdbc.JDBCBuriedPointType; +import com.ai.cloud.skywalking.plugin.mysql.JDBCBuriedPointType; import com.ai.cloud.skywalking.model.Identification; /** diff --git a/skywalking-sdk-plugin/jdbc-plugin/src/main/java/com/ai/cloud/skywalking/plugin/jdbc/tracing/PreparedStatementTracing.java b/skywalking-sdk-plugin/mysql-plugin/src/main/java/com/ai/cloud/skywalking/plugin/mysql/tracing/PreparedStatementTracing.java similarity index 90% rename from skywalking-sdk-plugin/jdbc-plugin/src/main/java/com/ai/cloud/skywalking/plugin/jdbc/tracing/PreparedStatementTracing.java rename to skywalking-sdk-plugin/mysql-plugin/src/main/java/com/ai/cloud/skywalking/plugin/mysql/tracing/PreparedStatementTracing.java index d3535e386..89ac3f4bc 100644 --- a/skywalking-sdk-plugin/jdbc-plugin/src/main/java/com/ai/cloud/skywalking/plugin/jdbc/tracing/PreparedStatementTracing.java +++ b/skywalking-sdk-plugin/mysql-plugin/src/main/java/com/ai/cloud/skywalking/plugin/mysql/tracing/PreparedStatementTracing.java @@ -1,9 +1,9 @@ -package com.ai.cloud.skywalking.plugin.jdbc.tracing; +package com.ai.cloud.skywalking.plugin.mysql.tracing; import java.sql.SQLException; import com.ai.cloud.skywalking.buriedpoint.RPCBuriedPointSender; -import com.ai.cloud.skywalking.plugin.jdbc.JDBCBuriedPointType; +import com.ai.cloud.skywalking.plugin.mysql.JDBCBuriedPointType; import com.ai.cloud.skywalking.model.Identification; /** diff --git a/skywalking-sdk-plugin/jdbc-plugin/src/main/java/com/ai/cloud/skywalking/plugin/jdbc/tracing/StatementTracing.java b/skywalking-sdk-plugin/mysql-plugin/src/main/java/com/ai/cloud/skywalking/plugin/mysql/tracing/StatementTracing.java similarity index 91% rename from skywalking-sdk-plugin/jdbc-plugin/src/main/java/com/ai/cloud/skywalking/plugin/jdbc/tracing/StatementTracing.java rename to skywalking-sdk-plugin/mysql-plugin/src/main/java/com/ai/cloud/skywalking/plugin/mysql/tracing/StatementTracing.java index d1dd7d3e4..12012cb4a 100644 --- a/skywalking-sdk-plugin/jdbc-plugin/src/main/java/com/ai/cloud/skywalking/plugin/jdbc/tracing/StatementTracing.java +++ b/skywalking-sdk-plugin/mysql-plugin/src/main/java/com/ai/cloud/skywalking/plugin/mysql/tracing/StatementTracing.java @@ -1,7 +1,7 @@ -package com.ai.cloud.skywalking.plugin.jdbc.tracing; +package com.ai.cloud.skywalking.plugin.mysql.tracing; import com.ai.cloud.skywalking.buriedpoint.RPCBuriedPointSender; -import com.ai.cloud.skywalking.plugin.jdbc.JDBCBuriedPointType; +import com.ai.cloud.skywalking.plugin.mysql.JDBCBuriedPointType; import com.ai.cloud.skywalking.model.Identification; import java.sql.SQLException; diff --git a/skywalking-sdk-plugin/mysql-plugin/src/main/resources/log4j2.xml b/skywalking-sdk-plugin/mysql-plugin/src/main/resources/log4j2.xml new file mode 100644 index 000000000..4e2af7485 --- /dev/null +++ b/skywalking-sdk-plugin/mysql-plugin/src/main/resources/log4j2.xml @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/skywalking-sdk-plugin/mysql-plugin/src/main/resources/sky-walking.auth b/skywalking-sdk-plugin/mysql-plugin/src/main/resources/sky-walking.auth new file mode 100644 index 000000000..c794ea37c --- /dev/null +++ b/skywalking-sdk-plugin/mysql-plugin/src/main/resources/sky-walking.auth @@ -0,0 +1,47 @@ +#skyWalking用户ID +skywalking.user_id=123 +#skyWalking应用编码 +skywalking.application_code=test +#skywalking auth的环境变量名字 +skywalking.auth_system_env_name=SKYWALKING_RUN +#skywalking数据编码 +skywalking.charset=UTF-8 + +#是否打印数据 +buriedpoint.printf=true +#埋点异常的最大长度 +buriedpoint.max_exception_stack_length=4000 +#业务字段的最大长度 +buriedpoint.businesskey_max_length=300 +#过滤异常 +buriedpoint.exclusive_exceptions=java.lang.RuntimeException + +#最大发送者的连接数阀比例 +sender.connect_percent=100 +#发送服务端配置 +sender.servers_addr=127.0.0.1:34000 +#最大发送的副本数量 +sender.max_copy_num=2 +#发送的最大长度 +sender.max_send_length=20000 +#当没有Sender时,尝试获取sender的等待周期 +sender.retry_get_sender_wait_interval=2000 +#是否开启发送消息 +sender.is_off=false + + +#最大消费线程数 +consumer.max_consumer=2 +#消费者最大等待时间 +consumer.max_wait_time=5 +#发送失败等待时间 +consumer.consumer_fail_retry_wait_interval=50 + +#每个Buffer的最大个数 +buffer.buffer_max_size=18000 +#Buffer池的最大长度 +buffer.pool_size=5 + +#发送检查线程检查周期 +senderchecker.check_polling_time=200 + diff --git a/skywalking-sdk-plugin/mysql-plugin/src/main/resources/skywalking-plugin.def b/skywalking-sdk-plugin/mysql-plugin/src/main/resources/skywalking-plugin.def new file mode 100644 index 000000000..a309bb0fe --- /dev/null +++ b/skywalking-sdk-plugin/mysql-plugin/src/main/resources/skywalking-plugin.def @@ -0,0 +1 @@ +com.ai.cloud.skywalking.plugin.mysql.ConnectionPluginDefine diff --git a/skywalking-sdk-plugin/mysql-plugin/src/test/java/test/ai/cloud/skywalking/plugin/mysql/TestMySQLDriver.java b/skywalking-sdk-plugin/mysql-plugin/src/test/java/test/ai/cloud/skywalking/plugin/mysql/TestMySQLDriver.java new file mode 100644 index 000000000..fc1eb2c83 --- /dev/null +++ b/skywalking-sdk-plugin/mysql-plugin/src/test/java/test/ai/cloud/skywalking/plugin/mysql/TestMySQLDriver.java @@ -0,0 +1,40 @@ +package test.ai.cloud.skywalking.plugin.mysql; + +import java.lang.reflect.InvocationTargetException; +import java.sql.Connection; +import java.sql.DriverManager; +import java.sql.PreparedStatement; +import java.sql.SQLException; +import java.sql.Statement; + +import org.junit.Test; + +import com.ai.cloud.skywalking.plugin.TracingBootstrap; + +public class TestMySQLDriver { + @Test + public void testsql() throws IllegalAccessException, + IllegalArgumentException, InvocationTargetException, + NoSuchMethodException, SecurityException, ClassNotFoundException { + TracingBootstrap + .main(new String[] { "test.ai.cloud.skywalking.plugin.mysql.TestMySQLDriver" }); + } + + public static void main(String[] args) throws ClassNotFoundException, SQLException, InterruptedException { + Class.forName("com.mysql.jdbc.Driver"); + String url="jdbc:mysql://10.1.228.202:31316/test?user=devrdbusr21&password=devrdbusr21"; + + Connection con = DriverManager.getConnection(url); + Statement state = con.createStatement(); + con.setAutoCommit(false); + state.execute("select 1 from dual"); + + PreparedStatement p0 = con.prepareStatement("select 1 from dual where 1=?"); + p0.setInt(1, 1); + p0.execute(); + con.commit(); + con.close(); + + Thread.sleep(5* 1000); + } +} diff --git a/skywalking-sdk-plugin/pom.xml b/skywalking-sdk-plugin/pom.xml index 7ff5b4bc7..05addc40a 100644 --- a/skywalking-sdk-plugin/pom.xml +++ b/skywalking-sdk-plugin/pom.xml @@ -8,7 +8,7 @@ dubbo-plugin spring-plugin - jdbc-plugin + mysql-plugin web-plugin httpclient-4.2.x-plugin httpclient-4.3.x-plugin @@ -26,7 +26,7 @@ junit junit - 3.8.1 + 4.12 test -- GitLab