$upstream_bytes_sent是Nginx内置变量,表示Nginx发送给上游服务器的字节数(上行流量),需通过log_format记录、nginx-prometheus-exporter日志解析或OpenResty+Lua埋点等方式间接暴露为Prometheus指标,不可直接在PromQL中使用。

$upstream_bytes_sent 是 Nginx 的内置变量,表示发送给上游服务器(如后端应用、API 服务)的字节数,即上行流量(从 Nginx 到 upstream 的数据量)。它本身不是 Prometheus 原生指标,需通过 Nginx 暴露的指标(如 nginx_ingress_controller_upstream_latency_seconds 或自定义日志+Exporter)间接采集。直接在 Prometheus 查询中使用 $upstream_bytes_sent 是无效的——它只在 Nginx 配置上下文中生效(例如 log_format、return 指令),不能被 Prometheus 直接读取。
1. 确保 Nginx 正确记录上行字节数
必须先在 Nginx 日志格式中显式包含 $upstream_bytes_sent,才能被后续工具提取:
- 在
http块中定义日志格式,例如:
- 将该格式应用于 access_log(如
access_log /var/log/nginx/access.log upstream_bytes;) - 注意:
$upstream_bytes_sent在请求未转发到 upstream(如 404、503、本地响应)时为 “-” 或 0,需在解析时处理空值
2. 使用 nginx-prometheus-exporter 提取该字段
官方 nginx-prometheus-exporter 默认不暴露 $upstream_bytes_sent。需配合自定义日志解析:
- 启用 exporter 的
--nginx.status-url(仅适用于 Nginx Plus 或开启 stub_status 的开源版)——但该方式无法获取 upstream 字节 - 更可靠的方式:使用
nginx-prometheus-exporter的 log parsing mode(v0.11+ 支持) - 配置示例(exporter 启动参数):
- 确保 exporter 能读取 access.log,并且日志格式名(
upstream_bytes)与配置一致 - 成功后,会暴露类似
nginx_http_request_upstream_bytes_total{host="...", upstream="backend1"} 123456的指标
3. 在 Prometheus 中查询与告警
采集到指标后,可按需聚合分析:
- 查看每秒平均上行流量(单位:B/s):
- 按 upstream 分组统计总开销:
- 异常突增告警(相比前 1 小时增长 300%):
- 注意:该指标是累计值,务必用
rate()或increase()计算速率,避免直接使用总量
4. 替代方案:OpenResty + lua-resty-prometheus
若需更高灵活性(如按 location、upstream group 动态打标),可用 OpenResty 自定义埋点:
- 在 upstream 块或 rewrite 阶段用 Lua 获取
ngx.var.upstream_bytes_sent - 调用
prometheus:counter_inc()上报,例如:
- 优势:标签丰富、低延迟、可过滤无效请求;缺点:需维护 Lua 逻辑和 OpenResty 环境


















