跳到主要内容

Prometheus 指标和监控指南

概述

OmniTAS 以 Prometheus 格式导出全面的操作指标,用于监控、警报和可观察性。本指南涵盖所有可用指标、其使用、故障排除和监控最佳实践。

指标端点

所有指标都在以下地址公开: http://<tas-ip>:8080/metrics

重要:指标时间单位配置

系统中的所有持续时间指标在其直方图声明中使用 duration_unit: false。这是 关键 的,因为:

  1. Prometheus Elixir 库会自动检测以 _milliseconds 结尾的指标名称
  2. 默认情况下,它会自动将原生 Erlang 时间单位转换为毫秒
  3. 我们的代码已经使用 System.convert_time_unit/3 将时间转换为毫秒
  4. 如果没有 duration_unit: false,库会将毫秒转换为纳秒(除以 ~1,000,000)

示例:

# 正确的配置
Histogram.declare(
name: :http_dialplan_request_duration_milliseconds,
help: "HTTP 拨号计划请求的持续时间(毫秒)",
labels: [:call_type],
buckets: [100, 250, 500, 750, 1000, 1500, 2000, 3000, 5000],
duration_unit: false # 必须防止双重转换
)

# 正确测量时间
start_time = System.monotonic_time()
# ... 执行工作 ...
end_time = System.monotonic_time()
duration_ms = System.convert_time_unit(end_time - start_time, :native, :millisecond)
Histogram.observe([name: :http_dialplan_request_duration_milliseconds], duration_ms)

完整指标参考

Diameter 指标

diameter_response_duration_milliseconds

类型: 直方图
标签: application (ro, sh), command (ccr, cca, 等), result (success, error, timeout)
桶: 10, 50, 100, 250, 500, 1000, 2500, 5000, 10000 ms
描述: Diameter 请求的持续时间(毫秒)

用法:

# 平均 Diameter 响应时间
rate(diameter_response_duration_milliseconds_sum[5m]) /
rate(diameter_response_duration_milliseconds_count[5m])

# P95 Diameter 延迟
histogram_quantile(0.95, rate(diameter_response_duration_milliseconds_bucket[5m]))

警报条件:

  • P95 > 1000ms - Diameter 响应缓慢

diameter_requests_total

类型: 计数器
标签: application (ro, sh), command (ccr, udr, 等)
描述: 发送的 Diameter 请求总数

用法:

# 请求速率
rate(diameter_requests_total[5m])

diameter_responses_total

类型: 计数器
标签: application (ro, sh), command (ccr, udr, 等), result_code (2001, 3002, 5xxx, 等)
描述: 接收到的 Diameter 响应总数

用法:

# 成功率
rate(diameter_responses_total{result_code="2001"}[5m]) /
rate(diameter_responses_total[5m]) * 100

diameter_peer_state

类型: 指示器
标签: peer_host, peer_realm, application (ro, sh)
描述: Diameter 对等体的状态 (1=在线, 0=离线)
更新间隔: 每 10 秒

用法:

# 检查离线对等体
diameter_peer_state == 0

警报条件:

  • 任何对等体离线超过 1 分钟

拨号计划生成指标

1. HTTP 请求指标

http_dialplan_request_duration_milliseconds

类型: 直方图
标签: call_type (mt, mo, emergency, unknown)
描述: 端到端 HTTP 请求持续时间 从接收到拨号计划 HTTP 请求到发送响应。这包括所有处理:参数解析、授权、Diameter 查找 (Sh/Ro)、HLR 查找 (SS7 MAP) 和 XML 生成。

用法:

# 平均端到端 HTTP 请求时间
rate(http_dialplan_request_duration_milliseconds_sum[5m]) /
rate(http_dialplan_request_duration_milliseconds_count[5m])

# 按呼叫类型的 P95
histogram_quantile(0.95,
rate(http_dialplan_request_duration_milliseconds_bucket[5m])
) by (call_type)

# 比较 MT 与 MO 性能
histogram_quantile(0.95,
rate(http_dialplan_request_duration_milliseconds_bucket{call_type="mt"}[5m])
)
vs
histogram_quantile(0.95,
rate(http_dialplan_request_duration_milliseconds_bucket{call_type="mo"}[5m])
)

