尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

Alertmanager告警治理:分组抑制路由与生产级配置实战

Alertmanager告警治理:分组抑制路由与生产级配置实战 1. 项目概述为什么警报管理不能只靠Grafana点个“告警开关”就完事你搭好了Prometheus抓指标、Grafana画图表看着CPU曲线起起伏伏心里踏实了别急——这就像给汽车装了转速表和水温表但没装机油报警灯。当服务器内存突然飙到98%、磁盘只剩200MB、API响应延迟突破5秒Grafana界面上那个红色闪烁的“告警面板”根本不会自动打电话给你也不会发微信、钉钉、邮件更不会在你睡觉时把你摇醒。它只是安静地躺在那里等你第二天早上打开浏览器才发现服务已经挂了6小时订单丢了372单日志里堆满了ERROR。这就是为什么标题里明确写着“使用Alertmanager进行警报管理”而不是“用Grafana配置告警规则”。Grafana的告警功能本质是“触发器通知通道”的简易组合它能判断“当前值阈值”也能调用Webhook发消息但它不处理告警的生命周期不合并重复告警、不抑制无关告警、不按时间窗口去重、不支持静默、不提供告警分组与路由策略、更无法实现多级升级比如白天发钉钉深夜发短信电话。这些不是锦上添花的功能而是生产环境告警系统存活的底线。我去年接手一个电商后台监控重构项目前任直接在Grafana里配了27条告警规则每条都连着企业微信机器人。结果大促当晚支付网关延迟告警每15秒触发一次企业微信被刷屏437条运维同事手机被震到发烫最后手动关掉所有通知——而真正致命的数据库连接池耗尽告警因为被淹没在信息洪流里没人看到。后来我们把整套告警逻辑迁移到Alertmanager用group_by: [alertname, instance]把同一台机器的多个告警聚合成一条用group_wait: 30s等30秒看有没有新告警进来再发用repeat_interval: 4h防止反复骚扰再配上inhibit_rules让“主机宕机”告警自动抑制其上所有服务告警……当晚告警总量从437条降到11条关键告警100%触达故障定位时间缩短68%。所以这不是“Grafana Prometheus Alertmanager”三件套的简单拼接而是一次告警治理的范式升级Prometheus负责“发现异常”Grafana负责“可视化诊断”Alertmanager则专职“告警决策与投递”。它像一个冷静的值班经理不慌不忙地审阅每一份告警报告决定谁该立刻上报、谁该合并处理、谁该暂时压下、谁该升级通报。你今天花2小时配好Alertmanager未来半年省下的不是配置时间而是半夜爬起来救火的体力、误判告警导致的焦虑以及因告警疲劳而关闭整个通知系统的巨大风险。2. 核心设计思路Alertmanager不是“另一个告警工具”而是告警流水线的中枢控制器很多人把Alertmanager当成Prometheus的“告警插件”装上就行配几个邮箱就完事。这是最大的认知偏差。Alertmanager的设计哲学本质上是在解决一个经典分布式系统问题如何在高并发、高噪声、多维度的告警事件流中做出低误报、高可操作、可追溯的决策。它的架构不是线性的“Prometheus → Alertmanager → 邮箱”而是一个带状态、有策略、可编排的告警处理流水线。理解这一点才能避开90%的配置陷阱。2.1 告警生命周期的四个阶段Alertmanager管哪一段Prometheus的告警规则alerting_rules.yml只负责第一阶段检测Detection。它周期性执行PromQL查询当结果非空时生成一条原始告警Alert附带标签如{alertnameHighMemoryUsage, instance10.0.1.23:9100, severitywarning}。这个原始告警会被推送到Alertmanager的/api/v1/alerts接口从此进入Alertmanager的管辖范围。Alertmanager接管后依次执行以下三阶段分组Grouping把语义相近的告警聚合成一个“告警组”。比如同一台服务器的CPU、内存、磁盘告警如果都标记了instance10.0.1.23:9100就可以按group_by: [instance]归为一组。这避免了“一台机器崩了你收到3条告警”的情况。分组不是简单合并而是基于标签匹配的逻辑聚合group_by: [alertname, job]和group_by: [job]产生的分组效果天差地别。抑制Inhibition主动压制某些告警防止告警风暴。典型场景当alertnameInstanceDown触发时自动抑制该实例上所有其他告警如HighCPUUsage、HighNetworkLatency因为根源是机器宕机修好机器其他告警自然消失。这需要精确的inhibit_rules配置规则匹配条件必须严格否则可能误抑制关键告警。路由与通知Routing Notification这是最复杂的部分。Alertmanager不是把所有告警一股脑发给所有人而是像邮局分拣信件一样根据告警标签severity,team,service等匹配预定义的路由树routing tree决定这条告警该发给谁、用什么方式发、是否需要等待、是否要重复发送。一个路由节点可以配置receiver接收人、group_wait组内等待时间、group_interval组间间隔、repeat_interval重复间隔还能嵌套子路由实现精细控制。提示Alertmanager的路由树是“最长匹配优先”。如果你配置了route:根路由又在下面加了- match: {severity: critical}的子路由那么所有severitycritical的告警会优先进入子路由处理其余告警走根路由。这个机制决定了告警流向务必画草图理清路径。2.2 为什么必须独立部署Alertmanager它和Prometheus的耦合度有多低Prometheus官方文档明确建议Alertmanager应作为独立服务部署而非与Prometheus进程捆绑。原因有三资源隔离告警处理尤其是大量告警涌入时的分组、抑制计算是CPU密集型任务。如果和Prometheus共用进程可能拖慢指标采集与查询性能。我们实测过在单核VM上运行PrometheusAlertmanager当告警速率超过50条/秒时Prometheus的scrape_duration_seconds指标明显升高影响数据准确性。高可用设计Alertmanager支持集群模式--cluster.peer多个实例通过Gossip协议同步告警状态实现故障自动转移。如果Alertmanager和Prometheus绑在一起一个Prometheus挂了它的Alertmanager也跟着挂告警能力直接归零。而独立部署的Alertmanager集群即使一个节点宕机其他节点仍能正常收告警、做决策、发通知。配置热更新Alertmanager支持SIGHUP信号或/-/reload端点热重载配置。这意味着你修改了alertmanager.yml里的路由规则无需重启服务新规则立即生效。而Prometheus的告警规则alert.rules)虽然也能热加载但Alertmanager的配置变更频率通常更高比如临时静默、调整分组策略独立部署让运维更灵活。注意Prometheus和Alertmanager之间是“推送”关系Prometheus主动POST告警到Alertmanager不是“拉取”。因此确保Prometheus的alerting.alertmanagers配置项指向的是Alertmanager集群的任意一个健康节点的地址而非负载均衡器VIP除非LB支持会话保持否则可能导致告警状态不一致。2.3 Alertmanager的核心配置文件结构一张图看懂alertmanager.ymlalertmanager.yml是整个告警系统的“宪法”它定义了告警如何被分组、抑制、路由和通知。其结构分为四大块缺一不可配置区块关键字段作用说明实操要点globalresolve_timeout,smtp_from,smtp_smarthost全局默认参数如告警自动恢复超时时间、邮件发件人、SMTP服务器resolve_timeout建议设为3-5分钟太短会导致短暂抖动就被标记为“已恢复”太长则延迟确认routereceiver,group_by,group_wait,group_interval,repeat_interval,match,match_re定义告警路由树的根节点及匹配规则group_by必须包含alertname否则不同告警类型会被错误分组match_re用于正则匹配如service: ^(backendreceiversname,email_configs,webhook_configs,wechat_configs,slack_configs定义具体的“通知渠道”及其参数每个receiver可配置多种通知方式如一个receiver同时含email_configs和webhook_configs告警会并行发送inhibit_rulessource_match,target_match,equal定义抑制规则即“当A发生时抑制B”equal字段指定哪些标签值必须相等才能触发抑制如equal: [instance]表示源告警和目标告警的instance标签值必须相同这张表不是死记硬背的清单而是你每次修改配置前必须对照检查的 checklist。我见过太多人只改了receivers里的邮箱密码却忘了route里receiver字段还指向旧的name结果告警石沉大海。或者inhibit_rules里equal: [job]写成了equal: [job]多了引号导致抑制失效。配置即代码严谨性就是告警系统的生命线。3. 核心细节解析从零开始构建一个生产级Alertmanager配置光知道概念没用得亲手把它跑起来。下面以Ubuntu 22.04服务器为例从下载二进制到上线运行全程无Docker、无K8s纯本地部署确保你能在任何Linux环境复现。所有命令、配置、路径均经过实测参数选择均有依据。3.1 下载、解压与基础启动三步验证服务可达性Alertmanager官方发布页https://github.com/prometheus/alertmanager/releases提供各平台二进制包。我们选择最新稳定版截至2024年v0.27.0# 创建专用目录 sudo mkdir -p /opt/alertmanager cd /opt/alertmanager # 下载并解压注意替换为实际最新版本号 sudo wget https://github.com/prometheus/alertmanager/releases/download/v0.27.0/alertmanager-0.27.0.linux-amd64.tar.gz sudo tar -xzf alertmanager-0.27.0.linux-amd64.tar.gz --strip-components1 # 验证二进制可执行 sudo ./alertmanager --version # 输出应为alertmanager, version 0.27.0 (...)此时你可以用默认配置快速启动验证服务是否监听# 后台启动仅测试生产环境用systemd sudo nohup ./alertmanager --config.filealertmanager.yml --web.listen-address:9093 /var/log/alertmanager.log 21 访问http://your-server-ip:9093应该看到Alertmanager的Web UI首页顶部显示“Silences”、“Alerts”、“Status”等菜单。这证明服务已成功启动。但此时它没有任何配置告警来了也会被丢弃。下一步才是真正的配置攻坚。3.2 编写生产级alertmanager.yml从模板到实战的逐行解读下面是一个经过我们线上环境验证的alertmanager.yml它覆盖了95%的常见需求。我会对每一行做“为什么这么写”的深度解释而不是简单罗列。# global 区块全局默认设置 global: # 告警自动恢复的超时时间。当Prometheus发送一个resolved状态的告警时 # Alertmanager会等待此时间若期间没收到新的 firing告警则标记为已解决。 # 设为3m是平衡灵敏度与稳定性太短如30s易受网络抖动影响太长如10m延迟确认。 resolve_timeout: 3m # 邮件通知的全局参数。这里只设发件人和SMTP服务器具体收件人放在receiver里。 smtp_from: alert-systemyourcompany.com smtp_smarthost: smtp.qiye.qq.com:465 # 企业微信SMTP465端口需TLS smtp_auth_username: alert-systemyourcompany.com smtp_auth_password: your_app_password # 注意此处必须是SMTP应用专用密码非邮箱登录密码 smtp_require_tls: true # route 区块告警路由树的根节点 route: # 默认接收人。所有未被子路由匹配的告警都会走到这里。 receiver: default-receiver # 分组依据。必须包含alertname否则不同类型的告警如CPU和磁盘会被混在一起。 # 这里按alertname和instance分组意味着同一台机器的同类型告警才合并。 group_by: [alertname, instance] # 组内等待时间收到第一条告警后等待30秒看是否有同组的其他告警进来再一起发。 # 30s是经验值短于15s可能来不及聚合长于60s用户感知延迟过大。 group_wait: 30s # 组间间隔上一组告警发出后同一组相同标签的下一条告警至少等待5分钟才发。 # 防止同一问题反复刷屏。5m足够覆盖大多数瞬时抖动。 group_interval: 5m # 重复间隔如果告警持续处于firing状态每隔4小时重复发送一次提醒。 # 避免值班人员遗忘又不至于过于频繁。critical告警可单独设为1hwarning设为12h。 repeat_interval: 4h # 子路由匹配severitycritical的告警走紧急通道 routes: - match: severity: critical # 紧急告警立即发送不等待且发给oncall轮值表 receiver: oncall-critical # 紧急告警组内等待设为0收到即发 group_wait: 0s # 紧急告警重复间隔设为1小时确保及时跟进 repeat_interval: 1h # 子路由匹配teambackend的告警路由给后端团队 - match: team: backend receiver: backend-team # 后端团队有自己的分组策略按service和alertname分组 group_by: [alertname, service] # receivers 区块定义具体的接收人及其通知方式 receivers: - name: default-receiver # 邮件通知发给运维组公共邮箱 email_configs: - to: opsyourcompany.com # 邮件主题模板清晰标识告警级别和名称 headers: Subject: [AlertManager] {{ .CommonLabels.severity | toUpper }}: {{ .CommonLabels.alertname }} - name: oncall-critical # 紧急告警同时发邮件企业微信Webhook对接内部IM email_configs: - to: oncallyourcompany.com headers: Subject: [CRITICAL] {{ .CommonLabels.alertname }} on {{ .CommonLabels.instance }} # 企业微信通知需提前在企业微信后台创建自建应用获取AgentId和Secret wechat_configs: - corp_id: wwxxxxxxxxxxxxxx # 企业ID api_url: https://qyapi.weixin.qq.com/cgi-bin/ # 企业微信API基础URL auth_secret: your_app_secret # 应用Secret agent_id: 1000001 # 应用AgentId to_party: 2 # 接收部门ID如“运维部” message: {{ template wechat.default.message . }} - name: backend-team # 后端团队主要用Webhook发到内部IM如钉钉机器人 webhook_configs: - url: https://oapi.dingtalk.com/robot/send?access_tokenxxx # 钉钉机器人Webhook地址 send_resolved: true # 告警恢复时也发通知 http_config: # 钉钉要求HTTPS且需设置User-Agent tls_config: insecure_skip_verify: false bearer_token: # 钉钉Webhook无需token留空即可 # inhibit_rules 区块抑制规则减少噪音 inhibit_rules: # 规则1当主机宕机InstanceDown时抑制该主机上所有其他告警 - source_match: alertname: InstanceDown target_match: severity: warning # 只有当源告警和目标告警的instance标签值完全相同时才触发抑制 equal: [instance] # 规则2当整个K8s集群不可用KubernetesDown时抑制所有Pod相关的告警 - source_match: alertname: KubernetesDown target_match_re: alertname: ^(KubePod.*|KubeNode.*)$ # 正则匹配所有Pod和Node告警 equal: [job]这份配置的关键细节远不止表面看到的smtp_auth_password的安全处理生产环境绝不能明文写在配置文件里。正确做法是使用环境变量smtp_auth_password: {{ $value : getenv ALERTMANAGER_SMTP_PASSWORD }}{{ if $value }}{{ $value }}{{ else }}{{ fail ALERTMANAGER_SMTP_PASSWORD not set }}{{ end }}然后启动时ALERTMANAGER_SMTP_PASSWORDxxx ./alertmanager ...。wechat_configs的message模板{{ template wechat.default.message . }}引用的是Alertmanager内置模板。你也可以自定义模板放在单独的templates/目录用--template.filestemplates/*.tmpl加载实现更丰富的格式如添加图表链接、跳转到Grafana面板。inhibit_rules的target_match_re正则表达式必须用target_match_re不能用target_match。后者只支持精确匹配前者才支持正则。这是新手常踩的坑。3.3 Prometheus端联动配置让告警从源头就带上正确标签Alertmanager的路由和抑制全靠告警的标签labels驱动。而这些标签90%来自Prometheus的告警规则文件alerts.yml。所以告警规则的编写质量直接决定了Alertmanager能否精准工作。一个典型的、带丰富标签的告警规则如下groups: - name: server-alerts rules: # 主机宕机告警这是抑制规则的“源” - alert: InstanceDown expr: up{jobnode} 0 for: 2m labels: severity: critical team: infra service: node-exporter annotations: summary: Instance {{ $labels.instance }} down description: {{ $labels.instance }} of job {{ $labels.job }} has been down for more than 2 minutes. # 高内存使用告警这是可能被抑制的“目标” - alert: HighMemoryUsage expr: 100 - (avg by(instance) (irate(node_memory_MemAvailable_bytes[5m])) * 100 / avg by(instance) (node_memory_MemTotal_bytes)) 90 for: 5m labels: severity: warning team: infra service: node-exporter # 关键必须有instance标签才能和InstanceDown告警的instance匹配触发抑制 annotations: summary: High memory usage on {{ $labels.instance }} description: Memory usage is above 90% for more than 5 minutes.这里有几个硬性要求for子句必须存在它定义了告警“持续多久才真正触发”。没有for瞬时抖动就会发告警噪音极大。for: 2m表示连续2分钟满足条件才firing。labels里必须包含severity、team、service等路由所需字段。severity是路由分叉的核心依据team和service是match的常用键。instance标签必须存在且准确这是inhibit_rules中equal: [instance]的匹配基础。up{jobnode}这个指标天然带有instance标签所以没问题。但如果你用count by(job) (up)这种聚合instance标签就丢失了抑制规则将失效。annotations里的summary和description会原样传给Alertmanager并最终出现在邮件/Webhook内容里。写得越清晰一线同学处理越快。3.4 systemd服务化与权限加固让Alertmanager像操作系统服务一样可靠裸奔的nohup进程重启服务器就没了也不符合生产环境规范。必须用systemd管理# 创建systemd服务文件 sudo tee /etc/systemd/system/alertmanager.service EOF [Unit] DescriptionAlertmanager Service Wantsnetwork-online.target Afternetwork-online.target [Service] Typesimple Userprometheus Groupprometheus # 工作目录确保配置文件路径正确 WorkingDirectory/opt/alertmanager # 启动命令指定配置文件和监听地址 ExecStart/opt/alertmanager/alertmanager \ --config.file/opt/alertmanager/alertmanager.yml \ --storage.path/var/lib/alertmanager \ --web.listen-address:9093 \ --web.external-urlhttp://your-server-ip:9093 \ --cluster.advertise-address0.0.0.0:9094 # 重启策略 Restartalways RestartSec10 # 环境变量用于smtp密码等敏感信息 EnvironmentALERTMANAGER_SMTP_PASSWORDyour_real_password [Install] WantedBymulti-user.target EOF # 创建数据目录并授权 sudo mkdir -p /var/lib/alertmanager sudo chown -R prometheus:prometheus /var/lib/alertmanager /opt/alertmanager # 重载systemd并启动 sudo systemctl daemon-reload sudo systemctl enable alertmanager sudo systemctl start alertmanager # 检查状态 sudo systemctl status alertmanager # 应显示 active (running)关键加固点专用用户创建prometheus用户sudo useradd --no-create-home --shell /bin/false prometheus避免root运行最小权限原则。数据目录分离--storage.path指向/var/lib/alertmanager这是Alertmanager存储告警状态、静默记录的地方必须有写权限。--web.external-url这个参数至关重要。当Alertmanager生成邮件中的“查看详情”链接时它会用这个URL拼接。如果不设链接会是http://localhost:9093/...点击打不开。设为你的公网IP或域名。--cluster.advertise-address为后续集群模式预留监听9094端口用于节点间通信。4. 实操过程与核心环节实现一次完整的告警链路验证与调试配置写完了不代表就万事大吉。必须亲手触发一条告警从Prometheus到Alertmanager再到你的邮箱/微信全程跟踪才能确认每个环节都畅通无阻。这是上线前的必经步骤。4.1 构建可验证的测试告警用node_exporter模拟真实场景我们不用修改生产规则而是创建一个独立的、只用于测试的告警规则文件test-alerts.ymlgroups: - name: test-alerts rules: - alert: TestAlertForValidation expr: vector(1) # 永远返回1永远firing用于测试 for: 10s # 10秒后就触发快速验证 labels: severity: warning team: test service: validation instance: test-server annotations: summary: Test alert for Alertmanager validation description: This is a test alert. Please check if it reaches your notification channel.将此文件放入Prometheus的rules目录如/opt/prometheus/rules/test-alerts.yml并在Prometheus主配置prometheus.yml中引入rule_files: - rules/alerts.yml - rules/test-alerts.yml # 新增这一行然后向Prometheus发送SIGHUP重载配置sudo kill -SIGHUP $(pgrep -f prometheus.*--config.file)稍等10秒访问Prometheus的Alerts页面http://your-prometheus-ip:9090/alerts你应该能看到TestAlertForValidation处于FIRING状态。这就完成了第一步告警已从Prometheus发出。4.2 在Alertmanager UI中追踪告警流转从“Received”到“Notified”打开Alertmanager Web UI (http://your-alertmanager-ip:9093)点击顶部菜单的Alerts。你应该能看到一条TestAlertForValidation告警状态为active。点击它进入详情页。这里的关键信息Status显示active表示Alertmanager已收到并正在处理。Labels显示你配置的所有标签{alertnameTestAlertForValidation, instancetest-server, ...}确认标签传递无误。Silence旁边有个Silence按钮点击可为这条告警创建静默这是日常运维的利器。Details展开后能看到Source来自哪个Prometheus、Fingerprint告警唯一ID、Starts At触发时间。现在等待约30秒group_wait时间再去http://your-alertmanager-ip:9093/#/status点击Status找到Configuration部分确认alertmanager.yml已加载。再回到Alerts页这条告警应该消失了——因为它已被分组并发送出去了。4.3 验证通知渠道检查邮箱、微信、Webhook的实际到达邮箱检查opsyourcompany.com邮箱应该收到一封主题为[AlertManager] WARNING: TestAlertForValidation的邮件。邮件正文应包含summary和description以及一个指向Alertmanager告警详情页的链接。企业微信打开企业微信进入“运维部”群应该看到一条由“告警系统”机器人发送的消息内容与邮件一致。钉钉Webhook如果配置了钉钉同样会在对应群聊中看到消息。提示如果通知没收到先不要慌。Alertmanager的日志是第一手线索。执行sudo journalctl -u alertmanager -f实时查看日志。常见错误Failed to send notification to email: dial tcp: lookup smtp.qiye.qq.com: no such hostDNS解析失败检查服务器网络和DNS配置。Failed to send notification to webhook: Post https://oapi.dingtalk.com/...: x509: certificate signed by unknown authority钉钉证书问题需在webhook_configs中添加tls_config: {insecure_skip_verify: true}仅测试环境。Notify attempt failed: context deadline exceeded网络超时检查防火墙是否放行了出站465/443端口。4.4 静态静默Silence与动态静默两种场景下的实操技巧静默不是“关掉告警”而是“临时屏蔽特定条件的告警”是运维的必备技能。静态静默Static Silence适用于计划内维护。比如你今晚要重启数据库提前2小时创建一个静默匹配{servicemysql, severitycritical}这样期间所有MySQL相关告警都不会发出。创建路径Alertmanager UI →Silences→New Silence→ 填写匹配器、开始/结束时间、备注。动态静默Dynamic Silence适用于突发问题。比如某台服务器10.0.1.23出现硬件故障你希望所有关于它的告警都静默直到维修完成。这时你可以在New Silence的匹配器中填{instance10.0.1.23}并勾选Continue matching resolved alerts持续匹配已恢复的告警这样即使告警状态变为resolved静默依然有效避免维修过程中反复收到“已恢复”通知。实操心得静默的ends at时间一定要比维护窗口多留30分钟。我曾因精确卡在维护结束时间导致最后5分钟的告警漏发被老板追问。另外静默创建后务必在UI的Silences列表里确认其状态为active而不是pending未生效或expired已过期。5. 常见问题与排查技巧实录那些文档里不会写的血泪教训再完美的配置在真实世界里也会遇到各种“意料之外”。以下是我在多个项目中踩过的坑以及对应的排查心法全是真金白银的经验。5.1 告警“发了但没收到”三层排查法这是最高频的问题。不要一上来就怀疑邮箱服务商按以下顺序排查Alertmanager层sudo journalctl -u alertmanager -n 100 --no-pager | grep -i notify\|error。重点看是否有Notify attempt failed或Failed to send notification。如果有错误信息会直接告诉你失败原因如SMTP认证失败、Webhook超时。网络层从Alertmanager服务器执行telnet smtp.qiye.qq.com 465或curl -v https://oapi.dingtalk.com/...。如果连接超时说明服务器出站网络不通检查iptables/firewalld规则、云厂商安全组。接收端层检查邮箱的垃圾邮件文件夹、企业微信/钉钉机器人的“消息发送记录”后台可查、Webhook URL是否被对方服务限流。曾有一个案例钉钉机器人每天限额100条我们配置了repeat_interval: 1h结果100个告警同时触发第101条开始全部失败日志里只显示HTTP 429需要联系钉钉客服提升额度。5.2 告警“不该发却发了”抑制规则失效的三大元凶抑制规则写得再漂亮也可能失效。罪魁祸首通常是标签不匹配inhibit_rules里的equal: [instance]要求源告警和目标告警的instance标签值完全一致。但如果源告警InstanceDown的instance是10.0.1.23:9100而目标告警HighMemoryUsage的instance是10.0.1.23端口被省略它们就不相等。解决方案在告警规则里统一instance格式或用target_match_re配合正则。路由树错位抑制规则只对进入同一路由节点的告警生效。如果InstanceDown被路由到oncall-critical而HighMemoryUsage被路由到default-receiver它们根本不在同一个处理上下文中抑制自然无效。解决方案确保需要抑制的告警其match条件最终都落到同一个route节点下。for时间未满足抑制规则只对firing状态的告警生效。如果InstanceDown告警刚触发for时间还没到它还是pending状态抑制规则不会触发。解决方案for时间设得合理如InstanceDown设为1m或接受短暂的噪音。5.3 Grafana告警面板与Alertmanager的“双轨制”陷阱很多团队会同时用Grafana和Alertmanager发告警以为是双重保险。这是危险的误区。Grafana告警和Alertmanager告警是两条完全独立的流水线Grafana告警由Grafana Server执行基于面板查询结果触发后直接调用通知渠道。Alertmanager告警由Prometheus生成推送给Alertmanager再由Alertmanager决策。如果两者配置了相同的告警条件如都监控100 - (avg by(instance) (irate(node_memory_MemAvailable_bytes[5m])) * 100 / avg by(instance) (node_memory_MemTotal_bytes)) 90就会造成告警重复。而且Grafana的告警无法享受Alertmanager的分组、抑制、静默等高级功能。我的建议彻底停用Grafana的告警功能只用它做可视化和诊断。所有告警逻辑统一收口到Prometheus的alerts.yml由Alertmanager统一处理。这样告警策略集中管理审计清晰运维同学只需关注一个配置源。5.4 Alertmanager集群脑裂Split-Brain的识别与修复当部署多个Alertmanager节点组成集群时如果网络分区发生节点间Gossip通信中断就可能出现脑裂两个节点都认为自己是“主”各自处理告警
返回列表