熔断器与监控
1. 三态熔断器
每个运营商中继维护独立的熔断器状态:
连续 N 次失败
Closed ─────────────► Open
▲ │
│ │ 等待冷却时间
│ 探测成功 ▼
│ HalfOpen
└──────────────────────┘
探测失败则回到 Open
| 状态 | 行为 |
|---|---|
| Closed | 正常路由,统计失败次数 |
| Open | 拒绝路由,不发送任何呼叫到该中继 |
| HalfOpen | 放行少量探测呼叫,成功则关闭,失败则重新打开 |
1.1 配置参数
| 参数 | 说明 | 默认值 |
|---|---|---|
| failure_threshold | 连续失败触发熔断 | 5 |
| open_duration_secs | 熔断持续时间 | 30 |
| half_open_probes | 半开探测次数 | 1 |
| failure_codes | 计为失败的 SIP 码 | [503, 408, 504] |
在控制台 Wholesale → 中继配置 中按中继独立启用/禁用。
1.2 运维操作
Wholesale → 监控限流:
- 查看所有中继当前状态(Closed/Open/HalfOpen)
- 手动重置:将 Open 状态强制回到 Closed
- 启用/禁用:临时关闭某中继的熔断器
2. 滑动窗口 ASR/ACD 监控
2.1 指标定义
| 指标 | 公式 | 说明 |
|---|---|---|
| ASR | 应答数 / 总呼叫数 × 100% | 接通率 |
| ACD | 总通话时长 / 应答数 | 平均通话时长 |
| Ring ASR | 应答数 / (总呼叫数 - 用户挂机) | 排除用户主动挂机 |
2.2 配置
[proxy.wholesale]
sliding_window_enabled = true
sliding_window_secs = 300 # 5 分钟窗口
sliding_window_max_events = 10000
asr_alert_threshold = 30.0 # ASR 低于 30% 告警
min_calls_for_stats = 10 # 不足 10 次不计算
2.3 告警
当某中继 ASR 低于阈值时:
- 控制台 监控限流 页面标红显示
- 熔断器可能自动触发(如果启用)
- Prometheus 指标可触发外部告警
2.4 严重级别:业务 vs 平台(0.5+)
业务类拒绝不是平台故障,错误目录也按此分级:
| 情况 | 级别 | 原因 |
|---|---|---|
insufficient_funds | WARN | 客户余额不足——预期内的业务事件 |
| 熔断打开 | WARN | 保护机制按设计工作 |
| 无匹配路由 | WARN | 配置缺口,但不是故障 |
| 媒体/传输失败 | ERROR | 平台或运营商问题——需要呼叫值班 |
实际效果:值班工程师不会再因为租户余额触底而被叫醒,而真正的故障保持原有的紧急度。拒绝原因同样出现在 CDR 与 API 中,利润分析可以把“客户端拒绝“与“我方问题“分开归组。
3. Prometheus 指标
Wholesale 暴露以下指标(/metrics 端点):
| 指标名 | 类型 | 标签 | 说明 |
|---|---|---|---|
wholesale_calls_total | Counter | tenant, carrier, status | 呼叫总数 |
wholesale_call_duration_seconds | Histogram | tenant, carrier | 通话时长分布 |
wholesale_revenue_microcurrency_total | Counter | tenant | 收入累计 |
wholesale_cost_microcurrency_total | Counter | carrier | 成本累计 |
wholesale_profit_microcurrency_total | Counter | tenant, carrier | 利润累计 |
wholesale_routing_attempts_total | Counter | tenant | 路由尝试次数 |
wholesale_routing_no_routes_total | Counter | tenant | 无路由次数 |
wholesale_concurrent_limit_rejected_total | Counter | tenant | 并发限制拒绝 |
wholesale_cps_limit_rejected_total | Counter | tenant | CPS 限制拒绝 |
wholesale_circuit_breaker_state | Gauge | trunk | 熔断器状态 |
4. 路由结果缓存
为提升性能,Wholesale 可缓存路由解析结果:
[proxy.wholesale]
route_cache_capacity = 10000 # LRU 最大条目
route_cache_ttl_secs = 30 # 缓存 30 秒
缓存 Key:(tenant_id, caller, callee)
- 新通话先查缓存,命中则直接使用
- 重新加载费率/路由时自动清空缓存