警报条件:

  • P95 > 2000ms - HTTP 响应时间缓慢
  • P95 > 3000ms - 关键性能问题
  • P99 > 5000ms - 严重性能下降
  • 任何请求显示 call_type="unknown" - 呼叫类型检测失败

见解:

  • 这是理解用户面延迟的 最重要指标
  • 典型值:P50: 100-500ms, P95: 500-2000ms, P99: 1000-3000ms
  • 包括所有组件时序 (Sh + HLR + OCS + 处理)
  • 如果此指标缓慢,请深入组件指标 (subscriber_data, hlr_data, ocs_authorization)
  • 预期范围:100ms (快速本地呼叫) 到 5000ms (缓慢且有重试/超时)

重要说明:

  • 替换了旧的 dialplan_generation_duration_milliseconds 指标,该指标仅测量 XML 生成
  • 准确反映 FreeSWITCH/SBC 的体验
  • 用于 SLA 监控和容量规划

2. 用户数据指标

subscriber_data_duration_milliseconds

类型: 直方图
标签: result (success, error)
描述: 从 Sh 接口 (HSS) 检索用户数据所花费的时间

用法:

# 平均 Sh 查找时间
rate(subscriber_data_duration_milliseconds_sum[5m]) /
rate(subscriber_data_duration_milliseconds_count[5m])

# 第 95 百分位 Sh 查找时间
histogram_quantile(0.95,
rate(subscriber_data_duration_milliseconds_bucket[5m])
)

警报条件:

  • P95 > 100ms - HSS 响应缓慢
  • P95 > 500ms - 关键 HSS 性能问题

subscriber_data_lookups_total

类型: 计数器
标签: result (success, error)
描述: 用户数据查找的总数

用法:

# Sh 查找速率
rate(subscriber_data_lookups_total[5m])

# Sh 错误率
rate(subscriber_data_lookups_total{result="error"}[5m])

# Sh 成功率百分比
(rate(subscriber_data_lookups_total{result="success"}[5m]) /
rate(subscriber_data_lookups_total[5m])) * 100

警报条件:

  • 错误率 > 5% - HSS 连接问题
  • 错误率 > 20% - 关键 HSS 故障

2. HLR 数据指标

hlr_data_duration_milliseconds

类型: 直方图
标签: result (success, error)
描述: 通过 SS7 MAP 检索 HLR 数据所花费的时间

用法:

# 平均 HLR 查找时间
rate(hlr_data_duration_milliseconds_sum[5m]) /
rate(hlr_data_duration_milliseconds_count[5m])

# 第 95 百分位 HLR 查找时间
histogram_quantile(0.95,
rate(hlr_data_duration_milliseconds_bucket[5m])
)

警报条件:

  • P95 > 500ms - SS7 MAP 响应缓慢
  • P95 > 2000ms - 关键 SS7 MAP 问题

hlr_lookups_total

类型: 计数器
标签: result_type (msrn, forwarding, error, unknown)
描述: 按结果类型的总 HLR 查找

用法:

# 按类型的 HLR 查找速率
rate(hlr_lookups_total[5m])

# MSRN 发现速率 (漫游用户)
rate(hlr_lookups_total{result_type="msrn"}[5m])

# 呼叫转移发现速率
rate(hlr_lookups_total{result_type="forwarding"}[5m])

# HLR 错误率
rate(hlr_lookups_total{result_type="error"}[5m])

警报条件:

  • 错误率 > 10% - SS7 MAP 问题
  • MSRN 速率突然下降 - 可能的漫游问题

见解:

  • 高 MSRN 速率表示许多漫游用户
  • 高转移率表示许多转接呼叫
  • 与呼叫量进行比较以计算漫游百分比

3. OCS 授权指标

ocs_authorization_duration_milliseconds

类型: 直方图
标签: result (success, error)
描述: OCS 授权所花费的时间

用法:

# 平均 OCS 授权时间
rate(ocs_authorization_duration_milliseconds_sum[5m]) /
rate(ocs_authorization_duration_milliseconds_count[5m])

# 第 95 百分位 OCS 授权时间
histogram_quantile(0.95,
rate(ocs_authorization_duration_milliseconds_bucket[5m])
)

