Prometheus AlertManager讲解
创始人
2025-05-29 08:00:04
0

一、概述

Prometheus 包含一个报警模块,就是我们的 AlertManager,Alertmanager 主要用于接收 Prometheus 发送的告警信息,它支持丰富的告警通知渠道,而且很容易做到告警信息进行去重,降噪,分组等,是一款前卫的告警通知系统。
  • GitHub地址:https://github.com/prometheus/alertmanager/

  • 官方文档:https://prometheus.io/docs/alerting/latest/alertmanager/

  • 关于Prometheus整体介绍,可以参考我这篇文章:Prometheus原理详解

  • Prometheus和Pushgetway的安装,可以参考我这篇文章:【云原生】Prometheus Pushgetway讲解与实战操作

二、AlertManager 架构

Alertmanager由以下6部分组成:

  • API组件——用于接收Prometheus Server的http请求,主要是告警相关的内容。

  • Alert Provider组件——API层将来自Prometheus Server的告警信息存储到Alert Provider上。

  • Dispatcher组件——不断的通过订阅的方式从Alert Provider获取新的告警,并根据yaml配置的routing tree将告警通过label路由到不同的分组中,以实现告警信息的分组处理。

  • Notification Pipeline组件——这是一个责任链模式的组件,它通过一系列的逻辑(抑制、静默、去重)来优化告警质量。

  • Silence Provider组件——API层将来自prometheus server的告警信息存储到silence provider上,然后由这个组件实现去重逻辑处理。

  • Notify Provider组件——是Silence Provider组件的下游,会在本地记录日志,并通过peers的方式将日志广播给集群中的其他节点,判断当前节点自身或者集群中其他节点是否已经发送过了,避免告警信息在集群中重复出现。

三、AlertManager 部署

下载地址:https://prometheus.io/download/

1)下载

wget https://github.com/prometheus/alertmanager/releases/download/v0.24.0/alertmanager-0.24.0.linux-amd64.tar.gztar -xf alertmanager-0.24.0.linux-amd64.tar.gz

2)配置

global:resolve_timeout: 5mroute:group_by: ['alertname']group_wait: 30sgroup_interval: 5mrepeat_interval: 1hreceiver: 'web.hook'
receivers:- name: 'web.hook'webhook_configs:- url: 'http://127.0.0.1:5001/'
inhibit_rules:- source_match:severity: 'critical'target_match:severity: 'warning'equal: ['alertname', 'dev', 'instance']

Alertmanager配置中一般会包含以下几个主要部分:

  • 全局配置(global):用于定义一些全局的公共参数,如全局的SMTP配置,Slack配置等内容。

  • 模板(templates):用于定义告警通知时的模板,如HTML模板,邮件模板等。

  • 告警路由(route):根据标签匹配,确定当前告警应该如何处理。

  • 接收人(receivers):接收人是一个抽象的概念,它可以是一个邮箱也可以是微信,Slack或者Webhook等,接收人一般配合告警路由使用。

  • 抑制规则(inhibit_rules):合理设置抑制规则可以减少垃圾告警的产生。

具体字段解释:

  • global 这个是全局设置

  • resolve_timeout 当告警的状态有firing变为resolve的以后还要呆多长时间,才宣布告警解除。这个主要是解决某些监控指标在阀值边缘上波动,一会儿好一会儿不好。

  • route 是个重点,告警内容从这里进入,寻找自己应该用那种策略发送出去。

  • receiver 一级的receiver,也就是默认的receiver,当告警进来后没有找到任何子节点和自己匹配,就用这个receiver。

  • group_by 告警应该根据那些标签进行分组。

  • group_wait 同一组的告警发出前要等待多少秒,这个是为了把更多的告警一个批次发出去。

  • group_interval 同一组的多批次告警间隔多少秒后,才能发出。

  • repeat_interval 重复的告警要等待多久后才能再次发出去。

  • routes 也就是子节点了,配置项和上面一样。告警会一层层的找,如果匹配到一层,并且这层的continue选项为true,那么他会再往下找,如果下层节点不能匹配那么他就用区配的这一层的配置发送告警。如果匹配到一层,并且这层的continue选项为false,那么他会直接用这一层的配置发送告警,就不往下找了。

  • match_re 用于匹配label。此处列出的所有label都匹配到才算匹配。

  • inhibit_rules这个叫做抑制项,通过匹配源告警来抑制目的告警。比如说当我们的主机挂了,可能引起主机上的服务,数据库,中间件等一些告警,假如说后续的这些告警相对来说没有意义,我们可以用抑制项这个功能,让Prometheus只发出主机挂了的告警。

  • source_match 根据label匹配源告警。

  • target_match 根据label匹配目的告警。

  • equal 此处的集合的label,在源和目的里的值必须相等。如果该集合的内的值再源和目的里都没有,那么目的告警也会被抑制。

