跳到主要内容

监控和指标指南

SMPP网关监控的完整参考

概述

SMPP网关以Prometheus格式公开指标,用于监控连接健康、消息吞吐量和系统性能。

关键:由于网关是无状态的,并依赖于OmniMessage Core,OmniMessage连接性是最重要的监控指标。请监控以下两项:

  1. SMPP网关指标 - 协议级健康
  2. OmniMessage API指标 - 后端连接性和健康

指标端点

URLhttp://your-server:4000/metrics

格式:Prometheus文本格式

访问:默认对localhost开放(配置防火墙以进行远程访问)

快速测试

curl http://localhost:4000/metrics

可用指标

所有指标都以smpp_为前缀,并包含用于识别的标签。

许可证指标

omnimessage_smpp_license_status

类型:Gauge
描述:当前许可证状态

  • 1 = 有效许可证
  • 0 = 无效/过期许可证

标签:无

示例

omnimessage_smpp_license_status 1

用途

  • 当值为0时发出警报(无效许可���)
  • 当许可证无效时,出站队列处理停止,但SMPP绑定保持连接
  • Web UI仍然可访问以进行故障排除

产品名称omnimessage_smpp

备注

  • 当许可证无效(license_status == 0)时,网关停止处理出站队列
  • SMPP绑定(客户端和服务器)保持连接并接受绑定请求
  • 入站消息仍然被接收但不被处理
  • 无论许可证状态如何,UI和监控仍然可访问

警报示例

- alert: SMPP_License_Invalid
expr: omnimessage_smpp_license_status == 0
for: 1m
labels:
severity: critical
annotations:
summary: "SMPP网关许可证无效或过期"
description: "许可证状态无效 - 出站消息处理被阻止"

连接状态指标

smpp_connection_status

类型:Gauge
描述:SMPP绑定的当前连接状态

  • 1 = 已连接
  • 0 = 已断开

标签

  • bind_name - 连接名称(例如,“vodafone_uk”)
  • mode - 连接类型(“client”或“server”)
  • host - 远程主机(仅客户端模式)
  • port - 远程端口(仅客户端模式)
  • bind_type - SMPP绑定类型(仅客户端模式)
  • system_id - 使用的系统ID

示例

smpp_connection_status{bind_name="vodafone_uk",mode="client",host="smpp.vodafone.co.uk",port="2775",bind_type="transceiver",system_id="user1"} 1

用途

  • 当值为0时发出警报(已断开)
  • 跟踪连接正常运行时间百分比
  • 监控重新连接频率

消息计数器

smpp_messages_sent_total

类型:Counter
描述:通过SMPP绑定发送的消息总数
单位:消息

标签:与connection_status相同

示例

smpp_messages_sent_total{bind_name="vodafone_uk",mode="client",...} 150234

用途

  • 计算消息速率(消息/秒)
  • 跟踪每日/月度量
  • 比较实际与预期吞吐量

smpp_messages_received_total

类型:Counter
描述:通过SMPP绑定接收的消息总数
单位:消息

标签:与connection_status相同

示例

smpp_messages_received_total{bind_name="partner_acme",mode="server",...} 45123

用途

  • 监控入站消息量
  • 跟踪移动发起(MO)流量
  • 对意外的流量变化发出警报

投递指标

smpp_delivery_failures_total

类型:Counter
描述:消息投递失败的总数
单位:失败

标签:与connection_status相同

示例

smpp_delivery_failures_total{bind_name="vodafone_uk",mode="client",...} 234

用途

  • 计算投递成功率
  • 对高失败率发出警报
  • 识别问题连接

成功率计算

success_rate = (messages_sent - delivery_failures) / messages_sent * 100

绑定操作指标

smpp_bind_success_total

类型:Counter
描述:成功绑定操作的总数
单位:绑定尝试

示例

smpp_bind_success_total{bind_name="vodafone_uk",...} 45

用途

  • 跟踪绑定稳定性
  • 监控身份验证成功

smpp_bind_failures_total

类型:Counter
描述:绑定操作失败的总数
单位:绑定尝试

示例

smpp_bind_failures_total{bind_name="vodafone_uk",...} 3

用途

  • 对身份验证失败发出警报
  • 识别凭据问题
  • 跟踪运营商连接问题

