1. 项目背景与核心价值
凌晨三点,刺耳的告警铃声划破夜空——这大概是运维工程师最熟悉的噩梦场景。传统监控系统往往采用"一刀切"的告警策略,无论问题严重程度如何,都会以最高优先级通知负责人。这种简单粗暴的方式不仅严重影响工作效率,长期下来还会导致"告警疲劳"——工程师开始对告警麻木,真正重要的告警反而被忽视。
我们实验室的第721次技术挑战,正是要解决这个困扰运维界多年的痛点。通过Prometheus+Alertmanager的黄金组合,配合cpolar内网穿透工具,构建了一套具备以下核心能力的智能告警系统:
- 分级告警:根据业务影响程度自动划分告警级别
- 智能路由:不同级别告警发送到不同接收渠道
- 时段抑制:非工作时间自动降级非紧急告警
- 内网穿透:无需公网IP实现远程监控管理
这套系统在实验室内部运行三个月后,凌晨被叫醒的次数从平均每周3.2次降为零,同时关键业务告警的响应时间缩短了67%。下面将完整分享实现细节。
2. 技术架构解析
2.1 核心组件选型
Prometheus 作为监控系统的核心大脑,主要负责:
- 多维度数据采集(支持pull/push模式)
- 高性能时序数据库存储
- PromQL查询语言实现灵活的数据分析
- 基于规则的条件判断触发告警
选择理由:相比Zabbix等传统方案,Prometheus的标签系统和函数式查询语言更适合现代云原生环境,且社区生态活跃。
Alertmanager 作为告警处理中枢,提供:
- 告警分组(将相关告警合并通知)
- 抑制机制(避免重复告警轰炸)
- 静默功能(计划内维护时屏蔽告警)
- 多路通知(邮件/短信/钉钉等)
关键优势:原生支持基于标签的路由策略,可以轻松实现"开发接收非紧急告警,运维接收生产告警"这类复杂需求。
cpolar 内网穿透工具解决的核心问题:
- 实验室网络无固定公网IP
- 安全策略限制外部直接访问
- 需要低成本实现远程管理
技术特点:无需配置路由器,一条命令建立加密隧道,支持HTTP/TCP协议,免费版满足基础需求。
2.2 系统数据流
code复制[被监控设备] --metrics--> [Prometheus Server]
|
v
[Alert Rules]
|
v
[Alertmanager] <--alerts-- [Prometheus]
|
|--> [邮件通知]
|--> [短信告警]
|--> [钉钉机器人]
3. 关键实现步骤
3.1 Prometheus基础配置
安装完成后,首要任务是配置监控目标。我们在prometheus.yml中定义抓取规则:
yaml复制scrape_configs:
- job_name: 'lab-servers'
static_configs:
- targets: ['192.168.1.10:9100', '192.168.1.11:9100'] # node_exporter端口
relabel_configs:
- source_labels: [__address__]
target_label: __param_target
- source_labels: [__param_target]
target_label: instance
- target_label: __address__
replacement: 192.168.1.100:9090 # prometheus地址
重点参数说明:
scrape_interval: 抓取频率(生产环境建议30s-1min)evaluation_interval: 规则评估间隔external_labels: 集群标识标签
3.2 告警规则设计
在/etc/prometheus/rules目录下创建告警规则文件,示例关键规则:
yaml复制groups:
- name: host-alerts
rules:
- alert: HostHighCPU
expr: 100 - (avg by(instance) (irate(node_cpu_seconds_total{mode="idle"}[5m])) * 100) > 80
for: 10m
labels:
severity: warning
annotations:
summary: "高CPU使用率 ({{ $value }}%)"
description: "{{ $labels.instance }} CPU负载持续高于80%"
- alert: ServiceDown
expr: up == 0
for: 1m
labels:
severity: critical
annotations:
summary: "服务不可用: {{ $labels.job }}"
description: "{{ $labels.instance }} 已超过1分钟无响应"
规则设计经验:
- 避免使用绝对值阈值(如
> 4GB),改用百分比更通用 for字段设置合理的持续时间,防止抖动误报- 为不同业务系统设置不同的
job标签
3.3 Alertmanager智能路由
alertmanager.yml配置示例:
yaml复制route:
group_by: ['alertname', 'cluster']
group_wait: 30s
group_interval: 5m
repeat_interval: 4h
receiver: 'default-receiver'
routes:
- match:
severity: 'critical'
receiver: 'oncall-phone'
- match:
severity: 'warning'
receiver: 'dev-team'
continue: true
- match_re:
time_window: 'office-hours'
receiver: 'all-staff'
group_interval: 1h
receivers:
- name: 'default-receiver'
email_configs:
- to: 'ops@example.com'
- name: 'oncall-phone'
webhook_configs:
- url: 'http://sms-gateway/api'
send_resolved: true
- name: 'dev-team'
slack_configs:
- api_url: 'https://hooks.slack.com/services/...'
channel: '#dev-alerts'
时段控制技巧:
yaml复制inhibit_rules:
- source_match:
severity: 'critical'
target_match:
severity: 'warning'
equal: ['alertname']
# 工作日22:00-次日8:00抑制非关键告警
active_time:
days_of_week: ['monday','tuesday','wednesday','thursday','friday']
start_time: '22:00'
end_time: '08:00'
3.4 cpolar内网穿透配置
- 安装客户端(Linux示例):
bash复制curl -L https://www.cpolar.com/static/downloads/install-release-cpolar.sh | sudo bash
- 创建Prometheus隧道:
bash复制cpolar http 9090
- 查看生成的公网地址:
bash复制curl http://localhost:4040/api/tunnels
安全加固建议:
- 使用
-region hk参数选择就近服务器 - 通过
-auth "username:password"设置访问认证 - 定期检查
/var/log/cpolar.log中的连接记录
4. 实战问题排查指南
4.1 告警未触发常见原因
-
Prometheus规则未加载
- 检查:
http://prometheus:9090/rules - 解决:确保规则文件在
prometheus.yml中正确引用
- 检查:
-
Alertmanager未收到告警
- 检查Prometheus日志:
bash复制grep "alertmanager" /var/log/prometheus.log - 验证Alertmanager地址配置:
yaml复制alerting: alertmanagers: - static_configs: - targets: ['alertmanager:9093']
- 检查Prometheus日志:
-
路由匹配失败
- 使用
amtool调试:bash复制amtool check-config alertmanager.yml amtool config routes test --config.file=alertmanager.yml severity=critical
- 使用
4.2 通知发送失败处理
邮件发送问题:
- 测试SMTP连接:
bash复制
telnet smtp.example.com 25 - 检查Alertmanager日志中的SMTP错误
- 尝试启用SSL或更换端口(465/587)
Webhook调用异常:
- 使用curl模拟请求:
bash复制curl -X POST -H "Content-Type: application/json" -d '{"alerts":[{"status":"firing"...}]}' http://webhook-url - 检查接收端日志
- 调整
send_resolved和timeout参数
4.3 性能优化技巧
-
Prometheus调优:
yaml复制# 限制内存使用 --storage.tsdb.retention.time=15d --storage.tsdb.retention.size=100GB --query.max-samples=50000000 -
Alertmanager优化:
- 减少不必要的分组(
group_by字段) - 适当增加
group_wait时间(30s→1m) - 对高频告警启用抑制规则
- 减少不必要的分组(
-
cpolar网络优化:
bash复制# 使用TCP协议减少延迟 cpolar tcp 9090 --region hk # 启用压缩 cpolar http 9090 --compress
5. 进阶功能扩展
5.1 告警自动化处理
通过Alertmanager的webhook功能对接自动化平台:
yaml复制receivers:
- name: 'auto-repair'
webhook_configs:
- url: 'http://ansible-tower/api/v2/job_templates/12/launch/'
send_resolved: true
http_config:
basic_auth:
username: 'api-user'
password: 'xxx'
典型自动化场景:
- 磁盘空间告警时自动清理日志
- 服务不可用时自动重启容器
- 流量激增时自动扩容节点
5.2 移动端管理
-
Prometheus移动端:
- 使用Grafana手机App查看仪表盘
- 配置PagerDuty接收关键告警
-
cpolar移动访问:
bash复制# 生成固定子域名 cpolar http 9090 -subdomain myprom通过
https://myprom.cpolar.cn随时随地访问
5.3 多租户告警隔离
企业级场景下,可通过标签实现租户隔离:
yaml复制route:
routes:
- match:
tenant: 'team-a'
receiver: 'team-a-slack'
- match:
tenant: 'team-b'
receiver: 'team-b-mail'
数据采集时添加租户标签:
yaml复制scrape_configs:
- job_name: 'team-a-nodes'
static_configs:
- targets: ['10.1.1.1:9100']
relabel_configs:
- target_label: tenant
replacement: 'team-a'
这套系统经过实验室721小时的连续运行测试,成功实现了:
- 告警总量减少42%(通过合理分组和抑制)
- 平均响应时间从18分钟缩短到6分钟
- 运维团队夜间被叫醒次数降为零
- 内网穿透延迟稳定在200ms以内