MonitorFilterInterceptor.java 6.5 KB
Newer Older
A
ascrutae 已提交
1
package com.a.eye.skywalking.plugin.dubbo;
Z
zhangxin10 已提交
2

A
ascrutae 已提交
3 4 5 6 7 8 9 10 11 12 13
import com.a.eye.skywalking.invoke.monitor.RPCServerInvokeMonitor;
import com.a.eye.skywalking.model.ContextData;
import com.a.eye.skywalking.model.Identification;
import com.a.eye.skywalking.plugin.dubbox.bugfix.below283.BugFixAcitve;
import com.a.eye.skywalking.plugin.dubbox.bugfix.below283.SWBaseBean;
import com.a.eye.skywalking.plugin.interceptor.EnhancedClassInstanceContext;
import com.a.eye.skywalking.plugin.interceptor.enhance.ConstructorInvokeContext;
import com.a.eye.skywalking.plugin.interceptor.enhance.InstanceMethodInvokeContext;
import com.a.eye.skywalking.plugin.interceptor.enhance.InstanceMethodsAroundInterceptor;
import com.a.eye.skywalking.plugin.interceptor.enhance.MethodInterceptResult;
import com.a.eye.skywalking.invoke.monitor.RPCClientInvokeMonitor;
A
ascrutae 已提交
14 15 16 17 18 19 20 21 22 23
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
    }
Z
zhangxin10 已提交
24

A
ascrutae 已提交
25 26 27 28 29 30
    @Override
    public void beforeMethod(EnhancedClassInstanceContext context, InstanceMethodInvokeContext interceptorContext,
            MethodInterceptResult result) {
        Object[] arguments = interceptorContext.allArguments();
        Invoker invoker = (Invoker) arguments[0];
        Invocation invocation = (Invocation) arguments[1];
31

A
ascrutae 已提交
32 33 34
        RpcContext rpcContext = RpcContext.getContext();
        boolean isConsumer = rpcContext.isConsumerSide();
        context.set("isConsumer", isConsumer);
Z
zhangxin10 已提交
35
        if (isConsumer) {
A
ascrutae 已提交
36 37
            ContextData contextData =
                    new RPCClientInvokeMonitor().beforeInvoke(createIdentification(invoker, invocation, true));
Z
zhangxin10 已提交
38 39 40 41
            String contextDataStr = contextData.toString();

            //追加参数
            if (!BugFixAcitve.isActive) {
42 43 44 45 46 47 48 49 50 51 52
                // context.setAttachment("contextData", contextDataStr);
                // context的setAttachment方法在重试机制的时候并不会覆盖原有的Attachment
                // 参见Dubbo源代码:“com.alibaba.dubbo.rpc.RpcInvocation”
                //  public void setAttachmentIfAbsent(String key, String value) {
                //      if (attachments == null) {
                //          attachments = new HashMap<String, String>();
                //      }
                //      if (! attachments.containsKey(key)) {
                //          attachments.put(key, value);
                //      }
                //  }
53 54 55
                // 在Rest模式中attachment会被抹除,不会传入到服务端
                // Rest模式会将attachment存放到header里面,具体见com.alibaba.dubbo.rpc.protocol.rest.RpcContextFilter
                //invocation.getAttachments().put("contextData", contextDataStr);
A
ascrutae 已提交
56
                rpcContext.getAttachments().put("contextData", contextDataStr);
Z
zhangxin10 已提交
57 58 59
            } else {
                fix283SendNoAttachmentIssue(invocation, contextDataStr);
            }
Z
zhangxin10 已提交
60 61
        } else {
            // 读取参数
Z
zhangxin10 已提交
62 63 64
            String contextDataStr;

            if (!BugFixAcitve.isActive) {
A
ascrutae 已提交
65
                contextDataStr = rpcContext.getAttachment("contextData");
Z
zhangxin10 已提交
66 67 68 69
            } else {
                contextDataStr = fix283RecvNoAttachmentIssue(invocation);
            }

Z
zhangxin10 已提交
70 71
            ContextData contextData = null;
            if (contextDataStr != null && contextDataStr.length() > 0) {
72
                contextData = new ContextData(contextDataStr);
Z
zhangxin10 已提交
73 74
            }

A
ascrutae 已提交
75
            new RPCServerInvokeMonitor().beforeInvoke(contextData, createIdentification(invoker, invocation, false));
A
ascrutae 已提交
76
        }
Z
zhangxin10 已提交
77

A
ascrutae 已提交
78 79 80 81 82 83
    }

    @Override
    public Object afterMethod(EnhancedClassInstanceContext context, InstanceMethodInvokeContext interceptorContext,
            Object ret) {
        Result result = (Result) ret;
84
        if (result != null && result.getException() != null) {
A
ascrutae 已提交
85
            dealException(result.getException(), context);
Z
zhangxin10 已提交
86 87
        }

A
ascrutae 已提交
88
        if (isConsumer(context)) {
89
            new RPCClientInvokeMonitor().afterInvoke();
A
ascrutae 已提交
90
        } else {
91 92 93
            new RPCServerInvokeMonitor().afterInvoke();
        }

A
ascrutae 已提交
94 95 96 97
        return ret;
    }

    @Override
