熔断器与监控

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_fundsWARN客户余额不足——预期内的业务事件
熔断打开WARN保护机制按设计工作
无匹配路由WARN配置缺口,但不是故障
媒体/传输失败ERROR平台或运营商问题——需要呼叫值班

实际效果:值班工程师不会再因为租户余额触底而被叫醒,而真正的故障保持原有的紧急度。拒绝原因同样出现在 CDR 与 API 中,利润分析可以把“客户端拒绝“与“我方问题“分开归组。

3. Prometheus 指标

Wholesale 暴露以下指标(/metrics 端点):

指标名类型标签说明
wholesale_calls_totalCountertenant, carrier, status呼叫总数
wholesale_call_duration_secondsHistogramtenant, carrier通话时长分布
wholesale_revenue_microcurrency_totalCountertenant收入累计
wholesale_cost_microcurrency_totalCountercarrier成本累计
wholesale_profit_microcurrency_totalCountertenant, carrier利润累计
wholesale_routing_attempts_totalCountertenant路由尝试次数
wholesale_routing_no_routes_totalCountertenant无路由次数
wholesale_concurrent_limit_rejected_totalCountertenant并发限制拒绝
wholesale_cps_limit_rejected_totalCountertenantCPS 限制拒绝
wholesale_circuit_breaker_stateGaugetrunk熔断器状态

4. 路由结果缓存

为提升性能,Wholesale 可缓存路由解析结果:

[proxy.wholesale]
route_cache_capacity = 10000   # LRU 最大条目
route_cache_ttl_secs = 30      # 缓存 30 秒

缓存 Key:(tenant_id, caller, callee)

  • 新通话先查缓存,命中则直接使用
  • 重新加载费率/路由时自动清空缓存