4、缓存命中率指标:关键指标定义与采集方式
缓存命中率是衡量 Envoy 灾备缓存效果的核心观测指标。只有准确理解 Cache Hit Ratio、Byte Hit Ratio、Miss Rate 三者的定义与差异,并掌握 Stats 和 Access Logs 两种采集方式,才能在日常巡检中快速定位缓存失效根因,避免误判。
4.1 关键指标定义
Envoy 的缓存指标基于 HTTP 缓存过滤器(envoy.filters.http.cache)计算,以下三个指标构成缓存效率评估的黄金三角:
| 指标名称 | 英文全称 | 计算公式 | 核心含义 |
|---|---|---|---|
| 缓存命中率 | Cache Hit Ratio | Cache Hits / (Cache Hits + Cache Misses) | 请求级别的命中比例,反映缓存对请求量的削减效果 |
| 字节命中率 | Byte Hit Ratio | Cache Bytes Served / Total Bytes Served | 流量级别的命中比例,反映缓存对带宽的节省效果 |
| 缺失率 | Miss Rate | Cache Misses / (Cache Hits + Cache Misses) | 请求未命中缓存的占比,与命中率互补(Miss Rate = 1 - Hit Ratio) |
巡检要点: 灾备场景下,Byte Hit Ratio 比 Cache Hit Ratio 更具业务价值。因为灾备缓存的核心目标是减少从源站回源的流量消耗,而字节命中率直接度量了带宽节省效果。若 Byte Hit Ratio 低于 60%,即使 Cache Hit Ratio 很高,也需要检查缓存对象大小分布是否合理。
4.2 指标采集方式
Envoy 提供两种互补的采集路径:Stats(统计计数器) 用于实时监控与告警,Access Logs(访问日志) 用于离线分析与根因定位。生产环境建议同时启用。
4.2.1 Stats 采集
Envoy 的 HTTP 缓存过滤器会暴露一组以 http.cache. 为前缀的统计计数器。通过 Admin 接口或 Prometheus 端点即可拉取。
# 通过 Admin 接口查看缓存统计
curl -s http://localhost:9901/stats | grep "http.cache"
# 输出示例
http.cache.cache_hit: 45231
http.cache.cache_miss: 12890
http.cache.cache_bypass: 3402
http.cache.cache_total: 61523
http.cache.bytes_served_from_cache: 2147483648
http.cache.bytes_served_total: 4294967296
基于上述计数器,可实时计算三个关键指标:
| 指标 | 计算方式 | PromQL 示例 |
|---|---|---|
| Cache Hit Ratio | cache_hit / cache_total |
envoy_http_cache_cache_hit / envoy_http_cache_cache_total |
| Byte Hit Ratio | bytes_served_from_cache / bytes_served_total |
envoy_http_cache_bytes_served_from_cache / envoy_http_cache_bytes_served_total |
| Miss Rate | cache_miss / cache_total |
envoy_http_cache_cache_miss / envoy_http_cache_cache_total |
Stats 采集优势: 毫秒级实时性,适合配置告警阈值(如 Byte Hit Ratio 低于 50% 触发 P1 告警)。但无法区分具体哪个 URI 或哪个上游导致的缓存未命中,需要 Access Logs 补充。
4.2.2 Access Logs 采集
在 Envoy 的访问日志格式中,通过 动态元数据 字段 %DYNAMIC_METADATA(envoy.filters.http.cache:cache_hit)% 可以获取每次请求的缓存命中状态。推荐使用 JSON 格式日志,便于结构化分析。
# 访问日志配置片段(JSON 格式)
access_log:
- name: envoy.access_loggers.file
typed_config:
"@type": type.googleapis.com/envoy.extensions.access_loggers.file.v3.FileAccessLog
path: /var/log/envoy/access.log
log_format:
json_format:
request_time: "%START_TIME%"
method: "%REQ(:METHOD)%"
path: "%REQ(X-ENVOY-ORIGINAL-PATH?:PATH)%"
response_code: "%RESPONSE_CODE%"
cache_hit: "%DYNAMIC_METADATA(envoy.filters.http.cache:cache_hit)%"
cache_bytes: "%DYNAMIC_METADATA(envoy.filters.http.cache:cache_bytes)%"
upstream_cluster: "%UPSTREAM_CLUSTER%"
response_size: "%RESPONSE_DURATION%"
日志输出示例:
{"request_time":"2025-03-21T10:15:30.123Z","method":"GET","path":"/api/v1/products","response_code":200,"cache_hit":true,"cache_bytes":4096,"upstream_cluster":"product-svc","response_size":4096}
{"request_time":"2025-03-21T10:15:31.456Z","method":"GET","path":"/api/v1/orders","response_code":200,"cache_hit":false,"cache_bytes":0,"upstream_cluster":"order-svc","response_size":15360}
通过日志分析工具(如 ELK、Loki)可计算:
- 按 URI 维度 统计 Cache Hit Ratio,定位哪些路径缓存效率低。
- 按上游集群维度 统计 Byte Hit Ratio,识别回源流量最大的上游。
- 按时间窗口 分析 Miss Rate 的波动趋势,判断是否与缓存过期策略有关。
4.3 采集方式对比与选型建议
| 对比维度 | Stats 采集 | Access Logs 采集 |
|---|---|---|
| 实时性 | 毫秒级,适合告警 | 秒级到分钟级(取决于日志采集管道) |
| 维度粒度 | 全局聚合,无法区分 URI/上游 | 单请求级别,可按任意字段分组 |
| 存储开销 | 极低(计数器,约 100 字节/指标) | 较高(每条日志约 200-500 字节) |
| 典型用途 | 实时仪表盘、告警阈值 | 根因分析、容量规划、报表 |
| 灾备场景推荐 | 必须启用,配置 Byte Hit Ratio 告警 | 建议启用,用于分析回源流量构成 |
避坑提示: 不要只依赖 Stats 的 Cache Hit Ratio 做决策。某次灾备演练中,Cache Hit Ratio 高达 92%,但 Byte Hit Ratio 仅 35%,原因是大量小文件命中缓存,而大文件(图片、视频)全部未命中。只有结合 Access Logs 按响应大小分组分析,才能发现缓存策略的配置缺陷。
4.4 本章小结
- 三个核心指标:Cache Hit Ratio(请求命中率)、Byte Hit Ratio(字节命中率)、Miss Rate(缺失率),灾备场景优先关注 Byte Hit Ratio。
- 两种采集方式:Stats 提供实时聚合数据,适合告警;Access Logs 提供单请求维度数据,适合根因分析。
- 生产最佳实践:同时启用两种方式,Stats 配置 Byte Hit Ratio 告警阈值(建议 60%),Access Logs 按 URI 和上游集群维度定期巡检。