全链路监控系统 - APM(Application Performance Managemen)主要用于调用链路追踪,对每一次调用都做性能分析。

当我们需要解决以下的问题的时候,我们就需要引入APM了。

  • 上线发布后,如何确认服务一切正常?
  • 客户端收到了错误的提示,但是到底是哪个服务抛出的这个错误?
  • 程序性能有问题,但是具体是哪个环节成了性能的瓶颈?
  • 接口响应很慢,到底是网络问题还是代码问题?
  • 服务调用链路长,每个环节都可能是一个出问题的风险点?
  • 做技术优化,如何丈量我们的服务质量呢?

调用链

基本概念

调用链中的核心概念

  • Trace 一次分布式调用的链路
  • Span 一次本地或者远程方法的调用
  • Annotation 附加在 Span 上的日志信息
  • Sampling 采样率(客户端按照比例将埋点信息提交给服务端)

我们来通过实例来具体展示以下对应的概念

如上我们图示了一次分布式调用的全过程,图中有三个分布式服务 Service A、Service B、Service B,每个方法的调用链信息中涉及到如下三个标记:

  • tid:tid 即为 trace id,代表该次调用的唯一 ID,在一次分布式调用中,所有方法的 tid 都相同。如上图中的 Tid:1。
  • sid:sid 即为 span id, 代表的是一个本地/远程方法调用的唯一 ID。如上图中每个绿色框代表的是一次方法调用,每次调用都有自己的 sid。
  • pid:pid 其实也是一个 span id,但是它代表的是当前方法的父级方法的 span id。如上图中第一方法调用由客户端发起,是没有 pid 的。

在上图中所示的调用链中总共包含了 7 个方法(本地/远程)调用,依次如下:

  • 用客户端发起调用请求后,首先请求进入到 A 服务。此时会产生调用链信息 tid:1, sid:1 。
  • 接着发生了一次远程调用 Tid:1, pid:1, sid:2,pid 为 1 代表父级方法的 span id 为 1 即为 sid = 1 的方法,同理本次 redis 远程调用的 span id 为 2。
  • Redis 远程调用结束后发生了对 Service B 的远程调用 Tid:1, pid:1, sid:3,与方法 2 类似,不同的是本次方法调用的 span id 为 3。
  • 在 Service B 中,首先是一个本地方法调用 Tid:1, pid:3, sid:4,从 pid = 3 可以得出它的父级方法正是方法 3。
  • 接着发生了一次对 Mysql 的远程调用 Tid:1, pid:4, sid:5,pid = 4 代表父级方法为方法 4,span id 为 5。
  • Mysql 远程调用结束后,Service B 对 Service C 进行了一次远程调用 Tid:1, pid:4, sid:6,同样通过 pid 和 tid 我们可以将本次方法调用与整个调用链关联起来。
  • 最后是 Service C 的一个本地方法调用 Tid:1, pid:6, sid:7,至此整个调用链到达最远端,这是本次分布式调用链最深处的一个方法。

发展

2010 年 Google Dapper 问世,其实早在 2002 年 eBay 已经有了自己的调用链监控产品,它叫 CAL(Central Application Logging)。当时 eBay 中国研发中心的一位资深工程师作为 CAL 的核心维护人员,对 CAL 的方方面面都非常熟悉。

后来他去了美团点评,在 2011 年的时候,他带领团队研发出了 CAT(Central Application Tracing),CAT 继承了 CAL 的优点,也增加了很多自己的特色功能,并且它已经在 GitHub 开源,也在美团点评经受了大流量,高并发应用的检验,是目前业界应用比较广泛和成熟的生产级别调用链监控产品。

随后由于 Google Dapper 论文的发布,也伴随着互联网产品的迅速发展,各个大厂依据 Dapper 纷纷实现了自己的调用链监控产品。在 2012 年就诞生了 3 款产品,携程的 CTrace,韩国公司 Naver 的 PinPoint,Twitter 的 Zipkin。

随后在 2014 年,阿里研发了 Eagleye,京东研发了 Hydra。接着诞生了调用链监控的标准规范 Open Tracing,面对各大厂的调用链监控产品,他们使用不兼容的 API 来实现各自的应用需求。尽管这些分布式追踪系统有着相似的 API 语法,但各种语言的开发人员依然很难将他们各自的系统(使用不同的语言和技术)和特定的分布式追踪系统进行整合,Open Tracing 希望可以解决这个问题,因此颁布了这套标准。于此也诞生了 Uber 的 Jaeger,国人吴晟做的 SkyWalking(现在已经捐赠给了 Apache)均实现了 Open Tracing 标准

各大调用链产品分为了典型的三类:

  • CAT 类:鼻祖 CAL,侵入式埋点,国内公司使用较广。
  • Zipkin 类:鼻祖 Google Dapper,侵入式埋点,国内使用不广(s)。
  • PinPiont类:鼻祖 Google Dapper,非侵入式卖点,采用字节码增强技术。
  • opentacing:jaeger,skywalking

ES

ES数据库很重要,不管在日志还是在调用链都是存储数据的核心模块,也是提供聚合查询的基础。