4. 熔断指标:upstream_rq_pending_overflow 与 upstream_rq_retry_overflow
Envoy 的熔断器并非黑盒开关,而是通过一系列可观测指标暴露内部决策过程。在实战排障中,upstream_rq_pending_overflow 和 upstream_rq_retry_overflow 是判断熔断是否生效、以及生效在哪个阶段的核心依据。本章将深入解析这两个关键指标的含义、触发条件及关联关系。
4.1 指标全景:熔断相关的计数器
Envoy 为每个上游集群(Cluster)维护一组熔断相关的统计计数器,位于 cluster.<name>.circuit_breakers. 命名空间下。下表列出最关键的几个指标及其含义:
| 指标名称 | 类型 | 触发条件 | 典型含义 |
|---|---|---|---|
upstream_rq_pending_overflow |
Counter | 待连接池(pending)队列已满,新请求被直接拒绝 | 连接池耗尽,请求排队超限 |
upstream_rq_retry_overflow |
Counter | 重试次数超过熔断阈值,Envoy 放弃重试 | 重试风暴被熔断拦截 |
upstream_cx_overflow |
Counter | 与上游的最大连接数达到上限 | 连接层熔断 |
upstream_rq_timeout |
Counter | 请求超时(非熔断,但常伴随熔断出现) | 上游响应过慢 |
upstream_rq_retry |
Counter | 发生重试(无论成功或失败) | 重试总次数 |
4.2 upstream_rq_pending_overflow:连接池排队熔断
Envoy 与上游服务之间维护了连接池。当所有连接都在处理请求时,新请求会进入 pending 队列等待空闲连接。如果 pending 队列长度超过 max_pending_requests 阈值,Envoy 会立即拒绝该请求,并递增 upstream_rq_pending_overflow 计数器。
触发流程:
- 客户端请求到达 Envoy。
- Envoy 检查连接池:所有连接繁忙,无空闲连接。
- 请求进入 pending 队列,等待可用连接。
- pending 队列长度达到
max_pending_requests(默认 1024)。 - Envoy 返回 503 响应,并递增
upstream_rq_pending_overflow。
典型场景:
- 上游服务突发慢查询,导致连接池中的连接被长时间占用。
- 上游服务实例数减少,但流量未降,连接池容量相对不足。
- 连接池配置过小(如
max_connections: 10),无法应对突发流量。
4.3 upstream_rq_retry_overflow:重试风暴熔断
Envoy 支持自动重试失败请求。但如果重试本身也失败,且重试次数过多,会形成“重试风暴”,进一步压垮上游。Envoy 通过 max_retries 熔断阈值限制重试总量,当重试次数超过该阈值时,后续重试请求会被直接拒绝,并递增 upstream_rq_retry_overflow 计数器。
触发流程:
- 原始请求失败(如 503、连接超时)。
- Envoy 根据重试策略发起重试。
- 重试请求再次失败,Envoy 继续重试。
- 累计重试次数达到集群级别的
max_retries阈值(默认 3)。 - Envoy 放弃重试,返回最终错误响应,并递增
upstream_rq_retry_overflow。
典型场景:
- 上游服务短暂抖动,重试成功但次数过多,触发熔断阈值。
- 重试策略配置过于激进(如
retry_on: 5xx且num_retries: 5),导致重试风暴。 - 多个 Envoy 实例同时向上游重试,集群级重试计数被快速耗尽。
4.4 两个指标的关联与区别
虽然两个指标都代表熔断生效,但作用阶段不同:
| 对比维度 | upstream_rq_pending_overflow | upstream_rq_retry_overflow |
|---|---|---|
| 熔断阶段 | 请求发送前(连接池排队) | 重试阶段(重试次数) |
| 触发阈值 | max_pending_requests |
max_retries |
| 返回状态码 | 503(熔断拒绝) | 503(重试熔断) |
| 对上游影响 | 减少新请求进入,保护连接池 | 减少重试流量,防止重试风暴 |
| 常见伴随指标 | upstream_cx_overflow、upstream_rq_timeout |
upstream_rq_retry、upstream_rq_retry_success |
两个指标同时飙升,通常意味着上游已经处于严重过载状态:连接池排队已满,重试也在不断失败。此时应优先恢复上游服务,而非调整熔断参数。
4.5 熔断指标关系图
下图展示了从请求到达 Envoy 到最终响应的完整流程中,两个熔断指标的触发位置:
4.6 实战:通过指标定位熔断根因
当监控告警显示熔断发生时,可按以下步骤快速定位:
- 检查 pending_overflow:如果该指标增长,说明连接池排队已满。查看
upstream_rq_pending_active和upstream_cx_active确认当前连接池使用率。 - 检查 retry_overflow:如果该指标增长,说明重试次数超限。查看
upstream_rq_retry和upstream_rq_retry_success确认重试成功率。 - 对比两个指标:
- 仅 pending_overflow 增长 → 连接池配置不足或上游响应慢。
- 仅 retry_overflow 增长 → 重试策略过于激进。
- 两者同时增长 → 上游服务严重过载,需优先恢复上游。
- 查看上游健康状态:结合
upstream_cx_connect_fail和upstream_rq_timeout判断上游是否可用。
curl -s http://localhost:15000/stats?filter=circuit_breakers | grep -E "pending_overflow|retry_overflow|cx_overflow"
输出示例:cluster.my_service.circuit_breakers.default.upstream_rq_pending_overflow: 12
cluster.my_service.circuit_breakers.default.upstream_rq_retry_overflow: 3
cluster.my_service.circuit_breakers.default.upstream_cx_overflow: 0
4.7 配置示例:熔断阈值与指标关联
以下 Envoy 配置展示了熔断阈值与对应指标的映射关系:
circuit_breakers:
thresholds:
- priority: DEFAULT
max_connections: 100 # 对应 upstream_cx_overflow
max_pending_requests: 50 # 对应 upstream_rq_pending_overflow
max_requests: 200 # 对应 upstream_rq_overflow(请求并发熔断)
max_retries: 3 # 对应 upstream_rq_retry_overflow
track_remaining: true # 暴露剩余容量指标
配置中的每个阈值都对应一个熔断计数器。当实际值超过阈值时,对应的 overflow 计数器递增。通过监控这些计数器,可以精确判断熔断发生在哪个维度。
track_remaining: true 开启,Envoy 会额外暴露 remaining_pending、remaining_retries 等指标,便于提前预警而非事后告警。