AlertManager介绍
概述
- Prometheus对指标的收集、存储同告警能力分属于Prometheus Server和AlertManager两个独立的组件组成,前者仅仅负责基于告警规则生成告警通知,具体的告警操作则由后者完成
- AlertManager负责处理由客户端发来的告警通知
- 客户端通常是Prometheus Server,但也支持来自其他工具的告警
- AlertManageer对告警通知进行分组、去重后根据路由规则将其路由到不同的receiver,如email、企业微信、钉钉等
AlertManager机制
分组(Grouping)
分组机制可以将详细的告警信息合并成一个通知,这样的话假如系统宕机导致大量的告警被同时触发,那么就可以将这些被处罚的告警合并为一个告警通知,避免一次性接受大量的告警通知,而无法对问题进行快速定位
例如,当集群中有数百个正在运行的服务实例,并且为每一个实例设置了告警规则,假如此时发生了网络故障,可能导致大量的服务实例无法连接到数据库,那么这些数百个告警就都会发送到Altermanger,但是用户只希望在一个通知中就能看到是哪些服务实例受到了影响,这时候就可以按照服务所在的集群或者告警名称对告警进行分组,而将这些告警内聚在一起成为一个通知
告警分组,告警时间,以及告警的接受方式可以通过Alertmanager的配置文件进行配置
抑制(Inhibition)
抑制是指当某一告警发出后,可以停止重复发送由此告警引发的其他告警的机制
例如,当集群不可访问时触发了一次告警,通过配置Alertmanager可以忽略与集群有关的其他所有告警,这样可以避免接收到大量与实际问题无关的告警通知
抑制机制同样通过Alertmanager的配置文件进行设置
静默(Silences)
在一个特定的时间窗口内,接收到告警通知,Alertmanager也不会真正向用户发送告警行为,静默提供了一个简单的机制可以快速根据标签对告警进行静默处理,如果接收到的告警符合静默的配置,则Altermanager就不会发送告警通知
静默设置需要再Altermanager的Web页面上进行设置
告警过程
在Prometheus上定义告警规则生成告警通知
在AlertManager上定义路由规则,将收到的告警通知按需分别进行处理
在AlertManger上定义receiver,他们是能够基于某个媒介接收告警信息的特定用户
- 使用Prometheus Server端通过静态或者动态配置去拉取(pull)被监控主机上的监控指标数据
- 基于
PromQL
对这些已经存储在本地存储HDD/SSD
的TSDB
中的指标定义阈值警报规则(Rules) - Prometheus根据配置的参数周期性的对警报规则进行计算, 如果满足警报条件,生产一条警报信息
- 将报警信息推送到 Alertmanager 组件
- Alertmanager 收到警报信息之后,会对警告信息进行处理,进行分组(Group)并将它们通过定义好的路由(Routing)规则转到正确的接收器(receiver), 比如
Email、Slack、钉钉、企业微信
等 - 最终异常事件
Warning
、Error
通知给定义好的接收人
AlertManger部署
- 下载二进制包并解压
[root@server1 ~]# wget https://github.com/prometheus/alertmanager/releases/download/v0.21.0/alertmanager-0.21.0.linux-amd64.tar.gz
[root@server1 ~]# tar -zxvf alertmanager-0.21.0.linux-amd64.tar.gz -C /data/
[root@server1 ~]# cd /data/
[root@server1 data]# ln -sv alertmanager-0.21.0.linux-amd64 alertmanager
[root@server1 data]# chown -R root:root alertmanager-0.21.0.linux-amd64
- 默认配置文件介绍
[root@server1 alertmanager]# vim alertmanager.yml
global: # 全局配置模块
resolve_timeout: 5m # 用于设置处理超时时间,默认五分钟
route: # 路由配置模块
group_by: ['alertname'] # 告警分组
group_wait: 10s # 10s内收到的同组告警在同一条告警通知中发送出去
group_interval: 10s # 同组之间发送告警通知的时间间隔
repeat_interval: 1h # 如果指定时间内没有修复,发送重复告警
receiver: 'web.hook' # 使用的接收器名称
receivers: # 接收器配置模块
- name: 'web.hook' # 定义接收器名称
webhook_configs: # 设置webhook地址
- url: 'http://127.0.0.1:5001/'
inhibit_rules: # 告警抑制功能模块
- source_match: # 源
severity: 'critical' # 当存在源标签告警触发时,含有目标标签的告警就不会触发
target_match: # 目标
severity: 'warning'
equal: ['alertname', 'dev', 'instance'] # 保证该配置下标签内容相同才会被抑制
QQ邮箱告警
- 修改alertmanager配置文件,启动服务
[root@server1 alertmanager]# vim alertmanager.yml
global:
resolve_timeout: 5m
smtp_from: '453048472@qq.com' # 邮件发送方
smtp_smarthost: 'smtp.qq.com:465'
smtp_auth_username: '453048472@qq.com'
smtp_auth_password: 'imimsnfnhxlzbgfa'
smtp_require_tls: false
smtp_hello: 'qq.com'
route:
group_by: ['alertname']
group_wait: 5s
group_interval: 5s
repeat_interval: 5m
receiver: 'email'
receivers:
- name: 'email'
email_configs:
- to: '3519713648@qq.com' # 邮件接收方
send_resolved: true # 是否故障恢复后发送邮件
inhibit_rules:
- source_match:
severity: 'critical'
target_match:
severity: 'warning'
equal: ['alertname', 'dev', 'instance']
[root@server1 alertmanager]# ./alertmanager
- 修改Prometheus配置文件
[root@server1 prometheus]# vim prometheus.yml
global:
scrape_interval: 15s
evaluation_interval: 15s
alerting: # 告警配置
alertmanagers:
- static_configs:
- targets:
- 192.168.31.10:9093 # 配置IP地址
rule_files:
- "/data/prometheus/rules/*.yml" # 设置规则文件的路径
scrape_configs:
- job_name: 'prometheus'
static_configs:
- targets: ['localhost:9090']
- job_name: 'node_exporter'
static_configs:
- targets: ['192.168.31.20:9100']
- job_name: 'mysqld_exporter'
scrape_interval: 10s
static_configs:
- targets: ['192.168.31.20:9104']
- job_name: 'Alertmanager' # 新增一个Alertmanager静态Job配置
static_configs:
- targets: ['192.168.31.10:9093'] # Alertmanager组件的端口号是9093
- 创建告警规则文件
[root@server1 prometheus]# mkdir rules
[root@server1 prometheus]# cd rules/
[root@server1 rules]# vim rules.yml
groups:
- name: up
rules:
- alert: node # 警报的名称
expr: up{job="node_exporter"} == 0 # 要评估的PromQL表达式
for: 1m # 评估等待时间,可选参数,用于表示在触发告警之前expr中表达式必须为true时持续的时间长度
labels: # 为每个警报添加或覆盖的标签
severity: critical
annotations: # 要添加到每个警报的注释
description: "Node has been down for more than 1 minutes"
summary: "Node down"
- 启动Prometheus服务
[root@server1 prometheus]# ./prometheus
- 进入Web UI界面查看规则
Status >> Rules
- 然后停止掉192.168.31.20的node_exporter的服务,查看是否进行了QQ邮箱告警
- 在Alter一栏进行查看,反复刷新,会发现状态变化为INACTIVE→ PENDING → FIRING
- INACTIVE:没有满足触发条件,告警未激活状态
- PENDING:已满足触发条件,但未满足告警持续时间的状态
- FIRING:已满足触发条件且已经超过for子句中指定的持续时间时的状态
- 查看QQ邮箱中的信息
如果故障修复了,还会发送故障已修复的邮件,可以在
alertmanager.yml
配置文件中设置