Prometheus Alertmanager
Prometheus自身不具备告警能力,需要结合AlertManager实现监控指标告警。由Prometheus配置告警规则,当告警规则触发后,会把告警信息推送给Altermanager,AlertManager收到告警之后在根据配置的路由,根据报警级别不同分别发送给不同的receive(收件人),AlertManager可以实现email、企业微信、钉钉等报警。Prometheus作为客户端,Alertmanager负责处理来自客户端的告警通知。对告警通知进行分组、去重后,根据路由规则将其路由到不同的receiver。
Alertmanager 三大核心
1. 分组告警
分组告警是指:prometheus的告警规则是对所有监控实例都生效的,当同一种类型的告警触发后会汇聚一起,并且发送一个告警消息,降低告警噪音。
AlertManager告警分组参数
route:
//根据标签进行分组,alertname就是告警规则的名称,多个标签可以以逗号隔开
group_by: ['alertname']
//发送告警等待时间,也就是一个时间范围内,如果同一组中有其他报警则一并发送
group_wait: 10s
//当触发了一组告警后,下一组报警触发的间隔
group_interval: 10s
//告警产生没有修复重复报警的时间间隔
repeat_interval: 10m
2. 告警抑制
通过抑制可以避免产生大量的告警风暴,当一个节点宕机设置标签为serverity=critical,而节点上的应用告警设置为serverity=warning,当节点宕机后可以使用抑制的方法,仅发送一条节点宕机的信息,而不是发送多条信息。
aertManager告警抑制参数
inhibit_rules:
- source_match:
// 源标签警报触发时抑制含有目标标签的警报,在当前警报匹配serverity=critical
serverity: 'critical'
target_match:
// 抑制`serverity=warning`类型告警
serverity: 'warning'
// 告警中包含的分组名称。标签内容相同才会抑制,也就是说警报中三个标签值相同才会被抑制。equal: ['alertname', 'dev', 'instance']
Prometheus 告警级别
告警级别分为warning、critical和emergency。严重等级依次递增。
3. 告警静默
静默是指定周期时间内不再触发某一个报警。alertManager将检查传入警报是否与活动静默的所有相等或正则表达式匹配。匹配静默规则,则不会为该警报发送任何通知。
Alertmanager Web UI 设置静默告警规则
创建静默告警规则
instance=192.168.100.73:9256 ,job=process 的主机告警2h周期内静默。
查看静默告警规则
Prometheus触发告警实现的流程
prometheus 对监控项进行监控,当一个监控项的阈值到达一定指标时,由告警规则中配置的for 持续时间进行判断,当达到一定时间都超过了阈值,则将报警推送给AlertManager,AlertManager收到报警后进行分组、抑制、静默,最后在通过我们配置的接收器,将报警发送给邮箱、微信、钉钉。
二进制包部署Alertmanager
官方网站下载 Alertmanager https://prometheus.io/download/
1,下载alertmanager
wget https://github.com/prometheus/alertmanager/releases/download/v0.24.0/alertmanager-0.24.0.linux-amd64.tar.gz
2,部署alertmanager
tar xvf alertmanager-0.23.0.linux-amd64.tar.gz -C /usr/local
cd /usr/local/
mv alertmanager-0.24.0.linux-amd64/ alertmanager
chown -R prometheus.prometheus alertmanager/
3,创建alertmanager 存储目录
mkdir -p /var/lib/alertmanager
chown -R prometheus.prometheus /var/lib/alertmanager
4,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 //接收者的邮箱地址
5,alertmanager 钉钉告警配置
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']
6,检查alertmanager配置文件格式
/usr/local/alertmanager
./amtool check-config alertmanager.yml
7,创建 alertmanager系统服务启动文件
cat /usr/lib/systemd/system/alertmanager.service
[Unit]
Description=alertmanager
Documentation=https://prometheus.io/
After=network.target
[Service]
User=prometheus
Group=prometheus
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
8,赋权alertmanager.service
chown -R prometheus.prometheus /usr/lib/systemd/system/alertmanager.service
9,启动alertmanager
systemctl daemon-reload
systemctl restart alertmanager && systemctl enable alertmanager
10,http 访问alertmanager
http://192.168.100.167:9093/#/alerts
11,加载alertmanager配置文件生效
curl -lv -X POST http://localhost:9093/-/reload
Prometheus集成AlertManager
1,prometheus.yml文件中配置与Alertmanager通信的地址和端口
vim /usr/local/prometheus/prometheus.yml
alerting:
alertmanagers:
- follow_redirects: true
scheme: http
timeout: 10s
api_version: v2
static_configs:
- targets: ['localhost:9093']
rule_files: ['/usr/local/prometheus/rules/*.yml']
2,通过Prometheus的restful接口热加载配置
curl -X POST http://127.0.0.1:9090/-/reload
Prometheus Rule 告警规则
1,自定义Prometheus告警规则,监控主机进程状态,进程异常中断触发告警。
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 }})"
2,Prometheus Rule 参数介绍
参数 | 描述 |
---|---|
- name: <string> | 警报规则组的名称 |
- alert: <string> | 警报规则的名称 |
expr: <string | 使用PromQL表达式完成的警报触发条件,用于计算是否有知足触发条件 |
<lable_name>: <label_value> | 自定义标签,容许自行定义标签附加在警报上,好比high warning |
annotations: <lable_name>: <tmpl_string> | 用来设置有关警报的一组描述信息,其中包括自定义的标签,以及expr计算后的值。 |
3,检查配置文件格式
/usr/local/prometheus/promtool check config prometheus.yml
/usr/local/prometheus/promtool check rules /usr/local/prometheus/rules/rules.yml
4,Prometheus热加载配置
curl -X POST http://127.0.0.1:9090/-/reload
Prometheus 告警规则状态
Inactive 正常状态,未激活警报
Pending 已知触发条件,但没有达到发送时间条件,在rules规则中 for 1m 定义发送时间条件
Firing 已触发阈值且满足告警持续时间,告警发送给接收者
rule 文件for 参数定义后 触发告警后先转换成 Pending 状态,达到for 时间条件后转换为 Firing 状态。俩个周期才能触发警报条件,若是没有设置 for 子句,会直接从 Inactive 状态转换成 Firing状态,触发警报,发送给 Receiver 设置的通知人。
Prometheus Alertmanager 钉钉插件
Prometheus 的Alertmanager自身不支持钉钉报警,需要通过插件的方式来达到报警条件。
1,下载Alertmanager
wget https://github.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
2,配置报警模板文件
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" . }}
3,钉钉插件告警配置
创建钉钉告警机器人
智能群助手--添加机器人--自定义(通过Webhook接入自定义服务)--添加prometheus机器人
复制Webhook
拷贝钉钉插件配置文件
cd /usr/local/prometheus-webhook-dingtalk
cp config.example.yml config.yml
egrep -v "*#|^$" config.yml
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" . }}'
4,后台启动
./prometheus-webhook-dingtalk --config.file=config.yml >dingtalk.log 2>&1 &
systemctl启动
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=prometheus
Group=prometheus
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
5,启动webhook-dingtalk
systemctl daemon-reload
systemctl restart webhook-dingtalk && systemctl enable webhook-dingtalk
6,prometheus-webhook-dingtalk(默认监听8060端口)
netstat -auntlp |grep 8060
7,Prometheus 钉钉告警测试
systemctl stop chronyd
Prometheus Web Alerts
Prometheus Alertmanager Web
钉钉消息
Prometheus AlertManager 告警路由配置
Alertmanager路由配置可以将不同的告警通过标签定义分别发送给不同的媒介接收人。
Alertmanager的route配置段支持定义“树”状路由表,入口位置称为根节点,每个子节点可以基于匹配条件定义出一个独立的路由分支;
alertmanager 实现不同的告警级别发送给不同的接收人
#全局配置
global:
resolve_timeout: 5m #处理超时时间,默认为5min
smtp_smarthost: 'smtp.126.com:465' # 邮箱smtp服务器代理
smtp_from: '****.com' # 发送邮箱名称
smtp_auth_username: '****.com' # 邮箱名称
smtp_auth_password: '****' # 邮箱密码或授权码
smtp_require_tls: false
#路由配置
route:
group_by: ['alertname']
group_wait: 10s
group_interval: 10s
repeat_interval: 1h
receiver: 'email' #所有报警均发邮件
routes: #路由正则
- match_re:
severity: warning #如果是warning告警,接收者是webhook1
receiver: webhook1
- match_re:
severity: critical #如果是error告警,接收者是webhook2
receiver: webhook2
#接收人信息
receivers:
- name: 'email' # 警报
email_configs: # 邮箱配置
- to: ****@qq.com' # 接收警报的email配置
- name: 'webhook1'
webhook_configs:
send_resolved: false
url: http://localhost:8060/dingtalk/webhook1/send
- name: 'webhook2'
webhook_configs
send_resolved: true
url: http://localhost:8060/dingtalk/webhook2/send
inhibit_rules:
- source_match:
severity: 'critical'
target_match:
severity: 'warning'
equal: ['alertname', 'dev', 'instance']
重启Alertmanager
ps aux | grep alert | grep -v grep | awk '{print $2}' |xargs kill -HUP
Alertmanager配置热加载
curl -lv -X POST http://192.168.100.167:9093/-/reload
Alertmanager邮件告警消息