两个服务上报同名指标 request_duration,A 服务单位是毫秒,P99 显示 120;B 服务单位是秒,P99 显示 0.12。合成一条曲线后抖动得像锯齿,告警阈值按 500 配,B 服务永远不触发。第一次遇到会往复杂处想,其实漏掉的多是个小前提。
git grep -n 'request_duration' -- '*.java' curl -s localhost:8080/actuator/prometheus | grep request_duration
指标名一样但单位没写进名字也没写进 help,聚合时直接相加。上报 SDK 默认按秒,业务代码手工传了毫秒值。跨服务对比时数量级差 1000,看图的人以为 B 服务快 1000 倍。这一点先确认清楚,后面就不用反复试。
「指标单位混用」相关的日志我一般连着看前后五分钟,单看一条报错经常判断不出是哪一步失败。临时改动用注释写上日期和原因,过两周自己都记不清为什么这么写。
动手前把原文件复制一份带时间戳,出问题立刻换回去,比现场分析快得多。
具体做法是,把单位写进指标名 _seconds 或 _milliseconds;统一按秒上报 在采集侧做换算;给指标加 unit 标签并在面板上显示;用两个服务各打一条请求 核对数值量级。
改完照着核一遍,两个服务的同名指标数值落在同一量级,合成曲线没有锯齿。
