调用链定义:

在系统完成一次业务调用的过程中,把服务之间的调用信息(时间、接口、层次、结果)打点到日志中,然后将所有的打点数据连接为一个树状链条就产生了一个调用链。跟踪系统把过程中产生的日志信息进行分析处理,将业务端到端的执行完整的调用过程进行还原,根据不同维度进行统计分析;从而标识出有异常的服务调用,能够快速分析定界到出异常的服务;同时可根据数据统计分析系统性能瓶颈。

核心概念:

1、Trace:
Trace是指一次请求调用的链路过程,trace id 是指这次请求调用的ID。在一次请求中,会在网络的最开始生成一个全局唯一的用于标识此次请求的trace id,这个trace id在这次请求调用过程中无论经过多少个节点都会保持不变,并且在随着每一层的调用不停的传递。最终,可以通过trace id将这一次用户请求在系统中的路径全部串起来。

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

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

java方法如何写一个方法链式调用 方法调用链分析_链路


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

系统整个调用链(核心思路):

整个调用过程的追踪,主要有下面几个步骤:

  • 所有请求到来即生成一个全局唯一编码的TraceID,通过TraceID可以串联起整个调用链,一个TraceID只代表一次请求。
  • 在调用过程中,需要SpanID用于记录调用父子关系。每个服务会记录下Parent ID和Span
    ID。这样通过TraceID和TraceID可以组织一次完整调用链的父子关系。
  • 一个没有Parent Id的Span成为Root Span,可以看成调用链入口。
    所有这些ID可用全局唯一的64位整数表示。
  • 整个调用过程中每个请求都要透传TraceID和SpanID。
  • 每个服务将该次请求附带的TraceID和附带的SpanID作为Parent ID记录下,并且将自己生成的SpanID也记录下。
  • 要查看某次完整的调用,只要根据TraceID查出所有调用记录,然后通过Parent ID和Span Id组织起整个调用父子关系即可。