警报条件:

  • P95 > 1000ms - OCS 响应缓慢
  • P95 > 5000ms - 关键 OCS 性能问题

ocs_authorization_attempts_total

类型: 计数器
标签: result (success, error), skipped (yes, no)
描述: OCS 授权尝试的总数

用法:

# OCS 授权速率
rate(ocs_authorization_attempts_total{skipped="no"}[5m])

# OCS 错误率
rate(ocs_authorization_attempts_total{result="error",skipped="no"}[5m])

# OCS 跳过率 (紧急、语音信箱等)
rate(ocs_authorization_attempts_total{skipped="yes"}[5m])

# OCS 成功率百分比
(rate(ocs_authorization_attempts_total{result="success",skipped="no"}[5m]) /
rate(ocs_authorization_attempts_total{skipped="no"}[5m])) * 100

警报条件:

  • 错误率 > 5% - OCS 连接问题
  • 成功率 < 95% - OCS 拒绝过多呼叫

见解:

  • 高跳过率表示许多紧急/免费呼叫
  • 错误率激增表示 OCS 故障
  • 将成功率与业务期望进行比较

4. 呼叫处理指标

call_param_errors_total

类型: 计数器
标签: error_type (parse_failed, missing_required_params)
描述: 呼叫参数解析错误

用法:

# 参数错误率
rate(call_param_errors_total[5m])

# 按类型的错误
rate(call_param_errors_total[5m]) by (error_type)

警报条件:

  • 任何错误 > 0 - 表示格式不正确的呼叫参数请求
  • 错误 > 1% 的呼叫量 - 关键问题

authorization_decisions_total

类型: 计数器
标签: disposition (mt, mo, emergency, unauthorized), result (success, error)
描述: 按呼叫类型的授权决策

用法:

# 按处置的授权率
rate(authorization_decisions_total[5m]) by (disposition)

# MT 呼叫率
rate(authorization_decisions_total{disposition="mt"}[5m])

# MO 呼叫率
rate(authorization_decisions_total{disposition="mo"}[5m])

# 紧急呼叫率
rate(authorization_decisions_total{disposition="emergency"}[5m])

# 未授权呼叫率
rate(authorization_decisions_total{disposition="unauthorized"}[5m])

警报条件:

  • 未授权率 > 1% - 可能的攻击或配置错误
  • 紧急呼叫激增 - 可能的紧急事件
  • MT/MO 比率的意外变化 - 可能的问题

见解:

  • MT/MO 比率指示流量模式
  • 紧急呼叫率指示服务使用情况
  • 未授权率指示安全态势

freeswitch_variable_set_duration_milliseconds

类型: 直方图
标签: batch_size (1, 5, 10, 25, 50, 100)
描述: 设置拨号计划变量所需的时间

用法:

# 平均变量设置时间
rate(freeswitch_variable_set_duration_milliseconds_sum[5m]) /
rate(freeswitch_variable_set_duration_milliseconds_count[5m])

# 按批量大小的变量设置时间
histogram_quantile(0.95,
rate(freeswitch_variable_set_duration_milliseconds_bucket[5m])
) by (batch_size)

警报条件:

  • P95 > 100ms - 变量设置性能缓慢
  • 增长趋势 - 可能的系统性能问题

5. 模块处理指标

dialplan_module_duration_milliseconds

类型: 直方图
标签: module (MT, MO, Emergency, CallParams, 等), call_type
描述: 每个拨号计划模块的处理时间

用法:

# 按模块的处理时间
histogram_quantile(0.95,
rate(dialplan_module_duration_milliseconds_bucket[5m])
) by (module)

# MT 模块处理时间
histogram_quantile(0.95,
rate(dialplan_module_duration_milliseconds_bucket{module="MT"}[5m])
)

警报条件:

  • 任何模块 P95 > 500ms - 性能问题
  • 任何模块的增长趋势 - 潜在泄漏或问题

见解:

  • 确定哪个模块最慢
  • 优先优化最慢的模块
  • 比较不同呼叫类型的模块时间

6. 呼叫量指标

call_attempts_total

类型: 计数器
标签: call_type (mt, mo, emergency, unauthorized), result (success, rejected)
描述: 总呼叫尝试

