AlertManager介绍

概述

  • Prometheus对指标的收集、存储同告警能力分属于Prometheus ServerAlertManager两个独立的组件组成,前者仅仅负责基于告警规则生成告警通知,具体的告警操作则由后者完成
  • AlertManager负责处理由客户端发来的告警通知
    • 客户端通常是Prometheus Server,但也支持来自其他工具的告警
    • AlertManageer对告警通知进行分组、去重后根据路由规则将其路由到不同的receiver,如email、企业微信、钉钉等

Prometheus组件—Alertmanger - 图1

AlertManager机制

分组(Grouping)

分组机制可以将详细的告警信息合并成一个通知,这样的话假如系统宕机导致大量的告警被同时触发,那么就可以将这些被处罚的告警合并为一个告警通知,避免一次性接受大量的告警通知,而无法对问题进行快速定位

例如,当集群中有数百个正在运行的服务实例,并且为每一个实例设置了告警规则,假如此时发生了网络故障,可能导致大量的服务实例无法连接到数据库,那么这些数百个告警就都会发送到Altermanger,但是用户只希望在一个通知中就能看到是哪些服务实例受到了影响,这时候就可以按照服务所在的集群或者告警名称对告警进行分组,而将这些告警内聚在一起成为一个通知

告警分组,告警时间,以及告警的接受方式可以通过Alertmanager的配置文件进行配置

抑制(Inhibition)

抑制是指当某一告警发出后,可以停止重复发送由此告警引发的其他告警的机制

例如,当集群不可访问时触发了一次告警,通过配置Alertmanager可以忽略与集群有关的其他所有告警,这样可以避免接收到大量与实际问题无关的告警通知

抑制机制同样通过Alertmanager的配置文件进行设置

静默(Silences)

在一个特定的时间窗口内,接收到告警通知,Alertmanager也不会真正向用户发送告警行为,静默提供了一个简单的机制可以快速根据标签对告警进行静默处理,如果接收到的告警符合静默的配置,则Altermanager就不会发送告警通知

静默设置需要再Altermanager的Web页面上进行设置

告警过程

在Prometheus上定义告警规则生成告警通知

在AlertManager上定义路由规则,将收到的告警通知按需分别进行处理

在AlertManger上定义receiver,他们是能够基于某个媒介接收告警信息的特定用户

  1. 使用Prometheus Server端通过静态或者动态配置去拉取(pull)被监控主机上的监控指标数据
  2. 基于 PromQL 对这些已经存储在本地存储 HDD/SSDTSDB 中的指标定义阈值警报规则(Rules)
  3. Prometheus根据配置的参数周期性的对警报规则进行计算, 如果满足警报条件,生产一条警报信息
  4. 将报警信息推送到 Alertmanager 组件
  5. Alertmanager 收到警报信息之后,会对警告信息进行处理,进行分组(Group)并将它们通过定义好的路由(Routing)规则转到正确的接收器(receiver), 比如Email、Slack、钉钉、企业微信
  6. 最终异常事件 WarningError通知给定义好的接收人

Prometheus组件—Alertmanger - 图2

AlertManger部署

  • 下载二进制包并解压
  1. [root@server1 ~]# wget https://github.com/prometheus/alertmanager/releases/download/v0.21.0/alertmanager-0.21.0.linux-amd64.tar.gz
  2. [root@server1 ~]# tar -zxvf alertmanager-0.21.0.linux-amd64.tar.gz -C /data/
  3. [root@server1 ~]# cd /data/
  4. [root@server1 data]# ln -sv alertmanager-0.21.0.linux-amd64 alertmanager
  5. [root@server1 data]# chown -R root:root alertmanager-0.21.0.linux-amd64
  • 默认配置文件介绍
  1. [root@server1 alertmanager]# vim alertmanager.yml
  2. global: # 全局配置模块
  3. resolve_timeout: 5m # 用于设置处理超时时间,默认五分钟
  4. route: # 路由配置模块
  5. group_by: ['alertname'] # 告警分组
  6. group_wait: 10s # 10s内收到的同组告警在同一条告警通知中发送出去
  7. group_interval: 10s # 同组之间发送告警通知的时间间隔
  8. repeat_interval: 1h # 如果指定时间内没有修复,发送重复告警
  9. receiver: 'web.hook' # 使用的接收器名称
  10. receivers: # 接收器配置模块
  11. - name: 'web.hook' # 定义接收器名称
  12. webhook_configs: # 设置webhook地址
  13. - url: 'http://127.0.0.1:5001/'
  14. inhibit_rules: # 告警抑制功能模块
  15. - source_match: # 源
  16. severity: 'critical' # 当存在源标签告警触发时,含有目标标签的告警就不会触发
  17. target_match: # 目标
  18. severity: 'warning'
  19. equal: ['alertname', 'dev', 'instance'] # 保证该配置下标签内容相同才会被抑制

