Prometheus监控系统(7)使用Alertmanager或Grafana实现告警

tanglu 12777 2019-07-30

一、 Alertmanager介绍

Prometheus监控平台主要是提供了数据采集和存储功能,如果要根据事件触发告警则需要依赖Alertmanager组件来完成(或者使用Grafana Alerting)。AlertManager支持告警分组,可以将同个分组下的多个告警告警到一封邮件中进行发送,减少骚扰;另外还有告警抑制功能,和Zabbix的告警依赖同理,避免发生某个故障出现后导致其他一系列故障一起告警形成告警风暴的问题;最后还有告警静默功能,让同时间段内的告警不重复发出。


二、安装与配置Alertmanager

在Prometheus官网下载好二进制安装包并解压,通过alertmanager.yml文件就可以进行告警分组、告警路由、告警抑制、告警静默等配置。下面是一个不带告警分组与路由的最基本配置说明

global:
  resolve_timeout: 5m                   #持续5分钟没收到告警信息后认为问题已解决
  smtp_smarthost: 'smtp.qq.com:465'     #告警邮件发送者SMTP地址
  smtp_from: '13841276@qq.com'          #发件者邮箱
  smtp_auth_username: 'tanglu'          #账号
  smtp_auth_password: '123456'          #邮箱专用授权码,不是QQ登录密码,在QQ邮箱中设置
  smtp_require_tls: false               #关闭tls授权

route:                                  #定义告警路由规则,可以定义多个receiver和group实现告警分组
  group_by: ['test_group']              #分组配置,在Prometheus的rules中进行分组的定义,一个分组内的告警会在一个邮件中
  group_wait: 10s                       #分组等待时间,可以理解为将10秒内的相同事件作为一个分组,如果太短分组就没有意义
  receiver: 'ops'                       #告警接受者,具体信息将在receivers区域中配置

receivers:                              #告警邮件接受者配置部分
- name: 'ops'                           #和上面route部分中的receiver一致,这里是定义具体的动作
  email_configs:                        #接收器为email,除此还有其他接收器可以使用
  - to: '13841276@qq.com'               #告警邮件发送对象
    send_resolved: true                 #接收告警恢复邮件

#告警抑制配置。如下配置表示发生多个告警时如果它们node标签的值相同,那么产生critical级别的告警就不对warning级别告警进行通知,告警级别的标签是在Prometheus的rules中定义
inhibit_rules:  
  - source_match:
      severity: 'critical'  
    target_match:
      severity: 'warning'
    equal: 
      - node


2、Alertmanager路由与告警分组设置

当有告警事件发生时都会从配置文件中顶级的route开始路由,每一个路由都可以定义接受人以及匹配规则。如果route中设置continue的值为false,那么告警在匹配到第一个子节点之后就停止继续匹配。如果continue为true则会继续进行后续匹配。如果当前告警匹配不到任何的子节点,那该告警将会基于当前路由节点的接收器配置方式进行处理。告警匹配可以基于字符串或者基于正则表达式完成。

global:
 resolve_timeout: 5m
 smtp_smarthost: 'smtp.qq.com:465'
 smtp_from: '13841276@qq.com'
 smtp_auth_username: '13841276'
 smtp_auth_password: 'mtdvgvofyfgybzae'
 smtp_require_tls: false

route:  #默认路由
 group_by: ['instance','job']  
 group_wait: 30s
 group_interval: 5m
 repeat_interval: 4h  #重复告警间隔
 receiver: 'email'  #默认接受者
 routes:  #子路由,不满足子路由的都走默认路由
 - match:  #普通匹配
     severity: critical
   receiver: leader
 - match_re:  #正则匹配
     severity: ^(warning|critical)$
   receiver: ops

receivers:  #定义三个接受者,和上面三个路由对应
- name: 'email'
 email_configs:
 - to: '13841276@qq.com'
- name: 'leader'
 email_configs:
 - to: '88888@qq.com'
- name: 'ops'
 email_configs:
 - to: 'ops@qq.com'


3、使用amtool检查配置文件语法

./amtool check-config alertmanager.yml


4、启动alertmanager,服务启动后默认监听在9093端口,可以直接访问该端口看到一些配置信息,静默配置也是在这个界面做操作

./alertmanager --config.file=alertmanager.yml


二、Prometheus配置部分

1、修改prometheus.yml的alerting部分,让alertmangers能与Prometheus通信

alerting:
 alertmanagers:
   - static_configs:
     - targets:
       - 192.168.1.100:9093

rule_files:  #指定告警规则和行为的配置路径
   - "rules/*.yml"

scrape_configs:
 - job_name: 'alertmanager'
   static_configs:
     - targets: ['192.168.1.100:9093']


2、在Prometheus配置中添加具体告警规则。为了使告警信息具有更好的可读性,Prometheus支持使用变量来获取指定标签中的值。比如$labels.<labelname>变量可以访问当前告警实例中指定标签的值。$value可以获取当前PromQL表达式计算的样本值。在创建规则文件时,建议为不同对象建立不同的文件,比如web.yml、mysql.yml

vim  /etc/prometheus/rules/node_alerts.yml 
groups:
- name: node_alerts #告警分组,一个组下的告警会整合在一个邮件中
 rules:
 - alert: CPU usage high  #定义告警事件名
   expr: node_cpu:avg_rate 5m > 4  #报警表达式
   for: 1m  #事件持续时长,0的话代表一满足就触发
   labels:
     severity: warning  #定义了一个名为severity值为warning的标签,用于告警分组
   annotations:  #邮件中的注释内容,可以引用变量
     summary: "Instance {{ $labels.instance }} CPU usgae high"  #summary概要信息
     description: "{{ $labels.instance }} CPU usage above 85% (current value: {{ $value }})"  #description详细信息


3、当报警触发后访问9093端口可以看到具体的信息以及告警状态,告警状态分为了Inactive(无事件)、Pending(触发阈值,但未满足告警持续时间)、Firing(触发告警)三种,邮箱里也会收到告警邮件,同一个分组下的告警事件会整合在一个邮件中

alert3.jpg

alert4.jpg


三、Grafana配置部分

1、如果需要使用Grafana来实现报警的话,就要让Grafana能正确连接到告警发送平台。告警平台包括有丁丁、Email、Prometheus Alertmanager、Pagerduty等,不同的告警平台设置略有不同。

alerting1.png


2、告警平台添加完成后,开始为监控项设置报警条件。编辑需要告警的图形,可以看到其中有专门设置告警的地方,然后要配置一个Conditions,也就是要写一条WHEN max() OF ( query A,1m,now) IS ABOVE 2000 这样的规则出来

alerting2.png


3、WHEN max() OF ( query A,1m,now) IS ABOVE 2000这个规则大致含义是说:取1分钟内的数据,如果最大值大于2000就触发告警,那个A是获取数据的查询语句,如图

alerting3.png


4、配置完成后在图形上就会出现一条红线,并显示了告警的阈值

版权声明
本站所有文章均为原创,转载请注明出处!小站维护不易,如果对您有所帮助,希望能点击一下站内广告,谢谢!
上一篇:Prometheus监控系统(6)使用mysqld_exporter监控MySQL
下一篇:【Zabbix监控教程】对日志文件内容进行监控报警
相关文章

 发表评论

暂时没有评论,来抢沙发吧~

微信二维码