Dubbo调用过程监控

MonitorFilter 主要对调用过程进行监控,

public Result invoke(Invoker invoker, Invocation invocation) throws RpcException { 
    if(invoker.getUrl().hasParameter(Constants.MONITOR_KEY)) {
        //  供方必须在 invoke()之前获取 context 信息
        RpcContext context = RpcContext.getContext();
        long start = System.currentTimeMillis(); // 记录起始时间戮 
        getConcurrent(invoker, invocation).incrementAndGet(); // 并发计数 
        try {
            Result result = invoker.invoke(invocation); // 让调用链往下执行 
            collect(invoker, invocation, result, context, start, false);
            return result;
        } catch (RpcException e) {
            collect(invoker, invocation, null, context, start, true);
            throw e; 
        } finally {
            getConcurrent(invoker, invocation).decrementAndGet(); // 并发计数 
        }
    } else {
        return invoker.invoke(invocation);
    } 
}

其核心代码是 collect()方法,该方法会将监控的数据通过 Monitor monitor 进 行收集,收集后存放在本地内存,每隔固定的时间(默认是 60 秒)上传到监控 节点上。
Monitor 的默认实现是 com.alibaba.dubbo.monitor.dubbo 包下的 DubboMonitor 类,DubboMonitor 中会定义一个 ConcurrentHashMap 的对象用于保存监控信息, MonitorFilter 的 collect 方法在执行时会将监控数据保存到该 ConcurrentHashMap 中;另外,DubboMonitor 默认会开启一个基于线程池的定时任务执行器 ScheduledExecutorService,并且在构造函数中会启动一个周期性执行的任务将 ConcurrentHashMap中的数据发送到监控节点上,发送逻辑在send()方法中实现, 发送的周期是 60000 毫秒(即一分钟)。

你可能感兴趣的:(java)