报警机制
prometheus触发一条告警的过程:
prometheus--->触发阈值--->超出持续时间--->alertmanager--->分组|抑制|静默--->媒体类型--->邮件|钉钉|微信等。
分组(group): 将类似性质的警报合并为单个通知;如web服务是一组、cpu是一组,不用发多个cpu超出范围的报警,只发单个cpu组的报警
静默(silences): 是一种简单的特定时间静音的机制,例如:服务器要升级维护可以先设置这个时间段告警静默,否则在代码升级时,会触发一些报警,代码升级时可以先设置静默,关闭期间的报警。
抑制(inhibition): 当警报发出后,停止重复发送由此警报引发的其他警报即合并一个故障引起的多个报警事件,可以消除冗余告警。如一个交换机上有3个节点,但由于交换机故障,导致3个节点网络也不通,所以只发交换机的报警,而不发3个节点的网络报警,因为是由于交换机故障而导致节点不能正常通信,不必要发一堆报警,此种也称为报警依赖。
部署alertmanager
https://prometheus.io/docs/alerting/configuration/ #alertmanager配置文件参考文档
alertmanager可以单独装在一台服务器上;alertmanager默认监听端口是9093
1、cd /usr/local/src
2、tar xvf alertmanager-0.20.0.linux-amd64.tar.gz
3、ln -sv /usr/local/src/alertmanager-0.20.0.linux-amd64 /usr/local/alertmanager
4、cd /usr/local/alertmanager
5、vim alertmanager.yml
global:
resolve_timeout: 5m #超时时间
smtp_smarthost: 'smtp.qq.com:465' #smtp服务器地址
smtp_from: '903660570@qq.com' #发件人
smtp_auth_username: '903660570@qq.com' #登录认证的用户名
smtp_auth_password: 'nihwoufvezufbdig' #登录的授权码
smtp_hello: '@qq.com'
smtp_require_tls: false #是否使用tls
route: #route用来设置报警的分发策略,由谁去发
group_by: ['alertname'] #采用哪个标签来作为分组依据
group_wait: 10s #组告警等待时间。也就是告警产生后等待10s,一个组内的告警10s后一起发送出去
group_interval: 10s #两组告警的间隔时间
repeat_interval: 2m #重复告警的间隔时间,减少相同邮件的发送频率
receiver: 'web.hook' #设置接收人;真正发送邮件不是由route完成,而是由receiver发送邮件
receivers:
- name: 'web.hook'
#webhook_configs: #调用指定的API把邮件发送出去
#- url: 'http://127.0.0.1:5001/'
email_configs: #通过邮件的方式发送
- to: '903660570@qq.com' #接收人
inhibit_rules: #禁止的规则
- source_match: #源匹配级别;以下设置的级别的报警不会发送
severity: 'critical'
target_match: #目标匹配级别
severity: 'warning'
equal: ['alertname', 'dev', 'instance']
6、vim /etc/systemd/system/alertmanager.service
[Unit]
Description=Prometheus AlertManager
Documentation=https://prometheus.io/docs/introduction/overview/
After=network.target
[Service]
Restart=on-failure
ExecStart=/usr/local/alertmanager/alertmanager --config.file=/usr/local/alertmanager/alertmanager.yml
[Install]
WantedBy=multi-user.target
7、systemctl start alertmanager.service
8、systemctl enable alertmanager.service
prometheus需要的配置
https://prometheus.io/docs/alerting/notification_examples/ #rule规则参考文档
1、vim /usr/local/prometheus/prometheus.yml
alerting: #当触发告警时,把告警发送给下面所配置的服务
alertmanagers: #当出告警时,把告警通知发送给alertmanager
- static_configs:
- targets:
- 192.168.3.146:9093 #指定alertmanager地址及端口
rule_files: #报警规则文件
- "/usr/local/prometheus/linux_rules.yml" #指定报警的rule文件所在路径
2、vim /usr/local/prometheus/linux_rules.yml #编辑rule文件
groups:
- name: linux_pod.rules #指定名称
rules:
- alert: Pod_all_cpu_usage #相当于zabbix中的监控项;也是邮件的标题
expr: (sum by(name)(rate(container_cpu_usage_seconds_total{image!=""}[5m]))*100) > 75 #promql查询语句查询到所有pod的CPU利用率与后面的值做对比,查询到的是浮点数,需要乘以100,转换成整数
for: 5m #每5分钟获取一次POD的CPU利用率
labels:
severity: critical
service: pods
annotations: #此为当前所有容器的CPU利用率
description: 容器 {{ $labels.name }} CPU 资源利用率大于 75% , (current value is {{ $value }}) #报警的描述信息内容
summary: Dev CPU 负载告警
- alert: Pod_all_memory_usage
expr: sort_desc(avg by(name)(irate(container_memory_usage_bytes{name!=""} [5m]))*100) > 1024^3*2 #通过promql语句获取到所有pod中内存利用率;将后面的单位G转换成字节
for: 10m
labels:
severity: critical
annotations:
description: 容器 {{ $labels.name }} Memory 资源利用率大于 2G , (当前已用内存是: {{ $value }})
summary: Dev Memory 负载告警
- alert: Pod_all_network_receive_usage
expr: sum by (name)(irate(container_network_receive_bytes_total{container_name="POD"}[1m])) > 1024*1024*50
for: 10m #获取的所有pod网络利用率是字节,所以把后面对比的Mb转换成字节
labels:
severity: critical
annotations:
description: 容器 {{ $labels.name }} network_receive 资源利用率大于 50M , (current value is {{ $value }}) #这些promql语句都是通过grafana,找到相应的监控项,点击edit找到相应的promql语句即可
3、systemctl restart prometheus.service
4、通过访问prometheus的web界面确认rule规则是否构建成功
5、查看构建的rule规则是否能够显示出来,能够看到rule规则,则表示构建成功
6、验证邮箱是否收到邮件
测试
1、./promtool check rules linux_rules.yml #检查rule文件语法是否正确
2、./amtool alert --alertmanager.url=http://192.168.3.146:9093 #列出当前alertmanager服务器的所有告警