Elastic 參數
Trace ID, Transaction, 和 Span 的关系
- Trace ID:
- 定义:Trace ID 是一个唯一标识符,用于关联同一请求在不同服务中的所有 transaction 和 span。
-
用途:通过 trace ID,可以追踪一个请求在整个系统中的流转过程,跨多个服务和操作。
-
Transaction:
- 定义:Transaction 代表一个完整的请求或任务的执行过程,包括所有相关的操作和步骤。
- 用途:记录整个请求的开始和结束时间,以及请求过程中发生的所有操作。
-
关系:一个 trace ID 可以包含多个 transaction,每个 transaction 代表一个服务中的请求处理。
-
Span:
- 定义:Span 代表 transaction 中的一个具体操作或步骤,例如数据库查询或外部 API 调用。
- 用途:记录每个具体操作的开始和结束时间,以及操作的详细信息。
- 关系:一个 transaction 可以包含多个 span,形成一个完整的链路追踪图。
生成方式
- 生成 Trace ID:
-
当一个请求进入系统时,生成一个唯一的 trace ID,并将其传递给所有后续的服务调用。
-
传递 Trace ID:
-
在每个服务之间传递 trace ID,通常通过 HTTP 请求头(例如
traceparent)来实现。 -
记录 Transaction 和 Span:
- 在每个服务中记录 trace ID 以及相关的 transaction 和 span 信息。
-
Transaction 记录整个请求的处理过程,Span 记录具体的操作步骤。
-
查询 Trace ID:
- 在 Kibana 中使用 trace ID 查询相关的 transaction 和 span,以查看整个请求的链路追踪。 当请求由线程处理时,trace ID、transaction 和 span 的使用方式基本保持不变,但需要注意以下几点:
舉例
- Trace ID:
-
生成和传递:Trace ID 仍然在请求进入系统时生成,并在各个线程之间传递。确保每个线程处理的操作都包含相同的 Trace ID,以便关联同一请求的所有操作。
-
Transaction:
- 记录:每个线程处理的请求部分会记录为一个 transaction。即使请求在不同线程中处理,所有 transaction 仍然会共享相同的 Trace ID。
-
线程安全:确保 transaction 的记录是线程安全的,避免多个线程同时写入相同的数据。
-
Span:
- 记录:每个线程中的具体操作记录为 span。span 记录的方式与单线程环境相同,但需要确保每个 span 关联到正确的 transaction。
- 父子关系:在多线程环境中,span 的父子关系可能会更加复杂,需要确保每个 span 正确地关联到其父 transaction 或父 span。
示例
假设一个请求进入系统后,由多个线程处理不同的操作:
- 生成 Trace ID:请求进入系统时生成一个 Trace ID,例如
trace-id-12345。 - 传递 Trace ID:Trace ID 通过 HTTP 请求头或其他方式传递给各个线程。
- 记录 Transaction:每个线程处理的请求部分记录为一个 transaction,例如:
- 线程 A 处理的部分记录为
transaction-A,包含trace-id-12345。 - 线程 B 处理的部分记录为
transaction-B,包含trace-id-12345。 - 记录 Span:每个线程中的具体操作记录为 span,例如:
- 线程 A 中的操作记录为
span-A1和span-A2,关联到transaction-A。 - 线程 B 中的操作记录为
span-B1和span-B2,关联到transaction-B。