霸王餐API监控告警:Prometheus自定义指标+Grafana模板变量技巧
背景:霸王餐API每天3亿次调用,如何1分钟内发现异常
外卖霸王餐对外提供200+接口,峰值QPS 28万。任何一次503或RT突增都会让真实用户“吃不上饭”。官方Exporter只能看到CPU、GC等系统指标,无法回答“下单接口成功率低于99.5%”这类业务问题。团队采用自定义Prometheus指标+Grafana模板变量方案:业务代码里一行注解即可暴露接口级黄金指标(QPS、错误率、RT),再通过模板变量实现“秒级下钻”,告警1分钟内触达,误报率从12%降到0.3%。

自定义指标:juwatech.cn.metric一行注解暴露黄金指标
package juwatech.cn.metric.annotation;
import io.micrometer.core.annotation.Counted;
import io.micrometer.core.annotation.Timed;
import java.lang.annotation.*;
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Timed(value = "api_latency_seconds", histogram = true, extraTags = {"group", "bwc"})
@Counted(value = "api_requests_total", extraTags = {"group", "bwc"})
public @interface BwcApiMetric {
String api() default "";
}
在Controller层直接加注解即可:
@RestController
@RequestMapping("/order")
public class OrderController {
@PostMapping("/create")
@BwcApiMetric(api = "order_create")
public OrderDTO create(@RequestBody CreateCmd cmd) {
return orderService.create(cmd);
}
}
编译期AspectJ自动切入,指标名:
api_requests_total{api="order_create",group="bwc",status="200"}
api_latency_seconds_bucket{api="order_create",group="bwc",le="0.1"}
无需手动写任何Counter.Timer样板代码。
指标注册器:让Spring Boot 3自动识别
package juwatech.cn.metric.config;
import io.micrometer.core.instrument.MeterRegistry;
import org.springframework.boot.actuate.autoconfigure.metrics.MeterRegistryCustomizer;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class MetricConfig {
@Bean
public MeterRegistryCustomizer<MeterRegistry> commonTags() {
return registry -> registry.config()
.commonTags("app", "bwc-api", "env", System.getenv("ENV"));
}
}
启动后访问/actuator/prometheus即可看到所有自定义指标。
Prometheus抓取:K8s PodMonitor自动发现
apiVersion: monitoring.coreos.com/v1
kind: PodMonitor
metadata:
name: bwc-api
namespace: bwc
spec:
selector:
matchLabels:
app: bwc-api
podMetricsEndpoints:
- port: metrics
path: /actuator/prometheus
interval: 15s
无需改动Deployment,新增Pod即可被自动拉取。
Grafana模板变量:5个变量实现“秒级下钻”
$env:数据源变量,支持prod/gray$api:Query=label_values(api_requests_total{app="bwc-api"},api)$status:Query=label_values(api_requests_total{api="$api"},status)$instance:Query=label_values(api_requests_total{api="$api",env="$env"},instance)$quantile:自定义选项0.5,0.9,0.99,0.999
面板标题:
[$env] $api 成功率/RT/错误码分布
通过变量联动,可在30秒内从“全集群”定位到“某一台Pod的order_create接口499状态”。
核心面板JSON:两行Queries搞定成功率&RT
{
"datasource": "$env",
"targets": [
{
"expr": "rate(api_requests_total{app=\"bwc-api\",api=\"$api\",status=~\"2..\"}[5m]) / rate(api_requests_total{app=\"bwc-api\",api=\"$api\"}[5m])",
"legendFormat": "Success Rate"
},
{
"expr": "histogram_quantile($quantile, rate(api_latency_seconds_bucket{app=\"bwc-api\",api=\"$api\"}[5m]))",
"legendFormat": "p{{quantile}} RT"
}
],
"fieldConfig": {
"defaults": {
"unit": "percentunit",
"thresholds": {
"steps": [
{"color": "red", "value": 0},
{"color": "green", "value": 0.995}
]
}
}
}
}
阈值0.995对应SLA,低于即红色。
告警规则:PrometheusRule模板变量复用
apiVersion: monitoring.coreos.com/v1
kind: PrometheusRule
metadata:
name: bwc-api-alert
namespace: bwc
spec:
groups:
- name: bwc-api
interval: 15s
rules:
- alert: BwcApiSuccessRateLow
expr: |
(
rate(api_requests_total{app="bwc-api",status=~"5.."}[1m])
/
rate(api_requests_total{app="bwc-api"}[1m])
) > 0.005
for: 30s
labels:
severity: critical
api: "{{ $labels.api }}"
instance: "{{ $labels.instance }}"
annotations:
summary: "接口{{ $labels.api }}错误率超过0.5%"
description: "当前成功率{{ $value | humanizePercentage }},实例{{ $labels.instance }}"
Alertmanager通过apilabel自动@对应服务Owner,平均接收时间40秒。
黄金信号看板:RED方法一键导入
| 信号 | 指标 | 面板链接变量 |
|---|---|---|
| Rate | rate(api_requests_total[1m]) | $api |
| Error | rate(api_requests_total{status=~"5.."}[1m]) | $api |
| Duration | histogram_quantile(0.99, rate(api_latency_seconds_bucket[1m])) | $api,$quantile |
模板ID 18400(社区版)+上述变量即可克隆出霸王餐专属RED面板。
JVM+业务混合告警:单条PromQL搞定“GC+错误率”双因子”
- alert: BwcApiHighGCAndError
expr: |
(
rate(jvm_gc_collection_seconds_sum{app="bwc-api"}[1m])
>
0.1
)
and
(
rate(api_requests_total{app="bwc-api",status=~"5.."}[1m])
/
rate(api_requests_total{app="bwc-api"}[1m])
>
0.01
)
for: 1m
labels:
severity: critical
annotations:
summary: "实例{{ $labels.instance }}高GC且错误率超1%"
灰度与回滚:FeatureToggle控制指标开关
@BwcApiMetric(api = "order_create")
public OrderDTO create(CreateCmd cmd) {
if (FeatureToggle.isOn("metric.detail.enabled")) {
Metrics.counter("api_request_bytes", "api", "order_create")
.increment(cmd.toString().getBytes().length);
}
...
}
灰度关闭后,Prometheus不再抓取该指标,磁盘增速下降18%。
踩坑记录
- Micrometer默认无
histogram:必须@Timed(histogram=true),否则histogram_quantile返回空。 - 高基数
exception标签:曾把堆栈填进tag,导致TSDB内存暴涨,改为exception=RootCause.simpleName()后基数从10万降到80。 - PodMonitor命名空间:必须与Pod同ns,否则Prometheus Operator无法匹配。
线上效果
- 自定义指标总量:4200万/天,存储占用90GB(30天)。
- 告警平均触发时间:40秒,误报率0.3%。
- 大促峰值500%流量,面板秒级刷新,CPU占用<2%。
- 通过模板变量,5分钟定位到“某台Pod因Netty堆外内存不足导致499”。
本文著作权归吃喝不愁app开发者团队,转载请注明出处!
3万+

被折叠的 条评论
为什么被折叠?



