主题
Span Lifecycle
标准状态
runningsuccessfailedcancelledtimeout
合法转移
running -> successrunning -> failedrunning -> cancelledrunning -> timeout
规则
startSpanMUST创建一个runningspan,并立刻固定traceId、spanId、rootSpanId和startTime- span 的第一个终态写入
MUST胜出,后续重复endMUST是幂等 no-op timeout是平台或 tracer 主动施加的终态,语义上不同于业务主动failed- 终态 span
MUST具备endTime与durationMs - 终态 span
SHOULD同时携带终态时刻的 metrics 快照
触发源
- runtime 用户代码
- 手动
end('success' | 'failed' | 'cancelled')
- 手动
- tracer 包装器
wrap/wrapChild/wrapDetached自动结束
- timeout 调度器
- 到期强制结束为
timeout
- 到期强制结束为
- runtime 销毁或异常清理
destroy(errorMessage?)导致保底终止
导出规则
- span 进入终态后
MUST最多导出一次稳定 completed event - span 生命周期中的
TraceEventMAY在运行中追加,也MAY在 exporter flush 时批量发出 - 导出失败时允许重试,但重试
MUST以traceId + spanId去重 - 读面投影
MUST NOT因重复 completed event 产生多个 span 版本 - span event 导出失败时,去重键
SHOULD至少包含traceId + spanId + eventId gen_ai.client.inference.operation.details等大 payload 事件MAY独立于 completed span 导出
约束
parentSpanId如果存在,MUST指向同一 trace 中的合法祖先或当前上下文父 spanspanIdMUST在 trace 内唯一rootSpanIdMUST在同一 trace 内保持稳定,不得在 span 生命周期中被重写