全链路跟踪简介
1 概述
实际业务中,一次请求需要关联到多个任务模块,这些业务模块有可能是由不同的团队开发,也可能使用不同的编程语言来实现、有可能布在了几千台服务器,横跨多个不同的数据中心。因此,就需要一些可以帮助理解系统行为、用于分析性能问题的工具,以便发生故障的时候,能够快速定位和解决问题。
想要在请求上下文中理解分布式系统的行为,就需要监控那些横跨了不同的应用、不同的服务器之间的关联动作。
全链路监控系统 - APM(Application Performance Managemen)就在这样的问题背景下产生了。
2 用途
全链路监控系统主要有以下用途:
2.1 故障定位
快速发现问题,判断故障影响范围。
2.2 容量评估
分析链路性能问题,实时容量规划。
2.3 链路梳理
了解整个系统,梳理服务依赖以及依赖的合理性。
2.4 性能分析
关注各项性能指标,比如吞吐量(TPS)、响应时间、错误记录。
2.5 数据可视化
3 系统要求
对 APM 组件要求有:
3.1 探针的性能消耗
APM 组件服务的影响应该做到足够小。服务调用埋点本身会带来性能损耗,这就需要调用跟踪的低损耗,实际中还会通过配置采样率的方式,选择一部分请求去分析请求路径。在一些高度优化过的服务,即使一点点损耗也会很容易察觉到,而且有可能迫使在线服务的部署团队不得不将跟踪系统关停。
3.2 代码的侵入性
应当尽可能少入侵或者无入侵其他业务系统,对于使用方透明,减少开发人员的负担。
3.3 可扩展性
一个优秀的调用跟踪系统必须支持分布式部署,具备良好的可扩展性。能够支持的组件越多当然越好。或者提供便捷的插件开发API,对于一些没有监控到的组件,应用开发者也可以自行扩展。
3.4 数据分析
数据的分析要快 ,分析的维度尽可能多。
- 信息反馈越快,对生产环境下的异常状况反应也越快。
- 分析的全面,能够避免二次开发。
4 主要概念
市面上的全链路监控理论模型大多都是借鉴Google Dapper论文(中文翻译),涉及到的主要概念有:
4.1 span
Span 是最基本的调用追踪单元
4.2 trace
Trace 是一组相互关联的 Span 集合
4.3 Annotation
注解,用来记录请求特定事件相关信息(例如时间),一个span中会有多个annotation注解描述。通常包含四个注解信息:
- cs:Client Start,表示客户端发起请求
- sr:Server Receive,表示服务端收到请求
- ss:Server Send,表示服务端完成处理,并将结果发送给客户端
- cr:Client Received,表示客户端获取到服务端返回信息
5 系统功能模块
5.1 埋点与生成日志
埋点即系统在当前节点的上下文信息,可以分为 客户端埋点、服务端埋点,以及客户端和服务端双向型埋点。
埋点日志通常要包含以下内容 trace_id、span_id、调用的开始时间,协议类型、调用方ip和端口,请求的服务名、调用耗时,调用结果,异常信息等,同时预留可扩展字段,为下一步扩展做准备.
因为要写log,业务QPS越高,性能影响越重。 通过采样和异步log解决 。
5.2 收集和存储日志
主要支持分布式日志采集的方案,同时增加消息队列作为缓冲;
- 每个机器上有一个 deamon 做日志收集,业务进程把自己的Trace发到daemon,daemon把收集Trace往上一级发送。
- 多级的 collector,类似 pub/sub 架构,可以负载均衡。
- 对聚合的数据进行实时分析和离线存储。
- 离线分析,需要将同一条调用链的日志汇总在一起。
5.3 分析和统计调用链路数据,以及时效性
调用链跟踪分析:把同一 TraceID 的 Span 收集起来,按时间排序就是 timeline。把 ParentID 串起来就是调用栈。
抛异常或者超时,在日志里打印TraceID。利用TraceID查询调用链情况,定位问题。
依赖度量:
- 强依赖:调用失败会直接中断主流程
- 高度依赖:一次链路中调用某个依赖的几率高
- 频繁依赖:一次链路调用同一个依赖的次数多
离线分析:按TraceID汇总,通过Span的ID和ParentID还原调用关系,分析链路形态。
实时分析:对单条日志直接分析,不做汇总,重组。得到当前QPS,延迟。
5.4 展现以及决策支持
6 开源产品1
本文重点关注以下几种开源 APM 组件:
6.1 Zipkin
Zipkin 是由Twitter公司开源,开放源代码分布式的跟踪系统,用于收集服务的定时数据,以解决微服务架构中的延迟问题,包括:数据的收集、存储、查找和展现。
6.2 Pinpoint
Pinpoint 是一款对Java编写的大规模分布式系统的APM工具,由韩国人开源的分布式跟踪组件。
6.3 Skywalking
Skywalking 是国产的优秀APM组件,是一个对JAVA分布式应用程序集群的业务运行情况进行追踪、告警和分析的系统。
6.4 CAT
CAT 是大众点评基于 Java 开发的实时应用监控平台,包括实时应用监控,业务监控。