用法:

# 呼叫尝试速率
rate(call_attempts_total[5m])

# 按呼叫类型的成功率
(rate(call_attempts_total{result="success"}[5m]) /
rate(call_attempts_total[5m])) * 100 by (call_type)

# 被拒绝的呼叫率
rate(call_attempts_total{result="rejected"}[5m])

警报条件:

  • 被拒绝的比例 > 5% - 可能的问题
  • 呼叫量突然下降 - 服务中断
  • 呼叫量突然激增 - 可能的攻击

active_calls

类型: 指示器
标签: call_type (mt, mo, emergency)
描述: 当前活跃呼叫

用法:

# 当前活跃呼叫
active_calls

# 按类型的活跃呼叫
active_calls by (call_type)

# 峰值活跃呼叫(过去一小时)
max_over_time(active_calls[1h])

警报条件:

  • 活跃呼叫 > 容量 - 超载
  • 活跃呼叫 = 0 超过一段时间 - 服务中断

7. 模拟指标

call_simulations_total

类型: 计数器
标签: call_type (mt, mo, emergency, unauthorized), source (web, api)
描述: 运行的呼叫模拟

用法:

# 模拟速率
rate(call_simulations_total[5m])

# 按类型的模拟
rate(call_simulations_total[5m]) by (call_type)

见解:

  • 跟踪诊断工具使用情况
  • 确定重度用户
  • 与故障排除活动相关联

8. SS7 MAP 指标

ss7_map_http_duration_milliseconds

类型: 直方图
标签: operation (sri, prn), result (success, error, timeout)
桶: 10, 50, 100, 250, 500, 1000, 2500, 5000, 10000 ms
描述: SS7 MAP HTTP 请求的持续时间(毫秒)

用法:

# SS7 MAP 错误率
rate(ss7_map_operations_total{result="error"}[5m]) /
rate(ss7_map_operations_total[5m]) * 100

警报条件:

  • P95 > 500ms - SS7 MAP 响应缓慢
  • 错误率 > 50% - 关键 SS7 MAP 问题

ss7_map_operations_total

类型: 计数器
标签: operation (sri, prn), result (success, error)
描述: SS7 MAP 操作的总数

9. 在线计费指标

online_charging_events_total

类型: 计数器
标签: event_type (authorize, answer, reauth, hangup), result (success, nocredit, error, timeout)
描述: 在线计费事件的总数

用法:

# OCS 信贷失败
rate(online_charging_events_total{result="nocredit"}[5m])

警报条件:

  • 信贷失败率高

10. 系统状态指标

tracked_registrations

类型: 指示器
描述: 当前活动的 SIP 注册数量(来自 FreeSWITCH Sofia 注册数据库)
更新间隔: 每 10 秒

说明:

  • 注册到期时会自动减少(FreeSWITCH 管理到期)

tracked_call_sessions

类型: 指示器
描述: 当前在 ETS 中跟踪的呼叫会话数量
更新间隔: 每 10 秒

11. HTTP 请求指标

http_requests_total

类型: 计数器
标签: endpoint (dialplan, call_event, directory, voicemail, sms_ccr, metrics), status_code (200, 400, 500, 等)
描述: 按端点的 HTTP 请求总数

用法:

# HTTP 错误率
rate(http_requests_total{status_code=~"5.."}[5m]) /
rate(http_requests_total[5m]) * 100

警报条件:

  • HTTP 5xx 错误率 > 10%

12. 呼叫拒绝指标

call_rejections_total

类型: 计数器
标签: call_type (mo, mt, emergency, unknown), reason (nocredit, unauthorized, parse_failed, missing_params, hlr_error, 等)
描述: 按原因的呼叫拒绝总数

用法:

# 按原因的呼叫拒绝率
sum by (reason) (rate(call_rejections_total[5m]))

警报条件:

  • 拒绝率 > 1/秒 - 需要调查

13. 事件套接字连接指标

event_socket_connected

类型: 指示器
标签: connection_type (main, log_listener)
描述: 事件套接字连接状态 (1=连接, 0=断开)
更新间隔: 连接状态变化时实时更新

用法:

# 事件套接字连接状态
event_socket_connected