连接事件指标

smpp_connection_attempts_total

类型:Counter
描述:连接尝试的总数
单位:尝试

示例

smpp_connection_attempts_total{bind_name="vodafone_uk",...} 48

用途

  • 跟踪连接流失
  • 监控重新连接频率

smpp_disconnection_total

类型:Counter
描述:断开的总数
单位:断开

示例

smpp_disconnection_total{bind_name="vodafone_uk",...} 3

用途

  • 对频繁断开发出警报
  • 识别网络问题
  • 跟踪连接稳定性

查询链指标

类型:Counter
描述:发送的查询链PDU总数,用于验证连接的活跃性
单位:PDU

标签:与connection_status相同

示例

smpp_enquire_link_sent_total{bind_name="vodafone_uk",mode="client",...} 1440

用途

  • 跟踪保持活动的活动
  • 与接收的数量进行比较以检测单向故障

类型:Counter
描述:从远程对等方接收的查询链响应PDU总数
单位:PDU

标签:与connection_status相同

示例

smpp_enquire_link_received_total{bind_name="vodafone_uk",mode="client",...} 1438

用途

  • 检测无响应的对等方(发送 >> 接收)
  • 监控连接健康状况,超出简单状态

正常运行时间指标

smpp_uptime_seconds

类型:Gauge
描述:SMPP绑定的当前正常运行时间(以秒为单位)
单位:秒

示例

smpp_uptime_seconds{bind_name="vodafone_uk",...} 86400

用途

  • 跟踪连接稳定性
  • 计算正常运行时间百分比
  • 对最近的重启发出警报

消息缓存指标

这些指标在一个或多个绑定上启用消息缓存时可用。有关缓存配置的详细信息,请参见MESSAGE_CACHE.md

smpp_cache_size

类型:Gauge
描述:每个绑定的本地缓存中当前消息的数量
单位:消息

标签

  • bind_name - 连接名称
  • mode - 连接类型(“client”或“server”)

示例

smpp_cache_size{bind_name="partner_acme",mode="server"} 42

用途

  • 监控缓存利用率
  • 当接近cache_max_size时发出警报

smpp_cache_delivered_total

类型:Counter
描述:成功交付到后端API的缓存消息总数
单位:消息

示例

smpp_cache_delivered_total{bind_name="partner_acme"} 1234

smpp_cache_retry_total

类型:Counter
描述:缓存消息的重试尝试总数
单位:尝试

示例

smpp_cache_retry_total{bind_name="partner_acme"} 56

smpp_cache_permanent_failures_total

类型:Counter
描述:超过最大重试次数并被标记为永久失败的消息总数
单位:消息

示例

smpp_cache_permanent_failures_total{bind_name="partner_acme"} 2

用途

  • 当 > 0 时发出警报(需��手动审核)

smpp_cache_overflow_total

类型:Counter
描述:缓存溢出事件的总数,其中最旧的消息被驱逐以腾出空间
单位:事件

示例

smpp_cache_overflow_total{bind_name="partner_acme"} 0

用途

  • 当增加时发出警报(缓存太小或API中断时间过长)

OmniMessage API健康指标

虽然网关本身公开与SMPP相关的指标,但OmniMessage API健康至关重要。您还应监控:

来自OmniMessage的指标(如果可用)

  • omnimessage_api_requests_total - 从网关发出的API请求总数
  • omnimessage_api_request_duration_seconds - API响应时间
  • omnimessage_queue_depth - OmniMessage队列中待处理的消息

来自网关日志(如果未公开指标)

查找这些模式以检测API问题:

  • "api.*connection refused" - 无法连接到OmniMessage
  • "api.*timeout" - OmniMessage未响应
  • "api.*http 503" - OmniMessage暂时不可用
  • "api.*parse error" - 响应格式问题

Prometheus配置

基本抓取配置

添加到/etc/prometheus/prometheus.yml

scrape_configs:
- job_name: 'omnimessage-smpp'
scrape_interval: 15s
static_configs:
- targets: ['your-server:4000']
labels:
environment: 'production'
service: 'omnimessage-smpp'

多个网关

