Dubbo 全链路监控技术实践
![Dubbo 全链路监控技术实践](https://static001.geekbang.org/infoq/af/afad6182207b024ab0fc2d5b11c65774.png)
序言:
Dubbo 是一款高性能的 Java RPC 框架。其前身是阿里巴巴公司开源的一款高性能、轻量级的开源 Java RPC 框架,它的设计初衷是为了方便服务之间的远程调用,是微服务体系构建的重要基石。
Dubbo 是国内开源的专门用于微服务之间通信的框架,背靠大厂有技术保障,有活跃的开源社区,技术成熟稳定,依赖组件少,相对于国外的比如 Spring-Cloud 来说上手更容易,因此广泛的被国内各行各业使用,比如电商、证券、银行等等。
微服务是当前企业服务的最通用架构,相对于传统的单体大服务有诸多优势,但同样使得服务关联关系变得更加复杂,此时一套分布式全链路追踪的可观测系统工具变得越来越重要,而 Dubbo 的全链路监控是监控系统的重要一环。
▐ 技术方案
全链路监控是由一条业务链路上每个组件的调用元数据(span)通过一个相同的唯一标识(traceId)串联而成,通过这些元数据能直观看到业务链路的走向及明细信息。针对 Dubbo 调用如何构建元数据(span),是每套可观测系统都需要解决的问题。
![](https://static001.geekbang.org/infoq/06/06cfd829ec8d1912fd1238f5eccda67d.webp?x-oss-process=image%2Fresize%2Cp_80%2Fformat%2Cpng)
Databuff APM 模块 使用 ASM 字节码修改技术,对 Dubbo 的 MonitorFilter Class 做了代码增强,修改了其核心方法的字节码,在其前后增强了 APM 的框架代码,这样客户端和服务端在其执行核心方法之前都能执行相应的处理逻辑:
Client
before:生成调用 span,将 APM 数据注入到 Request 上下文
after:从 Response 上下文获取 APM 数据,填充到 span 中,结束 span
Server
before:生成 span,从 Request 上下文提取 APM 数据,注入到 span 以及线程上下文中
after:将 APM 数据写入 Response 上下文,结束 span
▐ 呈现效果
![](https://static001.geekbang.org/infoq/e4/e4ffa94027fb6b385c0ed9a4475c1710.webp?x-oss-process=image%2Fresize%2Cp_80%2Fformat%2Cpng)
![](https://static001.geekbang.org/infoq/cd/cda0905c6cecafe2d9556ddf9e71ab7c.webp?x-oss-process=image%2Fresize%2Cp_80%2Fformat%2Cpng)
客户端和服务端都会生成一个 span,每个 span 都会记录当前服务的 ip 域名,服务名称,线程名称,接口 #方法名称,客户端还是服务端,调用耗时,是否报错等等。
Dubbo 调用可能有很多异常情况,大部分都能通过监控界面看到,比如远程调用超时:
![](https://static001.geekbang.org/infoq/93/939d719b1cb852882a43196cefef397c.webp?x-oss-process=image%2Fresize%2Cp_80%2Fformat%2Cpng)
从上图能看到服务端的执行时间超过了客户端的等待时间,客户端等不了了抛出异常(能看到异常堆栈信息),但服务端最终还是执行成功了,有上报的 span,也能看到服务端的 span 的时间条很长,远远超过客户端的 span 时间条。
通过 span 信息能很直观监控 dubbo 调用,当然也能很直观看到当前业务链路监控信息,这就是可观测系统的意义所在。
版权声明: 本文为 InfoQ 作者【乘云 DataBuff】的原创文章。
原文链接:【http://xie.infoq.cn/article/61c9f420f297525a58138820d】。文章转载请联系作者。
评论