在调用链监控系统中,有几个核心概念需要了解:

Trace:

Trace是指请求调用的链接过程,Trace id是指此请求调用的ID。 在请求中,将在网络的最开始处生成用于标识此请求的全局唯一trace id。 无论在此请求调用过程中经过多少个节点,此trace id都将保持不变,并且将继续进行下去。连续传递每一层的调用。 最后,该用户请求在系统中的路径可以通过trace id串在一起。

Span:

Span是指一个模块的调用过程,一般用span id来标识。在一次请求的过程中会调用不同的节点/模块/服务,每一次调用都会生成一个新的span id来记录。这样,就可以通过span id来定位当前请求在整个系统调用链中所处的位置,以及它的上下游节点分别是什么。

Annotation:

是指附属信息,可以用于附属在每一个Span上自定义的数据。

具体参考下图:

java 获取链接标题 描述 快照 java调用链_数据

从图中可见,一次请求只有一个唯一的trace id=12345,在请求过程中的任何环节都不会改变。在这个请求的调用链中,SpanA调用了SpanB,然后SpanB又调用了SpanC和SpanD,每一次Span调用都会生成一个自己的span id,并且还会记录自己的上级span id是谁。通过这些id,整个链路基本上就都能标识出来了。

好了,了解了核心概念之后,我们再来看一下它具体是如何工作的,下面选取Twitter开源的Zipkin原理图作为参考:

java 获取链接标题 描述 快照 java调用链_应用程序_02

所有的调用链监控系统都由 数据埋点采集、数据存储处理、数据分析展示 几大部分组成,Zipkin也不例外。

图中左上角Reporter部分集成到应用程序中采集数据,并将数据上报,由Collector进行收集,然后通过Storage模块负责存储,落地到存储系统中(Zipkin用的是Cassandra)。而API模块是可以将处理后的数据提供对外服务的,UI模块就是数据统计展示层了。