scrape_configs:
- job_name: 'omnimessage-smpp-instances'
scrape_interval: 15s
static_configs:
- targets:
- 'smpp-gw-1:4000'
- 'smpp-gw-2:4000'
- 'smpp-gw-3:4000'
labels:
environment: 'production'

服务发现

使用基于文件的发现:

scrape_configs:
- job_name: 'omnimessage-smpp-instances'
file_sd_configs:
- files:
- '/etc/prometheus/targets/smpp-*.json'

文件/etc/prometheus/targets/smpp-production.json

[
{
"targets": ["smpp-gw-1:4000", "smpp-gw-2:4000"],
"labels": {
"environment": "production",
"datacenter": "us-east"
}
}
]

Grafana仪表板

示例仪表板面板

连接状态面板

查询

smpp_connection_status{job="omnimessage-smpp"}

可视化:Stat
阈值

  • 红色:值 < 1(已断开)
  • 绿色:值 == 1(已连接)

消息速率面板

查询

rate(smpp_messages_sent_total{job="omnimessage-smpp"}[5m])

可视化:Graph
单位:消息/秒
图例{{bind_name}}

投递成功率面板

查询

100 * (1 - (
rate(smpp_delivery_failures_total{job="omnimessage-smpp"}[5m])
/
rate(smpp_messages_sent_total{job="omnimessage-smpp"}[5m])
))

可视化:Gauge
单位:百分比(0-100)
阈值

  • 红色:< 95%
  • 黄色:95-98%
  • 绿色:> 98%

连接正常运行时间面板

查询

smpp_uptime_seconds{job="omnimessage-smpp"} / 3600

可视化:Stat
单位:小时


警报规则

Prometheus警报规则

保存到/etc/prometheus/rules/smpp-alerts.yml

groups:
- name: smpp_gateway
interval: 30s
rules:
# 连接断开
- alert: SMPPConnectionDown
expr: smpp_connection_status == 0
for: 2m
labels:
severity: critical
annotations:
summary: "SMPP连接{{ $labels.bind_name }}已断开"
description: "连接{{ $labels.bind_name }}已断开超过2分钟。"

# 高失败率
- alert: SMPPHighFailureRate
expr: |
(
rate(smpp_delivery_failures_total[5m])
/
rate(smpp_messages_sent_total[5m])
) > 0.05
for: 5m
labels:
severity: warning
annotations:
summary: "在{{ $labels.bind_name }}上高投递失败率"
description: "投递失败率在{{ $labels.bind_name }}上为{{ $value | humanizePercentage }}。"

# 绑定失败
- alert: SMPPBindFailures
expr: increase(smpp_bind_failures_total[10m]) > 3
labels:
severity: warning
annotations:
summary: "在{{ $labels.bind_name }}上多次绑定失败"
description: "{{ $labels.bind_name }}在过去10分钟内绑定失败{{ $value }}次。"

# 没有消息发送(预期时)
- alert: SMPPNoTraffic
expr: rate(smpp_messages_sent_total[10m]) == 0
for: 30m
labels:
severity: warning
annotations:
summary: "在{{ $labels.bind_name }}上没有消息发送"
description: "{{ $labels.bind_name }}在30分钟内没有发送任何消息。"

# 频繁断开
- alert: SMPPFrequentDisconnections
expr: increase(smpp_disconnection_total[1h]) > 5
labels:
severity: warning
annotations:
summary: "在{{ $labels.bind_name }}上频繁断开"
description: "{{ $labels.bind_name }}在过去一小时内断开{{ $value }}次。"

# OmniMessage API无法访问
- alert: OmniMessageAPIUnreachable
expr: |
count(count_over_time({job="omnimessage-smpp"} |= "api.*connection refused"[5m])) > 0
for: 1m
labels:
severity: critical
annotations:
summary: "OmniMessage API无法访问"
description: "SMPP网关无法访问OmniMessage API。检查API_BASE_URL配置和网络连接。"

# OmniMessage API超时
- alert: OmniMessageAPITimeout
expr: |
count(count_over_time({job="omnimessage-smpp"} |= "api.*timeout"[5m])) > 5
for: 2m
labels:
severity: warning
annotations:
summary: "OmniMessage API超时"
description: "检测到多个API超时。OmniMessage可能很慢或超载。"