3)启动服务

# 查看帮助./alertmanager -h# 可以直接启动,但是不提倡,最好配置alertmanager.service./alertmanager

配置alertmanager.service启动脚本

 默认端口9093
cat >/usr/lib/systemd/system/alertmanager.service<

启动服务

# 执行 systemctl daemon-reload 命令重新加载systemd
systemctl daemon-reload
# 启动
systemctl start alertmanager
# 检查
systemctl status alertmanager
netstat -tnlp|grep :9093
ps -ef|grep alertmanager

web访问:http://ip:9093

4)与Prometheus集成

修改Prometheus的配置文件,修改配置如下:

重启Prometheus

systemctl restart prometheus

四、在Prometheus中设置告警规则

在Prometheus 配置中添加报警规则配置,配置文件中 rule_files 就是用来指定报警规则文件的,如下配置即指定存放报警规则的目录为/etc/prometheus,规则文件为rules.yml:

rule_files:- /etc/prometheus/rules.yml

设置报警规则:

警报规则允许基于 Prometheus 表达式语言的表达式来定义报警报条件的,并在触发警报时发送通知给外部的接收者(Alertmanager),一条警报规则主要由以下几部分组成:
  • alert——告警规则的名称。

  • expr——是用于进行报警规则 PromQL 查询语句。

  • for——评估告警的等待时间(Pending Duration)。

  • labels——自定义标签,允许用户指定额外的标签列表,把它们附加在告警上。

  • annotations——用于存储一些额外的信息,用于报警信息的展示之类的。

rules.yml如下所示:

groups:
- name: examplerules:- alert: high_memory# 当内存占有率超过10%,持续1min,则触发告警expr: 100 - ((node_memory_MemAvailable_bytes{instance="192.168.182.110:9100",job="node_exporter"} * 100) / node_memory_MemTotal_bytes{instance="192.168.182.110:9100",job="node_exporter"}) > 90for: 1mlabels:severity: pageannotations:summary: spike memeory

五、AlertManager 告警通道配置

## Alertmanager 配置文件
global:resolve_timeout: 5m# smtp配置smtp_from: "xxx@qq.com"smtp_smarthost: 'smtp.qq.com:465'smtp_auth_username: "xxx@qq.com"smtp_auth_password: "auth_pass"smtp_require_tls: true# email、企业微信的模板配置存放位置,钉钉的模板会单独讲如果配置。
templates:- '/data/alertmanager/templates/*.tmpl'
# 路由分组
route:receiver: opsgroup_wait: 30s # 在组内等待所配置的时间,如果同组内,30秒内出现相同报警,在一个组内出现。group_interval: 5m # 如果组内内容不变化,合并为一条警报信息,5m后发送。repeat_interval: 24h # 发送报警间隔,如果指定时间内没有修复,则重新发送报警。group_by: [alertname]  # 报警分组routes:- match:team: operationsgroup_by: [env,dc]receiver: 'ops'- match_re:service: nginx|apachereceiver: 'web'- match_re:service: hbase|sparkreceiver: 'hadoop'- match_re:service: mysql|mongodbreceiver: 'db'
# 接收器
# 抑制测试配置- receiver: opsgroup_wait: 10smatch:status: 'High'
# ops- receiver: ops # 路由和标签,根据match来指定发送目标,如果 rule的lable 包含 alertname, 使用 ops 来发送group_wait: 10smatch:team: operations
# web- receiver: db # 路由和标签,根据match来指定发送目标,如果 rule的lable 包含 alertname, 使用 db 来发送group_wait: 10smatch:team: db
# 接收器指定发送人以及发送渠道
receivers:
# ops分组的定义
- name: opsemail_configs:- to: '9935226@qq.com,10000@qq.com'send_resolved: trueheaders:subject: "[operations] 报警邮件"from: "警报中心"to: "小煜狼皇"# 钉钉配置webhook_configs:- url: http://localhost:8070/dingtalk/ops/send# 企业微信配置wechat_configs:- corp_id: 'ww5421dksajhdasjkhj'api_url: 'https://qyapi.weixin.qq.com/cgi-bin/'send_resolved: trueto_party: '2'agent_id: '1000002'api_secret: 'Tm1kkEE3RGqVhv5hO-khdakjsdkjsahjkdksahjkdsahkj'# web
- name: webemail_configs:- to: '9935226@qq.com'send_resolved: trueheaders: { Subject: "[web] 报警邮件"} # 接收邮件的标题webhook_configs:- url: http://localhost:8070/dingtalk/web/send- url: http://localhost:8070/dingtalk/ops/send
# db
- name: dbemail_configs:- to: '9935226@qq.com'send_resolved: trueheaders: { Subject: "[db] 报警邮件"} # 接收邮件的标题webhook_configs:- url: http://localhost:8070/dingtalk/db/send- url: http://localhost:8070/dingtalk/ops/send
# hadoop
- name: hadoopemail_configs:- to: '9935226@qq.com'send_resolved: trueheaders: { Subject: "[hadoop] 报警邮件"} # 接收邮件的标题webhook_configs:- url: http://localhost:8070/dingtalk/hadoop/send- url: http://localhost:8070/dingtalk/ops/send# 抑制器配置
inhibit_rules: # 抑制规则- source_match: # 源标签警报触发时抑制含有目标标签的警报,在当前警报匹配 status: 'High'status: 'High'  # 此处的抑制匹配一定在最上面的route中配置不然,会提示找不key。target_match:status: 'Warning' # 目标标签值正则匹配,可以是正则表达式如: ".*MySQL.*"equal: ['alertname','operations', 'instance'] # 确保这个配置下的标签内容相同才会抑制,也就是说警报中必须有这三个标签值才会被抑制。

