prometheus监控http状态码分布需通过网关/代理或应用埋点获取带status标签的指标,如ingress_requests或http_server_requests_seconds_count;用promql计算占比,如5xx错误率=sum(rate(http_requests_total{status=~"5.."}[1m]))/sum(rate(http_requests_total[1m]))*100。
要利用 prometheus 收集容器运行时状态码的分布占比,关键不是直接监控“容器本身的状态码”,而是监控**容器对外提供服务时产生的 http 响应状态码**——这通常由反向代理(如 nginx、traefik、ingress controller)或应用网关暴露指标,而非 docker 或容器运行时(如 containerd)原生提供。
确认指标来源:网关/代理必须暴露带 status 标签的指标
Prometheus 无法从容器运行时(如 dockerd 或 containerd)直接获取 HTTP 状态码。你需要确保以下任一组件已部署并正确导出指标:
-
Ingress Controller(如 Nginx Ingress、Traefik):默认暴露
ingress_requests{status="404", host="api.example.com"}类似指标; -
Nginx 容器 + nginx-exporter:需在 Nginx 配置中启用 stub_status,并用 nginx-prometheus-exporter 解析 access_log 或实时状态页,生成
nginx_http_requests_total{status="200"}; -
应用自身埋点(如 Spring Boot Actuator + Micrometer):导出
http_server_requests_seconds_count{status="500", uri="/api/user"}等标准指标。
用 PromQL 计算状态码分布占比(以 4xx/5xx 异常为例)
假设指标名为 http_requests_total(常见于 Spring Boot)或 ingress_requests(常见于 Ingress),且含 status 标签,可直接使用如下查询:
-
5xx 错误率(最近 1 分钟):
sum(rate(http_requests_total{status=~"5.."}[1m])) / sum(rate(http_requests_total[1m])) * 100 -
4xx 错误率:
sum(rate(http_requests_total{status=~"4.."}[1m])) / sum(rate(http_requests_total[1m])) * 100 -
所有状态码分布(饼图/TopN):
sum by (status) (rate(http_requests_total[5m])) -
按域名细分 5xx 占比:
sum(rate(http_requests_total{status=~"5..", host=~".+"}[1m])) by (host) / sum(rate(http_requests_total{host=~".+"}[1m])) by (host) * 100
配置 Prometheus 正确抓取与标签对齐
确保 scrape_configs 中目标能稳定返回含 status 的指标:
- 若使用 nginx-exporter,确认其监听端口(如
:9113)已开放,且 Prometheus job 指向该地址; - 检查采集到的样本是否真有
status标签:
在 Prometheus 表达式浏览器中输入http_requests_total,点开任意时间序列查看 label; - 如指标名不一致(比如是
nginx_http_requests_total),只需替换 PromQL 中的指标前缀,逻辑不变; - 避免因 relabel_configs 误删
status标签——检查配置中是否有action: drop或regex不当匹配导致 label 丢失。
告警与可视化落地建议
把状态码占比真正用起来,需要两步闭环:
-
告警规则(写入 prometheus.rules.yml):
expr: sum(rate(http_requests_total{status=~"5.."}[1m])) / sum(rate(http_requests_total[1m])) * 100 > 1.5<br>for: 2m<br>labels: severity: warning<br>annotations: summary: "5xx 错误率超 1.5%" -
Grafana 可视化:用 Pie Chart 展示各
status占比,用 Time Series 绘制 4xx/5xx 趋势线,叠加告警状态条; - 注意采样窗口一致性:计算占比时分子分母必须用相同时间范围(如都用
[1m]),否则结果失真。











