用 Alertmanager 把告警送出去
目标
通过亲手发送告警,确认 Prometheus 生成的告警经过 Alertmanager 后, 如何被分流、分组和抑制。
为什么重要
告警设计有两个失败方向:告警太多,以至于无人查看;或者没有告警,导致错过故障。 两者都会产生相同结果——告警失去信任。
因此需要路由、分组和抑制。当一个根因产生二十条告警时, 人不会逐条阅读全部二十条。一个抑制规则就能把它们减少为一条。
步骤
- 启动 Alertmanager
- 按 severity 划分路由 →
/etc/alertmanager.yml - 定义两个 receiver
- 设置 critical 抑制 warning 的规则
- 使用
amtool check-config检查并应用 - 使用
amtool alert add直接推送告警 - 尝试设置 silence
- 为告警添加 runbook 链接
参考
- 已预先为
amtool配置/root/.config/amtool/config.yml,因此无需指定--alertmanager.url,直接执行amtool alert即可。 amtool check-config只检查语法。请使用amtool config routes test severity=critical确认路由是否符合预期。- 修改配置后,需要重新启动 Alertmanager 才会生效。
启动 Alertmanager
启动 Alertmanager
使用 lab-start-alertmanager 启动。lab-status 中 9093 应显示为 [O]。Prometheus 配置中已经设定了 alertmanagers 目标。
编写路由树
按 severity 划分路由 → /etc/alertmanager.yml
修改 /etc/alertmanager.yml。在 route 下通过 routes 将 severity=critical 和 severity=warning 分开,发送到不同的 receiver。critical 的 group_wait 设置得短一些,warning 设置得长一些——这样可以优先通知紧急事项。
定义两个 receiver
定义两个 receiver
在 receivers 列表中至少放置两个 receiver。不需要真实的发送目的地——只有名称的 receiver 也是有效配置。这里学习的不是“发送到哪里”,而是“根据什么进行分流”。
抑制规则
设置 critical 抑制 warning 的规则
添加 inhibit_rules。当同一目标触发 critical 时,抑制 warning。需要 source_matchers、target_matchers、equal 三项;equal 定义了什么是“同一目标”——如果遗漏它,无关告警也会被一并压制。
检查配置
使用 amtool check-config 检查并应用
使用 amtool check-config /etc/alertmanager.yml 检查。通过后,重新启动 Alertmanager(pkill alertmanager; lab-start-alertmanager)以应用配置。
直接推送一条告警
使用 amtool alert add 直接推送告警
使用 amtool 创建一条告警:amtool alert add TestAlert severity=critical service=shop-api。然后用 amtool alert 确认是否已经到达。
设置 silence
尝试设置 silence
使用 amtool silence add alertname=TestAlert -d 1h -c '점검 중' 暂时将其静默。通过 amtool silence query 进行确认。维护期间使用 silence 而不是关闭告警,维护结束后告警会自动恢复——不会发生关闭后忘记重新开启的事故。
为告警添加 runbook 链接
为告警添加 runbook 链接
在 /etc/prometheus/rules/slo.yml 的告警中添加 annotations.runbook_url。凌晨 3 点被叫醒的人需要的不是“出了什么问题”,而是“应该做什么”。使用 promtool 检查后再 reload。