事情本身不复杂,线索都在日志里。给 span 写属性时把 token 数转成了字符串,Grafana 里 sum 出来全是 0,token 曲线是一条贴着底部的直线。
第一反应是「查询端没有做类型转换」,验证下来不成立。
原因不止一个,得分开看。属性类型是 string 无法直接求和。还有一种是不同 SDK 版本对属性类型推断不同。
另外,部分 span 还在用旧属性名。
上来先看导出的属性是什么类型
jq '.resourceSpans[].scopeSpans[].spans[].attributes[] | select(.key=="llm.usage.total_tokens")' out.json
然后改成整数写入并统一属性名
python patch_span.py --attr llm.usage.total_tokens --type int
随后重建面板查询并加类型转换
python dash.py --expr 'sum(int())' --panel tokens
等前面都确认过,再对照账单核对总量
python cost_stat.py --source otel --window 24h
命令输出我都留了记录,免得改完记不清原来的值。
改之前先确认了最近有没有人动过配置,避免白查一遍。
恢复的判定其实很直接。面板能按模型聚合出 token 总量,与账单偏差小于 3%,曲线不再是直线。
这里还有个坑。属性名统一比属性值正确更难,两类问题要一起查。同一份配置在测试环境跑通,不代表线上没事,两边的默认值经常不一样。
