opentelemetry-sdk 1.27 升级后,原来按 gen_ai.system 建的看板全部空白,采集端仍在正常上报,只是属性名变了。
一开始怀疑是「采集端做了属性白名单,新字段被过滤」,查了一圈,方向不对。
真正麻烦的地方在于,几个原因的现象几乎一样。语义约定升级,属性改成 gen_ai.provider.name。也可能是自定义 span 用的旧常量被删掉。
少数情况下是看板查询里写死了旧字段名。
上来先看一条 span 的实际属性
curl -s 'localhost:16686/api/traces?service=llm&limit=1' | jq '.data[0].spans[0].tags'
再往下查 SDK 里保留的常量名
python -c "from opentelemetry.semconv._incubating.attributes import gen_ai_attributes as g;print([a for a in dir(g) if 'SYSTEM' in a or 'PROVIDER' in a])"
接着看板查询兼容新旧字段
python -c "print('gen_ai.provider.name or gen_ai.system')"
上报一条测试 span 验证
python otel_smoke.py --service llm-test
这次没动代码,只在配置和运行环境上找原因。
隔了一天再看,现象没变,说明不是偶发。
改完先别撤,确认这几项。面板能重新出数,新旧属性在过渡期都有值,单个 trace 里能看到模型名与 token 数。
这里还有个坑。语义约定还在演进,采集端不要做字段白名单,否则升级一次就丢一批指标。报错文案容易误导,真正的原因往往在相邻那一层的日志里。
