如何配置Prometheus告警使其仅支持手动解除(集成PagerDuty)
实现Prometheus告警手动解除(阻止自动恢复)的几种方案
针对你需要部分告警触发后不自动解除、需手动操作的需求,以下是几种可行的实现方式:
方案一:通过Alertmanager配置阻止恢复通知(推荐)
核心思路是让Alertmanager不给PagerDuty发送告警恢复的resolved事件,这样PagerDuty中的告警事件会保持激活状态,必须手动关闭。
步骤:
- 给目标告警添加专属标签
在Prometheus的告警规则中,为需要手动解除的告警添加一个自定义标签(比如manual_resolve: "true"),用于后续Alertmanager的路由匹配:
groups: - name: critical_alerts rules: - alert: DatabaseConnectionFailure expr: up{job="database"} == 0 for: 5m labels: severity: critical manual_resolve: "true" # 标记该告警需手动解除 annotations: summary: "Database {{ $labels.instance }} is down"
- 配置Alertmanager路由规则
在Alertmanager的config.yml中,新增一条路由规则,匹配上述标签并设置send_resolved: false,同时指向PagerDuty接收器:
route: group_by: ['alertname', 'severity'] group_wait: 30s group_interval: 5m repeat_interval: 1h receiver: 'default-pagerduty' # 针对手动解除告警的路由 routes: - match: manual_resolve: "true" receiver: 'manual-pagerduty' send_resolved: false # 禁止发送恢复通知 receivers: - name: 'default-pagerduty' pagerduty_configs: - service_key: 'your-default-pd-service-key' - name: 'manual-pagerduty' pagerduty_configs: - service_key: 'your-pd-service-key' # 可复用默认服务密钥,也可单独配置
配置完成后,带有manual_resolve: "true"标签的告警触发后,即使Prometheus检测到条件恢复,Alertmanager也不会向PagerDuty发送关闭信号,必须在PagerDuty中手动关闭事件。
方案二:在PagerDuty端配置忽略自动恢复事件
如果不想改动Prometheus/Alertmanager的配置,可以直接在PagerDuty的服务规则中设置,忽略来自Alertmanager的恢复事件:
- 登录PagerDuty,进入目标服务的管理页面;
- 找到「Event Rules」(事件规则)选项;
- 添加一条规则:匹配包含
status: resolved的事件 payload,且匹配目标告警的名称/标签,将规则动作设置为「Suppress」(抑制)或「Do Nothing」,阻止自动关闭事件。
这种方式无需后端配置变更,但需要精准匹配恢复事件的特征,适合快速临时调整。
方案三:使用Prometheus静默(Silences)手动管控
对于临时需要手动解除的场景,可以在告警触发后,手动创建永久静默,阻止Prometheus继续发送该告警的通知,直到手动删除静默:
通过amtool命令创建永久静默:
amtool silence add --alertname=DatabaseConnectionFailure --duration=forever --comment="Manual resolve required"
或者直接在Prometheus UI的「Silences」页面创建。
注意:这种方式会让该告警不再触发任何通知,适合特定临时场景,不建议作为长期方案。
内容的提问来源于stack exchange,提问作者user389955
相关产品推荐
相关产品推荐