参考博客https://www.icode9.com/content-4-818785.html

QQ邮箱告警

  • 修改alertmanager配置文件,启动服务
  1. [root@server1 alertmanager]# vim alertmanager.yml
  2. global:
  3. resolve_timeout: 5m
  4. smtp_from: '453048472@qq.com' # 邮件发送方
  5. smtp_smarthost: 'smtp.qq.com:465'
  6. smtp_auth_username: '453048472@qq.com'
  7. smtp_auth_password: 'imimsnfnhxlzbgfa'
  8. smtp_require_tls: false
  9. smtp_hello: 'qq.com'
  10. route:
  11. group_by: ['alertname']
  12. group_wait: 5s
  13. group_interval: 5s
  14. repeat_interval: 5m
  15. receiver: 'email'
  16. receivers:
  17. - name: 'email'
  18. email_configs:
  19. - to: '3519713648@qq.com' # 邮件接收方
  20. send_resolved: true # 是否故障恢复后发送邮件
  21. inhibit_rules:
  22. - source_match:
  23. severity: 'critical'
  24. target_match:
  25. severity: 'warning'
  26. equal: ['alertname', 'dev', 'instance']
  27. [root@server1 alertmanager]# ./alertmanager
  • 修改Prometheus配置文件
  1. [root@server1 prometheus]# vim prometheus.yml
  2. global:
  3. scrape_interval: 15s
  4. evaluation_interval: 15s
  5. alerting: # 告警配置
  6. alertmanagers:
  7. - static_configs:
  8. - targets:
  9. - 192.168.31.10:9093 # 配置IP地址
  10. rule_files:
  11. - "/data/prometheus/rules/*.yml" # 设置规则文件的路径
  12. scrape_configs:
  13. - job_name: 'prometheus'
  14. static_configs:
  15. - targets: ['localhost:9090']
  16. - job_name: 'node_exporter'
  17. static_configs:
  18. - targets: ['192.168.31.20:9100']
  19. - job_name: 'mysqld_exporter'
  20. scrape_interval: 10s
  21. static_configs:
  22. - targets: ['192.168.31.20:9104']
  23. - job_name: 'Alertmanager' # 新增一个Alertmanager静态Job配置
  24. static_configs:
  25. - targets: ['192.168.31.10:9093'] # Alertmanager组件的端口号是9093
  • 创建告警规则文件
  1. [root@server1 prometheus]# mkdir rules
  2. [root@server1 prometheus]# cd rules/
  3. [root@server1 rules]# vim rules.yml
  4. groups:
  5. - name: up
  6. rules:
  7. - alert: node # 警报的名称
  8. expr: up{job="node_exporter"} == 0 # 要评估的PromQL表达式
  9. for: 1m # 评估等待时间,可选参数,用于表示在触发告警之前expr中表达式必须为true时持续的时间长度
  10. labels: # 为每个警报添加或覆盖的标签
  11. severity: critical
  12. annotations: # 要添加到每个警报的注释
  13. description: "Node has been down for more than 1 minutes"
  14. summary: "Node down"
  • 启动Prometheus服务
  1. [root@server1 prometheus]# ./prometheus
  • 进入Web UI界面查看规则 Status >> Rules

Prometheus组件—Alertmanger - 图3

  • 然后停止掉192.168.31.20的node_exporter的服务,查看是否进行了QQ邮箱告警
  • 在Alter一栏进行查看,反复刷新,会发现状态变化为INACTIVE→ PENDING → FIRING
    • INACTIVE:没有满足触发条件,告警未激活状态
    • PENDING:已满足触发条件,但未满足告警持续时间的状态
    • FIRING:已满足触发条件且已经超过for子句中指定的持续时间时的状态

Prometheus组件—Alertmanger - 图4

Prometheus组件—Alertmanger - 图5

  • 查看QQ邮箱中的信息

Prometheus组件—Alertmanger - 图6

如果故障修复了,还会发送故障已修复的邮件,可以在alertmanager.yml配置文件中设置