在Grafana中监控缓存命中率与回源比例,需将Nginx的$upstream_cache_status日志字段解析为Prometheus时序指标,按分钟聚合计算HIT占比及MISS/EXPIRED/BYPASS/REVALIDATED回源率,并联动upstream响应时间与磁盘使用率定位根因。

直接在 Grafana 里看缓存命中率和回源比例,核心是把 Nginx 日志中的 $upstream_cache_status 变量转化为可聚合的时序指标,并按分钟对齐、分组、计算比率。不能只依赖 stub_status 或粗粒度计数,得结合日志解析与 Prometheus 指标建模。
用日志字段构建缓存状态指标
在 Nginx 配置中启用带缓存状态的日志格式:
log_format cache_log '$remote_addr - $remote_user [$time_local] "$request" $status $body_bytes_sent "$http_referer" "$http_user_agent" "$upstream_cache_status" $request_time';关键点:
-
$upstream_cache_status输出值包括 HIT / MISS / EXPIRED / STALE / BYPASS / REVALIDATED / NOCACHE,每种都代表不同缓存行为 - 注意区分
$upstream_cache_status(代理层缓存状态)和$cache_status(旧版或非 proxy 场景),推荐统一用前者 - 静态文件直出或未走 proxy_pass 的请求该字段为空,需在采集端归为 NOCACHE 类,避免漏统计
定义业务口径并映射到 Prometheus 指标
缓存命中率不是唯一数值,要根据目标选分母。常用两种口径对应不同 Grafana 图表:
-
基础缓存利用率:分母 = 所有进入缓存逻辑的请求(即
$upstream_cache_status != ""),公式为sum(rate(nginx_upstream_cache_status_count{status="HIT"}[1m])) / sum(rate(nginx_upstream_cache_status_count{status=~"HIT|MISS|EXPIRED|STALE|BYPASS|REVALIDATED"}[1m])) -
有效回源比例:把
MISS + EXPIRED + BYPASS + REVALIDATED全部视为需回源,分子为这四类之和,分母同上;该比例上升说明缓存未生效或策略异常
建议在 Grafana 中用两个 stacked time series 面板分别展示 HIT 和回源类(MISS/EXPIRED/BYPASS)的每分钟请求数,再叠加一条计算出的「回源率」折线。
对齐后端响应时间,识别根因
单看命中率下降没意义,要和上游表现联动判断:
- 在 Prometheus 中同时采集
nginx_upstream_response_time_seconds{upstream="backend_api"}的 p95 值 - 将「MISS 率突增」与「upstream p95 同步升高」做关联:若两者同步上升,大概率是后端变慢导致缓存未及时建立或被跳过
- 若 MISS 率升但 upstream 响应时间平稳,则重点查
proxy_cache_bypass条件、Cache-Control: no-cache响应头、或Vary头不一致导致 key 冲突
Grafana 面板实用组合
一个完整的缓存链路监控面板应包含以下三线图(共享 X 轴时间):
- 缓存未命中率(MISS + EXPIRED + BYPASS)占比,单位 %
- 上游服务 5xx 错误率(
rate(nginx_upstream_status_count{code=~"5.."}[1m]) / rate(nginx_upstream_status_count[1m])) - 缓存区磁盘使用趋势(
node_filesystem_usage_percent{mountpoint="/var/cache/nginx"})
当三者中任意两条同时异常波动,基本可定位问题类型:磁盘满 → 缓存清理失败 → EXPIRED 增多;5xx 上升 → 缓存失效加速 → MISS 激增。











