核心是通过网关暴露带status标签的指标,由prometheus拉取并用promql计算4xx/5xx错误率实现异常监控。需确认指标含status标签(如ingress_requests{status="500"}),配置prometheus抓取任务,用rate和sum计算占比,再接入alertmanager告警与grafana可视化。

核心是让网关暴露带状态码标签的指标,再用Prometheus定时拉取并计算比例,不需要额外埋点代码也能快速落地。
确保网关指标含status标签
多数现代网关(如Nginx Ingress、Spring Cloud Gateway、自研Go网关)默认或通过插件支持暴露带status标签的请求计数器。关键看指标名是否形如:
- ingress_requests{status="500", host="api.example.com"}(Nginx Ingress)
- http_server_requests_seconds_count{status="401", uri="/login"}(Spring Boot Actuator)
- nginx_http_requests_total{status="404"}(Nginx VTS模块)
若指标中没有status标签,需先启用对应导出功能,例如在Nginx中配置vts_export on,或在Spring Boot中引入Micrometer并开启WebMvc指标。
配置Prometheus抓取任务
在prometheus.yml中添加对应job,确保目标地址可访问且路径返回文本格式指标:
- Nginx Ingress示例:
targets: ["nginx-ingress-controller:10254"],metrics_path为/metrics - Spring Boot应用示例:
targets: ["my-gateway:8080"],metrics_path为/actuator/prometheus
抓取成功后,在Prometheus表达式浏览器中输入count({__name__=~".*requests.*", status=~"[45].*"}[1h]),应能查到带状态码的样本。
用PromQL实时计算异常占比
异常状态码主要指4xx与5xx。直接使用以下查询即可获得最近1分钟的实时占比:
-
5xx错误率:
sum(rate(ingress_requests{status=~"5.."}[1m])) / sum(rate(ingress_requests[1m])) * 100 -
4xx错误率:
sum(rate(ingress_requests{status=~"4.."}[1m])) / sum(rate(ingress_requests[1m])) * 100 -
聚合异常率(4xx+5xx):
sum(rate(ingress_requests{status=~"[45].."}[1m])) / sum(rate(ingress_requests[1m])) * 100
注意:若指标名不同(如用http_requests_total),只需替换前缀;若想按域名或路由细分,可在rate内加label过滤,如{host="api.example.com"}。
设置告警与可视化联动
将上述PromQL写入Alertmanager规则,例如当5xx率超2%持续1分钟即触发严重告警:
expr: sum(rate(ingress_requests{status=~"5.."}[1m])) / sum(rate(ingress_requests[1m])) * 100 > 2for: 1mlabels: severity: critical
在Grafana中新建Time Series面板,粘贴相同PromQL,设置Y轴为百分比格式,并开启“Legend”显示各状态码分项,就能看到每秒波动曲线和构成拆解。











