持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第25天,点击查看活动详情
- 链路追踪事如何串化的呢,肯定是通过一个双向链表来记录的。这样我们就能够通过其中1个服务正向反向追踪各个服务的了。
Spans
Span 是一条追踪链路中的基本组成要素,一个 Span 表示一个独立的工作单元,比如可以表示一次函数调用,一次 HTTP 请求等等。Span 会记录如下基本要素:
Google Dapper论文发出来之后,很多公司基于链路追踪的基本原理给出了各自的解决方案,具体如下:
-
服务名称(Operation name)
-
服务的开始时间和结束时间
Baggage vs Span Tags
-
Baggage在全局范围内,(伴随业务系统的调用)跨进程传输数据。Span的tag不会进行传输,因为他们不会被子级的span继承。
-
span的tag可以用来记录业务相关的数据,并存储于追踪系统中。实现OpenTracing时,可以选择是否存储Baggage中的非业务数据,OpenTracing标准不强制要求实现此特性。
-
K/V形式的Tags
保存用户自定义标签,主要用于链路追踪结果的查询过滤。Span 中的 tag 仅自己可见,不会随着 SpanContext 传递给后续 Span。
-
K/V形式的Logs
与 tags 不同的是,logs 还会记录写入 logs 的时间,因此 logs 主要用于记录某些事件发生的时间。
-
SpanContext
SpanContext携带着一些用于跨服务通信的(跨进程)数据,主要包含:
- 足够在系统中标识该span的信息,比如:
span_id,trace_id。 - Baggage Items,为整条追踪链保存跨服务(跨进程)的K/V格式的用户自定义数据。"Baggage"会随着trace一同传播,他因此得名。
- 足够在系统中标识该span的信息,比如:
-
References:该span对一个或多个span的引用(通过引用SpanContext),有
ChildOf和FollowsFrom两种
Opentracing 提供了 Inject/Extract 用于在请求中注入 SpanContext 或者从请求中提取出 SpanContext。
客户端通过 Inject 将 SpanContext 注入到载体中,随着请求一起发送到服务端。
服务端则通过 Extract 将 SpanContext 提取出来,进行后续处理。