From 3ee2676268f7179304fc4c3302cf0c8c72dd2674 Mon Sep 17 00:00:00 2001 From: wusheng Date: Fri, 1 Jul 2016 17:58:13 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E4=B8=80=E4=B8=AA=E8=A7=81?= =?UTF-8?q?=E8=AF=81=E8=80=85=E7=B1=BB=E7=9A=84=E4=BB=A3=E7=A0=81=E3=80=82?= =?UTF-8?q?=E7=94=A8=E4=BA=8E=E5=90=8E=E6=9C=9F=E6=A0=87=E5=AE=9A=E4=B8=8D?= =?UTF-8?q?=E5=90=8C=E7=89=88=E6=9C=AC=E7=9A=84=E6=8F=92=E4=BB=B6=E4=BD=BF?= =?UTF-8?q?=E7=94=A8=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../AbstractClassEnhancePluginDefine.java | 67 +++++++++++++------ .../ai/cloud/matcher/TestMatcherDefine.java | 2 +- .../cloud/plugin/TestInterceptorDefine.java | 2 +- .../plugin/dubbo/DubboPluginDefine.java | 2 +- .../AbstractHttpClientPluginDefine.java | 2 +- .../DefaultRequestDirectorPluginDefine.java | 2 +- .../InternalHttpClientPluginDefine.java | 2 +- .../define/MinimalHttpClientPluginDefine.java | 2 +- .../define/JedisClusterPluginDefine.java | 2 +- .../v2/plugin/define/JedisPluginDefine.java | 2 +- 10 files changed, 54 insertions(+), 31 deletions(-) diff --git a/skywalking-collector/skywalking-api/src/main/java/com/ai/cloud/skywalking/plugin/interceptor/AbstractClassEnhancePluginDefine.java b/skywalking-collector/skywalking-api/src/main/java/com/ai/cloud/skywalking/plugin/interceptor/AbstractClassEnhancePluginDefine.java index c97275bac..1d39d737e 100644 --- a/skywalking-collector/skywalking-api/src/main/java/com/ai/cloud/skywalking/plugin/interceptor/AbstractClassEnhancePluginDefine.java +++ b/skywalking-collector/skywalking-api/src/main/java/com/ai/cloud/skywalking/plugin/interceptor/AbstractClassEnhancePluginDefine.java @@ -1,27 +1,26 @@ package com.ai.cloud.skywalking.plugin.interceptor; -import static com.ai.cloud.skywalking.plugin.PluginBootstrap.CLASS_TYPE_POOL; - import com.ai.cloud.skywalking.logging.LogManager; import com.ai.cloud.skywalking.logging.Logger; +import com.ai.cloud.skywalking.plugin.IPlugin; +import com.ai.cloud.skywalking.plugin.PluginException; +import com.ai.cloud.skywalking.util.StringUtil; import net.bytebuddy.ByteBuddy; import net.bytebuddy.dynamic.ClassFileLocator; import net.bytebuddy.dynamic.DynamicType; import net.bytebuddy.dynamic.loading.ClassLoadingStrategy; import net.bytebuddy.pool.TypePool.Resolution; -import com.ai.cloud.skywalking.plugin.IPlugin; -import com.ai.cloud.skywalking.plugin.PluginException; -import com.ai.cloud.skywalking.util.StringUtil; +import static com.ai.cloud.skywalking.plugin.PluginBootstrap.CLASS_TYPE_POOL; public abstract class AbstractClassEnhancePluginDefine implements IPlugin { - private static Logger logger = LogManager.getLogger(AbstractClassEnhancePluginDefine.class); - - @Override - public void define() throws PluginException { - String interceptorDefineClassName = this.getClass().getName(); - - String enhanceOriginClassName = getBeInterceptedClassName(); + private static Logger logger = LogManager.getLogger(AbstractClassEnhancePluginDefine.class); + + @Override + public void define() throws PluginException { + String interceptorDefineClassName = this.getClass().getName(); + + String enhanceOriginClassName = enhanceClassName(); if (StringUtil.isEmpty(enhanceOriginClassName)) { logger.warn("classname of being intercepted is not defined by {}.", interceptorDefineClassName); @@ -38,13 +37,27 @@ public abstract class AbstractClassEnhancePluginDefine implements IPlugin { return; } + /** + * find witness classes for enhance class + */ + String[] witnessClasses = witnessClasses(); + if(witnessClasses != null) { + for (String witnessClass : witnessClasses) { + Resolution witnessClassResolution = CLASS_TYPE_POOL.describe(witnessClass); + if (!witnessClassResolution.isResolved()) { + logger.warn("enhance class {} by plugin {} is not working. Because witness class {} is not existed.", enhanceOriginClassName, interceptorDefineClassName, witnessClass); + return; + } + } + } + /** * find origin class source code for interceptor */ DynamicType.Builder newClassBuilder = new ByteBuddy() .rebase(resolution.resolve(), ClassFileLocator.ForClassLoader.ofClassPath()); - + newClassBuilder = this.enhance(enhanceOriginClassName, newClassBuilder); /** @@ -59,14 +72,24 @@ public abstract class AbstractClassEnhancePluginDefine implements IPlugin { logger.debug("enhance class {} by {} completely.", enhanceOriginClassName, interceptorDefineClassName); - } - - protected abstract DynamicType.Builder enhance(String enhanceOriginClassName, DynamicType.Builder newClassBuilder) throws PluginException; + } - /** - * 返回要被增强的类,应当返回类全名 - * - * @return - */ - protected abstract String getBeInterceptedClassName(); + protected abstract DynamicType.Builder enhance(String enhanceOriginClassName, DynamicType.Builder newClassBuilder) throws PluginException; + + /** + * 返回要被增强的类,应当返回类全名 + * + * @return + */ + protected abstract String enhanceClassName(); + + /** + * 返回一个类名的列表 + * 如果列表中的类在JVM中存在,则enhance可以会尝试生效 + * + * @return + */ + protected String[] witnessClasses(){ + return new String[]{}; + } } 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 cb4f1b825..b092b7ce7 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 @@ -10,7 +10,7 @@ import com.ai.cloud.skywalking.plugin.interceptor.matcher.PrivateMethodMatcher; */ public class TestMatcherDefine extends ClassInstanceMethodsEnhancePluginDefine { @Override - public String getBeInterceptedClassName() { + public String enhanceClassName() { return "test.ai.cloud.matcher.TestMatcherClass"; } 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 31bc788b5..c18b13e8b 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 @@ -9,7 +9,7 @@ import com.ai.cloud.skywalking.plugin.interceptor.matcher.SimpleMethodMatcher; public class TestInterceptorDefine extends ClassEnhancePluginDefine { @Override - public String getBeInterceptedClassName() { + public String enhanceClassName() { return "test.ai.cloud.plugin.BeInterceptedClass"; } 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 508445c5c..f727b885d 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 @@ -17,7 +17,7 @@ public class DubboPluginDefine extends ClassStaticMethodsEnhancePluginDefine { } @Override - protected String getBeInterceptedClassName() { + protected String enhanceClassName() { return "com.alibaba.dubbo.rpc.protocol.ProtocolFilterWrapper"; } } diff --git a/skywalking-collector/skywalking-sdk-plugin/httpClient-4.x-plugin/src/main/java/org/skywalking/httpClient/v4/plugin/define/AbstractHttpClientPluginDefine.java b/skywalking-collector/skywalking-sdk-plugin/httpClient-4.x-plugin/src/main/java/org/skywalking/httpClient/v4/plugin/define/AbstractHttpClientPluginDefine.java index 055a20a38..bfc560385 100644 --- a/skywalking-collector/skywalking-sdk-plugin/httpClient-4.x-plugin/src/main/java/org/skywalking/httpClient/v4/plugin/define/AbstractHttpClientPluginDefine.java +++ b/skywalking-collector/skywalking-sdk-plugin/httpClient-4.x-plugin/src/main/java/org/skywalking/httpClient/v4/plugin/define/AbstractHttpClientPluginDefine.java @@ -6,7 +6,7 @@ import com.ai.cloud.skywalking.plugin.interceptor.matcher.SimpleMethodMatcher; public class AbstractHttpClientPluginDefine extends HttpClientPluginDefine { @Override - public String getBeInterceptedClassName() { + public String enhanceClassName() { return "org.apache.http.impl.client.AbstractHttpClient"; } diff --git a/skywalking-collector/skywalking-sdk-plugin/httpClient-4.x-plugin/src/main/java/org/skywalking/httpClient/v4/plugin/define/DefaultRequestDirectorPluginDefine.java b/skywalking-collector/skywalking-sdk-plugin/httpClient-4.x-plugin/src/main/java/org/skywalking/httpClient/v4/plugin/define/DefaultRequestDirectorPluginDefine.java index 03f3aeb39..d713d8e21 100644 --- a/skywalking-collector/skywalking-sdk-plugin/httpClient-4.x-plugin/src/main/java/org/skywalking/httpClient/v4/plugin/define/DefaultRequestDirectorPluginDefine.java +++ b/skywalking-collector/skywalking-sdk-plugin/httpClient-4.x-plugin/src/main/java/org/skywalking/httpClient/v4/plugin/define/DefaultRequestDirectorPluginDefine.java @@ -10,7 +10,7 @@ public class DefaultRequestDirectorPluginDefine extends HttpClientPluginDefine { * since 4.3, this class is Deprecated. */ @Override - public String getBeInterceptedClassName() { + public String enhanceClassName() { return "org.apache.http.impl.client.DefaultRequestDirector"; } diff --git a/skywalking-collector/skywalking-sdk-plugin/httpClient-4.x-plugin/src/main/java/org/skywalking/httpClient/v4/plugin/define/InternalHttpClientPluginDefine.java b/skywalking-collector/skywalking-sdk-plugin/httpClient-4.x-plugin/src/main/java/org/skywalking/httpClient/v4/plugin/define/InternalHttpClientPluginDefine.java index 84db0b610..ebe4973b6 100644 --- a/skywalking-collector/skywalking-sdk-plugin/httpClient-4.x-plugin/src/main/java/org/skywalking/httpClient/v4/plugin/define/InternalHttpClientPluginDefine.java +++ b/skywalking-collector/skywalking-sdk-plugin/httpClient-4.x-plugin/src/main/java/org/skywalking/httpClient/v4/plugin/define/InternalHttpClientPluginDefine.java @@ -10,7 +10,7 @@ public class InternalHttpClientPluginDefine extends HttpClientPluginDefine { } @Override - public String getBeInterceptedClassName() { + public String enhanceClassName() { return "org.apache.http.impl.client.InternalHttpClient"; } diff --git a/skywalking-collector/skywalking-sdk-plugin/httpClient-4.x-plugin/src/main/java/org/skywalking/httpClient/v4/plugin/define/MinimalHttpClientPluginDefine.java b/skywalking-collector/skywalking-sdk-plugin/httpClient-4.x-plugin/src/main/java/org/skywalking/httpClient/v4/plugin/define/MinimalHttpClientPluginDefine.java index aa5067d8e..17bc9adc3 100644 --- a/skywalking-collector/skywalking-sdk-plugin/httpClient-4.x-plugin/src/main/java/org/skywalking/httpClient/v4/plugin/define/MinimalHttpClientPluginDefine.java +++ b/skywalking-collector/skywalking-sdk-plugin/httpClient-4.x-plugin/src/main/java/org/skywalking/httpClient/v4/plugin/define/MinimalHttpClientPluginDefine.java @@ -10,7 +10,7 @@ public class MinimalHttpClientPluginDefine extends HttpClientPluginDefine { } @Override - public String getBeInterceptedClassName() { + public String enhanceClassName() { return "org.apache.http.impl.client.MinimalHttpClient"; } 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 d5e98567b..63fdd97c3 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 @@ -9,7 +9,7 @@ import com.ai.cloud.skywalking.plugin.interceptor.matcher.AnyMethodsMatcher; public class JedisClusterPluginDefine extends ClassInstanceMethodsEnhancePluginDefine { @Override - public String getBeInterceptedClassName() { + public String enhanceClassName() { return "redis.clients.jedis.JedisCluster"; } 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 bb86d12a2..8ce663b75 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 @@ -11,7 +11,7 @@ import com.ai.cloud.skywalking.plugin.interceptor.matcher.SimpleMethodMatcher; public class JedisPluginDefine extends ClassInstanceMethodsEnhancePluginDefine { @Override - public String getBeInterceptedClassName() { + public String enhanceClassName() { return "redis.clients.jedis.Jedis"; }