Prometheus自身不具备告警能力,需要结合AlertManager实现监控指标告警。 由Prometheus配置告警规则,当告警规则触发后,会把告警信息推送给Altermanager,AlertManager收到告警之后在根据配置的路由,根据报警级别不同分别发送给不同的receive(收件人),AlertManager可以实现email、企业微信、钉钉等报警。Prometheus作为客户端,Alertmanager负责处理来自客户端的告警通知。对告警通知进行分组、去重后,根据路由规则将其路由到不同的receiver。
当多个告警触发时,可以将它们按照一定的规则进行分组,然后将这些分组信息合并成一个通知。这样可以避免接收到大量重复的告警通知,使得告警信息更加简洁明了。在Alertmanager中,可以通过配置文件来定义告警的分组规则。
分组告警在Alertmanager中(alertmanager.yml)的参数配置解析:
route:
//根据标签进行分组,alertname就是告警规则的名称,多个标签可以以逗号隔开
group_by: ['alertname']
//发送告警等待时间,也就是一个时间范围内,如果同一组中有其他报警则一并发送
group_wait: 10s
//当触发了一组告警后,下一组报警触发的间隔
group_interval: 10s
//告警产生没有修复重复报警的时间间隔
repeat_interval: 10m
当某一个告警发出后,可以设置抑制机制,避免重复发送由此告警引发的其他告警。这样可以避免接收到大量与实际问题无关的告警通知,提高告警处理的效率。
告警抑制在Alertmanager中(alertmanager.yml)的参数配置解析:
inhibit_rules:
- source_match:
// 源标签警报触发时抑制含有目标标签的警报,在当前警报匹配serverity=critical
serverity: 'critical'
target_match:
// 抑制`serverity=warning`类型告警
serverity: 'warning'
// 告警中包含的分组名称。标签内容相同才会抑制,也就是说警报中三个标签值相同才会被抑制。equal: ['alertname', 'dev', 'instance']
静默是指定周期时间内不再触发某一个报警。 alertManager将检查传入警报是否与活动静默的所有相等或正则表达式匹配。匹配静默规则,则不会为该警报发送任何通知。
可以在Alertmanager 网页界面(http://alertmanager的机子ip:9093)设置静默告警规则:
告警级别分为 warning、critical和emergency 。严重等级依次递增。
rometheus 对监控项进行监控,当一个监控项的阈值到达一定指标时,由告警规则中配置的for持续时间进行判断,当达到一定时间都超过了阈值,则将报警推送给AlertManager,AlertManager收到报警后进行分组、抑制、静默,最后在通过我们配置的接收器,将报警发送给邮箱、微信、钉钉。
官方网站下载 Alertmanager https://prometheus.io/download/
部署在任意机子上
wget https://githubfast.com/prometheus/alertmanager/releases/download/v0.24.0/alertmanager-0.24.0.linux-amd64.tar.gz
tar -xzvf alertmanager-0.24.0.linux-amd64.tar.gz -C /usr/local
cd /usr/local/
mv alertmanager-0.24.0.linux-amd64/ alertmanager
mkdir -p /var/lib/alertmanager
global:
resolve_timeout //解析超时时间,也就是报警恢复不是立马发送的,而是在一个时间范围内不在触发报警,才能发送恢复报警,默认为5分钟
smtp_from //收件人的邮箱地址
smtp_smarthost //邮箱提供商的smtp地址
smtp_auth_username //收件人的邮箱账号
smtp_auth_password //邮箱授权码
smtp_require_tls //是否需要tls协议,默认是true
wechart_api_url //微信api地址
wbchart_api_secret //密码
wechat_api_corp_id //机器人应用的id
route:group_by //采用哪个标签作为分组
group_wait //分组等待的时间,收到报警不是立马发送出去,而是等待一段时间,看看同一组中是否有其他报警,如果有一并发送
group_interval //告警时间间隔
repeat_interval //重复告警时间间隔,可以减少发送告警的频率
receiver //接收者是谁
routes //子路由配置
receivers:name //接收者的名字,这里和route中的receiver对应
email_configs
- to //接收者的邮箱地址
vim /usr/local/alertmanager/alertmanager.yml
route:
group_by: ['alertname']
group_wait: 30s
group_interval: 5m
repeat_interval: 1h
receiver: 'dingtalk_webhook'
receivers:
- name: 'dingtalk_webhook'
webhook_configs:
- url: 'http://localhost:8060/dingtalk/webhook1/send'
send_resolved: true
inhibit_rules:
- source_match:
severity: 'critical'
target_match:
severity: 'warning'
equal: ['alertname', 'dev', 'instance']
cd /usr/local/alertmanager
./amtool check-config alertmanager.yml
vim /usr/lib/systemd/system/alertmanager.service
[Unit]
Description=alertmanager
Documentation=https://prometheus.io/
After=network.target
[Service]
User=root
Group=root
ExecStart=/usr/local/alertmanager/alertmanager --config.file=/usr/local/alertmanager/alertmanager.yml --storage.path=/var/lib/alertmanager
ExecReload=/bin/kill -HUP $MAINPID
KillMode=process
Restart=on-failure
[Install]
WantedBy=multi-user.target
systemctl daemon-reload
systemctl restart alertmanager && systemctl enable alertmanager
http://你的IP:9093
curl -lv -X POST http://localhost:9093/-/reload
在Prometheus Server中的prometheus.yml文件中配置与Alertmanager通信的地址和端口
vim /usr/local/prometheus/prometheus.yml
找到alerting并将其修改为为:
alerting:
alertmanagers:
- follow_redirects: true
scheme: http
timeout: 10s
api_version: v2
static_configs:
- targets: ['alertmanager机子ip:9093']
curl -X POST http://127.0.0.1:9090/-/reload
或者重启
systemctl restart prometheus
在Promethus Server机子中
mkdir /usr/local/prometheus/rules
vim /usr/local/prometheus/rules/rules.yml
添加
- name: process_status
rules:
- alert: process_status
expr: namedprocess_namegroup_num_procs==0
for: 1m
labels:
severity: critical
annotations:
summary: "主机 {{ $labels.instance }} process 异常!!!"
description: "{{ $labels.instance }} {{$labels.groupname}} process异常!!!(value: {{ $value }})"
Rule 参数介绍
参数 | 描述 |
---|---|
- name: | 警报规则组的名称 |
- alert: <string> | 警报规则的名称 |
expr: <string> | 使用PromQL表达式完成的警报触发条件,用于计算是否有知足触发条件 |
<lable_name>: <label_value> | 自定义标签,容许自行定义标签附加在警报上,好比high warning |
annotations: <lable_name>: <tmpl_string> | 用来设置有关警报的一组描述信息,其中包括自定义的标签,以及expr计算后的值。 |
/usr/local/prometheus/promtool check config prometheus.yml
/usr/local/prometheus/promtool check rules /usr/local/prometheus/rules/rules.yml
curl -X POST http://127.0.0.1:9090/-/reload
或者重启
systemctl restart prometheus
最后在Prometheus查看规则
Inactive 正常状态,未激活警报
Pending 已知触发条件,但没有达到发送时间条件,在rules规则中 for 1m 定义发送时间条件
Firing 已触发阈值且满足告警持续时间,告警发送给接收者
rule.yml文件的for参数定义后 触发告警后先转换成 Pending 状态,达到for 时间条件后转换为 Firing 状态。俩个周期才能触发警报条件,若是没有设置 for 子句,会直接从 Inactive 状态转换成 Firing状态,触发警报,发送给 Receiver 设置的通知人。
Prometheus 的Alertmanager自身不支持钉钉报警,需要通过插件的方式来达到报警条件。
wget https://githubfast.com/timonwong/prometheus-webhook-dingtalk/releases/download/v1.4.0/prometheus-webhook-dingtalk-1.4.0.linux-amd64.tar.gz
tar -xvf prometheus-webhook-dingtalk-1.4.0.linux-amd64.tar.gz -C /usr/local/
cd /usr/local
mv prometheus-webhook-dingtalk-1.4.0.linux-amd64/ prometheus-webhook-dingtalk
mkdir -p /usr/local/prometheus-webhook-dingtalk/contrib/templates
vim /usr/local/prometheus-webhook-dingtalk/contrib/templates/dingding.tmpl
{{ define "__subject" }}
[{{ .Status | toUpper }}{{ if eq .Status "firing" }}:{{ .Alerts.Firing | len }}{{ end }}]
{{ end }}
{{ define "__alert_list" }}{{ range . }}
---
**告警类型**: {{ .Labels.alertname }}
**告警级别**: {{ .Labels.severity }}
**故障主机**: {{ .Labels.instance }}
**告警信息**: {{ .Annotations.description }}
**触发时间**: {{ (.StartsAt.Add 28800e9).Format "2006-01-02 15:04:05" }}
{{ end }}{{ end }}
{{ define "__resolved_list" }}{{ range . }}
---
**告警类型**: {{ .Labels.alertname }}
**告警级别**: {{ .Labels.severity }}
**故障主机**: {{ .Labels.instance }}
**触发时间**: {{ (.StartsAt.Add 28800e9).Format "2006-01-02 15:04:05" }}
**恢复时间**: {{ (.EndsAt.Add 28800e9).Format "2006-01-02 15:04:05" }}
{{ end }}{{ end }}
{{ define "ops.title" }}
{{ template "__subject" . }}
{{ end }}
{{ define "ops.content" }}
{{ if gt (len .Alerts.Firing) 0 }}
**====侦测到{{ .Alerts.Firing | len }}个故障====**
{{ template "__alert_list" .Alerts.Firing }}
---
{{ end }}
{{ if gt (len .Alerts.Resolved) 0 }}
**====恢复{{ .Alerts.Resolved | len }}个故障====**
{{ template "__resolved_list" .Alerts.Resolved }}
{{ end }}
{{ end }}
{{ define "ops.link.title" }}{{ template "ops.title" . }}{{ end }}
{{ define "ops.link.content" }}{{ template "ops.content" . }}{{ end }}
{{ template "ops.title" . }}
{{ template "ops.content" . }}
上面的公网IP可以在当前的机子上通过 curl cip.cc查看
cd /usr/local/prometheus-webhook-dingtalk
cp config.example.yml config.yml
vim config.yml
修改对应内容,url为复制的Webhook地址
templates:
- contrib/templates/dingding.tmpl
targets:
webhook1:
url: https://oapi.dingtalk.com/robot/send?access_token=9ac4354ab7c8
message:
title: '{{ template "ops.title" . }}'
text: '{{ template "ops.content" . }}'
vim /usr/lib/systemd/system/webhook-dingtalk.service
[Unit]
Description=prometheus-webhook-dingtalk
Documentation=https://github.com/timonwong/prometheus-webhook-dingtalk
After=network.target
[Service]
User=root
Group=root
ExecStart=/usr/local/prometheus-webhook-dingtalk/prometheus-webhook-dingtalk --config.file=/usr/local/prometheus-webhook-dingtalk/config.yml
ExecReload=/bin/kill -HUP $MAINPID
KillMode=process
Restart=on-failure
[Install]
WantedBy=multi-user.target
systemctl daemon-reload
systemctl restart webhook-dingtalk && systemctl enable webhook-dingtalk
systemctl status webhook-dingtalk
cd /usr/local/prometheus-webhook-dingtalk
./prometheus-webhook-dingtalk --config.file=config.yml >dingtalk.log 2>&1 &
tail -f -n 30 dingtalk.log
ss -auntlp | grep 8060
systemctl stop chronyd
Alertmanager路由配置可以将不同的告警通过标签定义分别发送给不同的媒介接收人。
Alertmanager的route配置段支持定义“树”状路由表,入口位置称为根节点,每个子节点可以基于匹配条件定义出一个独立的路由分支;
所有告警都将进入路由根节点,而后进行子节点遍历;
若路由上的continue字段的值为false,则遇到第一个匹配的路由分支后即终止;否则,将继续匹配后续的子节点;
smtp_smarthost :填写邮箱服务器地址跟上端口号,我这里用的是qq的smtp
smtp_auth_password:填写qq邮箱授权码
global:
resolve_timeout: 5m
smtp_smarthost: 'smtp.qq.com:25'
smtp_from: 'xxxx@qq.com' #填写自己qq邮箱
smtp_auth_username: 'xxxx@qq.com' #填写自己qq邮箱
smtp_auth_password: 'xxxxxxxxx' #填写qq邮箱授权码
smtp_require_tls: false
route:
group_by: ['alertname']
group_wait: 10s
group_interval: 10s
repeat_interval: 30s
receiver: 'email'
routes:
- match_re:
severity: warning
receiver: webhook1
- match_re:
severity: critical
receiver: email
receivers:
- name: 'email'
email_configs:
- to: 'xxxxx@163.com' #指定发送给谁
- name: 'webhook1'
webhook_configs:
- send_resolved: false
url: http://localhost:8060/dingtalk/webhook1/send
inhibit_rules:
- source_match:
severity: 'critical'
target_match:
severity: 'warning'
equal: ['alertname', 'dev', 'instance']
ps aux | grep alert | grep -v grep | awk '{print $2}' |xargs kill -HUP
curl -lv -X POST http://192.168.100.167:9093/-/reload
下一篇文章:CentOS7中Prometheus PushGateway的使用
参考文档:https://cloud.tencent.com/developer/article/2216582