A
ascrutae 已提交
98 99
    public void handleMethodException(Throwable t, EnhancedClassInstanceContext context,
            InstanceMethodInvokeContext interceptorContext) {
A
ascrutae 已提交
100 101 102
        dealException(t, context);
    }

103

A
ascrutae 已提交
104
    private boolean isConsumer(EnhancedClassInstanceContext context) {
105 106 107
        return (boolean) context.get("isConsumer");
    }

A
ascrutae 已提交
108
    private void dealException(Throwable t, EnhancedClassInstanceContext context) {
109
        if (isConsumer(context)) {
A
ascrutae 已提交
110
            new RPCClientInvokeMonitor().occurException(t);
A
ascrutae 已提交
111
        } else {
112
            new RPCServerInvokeMonitor().occurException(t);
A
ascrutae 已提交
113
        }
Z
zhangxin10 已提交
114 115
    }

A
ascrutae 已提交
116
    private static Identification createIdentification(Invoker<?> invoker, Invocation invocation, boolean isConsumer) {
Z
zhangxin10 已提交
117
        StringBuilder viewPoint = new StringBuilder();
A
ascrutae 已提交
118 119 120 121 122
        if (isConsumer) {
            viewPoint.append("comsumer:");
        } else {
            viewPoint.append("provider:");
        }
Z
zhangxin10 已提交
123 124 125 126
        viewPoint.append(invoker.getUrl().getProtocol() + "://");
        viewPoint.append(invoker.getUrl().getHost());
        viewPoint.append(":" + invoker.getUrl().getPort());
        viewPoint.append(invoker.getUrl().getAbsolutePath());
Z
zhangxin10 已提交
127
        viewPoint.append("." + invocation.getMethodName() + "(");
128
        for (Class<?> classes : invocation.getParameterTypes()) {
Z
zhangxin10 已提交
129 130 131 132 133 134 135 136
            viewPoint.append(classes.getSimpleName() + ",");
        }

        if (invocation.getParameterTypes().length > 0) {
            viewPoint.delete(viewPoint.length() - 1, viewPoint.length());
        }

        viewPoint.append(")");
A
ascrutae 已提交
137 138
        return Identification.newBuilder().viewPoint(viewPoint.toString()).spanType(DubboBuriedPointType.instance())
                .build();
Z
zhangxin10 已提交
139
    }
Z
zhangxin10 已提交
140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160


    private static void fix283SendNoAttachmentIssue(Invocation invocation, String contextDataStr) {

        for (Object parameter : invocation.getArguments()) {
            if (parameter instanceof SWBaseBean) {
                ((SWBaseBean) parameter).setContextData(contextDataStr);
                return;
            }
        }
    }

    private static String fix283RecvNoAttachmentIssue(Invocation invocation) {
        for (Object parameter : invocation.getArguments()) {
            if (parameter instanceof SWBaseBean) {
                return ((SWBaseBean) parameter).getContextData();
            }
        }

        return null;
    }
wu-sheng's avatar
*...  
wu-sheng 已提交
161
}