# 没有消息流(API问题)
- alert: NoMessageFlow
expr: rate(smpp_messages_sent_total[10m]) == 0 and rate(smpp_messages_received_total[10m]) == 0
for: 30m
labels:
severity: warning
annotations:
summary: "未检测到消息流 - 检查OmniMessage连接性"
description: "30分钟内没有发送或接收任何消息。检查OmniMessage API连接性和队列状态。"

prometheus.yml中加载规则:

rule_files:
- '/etc/prometheus/rules/smpp-alerts.yml'

Web仪表板监控

内置的Web UI提供实时监控,无需Prometheus。

��问

URLhttps://your-server:8087

实时状态页面

导航:SMPP → 实时状态

功能

  • 实时连接状态
  • 消息计数器
  • 连接正常运行时间
  • 手动重连/断开控制
  • 每5秒自动刷新

用途

  • 快速状态检查
  • 手动干预
  • 实时故障排除

实时状态仪表板 - 所有SMPP对等连接和状态的实时视图

仪表板显示:

  • 总绑定:所有客户端和服务器连接的组合计数
  • 客户端绑定:到运营商的出站连接(显示连接/断开计数)
  • 服务器绑定:来自合作伙伴的入站连接(显示活动/等待计数)
  • 服务器监听:入站服务器套接字的配置(主机、端口、最大连接数)

日志监控

系统日志

查看日志

# 实时跟踪日志
sudo journalctl -u omnimessage-smpp -f

# 最近100行
sudo journalctl -u omnimessage-smpp -n 100

# 从特定时间开始
sudo journalctl -u omnimessage-smpp --since "1 hour ago"

# 按级别过滤
sudo journalctl -u omnimessage-smpp -p err

Web UI日志

导航:Web UI中的日志选项卡

功能

  • 实时日志流
  • 按级别过滤(调试、信息、警告、错误)
  • 搜索日志
  • 暂停/恢复
  • 清除日志

系统日志选项卡 - 实时日志查看器,带有级别过滤和搜索

日志视图允许您:

  • 级别过滤:选择日志级别(所有、调试、信息、警告、错误)
  • 搜索:通过文本内容查找特定日志条目
  • 自动滚动:启用/禁用新日志到达时的自动滚动
  • 暂停/恢复:暂停日志更新以查看特定条目
  • 清除:清除所有显示的日志

关键绩效指标(KPI)

连接健康

指标:连接正常运行时间百分比

avg_over_time(smpp_connection_status[24h]) * 100

目标:> 99.9%

消息投递率

指标:每秒投递的消息

rate(smpp_messages_sent_total[5m])

目标:匹配预期量

投递成功率

指标:成功投递的百分比

100 * (1 - rate(smpp_delivery_failures_total[5m]) / rate(smpp_messages_sent_total[5m]))

目标:> 98%

绑定稳定性

指标:每小时绑定尝试

rate(smpp_bind_success_total[1h]) * 3600

目标:< 10每小时(表示连接稳定)


监控最佳实践

1. 设置警报

  • 为关键指标配置Prometheus警报
  • 使用PagerDuty/OpsGenie进行24/7警报
  • 定期测试警报

2. 创建仪表板

  • 为每个网关构建Grafana仪表板
  • 在一个仪表板上包含所有连接
  • 添加容量规划面板

3. 定期审查

  • 每周审查指标
  • 识别趋势和模式
  • 计划容量调整

4. 记录基线

  • 记录正常的消息量
  • 记录预期的TPS速率
  • 注意高峰时间/天

5. 与后端关联

  • 监控后端API指标
  • 跟踪端到端消息流
  • 识别瓶颈

使用指标进行故障排除

连接问题

检查smpp_connection_status

  • 值为0 = 审查日志,检查网络,验证凭据
  • 频繁变化 = 网络不稳定

投递率低

检查smpp_delivery_failures_total

  • 高速率 = 检查运营商状态,审查消息格式
  • 在连接之间进行比较 = 识别问题运营商

吞吐量低

检查smpp_messages_sent_total速率

  • 低于预期 = 检查TPS限制,队列可用性
  • 检查后端API指标

绑定问题

检查smpp_bind_failures_total

  • 增加 = 身份验证问题,凭据问题
  • 检查配置中的system_id和密码

相关文档