From a388f7d4670d7ae9a3682cabe1da08a0958eaff5 Mon Sep 17 00:00:00 2001 From: dunwu Date: Fri, 14 Apr 2023 18:26:33 +0800 Subject: [PATCH] =?UTF-8?q?docs:=20=E6=9B=B4=E6=96=B0=E6=96=87=E6=A1=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...76\350\267\257\350\277\275\350\270\252.md" | 24 ++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-) diff --git "a/source/_posts/04.DevOps/03.\347\233\221\346\216\247/02.\351\223\276\350\267\257\350\277\275\350\270\252.md" "b/source/_posts/04.DevOps/03.\347\233\221\346\216\247/02.\351\223\276\350\267\257\350\277\275\350\270\252.md" index aeea1c53dc..ae65e3b833 100644 --- "a/source/_posts/04.DevOps/03.\347\233\221\346\216\247/02.\351\223\276\350\267\257\350\277\275\350\270\252.md" +++ "b/source/_posts/04.DevOps/03.\347\233\221\346\216\247/02.\351\223\276\350\267\257\350\277\275\350\270\252.md" @@ -44,7 +44,7 @@ Dapper 提出了一些很重要的核心概念:Trace、Span、Annonation 等 _Trace 和 Spans(图片来源于[Dapper 论文](https://static.googleusercontent.com/media/research.google.com/zh-CN//archive/papers/dapper-2010-1.pdf))_ - **Trace (追踪)** - 代表一次完整的请求。一次完整的请求是指,从客户端发起请求,记录请求流转的每一个服务,直到客户端收到响应为止。整个过程中,当请求分发到第一层级的服务时,就会生成一个全局唯一的 **Trace ID**,并且会随着请求分发到每一层级。因此,通过 **Trace ID** 就可以把一次用户请求在系统中调用的链路串联起来。 -- **Span (跨度)** - 请求链路中的每个环节被成为跨度。由于每次 Trace 都可能会调用数量不定、坐标不定的多个服务,为了能够记录具体调用了哪些服务,以及调用的顺序、开始时点、执行时长等信息,每次开始调用服务前都要先埋入一个调用记录,这个记录称为一个 Span。 +- **Span (跨度)** - 工作的基本单元。由于每次 Trace 都可能会调用数量不定、坐标不定的多个服务,为了能够记录具体调用了哪些服务,以及调用的顺序、开始时点、执行时长等信息,每次开始调用服务前都要先埋入一个调用记录,这个记录称为一个 Span。 - Span 的数据结构应该足够简单,以便于能放在日志或者网络协议的报文头里;也应该足够完备,起码应含有时间戳、起止时间、Trace 的 ID、当前 Span 的 ID、父 Span 的 ID 等能够满足追踪需要的信息。 - Trace 实际上都是由若干个有顺序、有层级关系的 Span 所组成一颗 Trace Tree (追踪树)。 - **Annotation**:用于业务自定义埋点数据,例如:一次请求的用户 ID,某一个支付订单的订单 ID 等。 @@ -58,8 +58,30 @@ _Trace 和 Spans(图片来源于[Dapper 论文](https://static.googleuserconte - **SS(Server Send)阶段** - 服务端返回请求时埋点,这时会将上下文数据传递到异步上传队列中。 - **CR(Client Recieve)阶段** - 客户端接收返回结果时埋点,这时会将上下文数据传递到异步上传队列中。 +下图显示了 Span 和 Trace 在系统中的样子。 + ![img](https://raw.githubusercontent.com/dunwu/images/dev/snap/20220420092134.png) +(图片来源于 [spring-cloud-sleuth 文档](https://docs.spring.io/spring-cloud-sleuth/docs/current/reference/html/getting-started.html#getting-started-terminology)) + +> 图片说明: +> +> _每种颜色表示一个跨度(有七个跨度 - 从 A 到 G)_。 +> +> ``` +> Trace Id = X +> Span Id = D +> Client Sent +> ``` +> +> 类似上面的注释,表示当前跨度的跟踪 ID 设置为 X,跨度 ID 设置为 D。此外,从 RPC 的角度来看,发生了客户端发送事件。 + +下图显示了 span 的父子关系: + +![](https://raw.githubusercontent.com/dunwu/images/dev/snap/20230414173703.png) + +(图片来源于 [spring-cloud-sleuth 文档](https://docs.spring.io/spring-cloud-sleuth/docs/current/reference/html/getting-started.html#getting-started-terminology)) + ## 链路追踪实现 一个完整的数据链路系统大致可以分为三个相对独立的模块: