问题出现得很突然,日志倒是留得挺全。模型调用抛异常后,trace 里只有一段 error 文本,没有堆栈和异常类型,日志里也搜不到 record_exception,排查时只能靠猜是哪一层抛的。

刚开始盯着「SDK 版本里属性名从 exception.message 改了」,折腾了半个多小时,排掉了。

原因不止一个,得分开看。捕获异常后只设置了 span 状态,没有记录事件。也可能是exception 事件被采样策略过滤掉。

另外,异步任务里 span 提前结束,事件挂到了已关闭的 span 上。

先打印 span 的事件列表

python dump_span.py --trace-id $TID --show-events

接着在 except 里补记录异常

python -c "from opentelemetry import trace;trace.get_current_span().record_exception(Exception('x'))"

然后确认采样策略没有过滤错误链路

python otel_cfg.py --always-sample-errors

复现一次并核对堆栈是否完整

python raise_case.py --trace --expect error

那几天正好在做别的变更,先把时间线对齐才敢动手。

别只看报错消失,验证要多做一步。trace 里能看到 exception 事件、类型和完整堆栈,按 trace_id 能直接定位到出错代码行。

补一句。只改 span 状态不会带上堆栈,异常信息要用事件记录,这个区别很关键。监控比日志更早给出信号,事后回看经常能提前半小时发现异常。

作者 9823189