Prometheus 自定义告警规则实战操作总结
一、概述
通过创建Prometheus监控告警规则,您可以制定针对特定Prometheus实例的告警规则。当告警规则设置的条件满足后,系统会产生对应的告警事件。如果想要收到通知,需要进一步配置对应的通知策略以生成告警并且以短信、邮件、电话、钉群机器人、企业微信机器人或者Webhook等方式发送通知。
从Prometheus server端接收到alerts后,会基于PromQL的告警规则 分析数据,如果满足PromQL定义的规则,则会产生一条告警,并发送告警信息到Alertmanager,Alertmanager则是根据配置处理告警信息并发送。所以Prometheus的告警配置依赖于PromQL与AlertManager
官方文档:https://prometheus.io/docs/alerting/latest/overview/
二、告警实现流程
设置警报和通知的主要步骤是:
在Prometheus中配置告警规则。
配置Prometheus 与 AlertManager 关联。
配置 AlertManager 告警通道。
三、告警规则
官方文档:https://prometheus.io/docs/prometheus/latest/configuration/alerting_rules/
1)告警规则配置
在Prometheus 配置(prometheus.yml)中添加报警规则配置,配置文件中 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: example
rules:
- 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"}) > 90
for: 1m
labels:
severity: page
annotations:
summary: spike memeory
1)监控服务器是否在线
对于被Prometheus监控的服务器,我们都有一个up指标,可以知道该服务是否在线。
up == 0 #服务下线了。
up == 1 #服务在线。
【示例】
groups:
- name: Test-Group-001 # 组的名字,在这个文件中必须要唯一
rules:
- alert: InstanceDown # 告警的名字,在组中需要唯一
expr: up == 0 # 表达式, 执行结果为true: 表示需要告警
for: 1m # 超过多少时间才认为需要告警(即up==0需要持续的时间)
labels:
severity: warning # 定义标签
annotations:
summary: "服务 {{ $labels.instance }} 下线了"
description: "{{ $labels.instance }} of job {{ $labels.job }} has been down for more than 1 minutes."
注意:
for 指定达到告警阈值之后,一致要持续多长时间,才发送告警数据。
labels 中可以指定自定义的标签,如果定义的标签已经存在,则会被覆盖。可以使用模板。
annotations 中的数据,可以使用模板,$labels表示告警数据的标签,{{$value}}表示时间序列的值。
3)告警数据的状态
Inactive——表示没有达到告警的阈值,即expr表达式不成立。
Pending——表示达到了告警的阈值,即expr表达式成立了,但是未满足告警的持续时间,即for的值。
Firing——已经达到阈值,且满足了告警的持续时间。
【温馨提示】经测试发现,如果同一个告警数据达到了Firing,那么不会再次产生一个告警数据,除非该告警解决了。
四、实战操作
1)下载 node_exporter
node-exporter用于采集node的运行指标,包括node的cpu、load、filesystem、meminfo、network等基础监控指标,类似于zabbix监控系统的的zabbix-agent。
下载地址:https://github.com/prometheus/node_exporter/releases/
wget https://github.com/prometheus/node_exporter/releases/download/v1.5.0/node_exporter-1.5.0.linux-amd64.tar.gz
tar -xzf node_exporter-1.5.0.linux-amd64.tar.gz
2)启动 node_exporter
ln -s /opt/prometheus/exporter/node_exporter/node_exporter-1.5.0.linux-amd64/node_exporter /usr/local/bin/node_exporter
# 指定端口启动,默认端口:9100
node_exporter --web.listen-address=":9100"
配置node_exporter.service启动
# 默认端口9100
cat >/usr/lib/systemd/system/node_exporter.service< [Unit] Description=node_exporter After=network.target #可以创建相应的用户和组 启动 #User=prometheus #Group=prometheus [Service] ExecStart=/opt/prometheus/exporter/node_exporter/node_exporter-1.5.0.linux-amd64/node_exporter --web.listen-address=:9100 [Install] WantedBy=multi-user.target EOF 启动服务 systemctl daemon-reload systemctl start node_exporter systemctl status node_exporter systemctl enable node_exporter 检查 curl http://localhost:9100/metrics 3)配置Prometheus加载node_exporter 添加或修改配置 prometheus.yml 重启加载配置 systemctl restart prometheus # 1、 kill方式 #kill -HUP pid # 2、curl方式(推荐) #curl -X POST http://IP/-/reload # 【注意】需要在启动的命令行增加参数: --web.enable-lifecycle curl -X POST http://192.168.182.110:9090/-/reload # 3、重启(不推荐,重启会导致所有的连接短暂性中断) systemctl restart prometheus 检查web:http://ip:9090/targets 4)告警规则配置 在Prometheus配置文件rometheus.yml 中配置如下:在/etc/prometheus/rule.yml配置如下: groups: - name: Test-Group-001 # 组的名字,在这个文件中必须要唯一 rules: - alert: InstanceDown # 告警的名字,在组中需要唯一 expr: up == 0 # 表达式, 执行结果为true: 表示需要告警 for: 1m # 超过多少时间才认为需要告警(即up==0需要持续的时间) labels: severity: warning # 定义标签 annotations: summary: "服务 {{ $labels.instance }} 下线了" description: "{{ $labels.instance }} of job {{ $labels.job }} has been down for more than 1 minutes." 重新加载 curl -X POST http://localhost:9090/-/reload 在web上就可以看到一个告警规则。 5)模拟告警 手动关机 sudo shutdown -h now 过了一段时间告警状态就变成Pending 再过一段时间告警就变成了Firing 6)配置告警通道 这里以有邮件告警为示例,其它的也差不多。修改配置之前最好先备份一下之前的配置 cp alertmanager.yml alertmanager.bak 【1】配置 alertmanager.yml global: resolve_timeout: 5m ## 这里为qq邮箱 SMTP 服务地址,官方地址为 smtp.qq.com 端口为 465 或 587,同时要设置开启 POP3/SMTP 服务。 smtp_smarthost: 'smtp.qq.com:465' smtp_from: 'xxxxxxxx@qq.com' smtp_auth_username: 'xxxxxxxx@qq.com' #授权码,不是密码,在 QQ 邮箱服务端设置开启 POP3/SMTP 服务时会提示 smtp_auth_password: 'xxxxxxxx' smtp_require_tls: false #1、模板 templates: - '/opt/prometheus/alertmanager/alertmanager-0.24.0.linux-amd64/templates/email.tmpl' #2、路由 route: group_by: ['alertname'] group_wait: 10s group_interval: 10s repeat_interval: 1h #邮箱 receiver: 'email' receivers: - name: 'email' email_configs: ## 接收警报的email(这里是引用模板文件中定义的变量) - to: '{{ template "email.to"}}' ## 发送邮件的内容(调用模板文件中的) html: '{{ template "email.to.html" .}}' send_resolved: true # 抑制器配置 inhibit_rules: - source_match: severity: 'critical' target_match: severity: 'warning' #确保这个配置下的标签内容相同才会抑制,也就是说警报中必须有这三个标签值才会被抑制。 equal: ['alertname', 'dev', 'instance'] 【2】模板 alert.tmpl 模板文件配置了email.from、email.to、email.to.html 三种模板变量,可以在 alertmanager.yml 文件中直接配置引用。这里 email.to.html 就是要发送的邮件内容,支持 Html 和 Text 格式,这里为了显示好看,采用 Html 格式简单显示信息。下边 {{ range .Alerts }} 是个循环语法,用于循环获取匹配的 Alerts 的信息。 {{ define "email.from" }}xxxxxxxx@qq.com{{ end }} {{ define "email.to" }}xxxxxxxx@163.com{{ end }} {{ define "email.to.html" }} {{ range .Alerts }} =========start========== 告警程序: prometheus_alert 告警级别: {{ .Labels.severity }} 级 告警类型: {{ .Labels.alertname }} 故障主机: {{ .Labels.instance }} 告警主题: {{ .Annotations.summary }} 告警详情: {{ .Annotations.description }} 触发时间: {{ .StartsAt.Format "2019-08-04 16:58:15" }} =========end========== {{ end }} {{ end }} 【温馨提示】这里记得换成自己的邮箱地址!!! 重启alertmanager systemctl restart alertmanager 在web上就可以看到对应的告警信息了。接下来就静待告警了。 一整套流程到这里就全部跑通了,告警规则、告警指标、告警通道根据自己的场景来定