链路追踪
现在的大多数互联网服务,基本都是用复杂,大规模分布式集群来实现,微服务化,这些服务模块分布在不同的机器,不同的数据中心,由不同团队,语言开发而成。因此,需要工具帮助理解,分析这些系统、定位问题,做到追踪每一个请求的完整调用链路,收集性能数据,反馈到服务治理中,链路追踪系统应运而生。
OpenTracing 协议
OpenTracing是分布式跟踪系统,当我们把系统拆成服务化,分布式系统的时候,查询一个问题,很可能需要多个登录多台机器。
OpenTracing
通过提供平台无关、厂商无关的API
,使得开发人员能够方便的添加(或更换)追踪系统的实现。OpenTracing
正在为全球的分布式追踪,提供统一的概念和数据标准。
Trace
OpenTracing
中的Trace
(调用链)通过归属于此调用链的Span来隐性的定义。- 一条
Trace
(调用链)可以被认为是一个由多个Span
组成的有向无环图(DAG图),Span
Span
可以被翻译为跨度,可以被理解为一次方法调用, 一个程序块的调用, 或者一次RPC
/数据库访问- 只要是一个具有完整时间周期的程序访问,都可以被认为是一个
span
Span
与Span
的关系被命名为References
。
以下是由8
个Span
组成的Trace
单个Trace中,span间的因果关系
[Span A] ←←←(the root span)
|
+------+------+
| |
[Span B] [Span C] ←←←(Span C 是 Span A 的孩子节点, ChildOf)
| |
[Span D] +---+-------+
| |
[Span E] [Span F] >>> [Span G] >>> [Span H]
↑
↑
↑
(Span G 在 Span F 后被调用, FollowsFrom)
基于时间轴的时序图
单个Trace中,span间的时间关系
––|–––––––|–––––––|–––––––|–––––––|–––––––|–––––––|–––––––|–> time
[Span A···················································]
[Span B··············································]
[Span D··········································]
[Span C········································]
[Span E·······] [Span F··] [Span G··] [Span H··]
span 的结构
Span
An operation name
,操作名称A start timestamp
,起始时间A finish timestamp
,结束时间Span Tag
,一组键值对构成的Span
标签集合。键值对中,键必须为string
,值可以是字符串,布尔,或者数字类型。Span Log
,一组span
的日志集合。- 每次
log
操作包含一个键值对,以及一个时间戳。 - 键值对中,键必须为
string
,值可以是任意类型。 - 不是所有的支持
OpenTracing
的Tracer
,都需要支持所有的值类型。
- 每次
SpanContext
,Span
上下文对象References
(Span
间关系),相关的零个或者多个Span
(Span
间通过SpanContext
建立这种关系)
SpanContext
- 任何一个
OpenTracing
的实现,都需要将当前调用链的状态(例如:trace
和spanId
),依赖一个独特的Span
去跨进程边界传输 Baggage Items
,Trace
的随行数据,是一个键值对集合,它存在于trace
中,也需要跨进程边界传输
span 的关系
一个Span
可以与一个或者多个SpanContexts
存在因果关系。OpenTracing
目前定义了两种关系,这两种关系明确的给出了两个父子关系的Span
的因果模型。
ChildOf
(父子),-
FollowsFrom
(跟随)。
ChildOf
一个span
可能是一个父级span
的孩子,即ChildOf
关系。在ChildOf
引用关系下,父级span
某种程度上取决于子span
。下面这些情况会构成ChildOf
关系:
- 一个
RPC
调用的服务端的span
,和RPC
服务客户端的span
构成ChildOf
关系 - 一个数据库
insert
操作的span
,和ORM
的save
方法的span
构成ChildOf
关系 - 很多
span
可以并行工作(或者分布式工作)都可能是一个父级的span
的子项,他会合并所有子span
的执行结果,并在指定期限内返回
ChildOf
关系的父子节点关系的时序图。
[-Parent Span---------]
[-Child Span----]
[-Parent Span--------------]
[-Child Span A----]
[-Child Span B----]
[-Child Span C----]
[-Child Span D---------------]
[-Child Span E----]
FollowsFrom
一些父级节点不以任何方式依赖他们子节点的执行结果,这种情况下,我们说这些子span
和父span
之间是FollowsFrom
的因果关系。FollowsFrom
关系可以被分为很多不同的子类型.
FollowFrom
关系的父子节点关系的时序图。
[-Parent Span-] [-Child Span-]
[-Parent Span--]
[-Child Span-]
[-Parent Span-]
[-Child Span-]