警报条件:

  • 连接断开超过 30 秒

event_socket_reconnections_total

类型: 计数器
标签: connection_type (main, log_listener), result (attempting, success, failed)
描述: 事件套接字重连尝试的总数

Grafana 仪表板集成

可以使用 Prometheus 数据源在 Grafana 中可视化指标。推荐的面板:

仪表板 1:呼叫量

  • 活跃呼叫指示器
  • 按类型的呼叫尝试速率 (MO/MT/紧急)
  • 呼叫拒绝率

仪表板 2:Diameter 性能

  • 响应时间热图
  • 请求/响应速率
  • 对等状态表
  • 按结果代码的错误率

仪表板 3:在线计费健康

  • 信贷授权成功率
  • "无信贷" 事件率
  • OCS 超时率

仪表板 4:系统性能

  • 拨号计划生成延迟 (P50/P95/P99)
  • SS7 MAP 响应时间
  • 整体系统可用性

推荐的 Grafana 仪表板布局

行 1:呼叫量

  • 按类型的呼叫尝试速率
  • 活跃呼叫指示器
  • 成功率百分比

行 2:性能

  • P95 HTTP 拨号计划请求时间 (按呼叫类型) - 主要指标
  • P95 Sh 查找时间
  • P95 HLR 查找时间
  • P95 OCS 授权时间
  • P95 拨号计划模块处理时间 (按模块)

行 3:成功率

  • Sh 查找成功率
  • HLR 查找成功率
  • OCS 授权成功率
  • 呼叫尝试成功率

行 4:模块性能

  • 按模块的 P95 处理时间
  • 模块呼叫计数

行 5:错误

  • 参数错误
  • 未授权尝试
  • Sh 错误
  • HLR 错误
  • OCS 错误

关键警报

优先级 1(立即页面):

# 拨号计划完全宕机
rate(call_attempts_total[5m]) == 0

# HSS 完全宕机
rate(subscriber_data_lookups_total{result="error"}[5m]) /
rate(subscriber_data_lookups_total[5m]) > 0.9

# OCS 完全宕机
rate(ocs_authorization_attempts_total{result="error"}[5m]) /
rate(ocs_authorization_attempts_total[5m]) > 0.9

优先级 2(警报):

# 拨号计划生成缓慢
histogram_quantile(0.95,
rate(dialplan_generation_duration_milliseconds_bucket[5m])
) > 1000

# HSS 错误率高
rate(subscriber_data_lookups_total{result="error"}[5m]) /
rate(subscriber_data_lookups_total[5m]) > 0.2

# OCS 错误率高
rate(ocs_authorization_attempts_total{result="error"}[5m]) /
rate(ocs_authorization_attempts_total[5m]) > 0.1

优先级 3(警告):

# HSS 延迟升高
histogram_quantile(0.95,
rate(subscriber_data_duration_milliseconds_bucket[5m])
) > 100

# OCS 延迟升高
histogram_quantile(0.95,
rate(ocs_authorization_duration_milliseconds_bucket[5m])
) > 1000

# 中等错误率
rate(call_attempts_total{result="rejected"}[5m]) /
rate(call_attempts_total[5m]) > 0.05

警报示例

Diameter 对等体离线

alert: DiameterPeerDown
expr: diameter_peer_state == 0
for: 1m
annotations:
summary: "Diameter 对等体 {{ $labels.peer_host }} 离线"

高 Diameter 延迟

alert: HighDiameterLatency
expr: histogram_quantile(0.95, rate(diameter_response_duration_milliseconds_bucket[5m])) > 1000
for: 5m
annotations:
summary: "Diameter P95 延迟超过 1s"

OCS 信贷失败

alert: HighOCSCreditFailures
expr: rate(online_charging_events_total{result="nocredit"}[5m]) > 0.1
for: 2m
annotations:
summary: "高 OCS 信贷失败率"

SS7 MAP 网关错误

alert: SS7MapErrors
expr: rate(ss7_map_operations_total{result="error"}[5m]) / rate(ss7_map_operations_total[5m]) > 0.5
for: 3m
annotations:
summary: "SS7 MAP 错误率超过 50%"

事件套接字断开

