UP | HOME

全链路跟踪简介

Table of Contents

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 开发的实时应用监控平台,包括实时应用监控,业务监控。

7 闭源产品2

7.2 淘宝鹰眼

7.3 新浪watchman

7.4 京东Hydra

7.5 阿里云链路追踪

8 开源产品使用

Footnotes:

Author: liushangliang

Email: phenix3443+github@gmail.com

Created: 2020-04-26 日 10:53