报错是这么冒出来的。埋点时把 gen_ai.request.model 写成业务别名 chat-default,实际可能路由到 gpt-4o 或 gpt-4o-mini,成本面板按这个属性聚合,单价差十几倍却并成一条线。

中间走过弯路,把「面板按字符串前缀匹配,别名被归到同一组」当成主因,改完现象没变。

原因不止一个,得分开看。只记录了别名,没有记录回包里的真实模型。也可能是网关改写 model 字段后没有更新 span 属性。

还有一种情况,响应头里的模型版本没有被采集。

动手时先核对 span 属性与响应体里的模型

python -c "import json;print(json.load(open('span.json'))['attributes'])"

接着用响应体里的模型覆盖别名

python otel_patch.py --attr gen_ai.response.model --from response

别名与真实模型两个属性都保留

python otel_patch.py --keep-alias true

等前面都确认过,再重建面板按真实模型聚合

python dashboard.py --group-by gen_ai.response.model

恢复的判定其实很直接。面板能按真实模型拆出两条曲线,成本合计与账单一致,别名仍可用于筛选。

容易忽略的是,别名会随时间指向不同模型,成本归因必须落在实际回包的模型名上。这类问题最好一次改到位,反复小改反而容易把原因搅混。

作者 9823189