alert: EventSocketDown
expr: event_socket_connected == 0
for: 30s
annotations:
summary: "事件套接字 {{ $labels.connection_type }} 断开"

高呼叫拒绝率

alert: HighCallRejectionRate
expr: rate(call_rejections_total[5m]) > 1
for: 2m
annotations:
summary: "高呼叫拒绝率:{{ $value }} 拒绝/秒"

HTTP 错误率高

alert: HighHTTPErrorRate
expr: rate(http_requests_total{status_code=~"5.."}[5m]) / rate(http_requests_total[5m]) > 0.1
for: 3m
annotations:
summary: "HTTP 5xx 错误率超过 10%"

使用指标进行故障排除

问题:指标显示不现实的值(纳秒而不是毫秒)

症状:

  • 直方图 _sum 值极小(例如,0.000315 而不是 315)
  • 所有请求显示在最低桶中 (< 5ms),而它们应该更慢
  • 值似乎比预期小 1,000,000 倍

根本原因: Prometheus Elixir 库会自动转换时间单位,当指标名称以 _milliseconds_seconds 等结尾时。如果没有设置 duration_unit: false,库会将您已经转换的毫秒转换为纳秒。

调查:

  1. 检查 lib/metrics.ex 中的指标声明
  2. 验证 duration_unit: false 是否存在:
    Histogram.declare(
    name: :some_duration_milliseconds,
    help: "...",
    buckets: [...],
    duration_unit: false # 必须存在!
    )
  3. 检查测量代码是否使用正确的时间转换:
    start = System.monotonic_time()
    # ... 工作 ...
    duration_ms = System.convert_time_unit(
    System.monotonic_time() - start,
    :native,
    :millisecond
    )
    Histogram.observe([name: :some_duration_milliseconds], duration_ms)

解决方案:

  1. 在直方图声明中添加 duration_unit: false
  2. 重启应用程序(需要重新加载指标声明)
  3. 修复后验证指标是否显示现实值

示例修复:

# 之前(错误 - 将显示纳秒)
Histogram.declare(
name: :http_dialplan_request_duration_milliseconds,
buckets: [5, 10, 25, 50, 100, 250, 500, 1000, 2500]
)

# 之后(正确 - 将显示毫秒)
Histogram.declare(
name: :http_dialplan_request_duration_milliseconds,
buckets: [100, 250, 500, 750, 1000, 1500, 2000, 3000, 5000],
duration_unit: false
)

问题:呼叫类型显示为 "unknown"

症状:

  • 所有指标显示 call_type="unknown" 而不是 mtmoemergency
  • 无法区分不同呼叫类型的性能

根本原因: 呼叫类型提取失败或未正确传递通过处理管道。

调查:

  1. 检查日志中的 "HTTP 拨号计划请求" 消息 - 它们应显示正确的呼叫类型
  2. 验证 process_call/1 返回 {xml, call_type} 元组,而不仅仅是 xml
  3. 验证 fsapi_conn/1 从元组中提取呼叫类型:{xml, call_type} = process_call(body)

解决方案: 确保拨号计划处理管道在所有函数中正确传递呼叫类型。

问题:呼叫缓慢

调查:

  1. 检查 http_dialplan_request_duration_milliseconds P95 - 从这里开始
  2. 如果高,检查组件时序:
    • 检查 subscriber_data_duration_milliseconds 的 Sh 延迟
    • 检查 hlr_data_duration_milliseconds 的 HLR 延迟
    • 检查 ocs_authorization_duration_milliseconds 的 OCS 延迟
    • 检查 dialplan_module_duration_milliseconds 的模块特定延迟
  3. 检查是否 call_type="unknown" - 表示呼叫类型检测失败
  4. 比较 MT 与 MO 与紧急处理时间
  5. 与系统日志相关联,获取��细错误消息

解决方案: 优化最慢的组件

问题:呼叫失败

调查:

  1. 检查 call_attempts_total{result="rejected"} 速率
  2. 检查 subscriber_data_lookups_total{result="error"} 的 Sh 问题
  3. 检查 hlr_lookups_total{result_type="error"} 的 HLR 问题
  4. 检查 ocs_authorization_attempts_total{result="error"} 的 OCS 问题
  5. 检查 authorization_decisions_total{disposition="unauthorized"} 的授权问题

