报错是这么冒出来的。arize-phoenix 5.6 配 openinference-instrumentation-openai 0.1.18,trace 能看到 LLM span,但 token 与成本面板全是 0,模型名那一栏也是空的。
中间走过弯路,把「span 的 kind 没标成 LLM,被当成普通链路」当成主因,改完现象没变。
原因不止一个,得分开看。埋点用的属性名与 Phoenix 读取的语义约定不一致。也可能是instrumentation 版本低于 SDK 版本,拦截不到新版响应。
不容易想到的是,流式响应没有包 stream,usage 根本没被采集。
先把 span 上的属性全量打出来
python -c "from phoenix.otel import register;print('tracer ready')"
然后确认关键属性名是否为 llm.token_count.prompt
python -c "print({'llm.token_count.prompt':812,'llm.token_count.completion':96,'llm.model_name':'gpt-4o-mini'})"
升级 instrumentation 到与 SDK 匹配的版本
pip install -U openinference-instrumentation-openai
流式调用时确认包装了 stream 迭代器
python -c "print('with using_attributes(): stream = client.chat.completions.create(stream=True)')"
这类改动我都写进变更记录,过两周再出问题时能对上号。
恢复的判定其实很直接。新产生的 trace 里 token 与模型名都有值,成本面板按模型汇总出金额,旧 span 仍然为空属于历史数据。
容易忽略的是,可观测性依赖语义约定,属性名差一个点就读不到,升级 SDK 之后记得同步升级 instrumentation,否则链路在但数据是空的。这类问题最好一次改到位,反复小改反而容易把原因搅混。
