面板上 5xx 曲线一直是 0,翻 trace 发现 http.status_code 存的是字符串 502,查询条件写的是数值 502,同一条记录用肉眼能搜到但面板统计不到。

把日志和配置对完,能解释这个现象的基本就这几处。属性被写成字符串,索引按数值建;语义约定版本升级后类型要求变了;网关改写响应时把状态码转成了文本;查询语句里的类型没做转换。

先抽查几条 span 看属性类型

python inspect_span.py --trace trace.jsonl --attr http.status_code --limit 5

随后在埋点处强制转成整数

span.set_attribute('http.status_code', int(resp.status_code))

接着在 Collector 里加类型转换处理器

processors: [attributes: {actions: [{key: http.status_code, action: convert, converted_type: int}]}]

等前面都确认过,再用面板查询复验 5xx 计数

curl -s 'http://tempo:3200/api/search?q=%7Bstatus%3Derror%7D' | jq '.traces | length'

我习惯把每一步的执行时间和结果记在一边,后面复盘省事。

改完先别撤,确认这几项。5xx 曲线能正常显示,查询数值 502 能命中对应记录,面板统计与日志计数一致。

容易忽略的是,属性类型不一致在 trace 里最难发现,因为看起来数据都在,建索引和查询却按不同类型处理。同一份配置在测试环境跑通,不代表线上没事,两边的默认值经常不一样。

作者 9823189