Span 状态是什么
Span 状态描述这个操作是成功还是失败,取值有未设置、成功、错误三种。它决定链路检索里「只看失败链路」能不能用:异常被捕获后如果只记录日志而不设置状态,链路在系统里仍然显示为正常,失败样本会整体遗漏。另一个容易踩的点是口径——业务失败(如参数校验不通过)与系统异常是否都算错误,需要团队统一定义。
基本信息
| 适用平台 | OpenTelemetry 各语言 SDK |
|---|---|
| 取值 | Unset(默认)、Ok、Error |
| 设置方式 | set_status 与异常记录接口配合使用 |
| 配套属性 | 错误类型与错误信息建议一并记录 |
典型使用场景
- 失败链路筛选:按错误状态检索出问题请求做批量分析
- 错误率统计:以链路状态为口径计算失败比例
- 调用链定位:在瀑布图里快速找到失败的环节
- 依赖质量评估:按被调用服务统计错误状态占比
- 回归验证:新版本上线后对比错误链路数量变化
标记示例
标记示例
from opentelemetry.trace import Status, StatusCode
with tracer.start_as_current_span("charge") as span:
try:
do_charge() # 可能抛出超时等异常
except TimeoutError as e:
span.set_status(Status(StatusCode.ERROR, "upstream timeout"))
span.record_exception(e) # 同时记录异常事件与堆栈
raise # 是否继续抛出按业务需要决定
else:
span.set_attribute("charge.result", "ok")
# 只捕获而不设置状态时,链路仍显示正常,失败样本被漏掉状态取值与含义
| 取值 | 含义 | 使用建议 |
|---|---|---|
| Unset | 默认值,未明确成功或失败 | 自动埋点未判定时的常见状态 |
| Ok | 显式成功 | 一般由自动埋点或框架中间件设置 |
| Error | 失败 | 需同时记录错误类型与描述 |
| (业务字段) | 自定义结果属性 | 业务失败是否算错误要事先约定 |
错误状态与错误事件要成对使用:状态用于筛选与统计,事件保留堆栈等细节,只有状态没有事件时排障仍然缺信息。
HTTP 状态码与业务结果的映射要提前定义:把参数校验失败(如 4xx)一律标为错误,会让错误率失真并抬高噪声。