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 毫秒(即一分钟)。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值