指标文档
本文档描述了IMS应用服务器组件所暴露的Prometheus指标。
目录
- 指标端点
- 9090端口 - 系统指标
- 8080端口 - TAS引擎指标
- 9093端口 - 媒体与呼叫质量指标
- Go运行时指标
- 进程指标
- Prometheus HTTP指标
- 指标类型
- 使用
- 示例查询
- 指标时间单位配置
- Grafana仪表板集成
- 警报示例
- 使用指标进行故障排除
- 性能基线
- 最佳实践
指标端点
| 端口 | 端点 | 目的 | 跳转到部分 |
|---|---|---|---|
| 9090 | /metrics | 系统、网关和核心电话指标 | 9090端口 → |
| 8080 | /metrics | TAS引擎、Diameter、HLR、OCS和Erlang VM指标 | 8080端口 → |
| 9093 | /esl?module=default | RTP/RTCP媒体质量和呼叫统计 | 9093端口 → |
9090端口 - 系统指标
呼叫和会话指标
| 指标名称 | 端口 | 描述 |
|---|---|---|
freeswitch_bridged_calls | 9090 | 当前活动的桥接呼叫数量 |
freeswitch_detailed_bridged_calls | 9090 | 当前活动的详细桥接呼叫数量 |
freeswitch_current_calls | 9090 | 当前活动的呼叫数量 |
freeswitch_detailed_calls | 9090 | 当前活动的详细呼叫数量 |
freeswitch_current_channels | 9090 | 当前活动的通道数量 |
freeswitch_current_sessions | 9090 | 当前活动的会话数量 |
freeswitch_current_sessions_peak | 9090 | 自启动以来的会话峰值数量 |
freeswitch_current_sessions_peak_last_5min | 9090 | 最近5分钟的会话峰值数量 |
freeswitch_sessions_total | 9090 | 自启动以来的会话总数(计数器) |
freeswitch_current_sps | 9090 | 每秒当前会话数 |
freeswitch_current_sps_peak | 9090 | 自启动以来的每秒峰值会话数 |
freeswitch_current_sps_peak_last_5min | 9090 | 最近5分钟的每秒峰值会话数 |
freeswitch_max_sessions | 9090 | 允许的最大会话数量 |
freeswitch_max_sps | 9090 | 允许的最大每秒会话数 |
系统资源指标
| 指标名称 | 端口 | 描述 |
|---|---|---|
freeswitch_current_idle_cpu | 9090 | 当前CPU空闲百分比 |
freeswitch_min_idle_cpu | 9090 | 记录的最低CPU空闲百分比 |
freeswitch_uptime_seconds | 9090 | 运行时间(秒) |
freeswitch_time_synced | 9090 | 系统时间是否与导出主机时间同步(1=同步,0=不同步) |
内存指标
| 指标名称 | 端口 | 描述 |
|---|---|---|
freeswitch_memory_arena | 9090 | 总非内存映射字节(malloc arena) |
freeswitch_memory_ordblks | 9090 | 空闲块数量 |
freeswitch_memory_smblks | 9090 | 空闲快速块数量 |
freeswitch_memory_hblks | 9090 | 映射区域数量 |
freeswitch_memory_hblkhd | 9090 | 映射区域中的字节数 |
freeswitch_memory_usmblks | 9090 | 最大总分配空间 |
freeswitch_memory_fsmblks | 9090 | 在快速块中持有的空闲字节 |
freeswitch_memory_uordblks | 9090 | 总分配空间 |
freeswitch_memory_fordblks | 9090 | 总空闲空间 |
freeswitch_memory_keepcost | 9090 | 最上层可释放块 |
编解码器状态指标
| 指标名称 | 端口 | 描述 |
|---|---|---|
freeswitch_codec_status | 9090 | 编解码器状态,标签包括:ikey(模块)、name(编解码器名称)、type(编解码器)。值=1表示编解码器可用 |
可用编解码器包括:
- G.711 alaw/ulaw
- PROXY PASS-THROUGH
- PROXY VIDEO PASS-THROUGH
- RAW Signed Linear (16 bit)
- Speex
- VP8/VP9 Video
- AMR variants
- B64
- G.723.1, G.729, G.722, G.726 variants
- OPUS
- MP3
- ADPCM, GSM, LPC-10
端点状态指标
| 指标名称 | 端口 | 描述 |
|---|---|---|
freeswitch_endpoint_status | 9090 | 端点状态,标签包括:ikey(模块)、name(端点名称)、type(端点)。值=1表示端点可用 |
可用端点包括:
- error, group, pickup, user (mod_dptools)
- loopback, null (mod_loopback)
- rtc (mod_rtc)
- rtp, sofia (mod_sofia)
- modem (mod_spandsp)
模块状态指标
| 指标名称 | 端口 | 描述 |
|---|---|---|
freeswitch_load_module | 9090 | 模块加载状态(1=已加载,0=未加载),标签:module |
监控的关键模块:
- mod_sofia (SIP)
- mod_conference, mod_conference_ims
- mod_opus, mod_g729, mod_amr, 等等
- mod_event_socket
- mod_dptools
- mod_python3
- mod_rtc
- 还有许多其他...
注册指标
| 指标名称 | 端口 | 描述 |
|---|---|---|
freeswitch_registrations | 9090 | 当前活动注册的总数 |
freeswitch_registration_defails | 9090 | 详细注册信息,标签包括:expires, hostname, network_ip, network_port, network_proto, realm, reg_user, token, url |
Sofia网关指标
| 指标名称 | 端口 | 描述 |
|---|---|---|
freeswitch_sofia_gateway_status | 9090 | 网关状态,标签包括:context, name, profile, proxy, scheme, status (UP/DOWN) |
freeswitch_sofia_gateway_call_in | 9090 | 通过网关的入站呼叫数量 |
freeswitch_sofia_gateway_call_out | 9090 | 通过网关的出站呼叫数量 |
freeswitch_sofia_gateway_failed_call_in | 9090 | 失败的入站呼叫数量 |
freeswitch_sofia_gateway_failed_call_out | 9090 | 失败的出站呼叫数量 |
freeswitch_sofia_gateway_ping | 9090 | 最后一次ping的时间戳(Unix纪元) |
freeswitch_sofia_gateway_pingtime | 9090 | 最后一次ping的时间(毫秒) |
freeswitch_sofia_gateway_pingfreq | 9090 | ping频率(秒) |
freeswitch_sofia_gateway_pingcount | 9090 | 发送的ping数量 |
freeswitch_sofia_gateway_pingmin | 9090 | 记录的最小ping时间 |
freeswitch_sofia_gateway_pingmax | 9090 | 记录的最大ping时间 |
导出器健康指标
| 指标名称 | 端口 | 描述 |
|---|---|---|
freeswitch_up | 9090 | 最后一次抓取是否成功(1=成功,0=失败) |
freeswitch_exporter_total_scrapes | 9090 | 执行的抓取总数(计数器) |
freeswitch_exporter_failed_scrapes | 9090 | 失败的抓取总数(计数器) |
8080端口 - TAS引擎指标
这些指标由电话应用服务器引擎暴露,提供对呼叫处理、数据库操作和Erlang VM性能的洞察。
应用呼叫指标
| 指标名称 | 端口 | 描述 |
|---|---|---|
call_simulations_total | 8080 | 呼叫模拟的总数(计数器) |
call_attempts_total | 8080 | 呼叫尝试的总数(计数器) |
call_rejections_total | 8080 | 按原因拒绝的呼叫总数(计数器) |
call_param_errors_total | 8080 | 呼叫参数解析错误的总数(计数器) |
active_calls | 8080 | 当前活动呼叫的数量,标签:call_type(mo/mt/emergency) |
tracked_call_sessions | 8080 | 当前在ETS中跟踪的呼叫会话数量 |
Diameter协议指标
| 指标名称 | 端口 | 描述 |
|---|---|---|
diameter_peer_state | 8080 | Diameter对等体的状态(1=在线,0=离线),标签:peer_host, peer_realm, application |
diameter_requests_total | 8080 | Diameter请求的总数(计数器) |
diameter_responses_total | 8080 | Diameter响应的总数(计数器) |
diameter_response_duration_milliseconds | 8080 | Diameter请求的持续时间(毫秒)(直方图) |
电话操作指标
| 指标名称 | 端口 | 描述 |
|---|---|---|
hlr_lookups_total | 8080 | HLR查找的总数(计数器) |
hlr_data_duration_milliseconds | 8080 | HLR数据检索的持续时间(毫秒)(直方图) |
subscriber_data_lookups_total | 8080 | 订阅者数据查找的总数(计数器) |
subscriber_data_duration_milliseconds | 8080 | Sh订阅者数据检索的持续时间(毫秒)(直方图) |
ss7_map_operations_total | 8080 | SS7 MAP操作的总数(计数器) |
ss7_map_http_duration_milliseconds | 8080 | SS7 MAP HTTP请求的持续时间(毫秒)(直方图) |
tracked_registrations | 8080 | 当前跟踪的SIP注册数量 |
在线计费系统(OCS)指标
| 指标名称 | 端口 | 描述 |
|---|---|---|
ocs_authorization_attempts_total | 8080 | OCS授权尝试的总数(计数器) |
ocs_authorization_duration_milliseconds | 8080 | OCS授权的持续时间(毫秒)(直方图) |
online_charging_events_total | 8080 | 在线计费事件的总数(计数器) |
authorization_decisions_total | 8080 | 授权决策的总数(计数器) |
拨号计划与处理指标
| 指标名称 | 端口 | 描述 |
|---|---|---|
http_requests_total | 8080 | HTTP请求的总数,标签:endpoint, status_code(计数器) |
http_dialplan_request_duration_milliseconds | 8080 | HTTP拨号计划请求的持续时间(毫秒)(直方图) |
dialplan_module_duration_milliseconds | 8080 | 单个拨号计划模块处理的持续时间(毫秒)(直方图) |
freeswitch_variable_set_duration_milliseconds | 8080 | 变量设置操作的持续时间(毫秒)(直方图) |
事件套接字指标
| 指标名称 | 端口 | 描述 |
|---|---|---|
event_socket_connected | 8080 | 事件套接字连接状态(1=已连接,0=未连接),标签:connection_type |
event_socket_reconnections_total | 8080 | 事件套接字重新连接尝试的总数(计数器) |
Erlang Mnesia数据库指标
| 指标名称 | 端口 | 描述 |
|---|---|---|
erlang_mnesia_held_locks | 8080 | 持有的锁数量 |
erlang_mnesia_lock_queue | 8080 | 等待锁的事务数量 |
erlang_mnesia_transaction_participants | 8080 | 参与事务的数量 |
erlang_mnesia_transaction_coordinators | 8080 | 协调事务的数量 |
erlang_mnesia_failed_transactions | 8080 | 失败(中止)事务的数量(计数器) |
erlang_mnesia_committed_transactions | 8080 | 提交的事务数量(计数器) |
erlang_mnesia_logged_transactions | 8080 | 记录的事务数量(计数器) |
erlang_mnesia_restarted_transactions | 8080 | 事务重启的总数(计数器) |
erlang_mnesia_memory_usage_bytes | 8080 | 所有mnesia表分配的总字节数 |
erlang_mnesia_tablewise_memory_usage_bytes | 8080 | 每个mnesia表分配的字节数,标签:table |
erlang_mnesia_tablewise_size | 8080 | 每个表的行数,标签:table |
Erlang VM内存指标
| 指标名称 | 端口 | 描述 |
|---|---|---|
erlang_vm_memory_atom_bytes_total | 8080 | 为原子分配的内存,标签:usage(used/free) |
erlang_vm_memory_bytes_total | 8080 | 总分配内存,标签:kind(system/processes) |
erlang_vm_memory_dets_tables | 8080 | DETS表的数量 |
erlang_vm_memory_ets_tables | 8080 | ETS表的数量 |
erlang_vm_memory_processes_bytes_total | 8080 | 为进程分配的内存,标签:usage(used/free) |
erlang_vm_memory_system_bytes_total | 8080 | 模拟器的内存(与进程无关),标签:usage(atom/binary/code/ets/other) |
Erlang VM统计信息
| 指标名称 | 端口 | 描述 |
|---|---|---|
erlang_vm_statistics_bytes_output_total | 8080 | 输出到端口的总字节数(计数器) |
erlang_vm_statistics_bytes_received_total | 8080 | 通过端口接收的总字节数(计数器) |
erlang_vm_statistics_context_switches | 8080 | 自启动以来的上下文切换总数(计数器) |
erlang_vm_statistics_dirty_cpu_run_queue_length | 8080 | 脏CPU运行队列的长度 |
erlang_vm_statistics_dirty_io_run_queue_length | 8080 | 脏IO运行队列的长度 |
erlang_vm_statistics_garbage_collection_number_of_gcs | 8080 | 垃圾回收的数量(计数器) |
erlang_vm_statistics_garbage_collection_bytes_reclaimed | 8080 | GC回收的字节数(计数器) |
erlang_vm_statistics_garbage_collection_words_reclaimed | 8080 | GC回收的单词数(计数器) |
erlang_vm_statistics_reductions_total | 8080 | 总减少数(计数器) |
erlang_vm_statistics_run_queues_length | 8080 | 正常运行队列的长度 |
erlang_vm_statistics_runtime_milliseconds | 8080 | 所有线程的运行时间总和(计数器) |
erlang_vm_statistics_wallclock_time_milliseconds | 8080 | 实际测量的时间(计数器) |
Erlang VM系统信息
| ���标名称 | 端口 | 描述 |
|---|---|---|
erlang_vm_dirty_cpu_schedulers | 8080 | 脏CPU调度线程的数量 |
erlang_vm_dirty_cpu_schedulers_online | 8080 | 在线的脏CPU调度器数量 |
erlang_vm_dirty_io_schedulers | 8080 | 脏I/O调度线程的数量 |
erlang_vm_ets_limit | 8080 | 允许的最大ETS表数量 |
erlang_vm_logical_processors | 8080 | 配置的逻辑处理器数量 |
erlang_vm_logical_processors_available | 8080 | 可用的逻辑处理器数量 |
erlang_vm_logical_processors_online | 8080 | 在线的逻辑处理器数量 |
erlang_vm_port_count | 8080 | 当前存在的端口数量 |
erlang_vm_port_limit | 8080 | 允许的最大端口数量 |
erlang_vm_process_count | 8080 | 当前存在的进程数量 |
erlang_vm_process_limit | 8080 | 允许的最大进程数量 |
erlang_vm_schedulers | 8080 | 调度线程的数量 |
erlang_vm_schedulers_online | 8080 | 在线的调度器数量 |
erlang_vm_smp_support | 8080 | 1表示编译时支持SMP,0表示不支持 |
erlang_vm_threads | 8080 | 1表示编译时支持线程,0表示不支持 |
erlang_vm_thread_pool_size | 8080 | 池中异步线程的数量 |
erlang_vm_time_correction | 8080 | 1表示启用时间校正,0表示未启用 |
erlang_vm_wordsize_bytes | 8080 | Erlang术语字的字节大小 |
erlang_vm_atom_count | 8080 | 当前存在的原子数量 |
erlang_vm_atom_limit | 8080 | 允许的最大原子数量 |
Erlang VM微状态会计(MSACC)
调度程序活动的详细时间跟踪,标签:type, id
| 指标名称 | 端口 | 描述 |
|---|---|---|
erlang_vm_msacc_aux_seconds_total | 8080 | 处理辅助作业所花费的时间(计数器) |
erlang_vm_msacc_check_io_seconds_total | 8080 | 检查新I/O事件所花费的时间(计数器) |
erlang_vm_msacc_emulator_seconds_total | 8080 | 执行Erlang进程所花费的时间(计数器) |
erlang_vm_msacc_gc_seconds_total | 8080 | 垃圾回收中所花费的时间(计数器) |
erlang_vm_msacc_other_seconds_total | 8080 | 在未计入活动中所花费的时间(计数器) |
erlang_vm_msacc_port_seconds_total | 8080 | 执行端口所花费的时间(计数器) |
erlang_vm_msacc_sleep_seconds_total | 8080 | 睡眠所花费的时间(计数器) |
erlang_vm_msacc_alloc_seconds_total | 8080 | 管理内存所花费的时间(计数器) |
erlang_vm_msacc_bif_seconds_total | 8080 | 在BIF中所花费的时间(计数器) |
erlang_vm_msacc_busy_wait_seconds_total | 8080 | 忙等待所花费的时间(计数器) |
erlang_vm_msacc_ets_seconds_total | 8080 | 在ETS BIF中所花费的时间(计数器) |
erlang_vm_msacc_gc_full_seconds_total | 8080 | 在全扫GC中所花费的时间(计数器) |
erlang_vm_msacc_nif_seconds_total | 8080 | 在NIF中所花费的时间(计数器) |
erlang_vm_msacc_send_seconds_total | 8080 | 发送消息所花费的时间(计数器) |
erlang_vm_msacc_timers_seconds_total | 8080 | 管理定时器所花费的时间(计数器) |
Erlang VM分配器
带有标签:alloc, instance_no, kind, usage的详细内存分配器指标
| 指标名称 | 端口 | 描述 |
|---|---|---|
erlang_vm_allocators | 8080 | 不同分配器的分配(carriers_size)和使用(blocks_size)内存。请参见 erts_alloc(3)。 |
分配器类型包括: temp_alloc, sl_alloc, std_alloc, ll_alloc, eheap_alloc, ets_alloc, fix_alloc, literal_alloc, binary_alloc, driver_alloc
9093端口 - 媒体与呼叫质量指标
这些指标提供实时RTP/RTCP统计信息和每个通道的呼叫质量信息。
| 指标名称 | 端口 | 描述 |
|---|---|---|
freeswitch_info | 9093 | 系统信息,标签:version |
freeswitch_up | 9093 | 就绪状态(1=就绪,0=未就绪) |
freeswitch_stack_bytes | 9093 | 堆栈大小(字节) |
freeswitch_session_total | 9093 | 会话总数 |
freeswitch_session_active | 9093 | 活动会话数量 |
freeswitch_session_limit | 9093 | 会话限制 |
rtp_channel_info | 9093 | RTP通道信息,带有通道详细信息的标签 |
RTP音频 - 字节计数器
| 指标名称 | 端口 | 描述 |
|---|---|---|
rtp_audio_in_raw_bytes_total | 9093 | 接收的总字节数(包括头部) |
rtp_audio_out_raw_bytes_total | 9093 | 发送的总字节数(包括头部) |
rtp_audio_in_media_bytes_total | 9093 | 接收的总媒体字节数(仅有效载荷) |
rtp_audio_out_media_bytes_total | 9093 | 发送的总媒体字节数(仅有效载荷) |
RTP音频 - 数据包计数器
| 指标名称 | 端口 | 描述 |
|---|---|---|
rtp_audio_in_packets_total | 9093 | 接收的总数据包数量 |
rtp_audio_out_packets_total | 9093 | 发送的总数据包数量 |
rtp_audio_in_media_packets_total | 9093 | 接收的总媒体数据包数量 |
rtp_audio_out_media_packets_total | 9093 | 发送的总媒体数据包数量 |
rtp_audio_in_skip_packets_total | 9093 | 丢弃的入站数据包数量 |
rtp_audio_out_skip_packets_total | 9093 | 丢弃的出站数据包数量 |
RTP音频 - 特殊数据��类型
| 指标名称 | 端口 | 描述 |
|---|---|---|
rtp_audio_in_jitter_packets_total | 9093 | 接收的抖动缓冲数据包数量 |
rtp_audio_in_dtmf_packets_total | 9093 | 接收的DTMF数据包数量 |
rtp_audio_out_dtmf_packets_total | 9093 | 发送的DTMF数据包数量 |
rtp_audio_in_cng_packets_total | 9093 | 接收的舒适噪声生成数据包数量 |
rtp_audio_out_cng_packets_total | 9093 | 发送的舒适噪声生成数据包数量 |
rtp_audio_in_flush_packets_total | 9093 | 被刷新数据包(缓冲区重置) |
RTP音频 - 抖动与质量指标
| 指标名称 | 端口 | 描述 |
|---|---|---|
rtp_audio_in_jitter_buffer_bytes_max | 9093 | 最大抖动缓冲区大小(字节) |
rtp_audio_in_jitter_seconds_min | 9093 | 最小抖动(秒) |
rtp_audio_in_jitter_seconds_max | 9093 | 最大抖动(秒) |
rtp_audio_in_jitter_loss_rate | 9093 | 由于抖动导致的数据包丢失率(比率) |
rtp_audio_in_jitter_burst_rate | 9093 | 由于抖动导致的数据包突发率(比率) |
rtp_audio_in_mean_interval_seconds | 9093 | 入站数据包之间的平均间隔 |
rtp_audio_in_flaw_total | 9093 | 检测到的音频缺陷总数(故障、伪影) |
rtp_audio_in_quality_percent | 9093 | ��频质量百分比(0-100) |
rtp_audio_in_quality_mos | 9093 | 平均意见分数(1-5,5为最佳) |
RTCP指标
| 指标名称 | 端口 | 描述 |
|---|---|---|
rtcp_audio_bytes_total | 9093 | 总RTCP字节数 |
rtcp_audio_packets_total | 9093 | 总RTCP数据包数量 |
Go运行时指标
| 指标名称 | 端口 | 描述 |
|---|---|---|
go_goroutines | 9090 | 当前运行的goroutines数量 |
go_threads | 9090 | 创建的OS线程数量 |
go_info | 9090 | Go环境的信息(带版本标签) |
go_gc_duration_seconds | 9090 | 垃圾回收周期的暂停持续时间(摘要) |
go_memstats_alloc_bytes | 9090 | 分配并仍在使用的字节数 |
go_memstats_alloc_bytes_total | 9090 | 分配的总字节数(计数器) |
go_memstats_heap_alloc_bytes | 9090 | 分配并仍在使用的堆字节数 |
go_memstats_heap_idle_bytes | 9090 | 等待使用的堆字节数 |
go_memstats_heap_inuse_bytes | 9090 | 当前使用的堆字节数 |
go_memstats_heap_objects | 9090 | 分配的堆对象数量 |
go_memstats_heap_released_bytes | 9090 | 释放给OS的堆字节数 |
go_memstats_heap_sys_bytes | 9090 | 从系统获取的堆字节数 |
go_memstats_sys_bytes | 9090 | 从系统获取的总字节数 |
进程指标
| 指标名称 | 端口 | 描述 |
|---|---|---|
process_cpu_seconds_total | 9090 | 花费的总用户和系统CPU时间(计数器) |
process_max_fds | 9090 | 最大打开文件描述符数量 |
process_open_fds | 9090 | 当前打开的文件描述符数量 |
process_resident_memory_bytes | 9090 | 常驻内存大小(字节) |
process_virtual_memory_bytes | 9090 | 虚拟内存大小(字节) |
process_virtual_memory_max_bytes | 9090 | 可用的最大虚拟内存量 |
process_start_time_seconds | 9090 | 自Unix纪元以来的进程启动时间 |
Prometheus HTTP指标
| 指标名称 | 端口 | 描述 |
|---|---|---|
promhttp_metric_handler_requests_in_flight | 9090 | 当前正在服务的抓取数量 |
promhttp_metric_handler_requests_total | 9090 | 按HTTP状态代码抓取的总数(计数器) |
指标类型
- gauge: 一个可以上升或下降的指标(例如,current_calls, cpu_idle)
- counter: 一个只会增加的指标(例如,sessions_total, failed_scrapes)
- summary: 一个在滑动时间窗口中跟踪分位数的指标(例如,gc_duration_seconds)
使用
要抓取这些指标,请配置您的Prometheus服务器以抓取所有三个端点:
scrape_configs:
- job_name: 'ims_as_system'
static_configs:
- targets: ['localhost:9090']
- job_name: 'ims_as_engine'
static_configs:
- targets: ['localhost:8080']
metrics_path: '/metrics'
- job_name: 'ims_as_media'
static_configs:
- targets: ['localhost:9093']
metrics_path: '/esl'
params:
module: ['default']
示例查询
快速链接:
一般指标
当前呼叫量:
freeswitch_current_calls
网关健康:
freeswitch_sofia_gateway_status{status="UP"}
到网关的平均ping时间:
avg(freeswitch_sofia_gateway_pingtime)
每秒会话率:
freeswitch_current_sps
内存使用情况:
freeswitch_memory_uordblks
媒体质量指标
呼叫质量(MOS分数):
rtp_audio_in_quality_mos
音频质量百分比:
rtp_audio_in_quality_percent
抖动率:
rate(rtp_audio_in_jitter_packets_total[5m])
数据包丢失率:
rtp_audio_in_jitter_loss_rate
平均抖动:
avg(rtp_audio_in_jitter_seconds_max - rtp_audio_in_jitter_seconds_min)
RTP带宽(入站):
rate(rtp_audio_in_media_bytes_total[1m]) * 8
检测到的音频缺陷:
increase(rtp_audio_in_flaw_total[5m])
TAS引擎指标
按类型的活动呼叫:
active_calls
Diameter对等体健康:
diameter_peer_state{application="sh"}
呼叫尝试率:
rate(call_attempts_total[5m])
HLR查找延迟(95百分位):
histogram_quantile(0.95, hlr_data_duration_milliseconds)
OCS授权延迟:
histogram_quantile(0.99, ocs_authorization_duration_milliseconds)
订阅者数据查找率:
rate(subscriber_data_lookups_total[5m])
Diameter请求成功率:
rate(diameter_responses_total[5m]) / rate(diameter_requests_total[5m])
事件套接字连接状态:
event_socket_connected
Mnesia事务性能:
rate(erlang_mnesia_committed_transactions[5m])
Mnesia失败事务率:
rate(erlang_mnesia_failed_transactions[5m])
Erlang VM进程数量:
erlang_vm_process_count
Erlang VM内存使用情况:
erlang_vm_memory_bytes_total
垃圾回收率:
rate(erlang_vm_statistics_garbage_collection_number_of_gcs[5m])
调度器运行队列长度:
erlang_vm_statistics_run_queues_length
ETS表数量:
erlang_vm_memory_ets_tables
HTTP拨号计划请求持续时间(中位数):
histogram_quantile(0.5, http_dialplan_request_duration_milliseconds)
指标时间单位配置
对开发者的重要性:
该系统中的所有持续时间指标在其直方图声明中使用duration_unit: false。这是关键的,因为:
- Prometheus Elixir库自动检测以
_milliseconds结尾的指标名称 - 默认情况下,它会自动将原生Erlang时间单位转换为毫秒
- 我们的代码已经使用
System.convert_time_unit/3将时间转换为毫秒 - 如果没有
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)
Grafana仪表板集成
可以使用Prometheus数据源在Grafana中可视化这些指标。
推荐的仪表板布局
第一行:呼叫量与健康
- 活动呼叫仪表(
active_calls) - 按类型的呼叫尝试率(
rate(call_attempts_total[5m])) - 呼叫拒绝率(
rate(call_rejections_total[5m])) - 网关健康(
freeswitch_sofia_gateway_status)
第二行:性能(延迟百分位)
- 按呼叫类型的P95 HTTP拨号计划请求时间
- P95 Sh订阅者数据查找时间
- P95 HLR查找时间
- P95 OCS授权时间
- 按应用的P95 Diameter响应时间
第三行:成功率
- 订阅者数据查找成功率
- HLR查找成功率
- OCS授权成功率
- Diameter对等体状态
第四行:媒体质量
- 呼叫质量MOS分数(
rtp_audio_in_quality_mos) - 音频质量百分比(
rtp_audio_in_quality_percent) - 抖动统计
- 数据包丢失率
第五行:系统��源
- Erlang VM进程数量
- Erlang VM内存使用情况
- ETS表数量
- 调度器运行队列长度
- 垃圾回收率
第六行:错误跟踪
- 呼叫参数错误
- 授权失败
- 事件套接字连接状态
- Mnesia事务失败
示例面板查询
按类型的活动呼叫:
sum by (call_type) (active_calls)
P95拨号计划生成延迟:
histogram_quantile(0.95,
rate(http_dialplan_request_duration_milliseconds_bucket[5m])
)
Diameter成功率:
rate(diameter_responses_total{result="success"}[5m]) /
rate(diameter_requests_total[5m]) * 100
媒体质量 - 平均MOS:
avg(rtp_audio_in_quality_mos)
警报示例
关键警报(立即页面)
系统故障 - 无呼叫尝试:
alert: SystemDown
expr: rate(call_attempts_total[5m]) == 0
for: 2m
labels:
severity: critical
annotations:
summary: "TAS系统似乎已关闭 - 无呼叫尝试"
description: "2分钟内未检测到呼叫尝试"
Diameter对等体故障:
alert: DiameterPeerDown
expr: diameter_peer_state == 0
for: 1m
labels:
severity: critical
annotations:
summary: "Diameter对等体{{ $labels.peer_host }}已关闭"
description: "{{ $labels.application }}应用的对等体不可用"
事件套接字断开连接:
alert: EventSocketDisconnected
expr: event_socket_connected == 0
for: 30s
labels:
severity: critical
annotations:
summary: "事件套接字{{ $labels.connection_type }}断开连接"
description: "关键通信通道关闭"
高严重性警报
高Diameter延迟:
alert: HighDiameterLatency
expr: |
histogram_quantile(0.95,
rate(diameter_response_duration_milliseconds_bucket[5m])
) > 1000
for: 5m
labels:
severity: high
annotations:
summary: "检测到高Diameter延迟"
description: "P95延迟为{{ $value }}ms"
OCS授权失败:
alert: OCSAuthFailures
expr: |
rate(ocs_authorization_attempts_total{result="no_credit"}[5m]) /
rate(ocs_authorization_attempts_total[5m]) > 0.1
for: 5m
labels:
severity: high
annotations:
summary: "OCS无信用响应的高比率"
description: "{{ $value | humanizePercentage }}的请求被拒绝信用"
高呼叫拒绝率:
alert: HighCallRejectionRate
expr: |
rate(call_rejections_total[5m]) /
rate(call_attempts_total[5m]) > 0.05
for: 5m
labels:
severity: high
annotations:
summary: "呼叫拒绝率超过5%"
description: "{{ $value | humanizePercentage }}的呼叫被拒绝"
媒体质量差:
alert: PoorMediaQuality
expr: avg(rtp_audio_in_quality_mos) < 3.5
for: 3m
labels:
severity: high
annotations:
summary: "检测到呼叫质量差"
description: "平均MOS分数为{{ $value }}"
警告警报
高内存使用:
alert: HighMemoryUsage
expr: |
erlang_vm_memory_bytes_total{kind="processes"} /
(erlang_vm_process_limit * 1000000) > 0.8
for: 10m
labels:
severity: warning
annotations:
summary: "Erlang VM内存使用高"
description: "进程内存为{{ $value | humanizePercentage }}"
高调度器运行队列:
alert: HighSchedulerRunQueue
expr: erlang_vm_statistics_run_queues_length > 10
for: 5m
labels:
severity: warning
annotations:
summary: "高调度器运行队列长度"
description: "运行队列长度为{{ $value }}"
Mnesia事务失败:
alert: MnesiaTransactionFailures
expr: rate(erlang_mnesia_failed_transactions[5m]) > 1
for: 5m
labels:
severity: warning
annotations:
summary: "检测到Mnesia事务失败"
description: "{{ $value }}每秒的失败"
使用指标进行故障排除
问题:指标显示不现实的值(纳秒而不是毫秒)
症状:
- 直方图值在十亿级别
- 延迟指标显示微秒/纳秒值
原因:
缺少直方图声明中的duration_unit: false
解决方案:
在所有持续时间直方图声明中添加duration_unit: false:
Histogram.declare(
name: :my_metric_duration_milliseconds,
# ... 其他选项 ...
duration_unit: false
)
问题:呼叫缓慢
调查步骤:
- 检查整体拨号计划生成时间:
histogram_quantile(0.95, rate(http_dialplan_request_duration_milliseconds_bucket[5m]))
- 按组件细分:
# 订阅者数据查找
histogram_quantile(0.95, rate(subscriber_data_duration_milliseconds_bucket[5m]))
# HLR查找
histogram_quantile(0.95, rate(hlr_data_duration_milliseconds_bucket[5m]))
# OCS授权
histogram_quantile(0.95, rate(ocs_authorization_duration_milliseconds_bucket[5m]))
- 检查模块特定延迟:
histogram_quantile(0.95,
rate(dialplan_module_duration_milliseconds_bucket[5m])
) by (module)
常见原因:
- 外部系统延迟(HSS, HLR, OCS)
- 网络问题
- 数据库竞争
- 高系统负载
问题:呼叫失败
调查步骤:
- 检查呼叫拒绝原因:
sum by (reason) (rate(call_rejections_total[5m]))
- 检查授权决策:
sum by (decision) (rate(authorization_decisions_total[5m]))
- 检查Diameter对等体健康:
diameter_peer_state
- 检查事件套接字连接:
event_socket_connected
问题:高负载
调查步骤:
- 检查呼叫量:
rate(call_attempts_total[5m])
active_calls
- 检查Erlang VM资源:
erlang_vm_process_count
erlang_vm_statistics_run_queues_length
erlang_vm_memory_bytes_total
- 检查垃圾回收:
rate(erlang_vm_statistics_garbage_collection_number_of_gcs[5m])
问题:媒体质量差
调查步骤:
- 检查MOS分数:
rtp_audio_in_quality_mos
rtp_audio_in_quality_percent
- 检查抖动:
rtp_audio_in_jitter_seconds_max
rtp_audio_in_jitter_loss_rate
- 检查数据包丢失:
rtp_audio_in_skip_packets_total
rtp_audio_in_flaw_total
- 检查带宽使用:
rate(rtp_audio_in_media_bytes_total[1m]) * 8
性能基线
典型值(调优良好的系统)
延迟(P95):
- HTTP拨号计划请求:200-500ms
- 订阅者数据(Sh)查找:50-150ms
- HLR数据查找:100-300ms
- OCS授权:100-250ms
- Diameter请求:50-200ms
- 拨号计划模块处理:每个模块10-50ms
成功率:
- 呼叫完成:>95%
- 订阅者数据查找:>99%
- HLR查找:>98%
- OCS授权:>99%(不包括合法的无信用)
- Diameter对等体正常运行时间:>99.9%
媒体质量:
- MOS分数:>4.0
- 音频质量百分比:>80%
- 抖动:<30ms
- 数据包丢失率:<1%
系统资源:
- Erlang进程数量:<50% 的限制
- Erlang内存使用:<70% 的可用内存
- 调度器运行队列:<5
- ETS表:<1000
容量规划
每台服务器的容量(推荐最大值):
- 并发呼叫:500-1000(取决于硬件)
- 每秒呼叫:20-50 CPS
- 注册的订阅者:10,000-50,000
扩展指标(当添加容量时):
- 活动呼叫持续>70% 的容量
- Erlang进程数量>70% 的限制
- P95延迟恶化
- 调度器运行队列持续>10
最佳实践
监控策略
-
为不同受众设置仪表板:
- 操作仪表板:呼叫量、成功率、系统健康
- 工程仪表板:延迟百分位、错误率、资源使用
- 高管仪表板:高层KPI、正常运行时间、成本指标
-
在多个级别配置警报:
- 关键:页面值班(系统故障,重大故障)
- 高:在工作时间内警报(性能下降)
- 警告:在票务系统中跟踪(潜在问题)
-
使用适当的时间范围:
- 实时监控:5分钟窗口
- 故障排除:15分钟到1小时窗口
- 容量规划:每日/每周汇总
-
关注用户影响:
- 优先考虑端到端延迟指标
- 跟踪成功率而不是单个错误计数器
- 监控媒体质量以提升用户体验
查询性能
- 为常用查询使用记录规则:
groups:
- name: ims_as_aggregations
interval: 30s
rules:
- record: job:call_attempts:rate5m
expr: rate(call_attempts_total[5m])
- record: job:dialplan_latency:p95
expr: histogram_quantile(0.95, rate(http_dialplan_request_duration_milliseconds_bucket[5m]))
-
在查询中避免高基数标签(例如,不按电话号码分组)
-
使用适当的速率间隔:
- 短期趋势:
[5m] - 中期趋势:
[1h] - 长期趋势:
[1d]
- 短期趋势:
指标基数
监控基数以防止Prometheus性能问题:
# 检查指标基数
count by (__name__) ({__name__=~".+"})
高基数风险:
- 每个呼叫具有唯一值的标签(电话号码、呼叫ID)
- 无界标签值
- 标签具有>1000个唯一值
解决方案:
- 使用标签进行分类,而不是唯一标识符
- 在外部系统中��合高基数数据
- 使用记录规则进行预聚合