最可靠轻量的自定义业务异常qps统计方式是用counter记录异常次数并用rate()计算每秒速率;需初始化带type和layer标签的app_exceptions_total计数器,在最外层catch块精准埋点,通过rate(app_exceptions_total[1m])查速率,并借助prometheus adapter接入hpa实现自动扩容。

直接用 Counter 类型指标记录异常次数,再通过 rate() 函数计算每秒速率,就是最可靠、最轻量的自定义业务异常 QPS 统计方式。
定义带标签的异常计数器
在应用启动时初始化一个 Counter,命名清晰、带业务维度标签:
- 指标名用
app_exceptions_total,符合 Prometheus 命名规范(字母、数字、下划线) - 必须加标签区分异常类型和位置,例如
{type="order_timeout", layer="service"}或{type="redis_unavailable", layer="client"} - Java 中推荐用 Micrometer(Spring Boot 场景)或
prometheus_client(原生场景)创建:
Counter.builder("app.exceptions")<br>
.tag("type", "payment_failed")<br>
.tag("layer", "api")<br>
.description("Total business exceptions thrown")<br>
.register(meterRegistry);
在 catch 块中精准埋点
不是每个 try-catch 都要计数,关键是“最终失败”的业务异常:
- 只在最外层业务 catch 块里调用
counter.increment(),避免重试过程中的中间异常重复计数 - 对包装异常(如
RuntimeException包裹的业务异常),提取原始类型做标签,保证type标签语义准确 - 不要在日志打印后才计数——异常可能被吞掉或未触发日志;计数动作应与异常判定同步发生
用 rate() 计算真实 QPS
Prometheus 本身不存“QPS”,而是靠函数实时算出来。查异常抛出速率,用:
-
rate(app_exceptions_total[1m]):过去 1 分钟平均每秒抛出多少次 - 若需更灵敏响应(如自动扩容),可缩至
[30s],但需配合stabilizationWindowSeconds: 300防抖 - 聚合到服务级:
sum by (job) (rate(app_exceptions_total[1m])) - 查高频异常类型:
topk(5, rate(app_exceptions_total[1m]))
打通 HPA 实现自动扩容
原生 Kubernetes HPA 不认你的 app_exceptions_total,得走 Prometheus Adapter:
- Adapter 配置 rule,把
rate(app_exceptions_total[2m])转成 Custom Metrics API 中的exceptions_per_second指标 - HPA 中引用该指标,设
averageValue: "0.3"表示单 Pod 平均每秒超 0.3 次异常就扩容 - 务必设
minReplicas: 2,防止仅剩 1 副本时异常集中导致雪崩
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











