在 SkyWalking 的分布式追踪系统中,Span 和 Segment 是核心概念,分别代表追踪的最小单元和更大的逻辑块。它们的关系如下:
1. 什么是 Span?
定义
Span 是分布式追踪的最小单元,表示一次具体的操作或请求处理。每个 Span 包含关于操作的详细信息,比如执行的时间、状态、所属服务、操作类型等。
特征
- 标识一个操作:如一次 HTTP 请求、数据库查询或方法调用。
- 嵌套关系:Span 可以嵌套,父 Span 表示调用者,子 Span 表示被调用者。
- 时间信息:记录操作的开始时间和结束时间,计算耗时。
- 错误信息:如果操作失败,Span 会记录错误的具体信息。
关键字段
一个 Span 通常包含以下字段:
- Span ID:Span 的唯一标识。
- Operation Name:操作的名称,如 HTTP 方法名或 SQL 查询。
- Parent Span ID:指向父 Span 的 ID,用于构建调用关系。
- Start Time 和 End Time:记录操作的开始和结束时间。
- Tags:额外的元信息,例如 URL、SQL 语句等。
- Logs:记录关键事件,比如错误信息、阶段日志。
示例
一个 HTTP 服务的请求可以生成以下 Spans:
- 入口 Span:接收请求。
- 调用 Span:调用数据库。
- 出口 Span:调用下游服务。
2. 什么是 Segment?
定义
Segment 是追踪的逻辑单元,表示一个服务实例中对一次请求的完整处理过程。它由多个 Span 组成,通常是同一线程或服务中的操作集合。
特征
- 属于单个服务实例:Segment 描述一个服务实例内的完整调用链。
- 聚合多个 Span:Segment 包含服务内所有相关的 Span,比如入口、方法调用、出口等。
- 跨线程支持:一个 Segment 可以跨多个线程(如异步调用)。
- 全局唯一性:每个 Segment 在全局中唯一标识,关联到一个分布式追踪中的单次请求。
关键字段
一个 Segment 通常包含:
- Segment ID:Segment 的唯一标识。
- Service Name:所属服务的名称。
- Service Instance ID:所属服务实例的标识。
- Spans:该 Segment 包含的所有 Span。
- Trace ID:关联的分布式追踪唯一标识。
示例
当一个 HTTP 请求进入服务 A 时,可能产生以下 Segment:
- 入口 Segment:记录请求的接收和处理过程。
- 调用 Segment:包含服务 A 调用下游服务或数据库的 Spans。
3. Span 和 Segment 的关系
- Span 是 Segment 的组成部分:一个 Segment 包含多个 Span,每个 Span 表示一次具体的操作。
- Segment 是 Trace 的组成部分:一个 Trace 由多个 Segment 组成,每个 Segment 代表一个服务实例对请求的处理。
- 上下游关系:在分布式调用中,服务 A 的出口 Span 和服务 B 的入口 Span 通过 Trace ID 和上下文信息关联。
分布式追踪的层次结构
- Trace(追踪):全局唯一,表示一次完整的请求链路。
- Segment(片段):每个服务实例的处理片段。
- Span(操作单元):每个操作或方法调用。
4. 直观比喻
- Span:是一个剧本中的一个场景(最小的操作单元)。
- Segment:是剧本中某个角色的完整表演片段(一个服务实例内的操作集合)。
- Trace:是整个剧本,包含所有角色的表演片段(多个服务实例的组合)。
5. 举例说明
一个用户请求经过多个服务的完整流程:
- Trace ID:
abc123
(追踪整个流程)。- 服务 A:
- Segment A:
- Span A1:接收请求(入口)。
- Span A2:调用数据库。
- Span A3:调用服务 B(出口)。
- Segment A:
- 服务 B:
- Segment B:
- Span B1:接收服务 A 的请求(入口)。
- Span B2:调用服务 C(出口)。
- Segment B:
- 服务 C:
- Segment C:
- Span C1:接收服务 B 的请求(入口)。
- Segment C:
- 服务 A:
6. 总结
- Span:记录单个操作,提供细粒度的性能和错误分析。
- Segment:聚合多个 Span,表示一个服务实例中的完整请求处理。
- Trace:通过 Span 和 Segment 组合,构建完整的分布式追踪链路。
SkyWalking 通过这些概念,帮助开发者深入分析分布式系统中的性能瓶颈和错误原因。