霸王餐API监控告警:Prometheus自定义指标+Grafana模板变量技巧

霸王餐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个变量实现“秒级下钻”

  1. $env:数据源变量,支持prod/gray
  2. $api:Query=label_values(api_requests_total{app="bwc-api"},api)
  3. $status:Query=label_values(api_requests_total{api="$api"},status)
  4. $instance:Query=label_values(api_requests_total{api="$api",env="$env"},instance)
  5. $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方法一键导入

信号指标面板链接变量
Raterate(api_requests_total[1m])$api
Errorrate(api_requests_total{status=~"5.."}[1m])$api
Durationhistogram_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%。


踩坑记录

  1. Micrometer默认无histogram:必须@Timed(histogram=true),否则histogram_quantile返回空。
  2. 高基数exception标签:曾把堆栈填进tag,导致TSDB内存暴涨,改为exception=RootCause.simpleName()后基数从10万降到80。
  3. PodMonitor命名空间:必须与Pod同ns,否则Prometheus Operator无法匹配。

线上效果

  • 自定义指标总量:4200万/天,存储占用90GB(30天)。
  • 告警平均触发时间:40秒,误报率0.3%。
  • 大促峰值500%流量,面板秒级刷新,CPU占用<2%。
  • 通过模板变量,5分钟定位到“某台Pod因Netty堆外内存不足导致499”。

本文著作权归吃喝不愁app开发者团队,转载请注明出处!

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值