From d6507d2feaa32d41c7a515780d76a8a6e05224e8 Mon Sep 17 00:00:00 2001 From: wusheng Date: Tue, 2 Aug 2016 21:43:33 +0800 Subject: [PATCH] =?UTF-8?q?=E8=B0=83=E5=87=86=E5=85=A8=E5=A5=97=E7=9A=84cl?= =?UTF-8?q?assloader=E6=9C=BA=E5=88=B6=EF=BC=8C=E5=AE=9E=E7=8E=B0=E8=87=AA?= =?UTF-8?q?=E5=B7=B1=E7=9A=84classload=E3=80=82=E4=BF=9D=E8=AF=81=E7=B1=BB?= =?UTF-8?q?=E6=89=80=E5=9C=A8=E7=9A=84classload=E5=85=B3=E7=B3=BB=E6=AD=A3?= =?UTF-8?q?=E7=A1=AE=E3=80=82=20=E9=81=97=E7=95=99=E9=97=AE=E9=A2=98?= =?UTF-8?q?=EF=BC=9Adubbo=E6=8F=92=E4=BB=B6=E5=AE=9E=E7=8E=B0=E6=A8=A1?= =?UTF-8?q?=E5=BC=8F=E9=94=99=E8=AF=AF=EF=BC=8C=E5=BA=94=E8=AF=A5=E8=80=83?= =?UTF-8?q?=E8=99=91=E5=A2=9E=E5=BC=BAMonitorFilter=E7=9A=84invoke?= =?UTF-8?q?=E6=96=B9=E6=B3=95=EF=BC=8C=E8=80=8C=E4=B8=8D=E6=98=AF=E6=96=B0?= =?UTF-8?q?=E5=A2=9EFilter=EF=BC=8C=E6=96=B0=E5=A2=9EFilter=E7=94=B1?= =?UTF-8?q?=E4=BA=8Edubbo=E4=BB=A5spi=E6=A8=A1=E5=BC=8F=E8=BF=90=E8=A1=8C?= =?UTF-8?q?=EF=BC=8C=E4=BC=9A=E6=9C=89=E9=97=AE=E9=A2=98=E3=80=82=20?= =?UTF-8?q?=E5=8F=A6=E5=A4=96=EF=BC=8CJDBC=E6=8F=92=E4=BB=B6=E4=B8=8D?= =?UTF-8?q?=E5=BA=94=E8=AF=A5=E6=A0=B9=E6=8D=AEurl=E5=8E=BB=E6=9F=A5?= =?UTF-8?q?=E6=89=BE=E9=A9=B1=E5=8A=A8=EF=BC=8C=E5=BA=94=E8=AF=A5=E5=9C=A8?= =?UTF-8?q?=E5=BD=93=E5=89=8D=E7=9A=84DriverManager=E7=9A=84=E5=85=B6?= =?UTF-8?q?=E4=BB=96=E6=B3=A8=E5=86=8C=E9=A9=B1=E5=8A=A8=E4=B8=AD=E5=8E=BB?= =?UTF-8?q?=E5=AF=BB=E6=89=BE=E5=90=88=E9=80=82=E7=9A=84=EF=BC=8C=E8=BF=9B?= =?UTF-8?q?=E8=A1=8C=E8=B0=83=E7=94=A8=E5=90=8E=EF=BC=8C=E5=8C=85=E8=A3=85?= =?UTF-8?q?=E8=BF=94=E5=9B=9E=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../example-dubbo/dubbo-impl/pom.xml | 16 -- .../dubbo-impl/src/main/resources/log4j.xml | 2 +- .../skywalking-example/example-web/pom.xml | 12 +- .../src/main/resources/log4j.properties | 4 +- .../skywalking/agent/SkyWalkingAgent.java | 2 - .../com/ai/cloud/skywalking/conf/Config.java | 2 +- .../skywalking/conf/ConfigInitializer.java | 2 +- .../enhance/ClassConstructorInterceptor.java | 9 +- .../enhance/ClassEnhancePluginDefine.java | 20 +-- ...assInstanceMethodsEnhancePluginDefine.java | 2 +- .../ClassInstanceMethodsInterceptor.java | 40 ++--- ...ClassStaticMethodsEnhancePluginDefine.java | 2 +- .../ClassStaticMethodsInterceptor.java | 9 +- .../loader/InterceptorInstanceLoader.java | 138 ++++++++++++++++++ .../cloud/matcher/ExclusionMatcherTest.java | 2 +- .../ai/cloud/matcher/TestMatcherDefine.java | 5 +- .../cloud/plugin/TestInterceptorDefine.java | 9 +- .../plugin/dubbo/DubboPluginDefine.java | 4 +- .../ProtocolFilterBuildChainInterceptor.java | 2 +- .../plugin/define/HttpClientPluginDefine.java | 5 +- .../define/JedisClusterPluginDefine.java | 5 +- .../v2/plugin/define/JedisPluginDefine.java | 5 +- .../tomcat78x/define/TomcatPluginDefine.java | 13 +- 23 files changed, 217 insertions(+), 93 deletions(-) create mode 100644 skywalking-collector/skywalking-api/src/main/java/com/ai/cloud/skywalking/plugin/interceptor/loader/InterceptorInstanceLoader.java diff --git a/samples/skywalking-example/example-dubbo/dubbo-impl/pom.xml b/samples/skywalking-example/example-dubbo/dubbo-impl/pom.xml index 6308a20ef..6bc0dcc4a 100644 --- a/samples/skywalking-example/example-dubbo/dubbo-impl/pom.xml +++ b/samples/skywalking-example/example-dubbo/dubbo-impl/pom.xml @@ -78,22 +78,6 @@ h2 1.4.192 - - com.ai.cloud - skywalking-log4j-1.x-plugin - 1.0-Final - - - com.ai.cloud - skywalking-log4j-2.x-plugin - 1.0-Final - - - com.ai.cloud - skywalking-api - 1.0-Final - test - org.mybatis mybatis diff --git a/samples/skywalking-example/example-dubbo/dubbo-impl/src/main/resources/log4j.xml b/samples/skywalking-example/example-dubbo/dubbo-impl/src/main/resources/log4j.xml index 55304ff73..9833431ba 100644 --- a/samples/skywalking-example/example-dubbo/dubbo-impl/src/main/resources/log4j.xml +++ b/samples/skywalking-example/example-dubbo/dubbo-impl/src/main/resources/log4j.xml @@ -3,7 +3,7 @@ - + diff --git a/samples/skywalking-example/example-web/pom.xml b/samples/skywalking-example/example-web/pom.xml index 7f2bb2247..87bd9e139 100644 --- a/samples/skywalking-example/example-web/pom.xml +++ b/samples/skywalking-example/example-web/pom.xml @@ -67,14 +67,14 @@ 0.7 - com.ai.cloud - skywalking-log4j-1.x-plugin - 1.0-Final + log4j + log4j + 1.2.17 - com.ai.cloud - skywalking-log4j-2.x-plugin - 1.0-Final + org.apache.logging.log4j + log4j-core + 2.2 diff --git a/samples/skywalking-example/example-web/src/main/resources/log4j.properties b/samples/skywalking-example/example-web/src/main/resources/log4j.properties index 93af71c78..9136f00e3 100644 --- a/samples/skywalking-example/example-web/src/main/resources/log4j.properties +++ b/samples/skywalking-example/example-web/src/main/resources/log4j.properties @@ -5,5 +5,5 @@ log4j.rootLogger=DEBUG, A1 #log4j.appender.A1.layout.ConversionPattern=%-d{yyyy-MM-dd HH:mm:ss.SSS} %c %n[%p] %n%m%n log4j.appender.A1=org.apache.log4j.ConsoleAppender -log4j.appender.A1.layout=com.ai.cloud.skywalking.plugin.log.log4j.v1.x.TraceIdPatternLayout -log4j.appender.A1.layout.ConversionPattern=%x %-d{yyyy-MM-dd HH:mm:ss.SSS} %c %n[%p] %n%m%n +log4j.appender.A1.layout=org.apache.log4j.PatternLayout +log4j.appender.A1.layout.ConversionPattern=%-d{yyyy-MM-dd HH:mm:ss.SSS} %c %n[%p] %n%m%n diff --git a/skywalking-collector/skywalking-agent/src/main/java/com/ai/cloud/skywalking/agent/SkyWalkingAgent.java b/skywalking-collector/skywalking-agent/src/main/java/com/ai/cloud/skywalking/agent/SkyWalkingAgent.java index 6e62f5bf3..6f5885de4 100644 --- a/skywalking-collector/skywalking-agent/src/main/java/com/ai/cloud/skywalking/agent/SkyWalkingAgent.java +++ b/skywalking-collector/skywalking-agent/src/main/java/com/ai/cloud/skywalking/agent/SkyWalkingAgent.java @@ -42,7 +42,6 @@ public class SkyWalkingAgent { @Override public void onIgnored(TypeDescription typeDescription, ClassLoader classLoader, JavaModule module) { - logger.info("ignore to enhance class " + typeDescription.getTypeName()); } @Override @@ -52,7 +51,6 @@ public class SkyWalkingAgent { @Override public void onComplete(String typeName, ClassLoader classLoader, JavaModule module) { - logger.info("enhance class " + typeName + " complete."); } }).installOn(instrumentation); diff --git a/skywalking-collector/skywalking-api/src/main/java/com/ai/cloud/skywalking/conf/Config.java b/skywalking-collector/skywalking-api/src/main/java/com/ai/cloud/skywalking/conf/Config.java index 3aadab0b6..a4eec243e 100644 --- a/skywalking-collector/skywalking-api/src/main/java/com/ai/cloud/skywalking/conf/Config.java +++ b/skywalking-collector/skywalking-api/src/main/java/com/ai/cloud/skywalking/conf/Config.java @@ -97,7 +97,7 @@ public class Config { // log文件文件夹名字 public static String LOG_DIR_NAME = "logs"; // 最大文件大小 - public static int MAX_LOG_FILE_LENGTH = 3 * 1024 * 1024; + public static int MAX_LOG_FILE_LENGTH = 300 * 1024 * 1024; // skywalking 系统错误文件日志 public static String SYSTEM_ERROR_LOG_FILE_NAME = "skywalking-api-error.log"; } diff --git a/skywalking-collector/skywalking-api/src/main/java/com/ai/cloud/skywalking/conf/ConfigInitializer.java b/skywalking-collector/skywalking-api/src/main/java/com/ai/cloud/skywalking/conf/ConfigInitializer.java index 1e61a57d7..b5cbde9ae 100644 --- a/skywalking-collector/skywalking-api/src/main/java/com/ai/cloud/skywalking/conf/ConfigInitializer.java +++ b/skywalking-collector/skywalking-api/src/main/java/com/ai/cloud/skywalking/conf/ConfigInitializer.java @@ -18,7 +18,7 @@ public class ConfigInitializer { static void initialize(InputStream inputStream) { if (inputStream == null) { - logger.info("No provider sky-walking certification documents, sky-walking api auto shutdown."); + logger.info("Not provide sky-walking certification documents, sky-walking api auto shutdown."); } else { try { Properties properties = new Properties(); diff --git a/skywalking-collector/skywalking-api/src/main/java/com/ai/cloud/skywalking/plugin/interceptor/enhance/ClassConstructorInterceptor.java b/skywalking-collector/skywalking-api/src/main/java/com/ai/cloud/skywalking/plugin/interceptor/enhance/ClassConstructorInterceptor.java index c85d925bc..5ef07e059 100644 --- a/skywalking-collector/skywalking-api/src/main/java/com/ai/cloud/skywalking/plugin/interceptor/enhance/ClassConstructorInterceptor.java +++ b/skywalking-collector/skywalking-api/src/main/java/com/ai/cloud/skywalking/plugin/interceptor/enhance/ClassConstructorInterceptor.java @@ -2,6 +2,7 @@ package com.ai.cloud.skywalking.plugin.interceptor.enhance; import com.ai.cloud.skywalking.logging.LogManager; import com.ai.cloud.skywalking.logging.Logger; +import com.ai.cloud.skywalking.plugin.interceptor.loader.InterceptorInstanceLoader; import net.bytebuddy.implementation.bind.annotation.AllArguments; import net.bytebuddy.implementation.bind.annotation.FieldProxy; import net.bytebuddy.implementation.bind.annotation.RuntimeType; @@ -13,10 +14,10 @@ public class ClassConstructorInterceptor { private static Logger logger = LogManager .getLogger(ClassConstructorInterceptor.class); - private InstanceMethodsAroundInterceptor interceptor; + private String instanceMethodsAroundInterceptorClassName; - public ClassConstructorInterceptor(InstanceMethodsAroundInterceptor interceptor) { - this.interceptor = interceptor; + public ClassConstructorInterceptor(String instanceMethodsAroundInterceptorClassName) { + this.instanceMethodsAroundInterceptorClassName = instanceMethodsAroundInterceptorClassName; } @RuntimeType @@ -25,6 +26,8 @@ public class ClassConstructorInterceptor { @FieldProxy(ClassEnhancePluginDefine.contextAttrName) FieldSetter accessor, @AllArguments Object[] allArguments) { try { + InstanceMethodsAroundInterceptor interceptor = InterceptorInstanceLoader.load(instanceMethodsAroundInterceptorClassName, obj.getClass().getClassLoader()); + EnhancedClassInstanceContext context = new EnhancedClassInstanceContext(); accessor.setValue(context); ConstructorInvokeContext interceptorContext = new ConstructorInvokeContext(obj, diff --git a/skywalking-collector/skywalking-api/src/main/java/com/ai/cloud/skywalking/plugin/interceptor/enhance/ClassEnhancePluginDefine.java b/skywalking-collector/skywalking-api/src/main/java/com/ai/cloud/skywalking/plugin/interceptor/enhance/ClassEnhancePluginDefine.java index 82d128873..86ed27e67 100644 --- a/skywalking-collector/skywalking-api/src/main/java/com/ai/cloud/skywalking/plugin/interceptor/enhance/ClassEnhancePluginDefine.java +++ b/skywalking-collector/skywalking-api/src/main/java/com/ai/cloud/skywalking/plugin/interceptor/enhance/ClassEnhancePluginDefine.java @@ -5,6 +5,7 @@ import static net.bytebuddy.matcher.ElementMatchers.not; import com.ai.cloud.skywalking.logging.LogManager; import com.ai.cloud.skywalking.logging.Logger; +import com.ai.cloud.skywalking.protocol.util.StringUtil; import net.bytebuddy.description.method.MethodDescription; import net.bytebuddy.dynamic.DynamicType; import net.bytebuddy.implementation.MethodDelegation; @@ -25,6 +26,7 @@ public abstract class ClassEnhancePluginDefine extends AbstractClassEnhancePlugi public static final String contextAttrName = "_$EnhancedClassInstanceContext"; + @Override protected DynamicType.Builder enhance(String enhanceOriginClassName, DynamicType.Builder newClassBuilder) throws PluginException { newClassBuilder = this.enhanceClass(enhanceOriginClassName, newClassBuilder); @@ -52,9 +54,9 @@ public abstract class ClassEnhancePluginDefine extends AbstractClassEnhancePlugi * 2.intercept constructor by default, and intercept method which it's * required by interceptorDefineClass.
*/ - InstanceMethodsAroundInterceptor interceptor = getInstanceMethodsInterceptor(); - if (interceptor == null) { - throw new EnhanceException("no InstanceMethodsAroundInterceptor instance. "); + String interceptor = getInstanceMethodsInterceptor(); + if (StringUtil.isEmpty(interceptor)) { + throw new EnhanceException("no InstanceMethodsAroundInterceptor define. "); } newClassBuilder = newClassBuilder @@ -116,7 +118,7 @@ public abstract class ClassEnhancePluginDefine extends AbstractClassEnhancePlugi * * @return */ - protected abstract InstanceMethodsAroundInterceptor getInstanceMethodsInterceptor(); + protected abstract String getInstanceMethodsInterceptor(); private DynamicType.Builder enhanceClass(String enhanceOriginClassName, DynamicType.Builder newClassBuilder) throws PluginException { @@ -124,10 +126,10 @@ public abstract class ClassEnhancePluginDefine extends AbstractClassEnhancePlugi if(methodMatchers == null){ return newClassBuilder; } - - StaticMethodsAroundInterceptor interceptor = getStaticMethodsInterceptor(); - if (interceptor == null) { - throw new EnhanceException("no StaticMethodsAroundInterceptor instance. "); + + String interceptor = getStaticMethodsInterceptor(); + if (StringUtil.isEmpty(interceptor)) { + throw new EnhanceException("no StaticMethodsAroundInterceptor define. "); } @@ -178,5 +180,5 @@ public abstract class ClassEnhancePluginDefine extends AbstractClassEnhancePlugi * * @return */ - protected abstract StaticMethodsAroundInterceptor getStaticMethodsInterceptor(); + protected abstract String getStaticMethodsInterceptor(); } diff --git a/skywalking-collector/skywalking-api/src/main/java/com/ai/cloud/skywalking/plugin/interceptor/enhance/ClassInstanceMethodsEnhancePluginDefine.java b/skywalking-collector/skywalking-api/src/main/java/com/ai/cloud/skywalking/plugin/interceptor/enhance/ClassInstanceMethodsEnhancePluginDefine.java index 90c712b95..f6ae6c706 100644 --- a/skywalking-collector/skywalking-api/src/main/java/com/ai/cloud/skywalking/plugin/interceptor/enhance/ClassInstanceMethodsEnhancePluginDefine.java +++ b/skywalking-collector/skywalking-api/src/main/java/com/ai/cloud/skywalking/plugin/interceptor/enhance/ClassInstanceMethodsEnhancePluginDefine.java @@ -17,7 +17,7 @@ public abstract class ClassInstanceMethodsEnhancePluginDefine extends } @Override - protected StaticMethodsAroundInterceptor getStaticMethodsInterceptor() { + protected String getStaticMethodsInterceptor() { return null; } diff --git a/skywalking-collector/skywalking-api/src/main/java/com/ai/cloud/skywalking/plugin/interceptor/enhance/ClassInstanceMethodsInterceptor.java b/skywalking-collector/skywalking-api/src/main/java/com/ai/cloud/skywalking/plugin/interceptor/enhance/ClassInstanceMethodsInterceptor.java index 04f4d05fd..6d4c224d8 100644 --- a/skywalking-collector/skywalking-api/src/main/java/com/ai/cloud/skywalking/plugin/interceptor/enhance/ClassInstanceMethodsInterceptor.java +++ b/skywalking-collector/skywalking-api/src/main/java/com/ai/cloud/skywalking/plugin/interceptor/enhance/ClassInstanceMethodsInterceptor.java @@ -3,9 +3,17 @@ package com.ai.cloud.skywalking.plugin.interceptor.enhance; import com.ai.cloud.skywalking.logging.LogManager; import com.ai.cloud.skywalking.logging.Logger; import com.ai.cloud.skywalking.plugin.interceptor.EnhancedClassInstanceContext; +import com.ai.cloud.skywalking.plugin.interceptor.loader.InterceptorInstanceLoader; +import net.bytebuddy.ByteBuddy; +import net.bytebuddy.dynamic.loading.ClassLoadingStrategy; import net.bytebuddy.implementation.bind.annotation.*; +import sun.tools.jar.resources.jar; +import java.io.BufferedInputStream; +import java.io.ByteArrayOutputStream; +import java.io.IOException; import java.lang.reflect.Method; +import java.security.ProtectionDomain; import java.util.concurrent.Callable; /** @@ -14,31 +22,25 @@ import java.util.concurrent.Callable; * @author wusheng */ public class ClassInstanceMethodsInterceptor { - private static Logger logger = LogManager - .getLogger(ClassInstanceMethodsInterceptor.class); + private static Logger logger = LogManager.getLogger(ClassInstanceMethodsInterceptor.class); - private InstanceMethodsAroundInterceptor interceptor; + private String instanceMethodsAroundInterceptorClassName; - public ClassInstanceMethodsInterceptor(InstanceMethodsAroundInterceptor interceptor) { - this.interceptor = interceptor; + public ClassInstanceMethodsInterceptor(String instanceMethodsAroundInterceptorClassName) { + this.instanceMethodsAroundInterceptorClassName = instanceMethodsAroundInterceptorClassName; } @RuntimeType - public Object intercept( - @This Object obj, - @AllArguments Object[] allArguments, - @Origin Method method, - @SuperCall Callable zuper, - @FieldValue(ClassEnhancePluginDefine.contextAttrName) EnhancedClassInstanceContext instanceContext) - throws Exception { - InstanceMethodInvokeContext interceptorContext = new InstanceMethodInvokeContext(obj, - method.getName(), allArguments); + public Object intercept(@This Object obj, @AllArguments Object[] allArguments, @Origin Method method, @SuperCall Callable zuper, + @FieldValue(ClassEnhancePluginDefine.contextAttrName) EnhancedClassInstanceContext instanceContext) throws Exception { + InstanceMethodsAroundInterceptor interceptor = InterceptorInstanceLoader.load(instanceMethodsAroundInterceptorClassName, obj.getClass().getClassLoader()); + + InstanceMethodInvokeContext interceptorContext = new InstanceMethodInvokeContext(obj, method.getName(), allArguments); MethodInterceptResult result = new MethodInterceptResult(); try { interceptor.beforeMethod(instanceContext, interceptorContext, result); } catch (Throwable t) { - logger.error("class[{}] before method[{}] intercept failue:{}", - new Object[]{obj.getClass(), method.getName(), t.getMessage()}, t); + logger.error("class[{}] before method[{}] intercept failue:{}", new Object[] {obj.getClass(), method.getName(), t.getMessage()}, t); } if (!result.isContinue()) { return result._ret(); @@ -51,16 +53,14 @@ public class ClassInstanceMethodsInterceptor { try { interceptor.handleMethodException(t, instanceContext, interceptorContext, ret); } catch (Throwable t2) { - logger.error("class[{}] handle method[{}] exception failue:{}", - new Object[]{obj.getClass(), method.getName(), t2.getMessage()}, t2); + logger.error("class[{}] handle method[{}] exception failue:{}", new Object[] {obj.getClass(), method.getName(), t2.getMessage()}, t2); } throw t; } finally { try { ret = interceptor.afterMethod(instanceContext, interceptorContext, ret); } catch (Throwable t) { - logger.error("class[{}] after method[{}] intercept failue:{}", - new Object[]{obj.getClass(), method.getName(), t.getMessage()}, t); + logger.error("class[{}] after method[{}] intercept failue:{}", new Object[] {obj.getClass(), method.getName(), t.getMessage()}, t); } } return ret; diff --git a/skywalking-collector/skywalking-api/src/main/java/com/ai/cloud/skywalking/plugin/interceptor/enhance/ClassStaticMethodsEnhancePluginDefine.java b/skywalking-collector/skywalking-api/src/main/java/com/ai/cloud/skywalking/plugin/interceptor/enhance/ClassStaticMethodsEnhancePluginDefine.java index 3629ab318..e6f2ba19f 100644 --- a/skywalking-collector/skywalking-api/src/main/java/com/ai/cloud/skywalking/plugin/interceptor/enhance/ClassStaticMethodsEnhancePluginDefine.java +++ b/skywalking-collector/skywalking-api/src/main/java/com/ai/cloud/skywalking/plugin/interceptor/enhance/ClassStaticMethodsEnhancePluginDefine.java @@ -17,7 +17,7 @@ public abstract class ClassStaticMethodsEnhancePluginDefine extends } @Override - protected InstanceMethodsAroundInterceptor getInstanceMethodsInterceptor() { + protected String getInstanceMethodsInterceptor() { return null; } } diff --git a/skywalking-collector/skywalking-api/src/main/java/com/ai/cloud/skywalking/plugin/interceptor/enhance/ClassStaticMethodsInterceptor.java b/skywalking-collector/skywalking-api/src/main/java/com/ai/cloud/skywalking/plugin/interceptor/enhance/ClassStaticMethodsInterceptor.java index 364f8f716..8ba42c473 100644 --- a/skywalking-collector/skywalking-api/src/main/java/com/ai/cloud/skywalking/plugin/interceptor/enhance/ClassStaticMethodsInterceptor.java +++ b/skywalking-collector/skywalking-api/src/main/java/com/ai/cloud/skywalking/plugin/interceptor/enhance/ClassStaticMethodsInterceptor.java @@ -2,6 +2,7 @@ package com.ai.cloud.skywalking.plugin.interceptor.enhance; import com.ai.cloud.skywalking.logging.LogManager; import com.ai.cloud.skywalking.logging.Logger; +import com.ai.cloud.skywalking.plugin.interceptor.loader.InterceptorInstanceLoader; import net.bytebuddy.implementation.bind.annotation.AllArguments; import net.bytebuddy.implementation.bind.annotation.Origin; import net.bytebuddy.implementation.bind.annotation.RuntimeType; @@ -18,14 +19,16 @@ import java.util.concurrent.Callable; public class ClassStaticMethodsInterceptor { private static Logger logger = LogManager.getLogger(ClassStaticMethodsInterceptor.class); - private StaticMethodsAroundInterceptor interceptor; + private String staticMethodsAroundInterceptorClassName; - public ClassStaticMethodsInterceptor(StaticMethodsAroundInterceptor interceptor) { - this.interceptor = interceptor; + public ClassStaticMethodsInterceptor(String staticMethodsAroundInterceptorClassName) { + this.staticMethodsAroundInterceptorClassName = staticMethodsAroundInterceptorClassName; } @RuntimeType public Object intercept(@Origin Class clazz, @AllArguments Object[] allArguments, @Origin Method method, @SuperCall Callable zuper) throws Exception { + StaticMethodsAroundInterceptor interceptor = InterceptorInstanceLoader.load(staticMethodsAroundInterceptorClassName, clazz.getClassLoader()); + MethodInvokeContext interceptorContext = new MethodInvokeContext(method.getName(), allArguments); MethodInterceptResult result = new MethodInterceptResult(); try { diff --git a/skywalking-collector/skywalking-api/src/main/java/com/ai/cloud/skywalking/plugin/interceptor/loader/InterceptorInstanceLoader.java b/skywalking-collector/skywalking-api/src/main/java/com/ai/cloud/skywalking/plugin/interceptor/loader/InterceptorInstanceLoader.java new file mode 100644 index 000000000..0996f3002 --- /dev/null +++ b/skywalking-collector/skywalking-api/src/main/java/com/ai/cloud/skywalking/plugin/interceptor/loader/InterceptorInstanceLoader.java @@ -0,0 +1,138 @@ +package com.ai.cloud.skywalking.plugin.interceptor.loader; + +import com.ai.cloud.skywalking.logging.LogManager; +import com.ai.cloud.skywalking.logging.Logger; +import com.ai.cloud.skywalking.plugin.interceptor.enhance.ClassInstanceMethodsInterceptor; + +import java.io.BufferedInputStream; +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.security.ProtectionDomain; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.locks.ReentrantLock; + +/** + * Created by wusheng on 16/8/2. + */ +public class InterceptorInstanceLoader { + private static Logger logger = LogManager.getLogger(InterceptorInstanceLoader.class); + + private static ConcurrentHashMap INSTANCE_CACHE = new ConcurrentHashMap<>(); + + private static ReentrantLock instanceLoadLock = new ReentrantLock(); + + public static T load(String className, ClassLoader targetClassLoader) + throws InvocationTargetException, IllegalAccessException, InstantiationException, ClassNotFoundException { + if (InterceptorInstanceLoader.class.getClassLoader().equals(targetClassLoader)) { + return (T) targetClassLoader.loadClass(className).newInstance(); + } + + String instanceKey = className + "_OF_" + targetClassLoader.getClass().getName() + "@" + Integer.toHexString(targetClassLoader.hashCode()); + Object inst = INSTANCE_CACHE.get(instanceKey); + if (inst != null) { + return (T) inst; + } + instanceLoadLock.lock(); + try { + try { + inst = findLoadedClass(className, targetClassLoader); + if (inst == null) { + inst = loadBinary(className, targetClassLoader); + } + if (inst == null) { + throw new ClassNotFoundException(targetClassLoader.toString() + " load interceptor class:" + className + " failure."); + } + INSTANCE_CACHE.put(instanceKey, inst); + return (T) inst; + } catch (Exception e) { + throw new ClassNotFoundException(targetClassLoader.toString() + " load interceptor class:" + className + " failure.", e); + } + } finally + + { + instanceLoadLock.unlock(); + } + + } + + /** + * 通过二进制读取,直接加载类文件,然后通过上下文所需的classLoader强制加载 + * + * @param className + * @param targetClassLoader + * @param + * @return + * @throws InvocationTargetException + * @throws IllegalAccessException + * @throws InstantiationException + */ + private static T loadBinary(String className, ClassLoader targetClassLoader) throws InvocationTargetException, IllegalAccessException, InstantiationException { + String path = "/" + className.replace('.', '/').concat(".class"); + byte[] data = null; + BufferedInputStream is = null; + ByteArrayOutputStream baos = null; + try { + is = new BufferedInputStream(InterceptorInstanceLoader.class.getResourceAsStream(path)); + baos = new ByteArrayOutputStream(); + int ch = 0; + while ((ch = is.read()) != -1) { + baos.write(ch); + } + data = baos.toByteArray(); + } catch (IOException e) { + logger.error(e.getMessage(), e); + } finally { + if (is != null) + try { + is.close(); + } catch (IOException ignored) { + } + if (baos != null) + try { + baos.close(); + } catch (IOException ignored) { + } + } + + Method defineClassMethod = null; + Class targetClassLoaderType = targetClassLoader.getClass(); + while (defineClassMethod == null && targetClassLoaderType != null) { + try { + defineClassMethod = targetClassLoaderType.getDeclaredMethod("defineClass", String.class, byte[].class, int.class, int.class, ProtectionDomain.class); + } catch (NoSuchMethodException e) { + targetClassLoaderType = targetClassLoaderType.getSuperclass(); + } + } + defineClassMethod.setAccessible(true); + Class type = (Class) defineClassMethod.invoke(targetClassLoader, className, data, 0, data.length, null); + return (T) type.newInstance(); + } + + /** + * 在当前classloader中查找是否已经加载此类。 + * + * @param className + * @param targetClassLoader + * @param + * @return + */ + private static T findLoadedClass(String className, ClassLoader targetClassLoader) throws InvocationTargetException, IllegalAccessException, InstantiationException { + Method defineClassMethod = null; + Class targetClassLoaderType = targetClassLoader.getClass(); + while (defineClassMethod == null && targetClassLoaderType != null) { + try { + defineClassMethod = targetClassLoaderType.getDeclaredMethod("findLoadedClass", String.class); + } catch (NoSuchMethodException e) { + targetClassLoaderType = targetClassLoaderType.getSuperclass(); + } + } + defineClassMethod.setAccessible(true); + Class type = (Class) defineClassMethod.invoke(targetClassLoader, className); + if (type == null) { + return null; + } + return (T) type.newInstance(); + } +} diff --git a/skywalking-collector/skywalking-api/src/test/java/test/ai/cloud/matcher/ExclusionMatcherTest.java b/skywalking-collector/skywalking-api/src/test/java/test/ai/cloud/matcher/ExclusionMatcherTest.java index e4fc662c3..14790e056 100644 --- a/skywalking-collector/skywalking-api/src/test/java/test/ai/cloud/matcher/ExclusionMatcherTest.java +++ b/skywalking-collector/skywalking-api/src/test/java/test/ai/cloud/matcher/ExclusionMatcherTest.java @@ -24,7 +24,7 @@ public class ExclusionMatcherTest extends TestCase { DynamicType.Builder newClassBuilder = new ByteBuddy().rebase(TypePool.Default.ofClassPath().describe(entry.getKey()).resolve(), ClassFileLocator.ForClassLoader.ofClassPath()); - newClassBuilder = entry.getValue().define(newClassBuilder); + newClassBuilder = entry.getValue().define(entry.getKey(), newClassBuilder); newClassBuilder.make().load(ClassLoader.getSystemClassLoader(), ClassLoadingStrategy.Default.INJECTION).getLoaded(); } diff --git a/skywalking-collector/skywalking-api/src/test/java/test/ai/cloud/matcher/TestMatcherDefine.java b/skywalking-collector/skywalking-api/src/test/java/test/ai/cloud/matcher/TestMatcherDefine.java index 9c424f7c4..5c3a44022 100644 --- a/skywalking-collector/skywalking-api/src/test/java/test/ai/cloud/matcher/TestMatcherDefine.java +++ b/skywalking-collector/skywalking-api/src/test/java/test/ai/cloud/matcher/TestMatcherDefine.java @@ -2,7 +2,6 @@ package test.ai.cloud.matcher; import com.ai.cloud.skywalking.plugin.interceptor.MethodMatcher; import com.ai.cloud.skywalking.plugin.interceptor.enhance.ClassInstanceMethodsEnhancePluginDefine; -import com.ai.cloud.skywalking.plugin.interceptor.enhance.InstanceMethodsAroundInterceptor; import com.ai.cloud.skywalking.plugin.interceptor.matcher.PrivateMethodMatcher; /** @@ -28,7 +27,7 @@ public class TestMatcherDefine extends ClassInstanceMethodsEnhancePluginDefine { } @Override - protected InstanceMethodsAroundInterceptor getInstanceMethodsInterceptor() { - return new TestAroundInterceptor(); + protected String getInstanceMethodsInterceptor() { + return "test.ai.cloud.matcher.TestMatcherDefine"; } } diff --git a/skywalking-collector/skywalking-api/src/test/java/test/ai/cloud/plugin/TestInterceptorDefine.java b/skywalking-collector/skywalking-api/src/test/java/test/ai/cloud/plugin/TestInterceptorDefine.java index ae0b805c4..6c521a217 100644 --- a/skywalking-collector/skywalking-api/src/test/java/test/ai/cloud/plugin/TestInterceptorDefine.java +++ b/skywalking-collector/skywalking-api/src/test/java/test/ai/cloud/plugin/TestInterceptorDefine.java @@ -2,7 +2,6 @@ package test.ai.cloud.plugin; import com.ai.cloud.skywalking.plugin.interceptor.MethodMatcher; import com.ai.cloud.skywalking.plugin.interceptor.enhance.ClassEnhancePluginDefine; -import com.ai.cloud.skywalking.plugin.interceptor.enhance.InstanceMethodsAroundInterceptor; import com.ai.cloud.skywalking.plugin.interceptor.enhance.StaticMethodsAroundInterceptor; import com.ai.cloud.skywalking.plugin.interceptor.matcher.SimpleMethodMatcher; @@ -19,8 +18,8 @@ public class TestInterceptorDefine extends ClassEnhancePluginDefine { } @Override - public InstanceMethodsAroundInterceptor getInstanceMethodsInterceptor() { - return new TestAroundInterceptor(); + public String getInstanceMethodsInterceptor() { + return "test.ai.cloud.plugin.TestAroundInterceptor"; } @Override @@ -29,8 +28,8 @@ public class TestInterceptorDefine extends ClassEnhancePluginDefine { } @Override - protected StaticMethodsAroundInterceptor getStaticMethodsInterceptor() { - return new TestStaticAroundInterceptor(); + protected String getStaticMethodsInterceptor() { + return "test.ai.cloud.plugin.TestStaticAroundInterceptor"; } } diff --git a/skywalking-collector/skywalking-sdk-plugin/dubbo-plugin/src/main/java/com/ai/cloud/skywalking/plugin/dubbo/DubboPluginDefine.java b/skywalking-collector/skywalking-sdk-plugin/dubbo-plugin/src/main/java/com/ai/cloud/skywalking/plugin/dubbo/DubboPluginDefine.java index f727b885d..deaee060f 100644 --- a/skywalking-collector/skywalking-sdk-plugin/dubbo-plugin/src/main/java/com/ai/cloud/skywalking/plugin/dubbo/DubboPluginDefine.java +++ b/skywalking-collector/skywalking-sdk-plugin/dubbo-plugin/src/main/java/com/ai/cloud/skywalking/plugin/dubbo/DubboPluginDefine.java @@ -12,8 +12,8 @@ public class DubboPluginDefine extends ClassStaticMethodsEnhancePluginDefine { } @Override - protected StaticMethodsAroundInterceptor getStaticMethodsInterceptor() { - return new ProtocolFilterBuildChainInterceptor(); + protected String getStaticMethodsInterceptor() { + return "com.ai.cloud.skywalking.plugin.dubbo.ProtocolFilterBuildChainInterceptor"; } @Override diff --git a/skywalking-collector/skywalking-sdk-plugin/dubbo-plugin/src/main/java/com/ai/cloud/skywalking/plugin/dubbo/ProtocolFilterBuildChainInterceptor.java b/skywalking-collector/skywalking-sdk-plugin/dubbo-plugin/src/main/java/com/ai/cloud/skywalking/plugin/dubbo/ProtocolFilterBuildChainInterceptor.java index 3d4c72e38..fa1860d79 100644 --- a/skywalking-collector/skywalking-sdk-plugin/dubbo-plugin/src/main/java/com/ai/cloud/skywalking/plugin/dubbo/ProtocolFilterBuildChainInterceptor.java +++ b/skywalking-collector/skywalking-sdk-plugin/dubbo-plugin/src/main/java/com/ai/cloud/skywalking/plugin/dubbo/ProtocolFilterBuildChainInterceptor.java @@ -23,7 +23,7 @@ public class ProtocolFilterBuildChainInterceptor implements StaticMethodsAroundI final Invoker invoker = (Invoker)args[0]; String key = (String)args[1]; String group = (String)args[2]; - + final URL newURL = invoker.getUrl().addParameter(key, "skywalking$enhanceFilter"); Invoker last = invoker; List filters = ExtensionLoader.getExtensionLoader(Filter.class).getActivateExtension(newURL, key, group); diff --git a/skywalking-collector/skywalking-sdk-plugin/httpClient-4.x-plugin/src/main/java/com/ai/cloud/skywalking/httpClient/v4/plugin/define/HttpClientPluginDefine.java b/skywalking-collector/skywalking-sdk-plugin/httpClient-4.x-plugin/src/main/java/com/ai/cloud/skywalking/httpClient/v4/plugin/define/HttpClientPluginDefine.java index 989516e66..faa18a0a0 100644 --- a/skywalking-collector/skywalking-sdk-plugin/httpClient-4.x-plugin/src/main/java/com/ai/cloud/skywalking/httpClient/v4/plugin/define/HttpClientPluginDefine.java +++ b/skywalking-collector/skywalking-sdk-plugin/httpClient-4.x-plugin/src/main/java/com/ai/cloud/skywalking/httpClient/v4/plugin/define/HttpClientPluginDefine.java @@ -3,13 +3,12 @@ package com.ai.cloud.skywalking.httpClient.v4.plugin.define; import com.ai.cloud.skywalking.httpClient.v4.plugin.HttpClientExecuteInterceptor; import com.ai.cloud.skywalking.plugin.interceptor.enhance.ClassInstanceMethodsEnhancePluginDefine; -import com.ai.cloud.skywalking.plugin.interceptor.enhance.InstanceMethodsAroundInterceptor; public abstract class HttpClientPluginDefine extends ClassInstanceMethodsEnhancePluginDefine { @Override - public InstanceMethodsAroundInterceptor getInstanceMethodsInterceptor() { - return new HttpClientExecuteInterceptor(); + public String getInstanceMethodsInterceptor() { + return "com.ai.cloud.skywalking.httpClient.v4.plugin.HttpClientExecuteInterceptor"; } } diff --git a/skywalking-collector/skywalking-sdk-plugin/jedis-2.x-plugin/src/main/java/com/ai/cloud/skywalking/jedis/v2/plugin/define/JedisClusterPluginDefine.java b/skywalking-collector/skywalking-sdk-plugin/jedis-2.x-plugin/src/main/java/com/ai/cloud/skywalking/jedis/v2/plugin/define/JedisClusterPluginDefine.java index 6cbde6252..0f9e6f322 100644 --- a/skywalking-collector/skywalking-sdk-plugin/jedis-2.x-plugin/src/main/java/com/ai/cloud/skywalking/jedis/v2/plugin/define/JedisClusterPluginDefine.java +++ b/skywalking-collector/skywalking-sdk-plugin/jedis-2.x-plugin/src/main/java/com/ai/cloud/skywalking/jedis/v2/plugin/define/JedisClusterPluginDefine.java @@ -3,7 +3,6 @@ package com.ai.cloud.skywalking.jedis.v2.plugin.define; import com.ai.cloud.skywalking.jedis.v2.plugin.JedisClusterInterceptor; import com.ai.cloud.skywalking.plugin.interceptor.MethodMatcher; import com.ai.cloud.skywalking.plugin.interceptor.enhance.ClassInstanceMethodsEnhancePluginDefine; -import com.ai.cloud.skywalking.plugin.interceptor.enhance.InstanceMethodsAroundInterceptor; import com.ai.cloud.skywalking.plugin.interceptor.matcher.AnyMethodsMatcher; public class JedisClusterPluginDefine extends ClassInstanceMethodsEnhancePluginDefine { @@ -21,7 +20,7 @@ public class JedisClusterPluginDefine extends ClassInstanceMethodsEnhancePluginD } @Override - public InstanceMethodsAroundInterceptor getInstanceMethodsInterceptor() { - return new JedisClusterInterceptor(); + public String getInstanceMethodsInterceptor() { + return "com.ai.cloud.skywalking.jedis.v2.plugin.JedisClusterInterceptor"; } } diff --git a/skywalking-collector/skywalking-sdk-plugin/jedis-2.x-plugin/src/main/java/com/ai/cloud/skywalking/jedis/v2/plugin/define/JedisPluginDefine.java b/skywalking-collector/skywalking-sdk-plugin/jedis-2.x-plugin/src/main/java/com/ai/cloud/skywalking/jedis/v2/plugin/define/JedisPluginDefine.java index a645fa08e..430c453c4 100644 --- a/skywalking-collector/skywalking-sdk-plugin/jedis-2.x-plugin/src/main/java/com/ai/cloud/skywalking/jedis/v2/plugin/define/JedisPluginDefine.java +++ b/skywalking-collector/skywalking-sdk-plugin/jedis-2.x-plugin/src/main/java/com/ai/cloud/skywalking/jedis/v2/plugin/define/JedisPluginDefine.java @@ -3,7 +3,6 @@ package com.ai.cloud.skywalking.jedis.v2.plugin.define; import com.ai.cloud.skywalking.jedis.v2.plugin.JedisInterceptor; import com.ai.cloud.skywalking.plugin.interceptor.MethodMatcher; import com.ai.cloud.skywalking.plugin.interceptor.enhance.ClassInstanceMethodsEnhancePluginDefine; -import com.ai.cloud.skywalking.plugin.interceptor.enhance.InstanceMethodsAroundInterceptor; import com.ai.cloud.skywalking.plugin.interceptor.matcher.MethodsExclusiveMatcher; import com.ai.cloud.skywalking.plugin.interceptor.matcher.PrivateMethodMatcher; import com.ai.cloud.skywalking.plugin.interceptor.matcher.SimpleMethodMatcher; @@ -32,8 +31,8 @@ public class JedisPluginDefine extends ClassInstanceMethodsEnhancePluginDefine { } @Override - public InstanceMethodsAroundInterceptor getInstanceMethodsInterceptor() { - return new JedisInterceptor(); + public String getInstanceMethodsInterceptor() { + return "com.ai.cloud.skywalking.jedis.v2.plugin.JedisInterceptor"; } } diff --git a/skywalking-collector/skywalking-sdk-plugin/tomcat-7.x-8.x-plugin/src/main/java/com/ai/cloud/skywalking/plugin/tomcat78x/define/TomcatPluginDefine.java b/skywalking-collector/skywalking-sdk-plugin/tomcat-7.x-8.x-plugin/src/main/java/com/ai/cloud/skywalking/plugin/tomcat78x/define/TomcatPluginDefine.java index 5e3de1440..dd5b6186f 100644 --- a/skywalking-collector/skywalking-sdk-plugin/tomcat-7.x-8.x-plugin/src/main/java/com/ai/cloud/skywalking/plugin/tomcat78x/define/TomcatPluginDefine.java +++ b/skywalking-collector/skywalking-sdk-plugin/tomcat-7.x-8.x-plugin/src/main/java/com/ai/cloud/skywalking/plugin/tomcat78x/define/TomcatPluginDefine.java @@ -1,23 +1,24 @@ package com.ai.cloud.skywalking.plugin.tomcat78x.define; +import com.ai.cloud.skywalking.logging.LogManager; +import com.ai.cloud.skywalking.logging.Logger; import com.ai.cloud.skywalking.plugin.interceptor.MethodMatcher; import com.ai.cloud.skywalking.plugin.interceptor.enhance.ClassInstanceMethodsEnhancePluginDefine; -import com.ai.cloud.skywalking.plugin.interceptor.enhance.InstanceMethodsAroundInterceptor; import com.ai.cloud.skywalking.plugin.interceptor.matcher.SimpleMethodMatcher; import com.ai.cloud.skywalking.plugin.tomcat78x.TomcatPluginInterceptor; -import org.apache.catalina.connector.Request; -import org.apache.catalina.connector.Response; public class TomcatPluginDefine extends ClassInstanceMethodsEnhancePluginDefine { + private static Logger logger = LogManager.getLogger(TomcatPluginDefine.class); + @Override protected MethodMatcher[] getInstanceMethodsMatchers() { - return new MethodMatcher[]{new SimpleMethodMatcher("invoke", Request.class, Response.class)}; + return new MethodMatcher[]{new SimpleMethodMatcher("invoke")}; } @Override - protected InstanceMethodsAroundInterceptor getInstanceMethodsInterceptor() { - return new TomcatPluginInterceptor(); + protected String getInstanceMethodsInterceptor() { + return "com.ai.cloud.skywalking.plugin.tomcat78x.TomcatPluginInterceptor"; } @Override -- GitLab