一般企业钉钉、邮件、webhook告警通道比较常用,尤其是webhook,一般都会通过webhook对接公司内部的统一告警平台。

相关内容

热门资讯

熵_相对熵_散度 1 信息量 意外越大,越不可能发生,概率就越小,信息量也就...
张家界旅游攻略最佳攻略:玩透张... 张家界旅游攻略最佳攻略:玩透张家界就看这篇! 大家好!我是小李,刚从张家界回来,必须和大家分享我的...
暑假带娃玩转西北畅玩小团|青甘... ✨**带娃畅玩西北,青甘环线轻松搞定!跟着阿洁出发,体验不一样的大美风光!**✨ 我这次暑假带着孩子...
想带父母去四川旅游6天5晚要多... 想带父母去四川旅游6天5晚要多少钱?带父母去四川旅游该怎么玩?看驴友怎么玩 四川,那片充满魅力和生机...
黄山提供一站式的咨询攻略!黄山... 黄山提供一站式的咨询攻略!黄山旅行社4日游尊享版多少钱? 黄山,位于安徽省南部黄山市境内,它不仅仅是...
自驾一小时直达!在济南南部山区... 图源|小红书:荒野之鹿 当山溪漫过脚踝卷走夏日的燥热,待篝火将吉他染成橙红,所有被城市折叠的自由都会...
市区藏绝美湿地公园!日落白鹭齐... 在城市的喧嚣中,总有一些地方像隐秘的宝石,静静等待着被发现。位于市区的一处湿地公园,便是这样一片令人...
第三届衡阳市旅游发展大会主题口... 第三届衡阳市旅游发展大会主题口号、形象标识(LOGO)评选结果公布 为全力办好第三届衡阳市旅游发展大...
潮汕三天两夜旅游多少钱,潮汕三... 潮汕地区,这片充满文化底蕴与独特魅力的土地,一直以来都是众多游客向往的旅游胜地。它不仅有着悠久的历史...
人到山西好风光 青春“晋”行时... 5月27-28日,山西省文旅厅走进山东大学、中国石油大学(华东)开展进校园主题推介活动,吸引山东学子...
旅游小镇票务系统解决方案分享:... 宜良九乡旅游小镇,坐落于云南省昆明市宜良县,是一个令人心驰神往的旅游胜地。这里融合了丛林奇观、古人类...
原创 7... 近日,曾志伟和谭咏麟一起在日本旅行的消息吸引了众多网友的关注。大家纷纷羡慕他们几十年的深厚友谊,但鲜...
土耳其旅游促进和发展局连续第三... 5月27日,2025 ITB上海国际旅游交易博览会(ITB China)在上海世博展览馆盛大启幕。 ...
重庆多个水上乐园开浪!粽香里冲... 本周末 我们即将迎来端午节与儿童节的奇妙邂逅 跟节日一样让人期待的夏日限定快乐 —— 水上乐园🌊 ...
和姐妹去黄山旅游五天需要多少钱... 黄山,这座被誉为“天下第一奇山”的名山,以其奇松、怪石、云海、温泉四绝闻名于世。一直以来,它都是我心...
北京旅游五天四晚大概要多少钱?... 北京,这座古老与现代交织的城市,承载着千年的历史与文化。从宏伟壮观的故宫到繁华热闹的王府井,从静谧幽...
惠州市惠阳区淡水哪个桑拿酒店服... 在惠州市惠阳区淡水,桑拿酒店众多,每一家都宣称自己服务优质131。对于渴望在忙碌生活中寻得放松与享受...
渔湾景区打造非遗数字文旅新标杆 夜幕降临,连云港渔湾景区珍珠瀑布前,1600℃的铁水被击向夜空,瞬间化作漫天金色星雨。游客的惊叹声未...