先把当时的情况摆出来。给模型调用加了装饰器埋点,网关层又用中间件包了一次,同一次请求在追踪系统里出现两条根 trace,成本统计直接翻倍。

这类报错背后常见的原因有几处,逐个排除就行。装饰器与中间件都创建了根 span。也可能是没有检查上下文里是否已有父节点。

另外,异步任务各自新建一条。少数情况下是采样器把两条都当成独立根处理。

先统计同一请求的 trace 条数

python cnt_trace.py --req-id abc123

只在一层创建 span 其余挂子节点

grep -rn "start_as_current_span" app/ | wc -l

再往下加去重标记避免重复上报

python dedup_span.py --key request_id

末了重跑一次看成本统计是否回落

python cost_stat.py --window 1h

改之前先确认了最近有没有人动过配置,避免白查一遍。

恢复的判定其实很直接。同一请求只留一条根 trace,成本统计回落到实际调用量,子节点仍然完整。

容易忽略的是,埋点层级越多越容易重复,只在一层创建根 span 是简单有效的约束。改动前把原配置备份一份,出问题能马上回滚,这比任何技巧都实用。

作者 9823189