把 opentelemetry-instrumentation-openai 从 0.30 升到 0.44,面板里 gen_ai.usage.input_tokens 全部消失,只剩 llm.token_count.prompt 这种旧属性名。

一开始怀疑是「SDK 与 Collector 版本不匹配,属性被重写」,查了一圈,方向不对。

真正麻烦的地方在于,几个原因的现象几乎一样。语义约定从 llm.* 迁移到了 gen_ai.*。也可能是Collector 的属性白名单还是旧名单,新属性被过滤。

还有一种情况,自定义 span 覆盖了自动注入的属性。

上来先打印一条 span 的全部属性

python -c "print('dump span.attributes keys')"

升级 Collector 并放开属性过滤

python -c "print('otelcol --config new.yaml')"

然后把面板查询改成 gen_ai 前缀

python -c "print('gen_ai.usage.input_tokens')"

回归一次请求确认两套属性都在

curl -s http://127.0.0.1:4318/v1/traces -H 'Content-Type: application/json' -d @span.json

同一份数据我导出了两份,一份留底,一份拿来试。

这类问题以前遇到过,但这次的触发条件和上次不一样。

别只看报错消失,验证要多做一步。面板恢复显示 gen_ai.usage.input_tokens,同一条 trace 里 token 数与服务端日志一致,旧面板查询同步改完没有空图。

语义约定改名是破坏性变更,升级插桩库和 Collector 要一起做,只升一边就会出现属性对不上。这类问题最好一次改到位,反复小改反而容易把原因搅混。

作者 9823189