解决方案: 修复失败的组件

问题:高负载

调查:

  1. 检查 active_calls 当前值
  2. 检查 call_attempts_total 速率
  3. 检查速率是否与预期流量匹配
  4. 比较 MT 与 MO 比率
  5. 检查是否有异常模式(激增、稳定增长)

解决方案: 扩展或调查异常流量

问题:漫游问题

调查:

  1. 检查 hlr_lookups_total{result_type="msrn"} 速率
  2. 检查 hlr_data_duration_milliseconds 的延迟
  3. 使用 HLR 查找工具检查特定用户
  4. 检查 MSRN 是否被正确检索

解决方案: 修复 HLR 连接或配置

性能基准

典型值(调优良好的系统)

  • HTTP 拨号计划请求(端到端): P50: 100-500ms, P95: 500-2000ms, P99: 1000-3000ms
  • Sh 查找时间: P50: 15ms, P95: 50ms, P99: 100ms
  • HLR 查找时间: P50: 100ms, P95: 300ms, P99: 800ms
  • OCS 授权时间: P50: 150ms, P95: 500ms, P99: 1500ms
  • 拨号计划模块处理: P50: 1-5ms, P95: 10-25ms, P99: 50ms
  • Sh 成功率: > 99%
  • HLR 成功率: > 95% (较低是正常的,因为有离线用户)
  • OCS 成功率: > 98%
  • 呼叫成功率: > 99%

注意: HTTP 拨号计划请求时间是所有组件时间加上开销的总和。它应大致等于:Sh 查找 + HLR 查找 + OCS 授权 + 拨号计划模块处理 + 网络/解析开销。最低预期时间约为 ~100ms(仅需要 Sh 查找时),最大典型时间约为 ~2000ms(所有查找和重试时)。

容量规划

监控这些趋势:

  • call_attempts_total 速率的增长
  • active_calls 峰值的增长
  • 稳定或改善的 P95 延迟
  • 稳定或改善的成功率

当以下情况发生时,计划扩展:

  • 活跃呼叫接近 80% 的容量
  • 尽管负载稳定,P95 延迟增长
  • 尽管外部系统稳定,成功率下降

与日志的集成

将指标与日志相关联:

  1. 指标中的高错误率 → 在日志中搜索 ERROR 消息
  2. 响应时间缓慢 → 在日志中搜索关于超时的 WARNING 消息
  3. 特定呼叫问题 → 按呼叫 ID 或电话号码在日志中搜索
  4. 使用模拟工具重现并调试

最佳实践

  1. 在问题发生之前设置仪表板
  2. 根据基准定义警报阈值
  3. 通过使用呼叫模拟器测试警报
  4. 每周审查指标以识别趋势
  5. 将指标与业务事件相关联(活动、故障等)
  6. 使用指标证明基础设施投资的合理性
  7. 与运营团队共享仪表板
  8. 记录您的警报响应程序

配置

指标收集在应用程序启动时自动启用。指标端点在与 API 相同的端口上公开(默认:8080)。

要配置 Prometheus 抓取指标,请在 prometheus.yml 中添加此作业:

scrape_configs:
- job_name: 'omnitas'
static_configs:
- targets: ['<tas-ip>:8080']
metrics_path: '/metrics'
scrape_interval: 10s

指标基数

这些指标设计时控制基数,以避免压垮 Prometheus:

  • 对等标签: 限制为仅配置的对等体
  • 呼叫类型: 固定集 (mo, mt, emergency, unauthorized)
  • 结果代码: 限制为实际接收到的 Diameter/OCS 结果代码
  • 操作: 每个接口的固定集 (sri/prn 用于 MAP, ccr/cca 用于 Diameter)

估计的时间序列总数:~200-500,具体取决于配置的对等体数量和活动结果代码。

指标保留

推荐的保留期:

  • 原始指标: 30 天(高分辨率)
  • 5 分钟聚合: 90 天
  • 1 小时聚合: 1 年
  • 每日聚合: 5 年

这支持:

  • 实时故障排除(原始指标)
  • 每周/月分��(5 分钟/1 小时聚合)
  • 容量规划(每日聚合)
  • 历史比较(年度聚合)