代码里 Counter orders_created_total 注册成功,跑了一天 /metrics 里能搜到名字,值一直是 0,业务日志显示当天创建了 3 万多单。乍看像缓存或者权限的锅,追下去往往不是。
curl -s localhost:8080/actuator/prometheus | grep orders_created for i in $(seq 1 5); do curl -s -XPOST localhost:8080/api/order >/dev/null; done curl -s localhost:8080/actuator/prometheus | grep orders_created
追下去是这么回事:Counter 在 bean 初始化时创建,但业务代码用的是另一个 new 出来的实例,自增打在没注册的对象上。指标名前缀在注册时被加工成 app_orders_created_total,查询里还按原名搜。埋点方法在异步分支里没走到,只在同步路径加了一次。
碰到「自定义指标为 0」这类问题,我习惯先把当前配置原样备份一份,改坏了立刻换回来,不用现场推。接口问题先分清是没发出去、发出去了没收到,还是收到了处理失败。
偶发问题先统计频率,一小时几次和一天一次,查法完全不同。
具体做法是,确认自增用的实例就是注册的那个 别在方法里 new;搜 /metrics 时用后缀匹配 别写死前缀;把计数加到唯一出口 避免分支漏加;用一个手动触发的接口验证数值是否变化。
验收就看一点,连续下单 5 次后计数增加 5,/metrics 里能按后缀搜到对应名字。
