直接使用 $upstream_status 变量无法在 prometheus 中监控后端健康度,必须通过 nginx-prometheus-exporter 或 nginx-lua-prometheus 将其转化为指标,并结合日志格式配置、promql 查询及上游状态综合判断。

直接使用 $upstream_status 变量本身无法在 Prometheus 中监控后端健康度,因为它只是 Nginx 日志中的一个变量,Prometheus 不会自动识别或采集它。必须通过 Nginx 的指标暴露机制(如 nginx-prometheus-exporter 或 nginx-lua-prometheus)将上游响应状态码转化为可观测的指标,再配合 Prometheus 查询与告警。
确保 Nginx 正确记录 upstream_status
该变量仅在启用 proxy_pass、fastcgi_pass 等代理指令且请求实际转发到上游时才有值。需确认日志格式中已包含它:
log_format main '$remote_addr - $remote_user [$time_local] '
'"$request" $status $body_bytes_sent '
'"$http_referer" "$http_user_agent" '
'$upstream_addr $upstream_status $upstream_response_time';注意:$upstream_status 在请求未走到 upstream(如 503 由 Nginx 自身返回)、或 upstream 配置错误/不可达时可能为空或为“-”。这类情况需结合 $upstream_addr 和 $upstream_response_time 综合判断。
用 nginx-prometheus-exporter 提取 upstream_status 指标
官方推荐工具 nginx-prometheus-exporter 可解析 Nginx access log,自动将 $upstream_status 转为 Prometheus 指标:
- 启动 exporter 时指定日志路径和 log format name(需与 Nginx 配置一致)
- 它会生成类似
nginx_http_request_upstream_status_count{upstream_status="200",vhost="api.example.com"}的计数器 - 确保
upstream_status字段在 log format 中位置固定、无空格干扰,否则解析失败
用 PromQL 分析后端健康趋势
基于 exporter 暴露的指标,可构建实用查询:
- 各上游状态码分布:
sum by (upstream_status) (rate(nginx_http_request_upstream_status_count[1h])) - 5xx 错误率(反映后端异常):
rate(nginx_http_request_upstream_status_count{upstream_status=~"5.."}[5m]) / rate(nginx_http_request_upstream_status_count[5m]) - 特定 upstream 的失败突增:
increase(nginx_http_request_upstream_status_count{upstream_status=~"5..", upstream_addr=~"10.0.1.10:8080"}[10m]) > 10
补充:Lua 方案更灵活但需定制
若需实时聚合或按 upstream 名称(而非 IP)分组,可用 nginx-lua-prometheus + Lua 脚本捕获 $upstream_status:
- 在
log_by_lua_block中读取ngx.var.upstream_status - 调用
metric:inc({upstream_status = ngx.var.upstream_status}) - 需确保 upstream 配置中启用了
upstream_name变量(如用upstream_check模块),否则只能依赖$upstream_addr











