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 deaee060f6de2dbb39d6520e3a83ecb66ad87d22..760557c4add5352a2aea32c4122d9d6bccb718f2 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 @@ -1,23 +1,24 @@ package com.ai.cloud.skywalking.plugin.dubbo; 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.ClassStaticMethodsEnhancePluginDefine; import com.ai.cloud.skywalking.plugin.interceptor.enhance.StaticMethodsAroundInterceptor; import com.ai.cloud.skywalking.plugin.interceptor.matcher.SimpleMethodMatcher; -public class DubboPluginDefine extends ClassStaticMethodsEnhancePluginDefine { +public class DubboPluginDefine extends ClassInstanceMethodsEnhancePluginDefine { @Override - protected MethodMatcher[] getStaticMethodsMatchers() { - return new MethodMatcher[]{new SimpleMethodMatcher("buildInvokerChain")}; + protected MethodMatcher[] getInstanceMethodsMatchers() { + return new MethodMatcher[]{new SimpleMethodMatcher("invoke")}; } @Override - protected String getStaticMethodsInterceptor() { - return "com.ai.cloud.skywalking.plugin.dubbo.ProtocolFilterBuildChainInterceptor"; + protected String getInstanceMethodsInterceptor() { + return "com.ai.cloud.skywalking.plugin.dubbo.MonitorFilterInterceptor"; } @Override protected String enhanceClassName() { - return "com.alibaba.dubbo.rpc.protocol.ProtocolFilterWrapper"; + return "com.alibaba.dubbo.monitor.support.MonitorFilter"; } } diff --git a/skywalking-collector/skywalking-sdk-plugin/dubbo-plugin/src/main/java/com/ai/cloud/skywalking/plugin/dubbo/SWDubboEnhanceFilter.java b/skywalking-collector/skywalking-sdk-plugin/dubbo-plugin/src/main/java/com/ai/cloud/skywalking/plugin/dubbo/MonitorFilterInterceptor.java similarity index 60% rename from skywalking-collector/skywalking-sdk-plugin/dubbo-plugin/src/main/java/com/ai/cloud/skywalking/plugin/dubbo/SWDubboEnhanceFilter.java rename to skywalking-collector/skywalking-sdk-plugin/dubbo-plugin/src/main/java/com/ai/cloud/skywalking/plugin/dubbo/MonitorFilterInterceptor.java index ba8af10def1360120ad4515f3e5706eae75fc1bd..88ba1c0c3c518db1d5373a2248450afcbbfb7db3 100644 --- a/skywalking-collector/skywalking-sdk-plugin/dubbo-plugin/src/main/java/com/ai/cloud/skywalking/plugin/dubbo/SWDubboEnhanceFilter.java +++ b/skywalking-collector/skywalking-sdk-plugin/dubbo-plugin/src/main/java/com/ai/cloud/skywalking/plugin/dubbo/MonitorFilterInterceptor.java @@ -1,29 +1,40 @@ package com.ai.cloud.skywalking.plugin.dubbo; -import com.ai.cloud.skywalking.invoke.monitor.RPCServerInvokeMonitor; import com.ai.cloud.skywalking.invoke.monitor.RPCClientInvokeMonitor; -import com.ai.cloud.skywalking.conf.AuthDesc; +import com.ai.cloud.skywalking.invoke.monitor.RPCServerInvokeMonitor; import com.ai.cloud.skywalking.model.ContextData; import com.ai.cloud.skywalking.model.Identification; import com.ai.cloud.skywalking.plugin.dubbox.bugfix.below283.BugFixAcitve; import com.ai.cloud.skywalking.plugin.dubbox.bugfix.below283.SWBaseBean; -import com.alibaba.dubbo.common.extension.Activate; -import com.alibaba.dubbo.rpc.*; - -@Activate -public class SWDubboEnhanceFilter implements Filter { +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.InstanceMethodsAroundInterceptor; +import com.ai.cloud.skywalking.plugin.interceptor.enhance.MethodInterceptResult; +import com.alibaba.dubbo.rpc.Invocation; +import com.alibaba.dubbo.rpc.Invoker; +import com.alibaba.dubbo.rpc.Result; +import com.alibaba.dubbo.rpc.RpcContext; + +public class MonitorFilterInterceptor implements InstanceMethodsAroundInterceptor { + @Override + public void onConstruct(EnhancedClassInstanceContext context, ConstructorInvokeContext interceptorContext) { + // do nothing + } - public Result invoke(Invoker invoker, Invocation invocation) throws RpcException { - if (!AuthDesc.isAuth()) { - return invoker.invoke(invocation); - } + @Override + public void beforeMethod(EnhancedClassInstanceContext context, InstanceMethodInvokeContext interceptorContext, + MethodInterceptResult result) { + Object[] arguments = interceptorContext.allArguments(); + Invoker invoker = (Invoker) arguments[0]; + Invocation invocation = (Invocation) arguments[1]; - RpcContext context = RpcContext.getContext(); - boolean isConsumer = context.isConsumerSide(); - Result result = null; + RpcContext rpcContext = RpcContext.getContext(); + boolean isConsumer = rpcContext.isConsumerSide(); + context.set("isConsumer", isConsumer); if (isConsumer) { RPCClientInvokeMonitor rpcClientInvokeMonitor = new RPCClientInvokeMonitor(); - + context.set("rpcClientInvokeMonitor", rpcClientInvokeMonitor); ContextData contextData = rpcClientInvokeMonitor.beforeInvoke(createIdentification(invoker, invocation)); String contextDataStr = contextData.toString(); @@ -43,32 +54,18 @@ public class SWDubboEnhanceFilter implements Filter { // 在Rest模式中attachment会被抹除,不会传入到服务端 // Rest模式会将attachment存放到header里面,具体见com.alibaba.dubbo.rpc.protocol.rest.RpcContextFilter //invocation.getAttachments().put("contextData", contextDataStr); - context.getAttachments().put("contextData", contextDataStr); + rpcContext.getAttachments().put("contextData", contextDataStr); } else { fix283SendNoAttachmentIssue(invocation, contextDataStr); } - - try { - //执行结果 - result = invoker.invoke(invocation); - //结果是否包含异常 - if (result.getException() != null) { - rpcClientInvokeMonitor.occurException(result.getException()); - } - } catch (RpcException e) { - // 自身异常 - rpcClientInvokeMonitor.occurException(e); - throw e; - } finally { - rpcClientInvokeMonitor.afterInvoke(); - } } else { // 读取参数 RPCServerInvokeMonitor rpcServerInvokeMonitor = new RPCServerInvokeMonitor(); + context.set("rpcServerInvokeMonitor", rpcServerInvokeMonitor); String contextDataStr; if (!BugFixAcitve.isActive) { - contextDataStr = context.getAttachment("contextData"); + contextDataStr = rpcContext.getAttachment("contextData"); } else { contextDataStr = fix283RecvNoAttachmentIssue(invocation); } @@ -79,24 +76,34 @@ public class SWDubboEnhanceFilter implements Filter { } rpcServerInvokeMonitor.beforeInvoke(contextData, createIdentification(invoker, invocation)); + } - try { - //执行结果 - result = invoker.invoke(invocation); - //结果是否包含异常 - if (result.getException() != null) { - rpcServerInvokeMonitor.occurException(result.getException()); - } - } catch (RpcException e) { - // 自身异常 - rpcServerInvokeMonitor.occurException(e); - throw e; - } finally { - rpcServerInvokeMonitor.afterInvoke(); - } + } + + @Override + public Object afterMethod(EnhancedClassInstanceContext context, InstanceMethodInvokeContext interceptorContext, + Object ret) { + Result result = (Result) ret; + if (result.getException() != null) { + dealException(result.getException(), context); } - return result; + return ret; + } + + @Override + public void handleMethodException(Throwable t, EnhancedClassInstanceContext context, + InstanceMethodInvokeContext interceptorContext, Object ret) { + dealException(t, context); + } + + private void dealException(Throwable t, EnhancedClassInstanceContext context) { + boolean isConsumer = (boolean) context.get("isConsumer"); + if (isConsumer) { + ((RPCClientInvokeMonitor) context.get("rpcClientInvokeMonitor")).occurException(t); + } else { + ((RPCServerInvokeMonitor) context.get("rpcServerInvokeMonitor")).occurException(t); + } } private static Identification createIdentification(Invoker invoker, Invocation invocation) { @@ -115,7 +122,8 @@ public class SWDubboEnhanceFilter implements Filter { } viewPoint.append(")"); - return Identification.newBuilder().viewPoint(viewPoint.toString()).spanType(DubboBuriedPointType.instance()).build(); + return Identification.newBuilder().viewPoint(viewPoint.toString()).spanType(DubboBuriedPointType.instance()) + .build(); } 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 deleted file mode 100644 index fa1860d79db208e922749bfdd7e34fb6871f5b9f..0000000000000000000000000000000000000000 --- a/skywalking-collector/skywalking-sdk-plugin/dubbo-plugin/src/main/java/com/ai/cloud/skywalking/plugin/dubbo/ProtocolFilterBuildChainInterceptor.java +++ /dev/null @@ -1,78 +0,0 @@ -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-collector/skywalking-sdk-plugin/dubbo-plugin/src/main/resources/META-INF/dubbo/com.alibaba.dubbo.rpc.Filter b/skywalking-collector/skywalking-sdk-plugin/dubbo-plugin/src/main/resources/META-INF/dubbo/com.alibaba.dubbo.rpc.Filter deleted file mode 100644 index 459683129a8a72822b7363d150e75bdcd4100c67..0000000000000000000000000000000000000000 --- a/skywalking-collector/skywalking-sdk-plugin/dubbo-plugin/src/main/resources/META-INF/dubbo/com.alibaba.dubbo.rpc.Filter +++ /dev/null @@ -1 +0,0 @@ -skywalking$enhanceFilter=com.ai.cloud.skywalking.plugin.dubbo.SWDubboEnhanceFilter \ No newline at end of file