如何配置Prometheus自身宕机告警并推送至Slack渠道
现有配置问题排查
- YAML语法错误:
match字段下的alertname未做缩进,YAML语法校验会直接失败,Alertmanager无法加载配置 - 参数重复冲突:顶层路由和子路由重复定义
group_wait/group_interval/repeat_interval,会导致路由逻辑异常 - 接收器配置缺失:
slack接收器未配置Slack webhook地址、推送渠道等必填参数,根本无法发送消息 - 逻辑缺陷:当前配置没有解决Prometheus自身宕机时无法主动上报告警的核心问题,且DeadMansSwitch(看门狗)路由逻辑错误,仅将心跳转发到cloudwatch,没有做心跳超时告警的兜底逻辑
正确实现方案
架构前提
监控Prometheus自身宕机不能依赖被监控的Prometheus实例本身(实例宕机后无法主动采集、推送告警),必须满足以下两个条件之一:
- 部署一套独立于业务Prometheus的监控链路(独立Prometheus + 独立Alertmanager),专门探测业务Prometheus的存活状态
- 部署blackbox_exporter做独立黑盒探测,绕过业务Prometheus的采集链路直接探活
第一步:配置Prometheus侧告警规则
在Prometheus加载的规则文件中添加以下两组规则,分别实现看门狗心跳、实例存活检测:
groups: - name: prometheus_self_monitor rules: # 看门狗心跳:Prometheus正常运行时会持续触发该告警,用于判断Prometheus是否在线 - alert: DeadMansSwitch expr: vector(1) for: 0m labels: severity: critical annotations: summary: "Prometheus 运行心跳" # 同集群内Prometheus实例存活检测 - alert: PrometheusDown expr: up{job="prometheus"} == 0 for: 1m labels: severity: critical annotations: summary: "Prometheus 实例失联" description: "实例 {{ $labels.instance }} 已无法正常采集指标超过1分钟"
规则配置完成后执行promtool check rules 你的规则文件路径校验语法,重载Prometheus配置生效。
第二步:修复Alertmanager配置
替换原有错误配置为以下内容,注意替换Slack相关的自定义参数:
global: resolve_timeout: 5m # 替换为你自己的Slack Incoming Webhook 地址 slack_api_url: "https://hooks.slack.com/services/XXX/XXX/XXX" route: receiver: "slack" group_by: ['severity', 'alertname'] group_wait: 30s group_interval: 1m repeat_interval: 48h routes: - receiver: "cloudwatch" match: alertname: DeadMansSwitch # 心跳每分钟上报一次到cloudwatch做链路存活性校验 repeat_interval: 1m receivers: - name: "cloudwatch" webhook_configs: - url: "http://alertmanager-cloudwatch-webhook/webhook" - name: "slack" slack_configs: - channel: "#ops-alerts" # 替换为你实际接收告警的Slack频道 send_resolved: true title: "[{{ .Status | toUpper }}] {{ .CommonLabels.alertname }}" text: "{{ range .Alerts }}{{ .Annotations.summary }}\n{{ .Annotations.description }}{{ end }}"
配置完成后执行amtool check-config alertmanager.yml校验语法,重载Alertmanager配置生效。
第三步:配置宕机兜底告警(核心)
为了避免Prometheus完全宕机时无法上报告警,需要在独立部署的监控Prometheus上添加以下规则,通过检测Alertmanager收到的心跳判断业务Prometheus是否存活:
- alert: PrometheusDead expr: absent(alertmanager_alerts{alertname="DeadMansSwitch", job="alertmanager"} == 1) for: 2m labels: severity: critical annotations: summary: "Prometheus 已完全宕机" description: "连续2分钟未收到Prometheus上报的看门狗心跳,疑似服务完全不可用"
如果没有独立监控链路,也可以部署blackbox_exporter,通过tcp/http探测Prometheus的/-/healthy端点,探测失败超过2分钟触发Slack告警。
验证方法
- 执行配置校验命令,确认Prometheus和Alertmanager无配置语法错误
- 手动停止Prometheus进程,等待2-3分钟,确认Slack频道收到对应宕机告警
- 重启Prometheus进程,确认Slack收到告警恢复通知
内容的提问来源于stack exchange,提问作者Suraj
相关产品推荐
相关产品推荐

