把 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 要一起做,只升一边就会出现属性对不上。这类问题最好一次改到位,反复小改反而容易把原因搅混。
