From c23b98819366489062af99d8455f14c63475e357 Mon Sep 17 00:00:00 2001 From: wusheng Date: Sun, 19 Jun 2016 15:04:37 +0800 Subject: [PATCH] =?UTF-8?q?1.interceptor=E7=9A=84beforeMethod=E5=BC=95?= =?UTF-8?q?=E5=85=A5=E6=96=B0=E7=9A=84=E5=8F=82=E6=95=B0=EF=BC=8C=E5=85=81?= =?UTF-8?q?=E8=AE=B8=E5=9C=A8=E6=96=B9=E6=B3=95=E5=86=85=E9=83=A8=EF=BC=8C?= =?UTF-8?q?=E6=8B=A6=E6=88=AA=E5=B9=B6=E8=AE=BE=E7=BD=AE=E6=96=B9=E6=B3=95?= =?UTF-8?q?=E6=96=B0=E7=9A=84=E8=BF=94=E5=9B=9E=E5=80=BC=E3=80=82=E5=A6=82?= =?UTF-8?q?=E8=AE=BE=E7=BD=AE=EF=BC=8C=E5=88=99=E5=8E=9F=E6=96=B9=E6=B3=95?= =?UTF-8?q?=E4=BD=93=E5=B0=86=E4=B8=8D=E5=86=8D=E6=89=A7=E8=A1=8C=E3=80=82?= =?UTF-8?q?=202.=E4=BB=A3=E7=A0=81=E7=BA=A7=E5=88=AB=E4=BF=AE=E5=A4=8Ddubb?= =?UTF-8?q?o=E6=8F=92=E4=BB=B6=E7=9A=84=E6=8B=A6=E6=88=AA=E5=99=A8?= =?UTF-8?q?=E6=9C=BA=E5=88=B6=E3=80=82=203.=E6=89=80=E6=9C=89=E6=8F=92?= =?UTF-8?q?=E4=BB=B6=E7=9A=84=E9=87=8D=E6=9E=84=E4=BB=A3=E7=A0=81=E5=8A=9F?= =?UTF-8?q?=E8=83=BD=EF=BC=8C=E5=BE=85=E6=B5=8B=E8=AF=95=E3=80=82@ascrutae?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ClassInstanceMethodsInterceptor.java | 7 +- .../ClassStaticMethodsInterceptor.java | 7 +- .../IntanceMethodsAroundInterceptor.java | 2 +- .../enhance/MethodInterceptResult.java | 20 +++++ .../StaticMethodsAroundInterceptor.java | 2 +- .../cloud/matcher/TestAroundInterceptor.java | 3 +- .../cloud/plugin/TestAroundInterceptor.java | 3 +- .../plugin/TestStaticAroundInterceptor.java | 3 +- .../plugin/DubboFilterBuildInterceptor.java | 56 ------------- .../plugin/{ => dubbo}/DubboPluginDefine.java | 3 +- .../ProtocolFilterBuildChainInterceptor.java | 78 +++++++++++++++++++ .../src/main/resources/skywalking-plugin.def | 2 +- .../plugin/HttpClientExecuteInterceptor.java | 3 +- .../jedis/v2/plugin/JedisBaseInterceptor.java | 3 +- 14 files changed, 124 insertions(+), 68 deletions(-) create mode 100644 skywalking-api/src/main/java/com/ai/cloud/skywalking/plugin/interceptor/enhance/MethodInterceptResult.java delete mode 100644 skywalking-sdk-plugin/dubbo-plugin/src/main/java/com/ai/cloud/skywalking/plugin/DubboFilterBuildInterceptor.java rename skywalking-sdk-plugin/dubbo-plugin/src/main/java/com/ai/cloud/skywalking/plugin/{ => dubbo}/DubboPluginDefine.java (91%) create mode 100644 skywalking-sdk-plugin/dubbo-plugin/src/main/java/com/ai/cloud/skywalking/plugin/dubbo/ProtocolFilterBuildChainInterceptor.java diff --git a/skywalking-api/src/main/java/com/ai/cloud/skywalking/plugin/interceptor/enhance/ClassInstanceMethodsInterceptor.java b/skywalking-api/src/main/java/com/ai/cloud/skywalking/plugin/interceptor/enhance/ClassInstanceMethodsInterceptor.java index aaee6e477..ac9c81e9c 100644 --- a/skywalking-api/src/main/java/com/ai/cloud/skywalking/plugin/interceptor/enhance/ClassInstanceMethodsInterceptor.java +++ b/skywalking-api/src/main/java/com/ai/cloud/skywalking/plugin/interceptor/enhance/ClassInstanceMethodsInterceptor.java @@ -41,12 +41,17 @@ public class ClassInstanceMethodsInterceptor { throws Exception { InstanceMethodInvokeContext interceptorContext = new InstanceMethodInvokeContext(obj, method.getName(), allArguments); + MethodInterceptResult result = new MethodInterceptResult(); try { - interceptor.beforeMethod(instanceContext, interceptorContext); + interceptor.beforeMethod(instanceContext, interceptorContext, result); } catch (Throwable t) { logger.error("class[{}] before method[{}] intercept failue:{}", obj.getClass(), method.getName(), t.getMessage(), t); } + if(!result.isContinue()){ + return result._ret(); + } + Object ret = null; try { ret = zuper.call(); diff --git a/skywalking-api/src/main/java/com/ai/cloud/skywalking/plugin/interceptor/enhance/ClassStaticMethodsInterceptor.java b/skywalking-api/src/main/java/com/ai/cloud/skywalking/plugin/interceptor/enhance/ClassStaticMethodsInterceptor.java index e1cdff943..9c87aa412 100644 --- a/skywalking-api/src/main/java/com/ai/cloud/skywalking/plugin/interceptor/enhance/ClassStaticMethodsInterceptor.java +++ b/skywalking-api/src/main/java/com/ai/cloud/skywalking/plugin/interceptor/enhance/ClassStaticMethodsInterceptor.java @@ -34,12 +34,17 @@ public class ClassStaticMethodsInterceptor { @SuperCall Callable zuper) throws Exception { MethodInvokeContext interceptorContext = new MethodInvokeContext( method.getName(), allArguments); + MethodInterceptResult result = new MethodInterceptResult(); try { - interceptor.beforeMethod(interceptorContext); + interceptor.beforeMethod(interceptorContext, result); } catch (Throwable t) { logger.error("class[{}] before static method[{}] intercept failue:{}", clazz, method.getName(), t.getMessage(), t); } + if(!result.isContinue()){ + return result._ret(); + } + Object ret = null; try { ret = zuper.call(); diff --git a/skywalking-api/src/main/java/com/ai/cloud/skywalking/plugin/interceptor/enhance/IntanceMethodsAroundInterceptor.java b/skywalking-api/src/main/java/com/ai/cloud/skywalking/plugin/interceptor/enhance/IntanceMethodsAroundInterceptor.java index 2f3dda4e1..c1fd08eaa 100644 --- a/skywalking-api/src/main/java/com/ai/cloud/skywalking/plugin/interceptor/enhance/IntanceMethodsAroundInterceptor.java +++ b/skywalking-api/src/main/java/com/ai/cloud/skywalking/plugin/interceptor/enhance/IntanceMethodsAroundInterceptor.java @@ -5,7 +5,7 @@ import com.ai.cloud.skywalking.plugin.interceptor.EnhancedClassInstanceContext; public interface IntanceMethodsAroundInterceptor { public void onConstruct(EnhancedClassInstanceContext context, ConstructorInvokeContext interceptorContext); - public void beforeMethod(EnhancedClassInstanceContext context, InstanceMethodInvokeContext interceptorContext); + public void beforeMethod(EnhancedClassInstanceContext context, InstanceMethodInvokeContext interceptorContext, MethodInterceptResult result); public Object afterMethod(EnhancedClassInstanceContext context, InstanceMethodInvokeContext interceptorContext, Object ret); diff --git a/skywalking-api/src/main/java/com/ai/cloud/skywalking/plugin/interceptor/enhance/MethodInterceptResult.java b/skywalking-api/src/main/java/com/ai/cloud/skywalking/plugin/interceptor/enhance/MethodInterceptResult.java new file mode 100644 index 000000000..e4ed4dea9 --- /dev/null +++ b/skywalking-api/src/main/java/com/ai/cloud/skywalking/plugin/interceptor/enhance/MethodInterceptResult.java @@ -0,0 +1,20 @@ +package com.ai.cloud.skywalking.plugin.interceptor.enhance; + +public class MethodInterceptResult { + private boolean isContinue = true; + + private Object _ret = null; + + public void defineReturnValue(Object ret){ + this.isContinue = false; + this._ret = ret; + } + + public boolean isContinue() { + return isContinue; + } + + Object _ret(){ + return _ret; + } +} diff --git a/skywalking-api/src/main/java/com/ai/cloud/skywalking/plugin/interceptor/enhance/StaticMethodsAroundInterceptor.java b/skywalking-api/src/main/java/com/ai/cloud/skywalking/plugin/interceptor/enhance/StaticMethodsAroundInterceptor.java index 11be7ec0d..6c683e7de 100644 --- a/skywalking-api/src/main/java/com/ai/cloud/skywalking/plugin/interceptor/enhance/StaticMethodsAroundInterceptor.java +++ b/skywalking-api/src/main/java/com/ai/cloud/skywalking/plugin/interceptor/enhance/StaticMethodsAroundInterceptor.java @@ -2,7 +2,7 @@ package com.ai.cloud.skywalking.plugin.interceptor.enhance; public interface StaticMethodsAroundInterceptor { - public void beforeMethod(MethodInvokeContext interceptorContext); + public void beforeMethod(MethodInvokeContext interceptorContext, MethodInterceptResult result); public Object afterMethod(MethodInvokeContext interceptorContext, Object ret); diff --git a/skywalking-api/src/test/java/test/ai/cloud/matcher/TestAroundInterceptor.java b/skywalking-api/src/test/java/test/ai/cloud/matcher/TestAroundInterceptor.java index 6a1e2d6bf..e3b565442 100644 --- a/skywalking-api/src/test/java/test/ai/cloud/matcher/TestAroundInterceptor.java +++ b/skywalking-api/src/test/java/test/ai/cloud/matcher/TestAroundInterceptor.java @@ -4,6 +4,7 @@ import com.ai.cloud.skywalking.plugin.interceptor.EnhancedClassInstanceContext; import com.ai.cloud.skywalking.plugin.interceptor.enhance.ConstructorInvokeContext; import com.ai.cloud.skywalking.plugin.interceptor.enhance.InstanceMethodInvokeContext; import com.ai.cloud.skywalking.plugin.interceptor.enhance.IntanceMethodsAroundInterceptor; +import com.ai.cloud.skywalking.plugin.interceptor.enhance.MethodInterceptResult; /** * Created by xin on 16-6-8. @@ -15,7 +16,7 @@ public class TestAroundInterceptor implements IntanceMethodsAroundInterceptor { } @Override - public void beforeMethod(EnhancedClassInstanceContext context, InstanceMethodInvokeContext interceptorContext) { + public void beforeMethod(EnhancedClassInstanceContext context, InstanceMethodInvokeContext interceptorContext, MethodInterceptResult result) { System.out.println("before method"); } 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 438ee06e6..6c9cb5e4b 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 @@ -4,6 +4,7 @@ import com.ai.cloud.skywalking.plugin.interceptor.EnhancedClassInstanceContext; import com.ai.cloud.skywalking.plugin.interceptor.enhance.ConstructorInvokeContext; import com.ai.cloud.skywalking.plugin.interceptor.enhance.InstanceMethodInvokeContext; import com.ai.cloud.skywalking.plugin.interceptor.enhance.IntanceMethodsAroundInterceptor; +import com.ai.cloud.skywalking.plugin.interceptor.enhance.MethodInterceptResult; public class TestAroundInterceptor implements IntanceMethodsAroundInterceptor { @@ -14,7 +15,7 @@ public class TestAroundInterceptor implements IntanceMethodsAroundInterceptor { } @Override - public void beforeMethod(EnhancedClassInstanceContext context, InstanceMethodInvokeContext interceptorContext) { + public void beforeMethod(EnhancedClassInstanceContext context, InstanceMethodInvokeContext interceptorContext, MethodInterceptResult result) { System.out.println("beforeMethod : " + context.get("test.key", String.class)); } diff --git a/skywalking-api/src/test/java/test/ai/cloud/plugin/TestStaticAroundInterceptor.java b/skywalking-api/src/test/java/test/ai/cloud/plugin/TestStaticAroundInterceptor.java index 007bc49dc..7462389cb 100644 --- a/skywalking-api/src/test/java/test/ai/cloud/plugin/TestStaticAroundInterceptor.java +++ b/skywalking-api/src/test/java/test/ai/cloud/plugin/TestStaticAroundInterceptor.java @@ -1,12 +1,13 @@ package test.ai.cloud.plugin; +import com.ai.cloud.skywalking.plugin.interceptor.enhance.MethodInterceptResult; import com.ai.cloud.skywalking.plugin.interceptor.enhance.MethodInvokeContext; import com.ai.cloud.skywalking.plugin.interceptor.enhance.StaticMethodsAroundInterceptor; public class TestStaticAroundInterceptor implements StaticMethodsAroundInterceptor { @Override - public void beforeMethod(MethodInvokeContext interceptorContext) { + public void beforeMethod(MethodInvokeContext interceptorContext, MethodInterceptResult result) { System.out.println("beforeMethod : static"); } diff --git a/skywalking-sdk-plugin/dubbo-plugin/src/main/java/com/ai/cloud/skywalking/plugin/DubboFilterBuildInterceptor.java b/skywalking-sdk-plugin/dubbo-plugin/src/main/java/com/ai/cloud/skywalking/plugin/DubboFilterBuildInterceptor.java deleted file mode 100644 index 5f32d323e..000000000 --- a/skywalking-sdk-plugin/dubbo-plugin/src/main/java/com/ai/cloud/skywalking/plugin/DubboFilterBuildInterceptor.java +++ /dev/null @@ -1,56 +0,0 @@ -package com.ai.cloud.skywalking.plugin; - -import com.alibaba.dubbo.common.URL; -import com.alibaba.dubbo.common.extension.ExtensionLoader; -import com.alibaba.dubbo.rpc.*; -import net.bytebuddy.implementation.bind.annotation.Argument; -import net.bytebuddy.implementation.bind.annotation.RuntimeType; - -import java.util.List; - -public class DubboFilterBuildInterceptor { - - @RuntimeType - public Object intercept( - @Argument(0) final Invoker invoker, - @Argument(1) final String key, - @Argument(2) final String group) - throws Exception { - final URL newURL = invoker.getUrl().addParameter(key, "skywalking$enhanceFilter"); - Invoker last = invoker; - List filters = ExtensionLoader.getExtensionLoader(Filter.class).getActivateExtension(newURL, key, group); - if (filters.size() > 0) { - for (int i = filters.size() - 1; i >= 0; i--) { - final Filter filter = filters.get(i); - final Invoker next = last; - last = new Invoker() { - public Class getInterface() { - return invoker.getInterface(); - } - - public URL getUrl() { - return newURL; - } - - public boolean isAvailable() { - return invoker.isAvailable(); - } - - public Result invoke(Invocation invocation) throws RpcException { - return filter.invoke(next, invocation); - } - - public void destroy() { - invoker.destroy(); - } - - @Override - public String toString() { - return invoker.toString(); - } - }; - } - } - return last; - } -} diff --git a/skywalking-sdk-plugin/dubbo-plugin/src/main/java/com/ai/cloud/skywalking/plugin/DubboPluginDefine.java b/skywalking-sdk-plugin/dubbo-plugin/src/main/java/com/ai/cloud/skywalking/plugin/dubbo/DubboPluginDefine.java similarity index 91% rename from skywalking-sdk-plugin/dubbo-plugin/src/main/java/com/ai/cloud/skywalking/plugin/DubboPluginDefine.java rename to skywalking-sdk-plugin/dubbo-plugin/src/main/java/com/ai/cloud/skywalking/plugin/dubbo/DubboPluginDefine.java index d16e3863d..9df4d6654 100644 --- a/skywalking-sdk-plugin/dubbo-plugin/src/main/java/com/ai/cloud/skywalking/plugin/DubboPluginDefine.java +++ b/skywalking-sdk-plugin/dubbo-plugin/src/main/java/com/ai/cloud/skywalking/plugin/dubbo/DubboPluginDefine.java @@ -1,4 +1,4 @@ -package com.ai.cloud.skywalking.plugin; +package com.ai.cloud.skywalking.plugin.dubbo; import com.ai.cloud.skywalking.plugin.interceptor.MethodMatcher; import com.ai.cloud.skywalking.plugin.interceptor.enhance.ClassStaticMethodsEnhancePluginDefine; @@ -13,7 +13,6 @@ public class DubboPluginDefine extends ClassStaticMethodsEnhancePluginDefine { @Override protected StaticMethodsAroundInterceptor getStaticMethodsInterceptor() { - // TODO Auto-generated method stub return null; } diff --git a/skywalking-sdk-plugin/dubbo-plugin/src/main/java/com/ai/cloud/skywalking/plugin/dubbo/ProtocolFilterBuildChainInterceptor.java b/skywalking-sdk-plugin/dubbo-plugin/src/main/java/com/ai/cloud/skywalking/plugin/dubbo/ProtocolFilterBuildChainInterceptor.java new file mode 100644 index 000000000..3d4c72e38 --- /dev/null +++ b/skywalking-sdk-plugin/dubbo-plugin/src/main/java/com/ai/cloud/skywalking/plugin/dubbo/ProtocolFilterBuildChainInterceptor.java @@ -0,0 +1,78 @@ +package com.ai.cloud.skywalking.plugin.dubbo; + +import java.util.List; + +import com.ai.cloud.skywalking.plugin.interceptor.enhance.MethodInterceptResult; +import com.ai.cloud.skywalking.plugin.interceptor.enhance.MethodInvokeContext; +import com.ai.cloud.skywalking.plugin.interceptor.enhance.StaticMethodsAroundInterceptor; +import com.alibaba.dubbo.common.URL; +import com.alibaba.dubbo.common.extension.ExtensionLoader; +import com.alibaba.dubbo.rpc.Filter; +import com.alibaba.dubbo.rpc.Invocation; +import com.alibaba.dubbo.rpc.Invoker; +import com.alibaba.dubbo.rpc.Result; +import com.alibaba.dubbo.rpc.RpcException; + +public class ProtocolFilterBuildChainInterceptor implements StaticMethodsAroundInterceptor{ + + @SuppressWarnings("rawtypes") + @Override + public void beforeMethod(MethodInvokeContext interceptorContext, + MethodInterceptResult result) { + Object[] args = interceptorContext.allArguments(); + 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); + if (filters.size() > 0) { + for (int i = filters.size() - 1; i >= 0; i--) { + final Filter filter = filters.get(i); + final Invoker next = last; + last = new Invoker() { + public Class getInterface() { + return invoker.getInterface(); + } + + public URL getUrl() { + return newURL; + } + + public boolean isAvailable() { + return invoker.isAvailable(); + } + + public Result invoke(Invocation invocation) throws RpcException { + return filter.invoke(next, invocation); + } + + public void destroy() { + invoker.destroy(); + } + + @Override + public String toString() { + return invoker.toString(); + } + }; + } + } + + result.defineReturnValue(last); + } + + @Override + public Object afterMethod(MethodInvokeContext interceptorContext, Object ret) { + return null; + //unreachable + } + + @Override + public void handleMethodException(Throwable t, + MethodInvokeContext interceptorContext, Object ret) { + //unreachable + } + +} diff --git a/skywalking-sdk-plugin/dubbo-plugin/src/main/resources/skywalking-plugin.def b/skywalking-sdk-plugin/dubbo-plugin/src/main/resources/skywalking-plugin.def index 5ac0cb551..605938881 100644 --- a/skywalking-sdk-plugin/dubbo-plugin/src/main/resources/skywalking-plugin.def +++ b/skywalking-sdk-plugin/dubbo-plugin/src/main/resources/skywalking-plugin.def @@ -1 +1 @@ -com.ai.cloud.skywalking.plugin.DubboPluginDefine \ No newline at end of file +com.ai.cloud.skywalking.plugin.dubbo.DubboPluginDefine \ No newline at end of file diff --git a/skywalking-sdk-plugin/httpClient-4.x-plugin/src/main/java/org/skywalking/httpClient/v4/plugin/HttpClientExecuteInterceptor.java b/skywalking-sdk-plugin/httpClient-4.x-plugin/src/main/java/org/skywalking/httpClient/v4/plugin/HttpClientExecuteInterceptor.java index 6842a0b51..42db63cce 100644 --- a/skywalking-sdk-plugin/httpClient-4.x-plugin/src/main/java/org/skywalking/httpClient/v4/plugin/HttpClientExecuteInterceptor.java +++ b/skywalking-sdk-plugin/httpClient-4.x-plugin/src/main/java/org/skywalking/httpClient/v4/plugin/HttpClientExecuteInterceptor.java @@ -9,6 +9,7 @@ import com.ai.cloud.skywalking.plugin.interceptor.EnhancedClassInstanceContext; import com.ai.cloud.skywalking.plugin.interceptor.enhance.ConstructorInvokeContext; import com.ai.cloud.skywalking.plugin.interceptor.enhance.InstanceMethodInvokeContext; import com.ai.cloud.skywalking.plugin.interceptor.enhance.IntanceMethodsAroundInterceptor; +import com.ai.cloud.skywalking.plugin.interceptor.enhance.MethodInterceptResult; public class HttpClientExecuteInterceptor implements IntanceMethodsAroundInterceptor { /** @@ -25,7 +26,7 @@ public class HttpClientExecuteInterceptor implements IntanceMethodsAroundInterce @Override public void beforeMethod(EnhancedClassInstanceContext context, - InstanceMethodInvokeContext interceptorContext) { + InstanceMethodInvokeContext interceptorContext, MethodInterceptResult result) { Object[] allArguments = interceptorContext.allArguments(); if (allArguments[0] == null || allArguments[1] == null) { // illegal args, can't trace. ignore. diff --git a/skywalking-sdk-plugin/jedis-2.x-plugin/src/main/java/com/ai/cloud/skywalking/jedis/v2/plugin/JedisBaseInterceptor.java b/skywalking-sdk-plugin/jedis-2.x-plugin/src/main/java/com/ai/cloud/skywalking/jedis/v2/plugin/JedisBaseInterceptor.java index 2f0c7a6ee..c1c9e81fc 100644 --- a/skywalking-sdk-plugin/jedis-2.x-plugin/src/main/java/com/ai/cloud/skywalking/jedis/v2/plugin/JedisBaseInterceptor.java +++ b/skywalking-sdk-plugin/jedis-2.x-plugin/src/main/java/com/ai/cloud/skywalking/jedis/v2/plugin/JedisBaseInterceptor.java @@ -5,6 +5,7 @@ import com.ai.cloud.skywalking.model.Identification; import com.ai.cloud.skywalking.plugin.interceptor.EnhancedClassInstanceContext; import com.ai.cloud.skywalking.plugin.interceptor.assist.SimpleObjectFirstInvokeInterceptor; import com.ai.cloud.skywalking.plugin.interceptor.enhance.InstanceMethodInvokeContext; +import com.ai.cloud.skywalking.plugin.interceptor.enhance.MethodInterceptResult; public abstract class JedisBaseInterceptor extends SimpleObjectFirstInvokeInterceptor { protected static final String REDIS_CONN_INFO_KEY = "redisClusterConnInfo"; @@ -12,7 +13,7 @@ public abstract class JedisBaseInterceptor extends SimpleObjectFirstInvokeInterc private static RPCBuriedPointSender sender = new RPCBuriedPointSender(); @Override - public void beforeMethod(EnhancedClassInstanceContext context, InstanceMethodInvokeContext interceptorContext) { + public void beforeMethod(EnhancedClassInstanceContext context, InstanceMethodInvokeContext interceptorContext, MethodInterceptResult result) { if (this.isFirstBeforeMethod(context)) { /** * redis server wouldn't process rpc context. ignore the