目录
1 Alertmanager实现告警
1.1 告警概述
使用 Prometheus 发出警报分为两部分。Prometheus 服务器的告警规则会将告警发送给Alertmanager。然后,Alertmanager 管理这些警报,包括静音、抑制、聚合和 通过电子邮件、随叫随到的通知系统和聊天平台等方法发送通知。
配置告警和通知的主要步骤如下:
- 设置和配置 Alertmanager
- 配置 Prometheus 与 Alertmanager 通信
- 在 Prometheus 中创建报警规则
1.2 Alertmanager说明
Alertmanager 负责处理客户端应用程序(如 Prometheus 服务器)发送的警报。它负责消除重复、分组,并将它们路由到正确的接收器集成,如电子邮件、PagerDuty 或 OpsGenie。同时,它还负责静默和告警抑制。
以下是一些常见概念:
1、分组
分组将性质相似的警报分类为单个通知。当许多系统同时发生故障,可能同时触发数百到数千个警报时,这在较大的中断期间特别有用。
例如:当网络分区发生时,集群中正在运行数十或数百个服务实例。一半的服务实例不能再访问数据库。Prometheus的警报规则被配置为在每个服务实例无法与数据库通信时发送警报。结果,数百个警报被发送到Alertmanager。
作为用户,人们只想获得一个页面,同时仍然能够准确地看到哪些服务实例受到了影响。因此,我们可以配置Alertmanager,将警报按集群和alertname分组,这样它就会发送一个紧凑的通知。
警报分组、分组通知的定时以及这些通知的接收者由配置文件中的路由树配置。
2、抑制(Inhibition)
告警抑制,当在已经触发某些警告的情况下,压制与其相关的其他特定警告不发送通知
例如:当有一个警告触发,告知整个集群无法访问时,Alertmanager可以被配置为抑制与该集群相关的所有其他警告的通知。这有助于避免因为成百上千个不相关的警告触发而发送通知,从而帮助用户聚焦于实际的问题。
抑制是通过Alertmanager的配置文件来配置的。
3、静默(Silences)
静默是一种简单直接的方式来在特定时间内压制警告。静默的配置基于匹配器,就像路由树一样。传入的警告会检查是否匹配活跃静默中所有的等号或正则表达式匹配器。如果匹配,则不会为该警告发送任何通知。
静默是在Alertmanager的Web界面中进行配置的。
1.3 Alertmanager安装配置
1、安装Alertmanager
tar -zxf alertmanager-0.26.0.linux-amd64.tar.gz
cd alertmanager-0.26.0.linux-amd64/
vim alertmanager.yml
### 进行配置文件修改
global:
resolve_timeout: 5m #处理超时时间,默认为5分钟
smtp_from: '[email protected]' # smtp_from:指定通知报警的邮箱
smtp_smarthost: 'smtp.qq.com:25' # smtp_smarthost: 使用email打开服务配置
smtp_auth_username: [email protected]' # smtp_auth_username:邮箱用户名
smtp_auth_password: xxxxxxxxxxxxj' # 此处为邮箱授权码
route:
group_by: ['alertname', 'item'] # 传入报警分组在一起的标签,如item=测试和alertname=Disk的多个报警将批处理为单个组
group_wait: 30s # 这个参数设置了在发送第一批警报之后,Alertmanager 等待新警报加入现有组的时间。此处 group_wait 被设置为 30 秒。如果在 30 秒内没有新的警报加入组,那么这个组的警报将被发送出去。
group_interval: 300s # 发送组警报的时间间隔
repeat_interval: 4h # 对同一个警报组的重复通知之间的时间间隔 对于email配置中,此项不可以设置过低,否则将会由于邮件发送太多频繁,被smtp服务器拒绝
receiver: 'email' # 发送警报的接收者的名称,以下receivers name的名称
# 定义模板
#templates:
# - '/usr/local/alertmanager/template/*.tmpl'
receivers:
# 接收邮件的邮箱
- name: 'email'
email_configs:
- to: 'xxxxxxxx'
inhibit_rules: # 抑制规则
- source_match:
severity: 'critical'
target_match:
severity: 'warning'
equal: ['alertname', 'dev', 'instance', 'prod']
配置模板
mkdir template
cat template/test.tmpl
{
{ define "test.html" }}
{
{ range $i, $alert := .Alerts.Firing }}
[报警项名]:{
{ index $alert.Labels "alertname" }}
[报警主机]:{
{ index $alert.Labels "instance" }}
[报警阀值]:{
{ index $alert.Annotations "value" }}
[开始时间]:{
{ $alert.StartsAt }}
{
{ end }}
{
{ end }}
2、配置快速启动文件
cd ..
mv alertmanager-0.26.0.linux-amd64 /usr/local/alertmanager
mkdir /usr/local/alertmanager/data
#######
cat > /usr/lib/systemd/system/alertmanager.service << EOF
[Unit]
Description=alertmanager server daemon
Documentation=https://prometheus.io/docs/introduction/overview/
After=network.target
[Service]
ExecStart=/usr/local/alertmanager/alertmanager --config.file=/usr/local/alertmanager/alertmanager.yml --storage.path=/usr/local/alertmanager/data
ExecReload=/bin/kill -HUP $MAINPID
ExecStop=/bin/kill -s QUIT $MAINPID
KillMode=process
Restart=on-failure
RestartSec=42s
[Install]
WantedBy=multi-user.target
EOF
#######
# 重新加载配置
systemctl daemon-reload
systemctl start alertmanager.service
systemctl status alertmanager.service
可以查看alertmanager信息:http://ip:9093
3、进行Prometheus配置
mkdir /usr/local/prometheus/rules/
vim /usr/local/prometheus/prometheus.yml
#######
alerting:
alertmanagers:
- static_configs:
- targets:
- localhost:9093
rule_files:
- /usr/local/prometheus/rules/*.rules # 规则配置文件
systemctl restart prometheus.service
4、配置告警规则
告警规则可以参考:https://samber.github.io/awesome-prometheus-alerts/rules,并根据自己的需要进行修改
cat > /usr/local/prometheus/rules/hoststats-alert.rules << EOF
groups:
- name: hostStatsAlert
rules:
- alert: instanceDown
expr: up == 0
for: 5m
labels:
severity: node
annotations:
summary: "Instance {
{ $labels.instance }} down"
description: "{
{ $labels.instance }} of job {
{ $labels.job }} has been down for more than 5 minutes."
- alert: diskFree
expr: (1-(node_filesystem_free_bytes{fstype=~"ext4|xfs"} / node_filesystem_size_bytes{fstype=~"ext4|xfs"}) ) * 100 > 15
for: 5m
labels:
severity: page
annotations:
summary: "Instance {
{ $labels.instance }} down"
description: "{
{ $labels.instance }} of job {
{ $labels.job }} has been down for more than 5 minutes."
EOF
#### 配置完成后重启服务
systemctl restart prometheus.service
可以在Prometheus提供的页面上查看告警规则:
下面可以查看所有的告警规则:
下面这个可以看到告警状态:
一个报警信息在生命周期内有下面3中状态:
- inactive: 表示当前报警信息既不是firing状态也不是pending状态
- pending: 表示在设置的阈值时间范围内被激活了
- firing: 表示超过设置的阈值时间被激活了
5、验证
此时可以查看邮箱中是否有测试邮件
如果没有的话可以在 /var/log/syslog 查看是否有错误日志
1.4 部署 prometheusAlert - 发送飞书告警
1、简单介绍
alertmanager 是告警处理模块,但是告警消息的发送方法并不丰富。如果需要将告警接入飞书,钉钉,微信等,还需要有相应的SDK适配。prometheusAlert就是这样的SDK,可以将告警消息发送到各种终端上。
prometheus Alert 是开源的运维告警中心消息转发系统,支持主流的监控系统 prometheus,日志系统 Graylog 和数据可视化系统 Grafana 发出的预警消息。通知渠道支持钉钉、微信、华为云短信、腾讯云短信、腾讯云电话、阿里云短信、阿里云电话等。
这里主要是配置飞书告警。
2、创建飞书机器人
需要先创建一个群组
完成之后会自动生成一个webhook地址,记住这个webhook,就是以后要用的。
3、安装配置prometheusAlert
## 下载软件包wget
wget -P /usr/local/src https://github.com/feiyu563/PrometheusAlert/releases/download/v4.8.1/linux.zip
unzip linux.zip
mv linux prometheusAlert
##### 修改配置文件
cat prometheusAlert/conf/app.conf
######
### 比较重要的有几部分:端口,飞书rul的配置
#---------------------↓全局配置-----------------------
appname = PrometheusAlert
#登录用户名
login_user=prometheusalert
#登录密码
login_password=prometheusalert
#监听地址
httpaddr = "0.0.0.0"
#监听端口
httpport = 8088
#---------------------↓webhook-----------------------
#是否开启钉钉告警通道,可同时开始多个通道0为关闭,1为开启
open-dingding=1
#默认钉钉机器人地址
ddurl=https://oapi.dingtalk.com/robot/send?access_token=xxxxx
#是否开启 @所有人(0为关闭,1为开启)
dd_isatall=1
#是否开启微信告警通道,可同时开始多个通道0为关闭,1为开启
open-weixin=1
#默认企业微信机器人地址
wxurl=https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=xxxxx
#是否开启飞书告警通道,可同时开始多个通道0为关闭,1为开启
open-feishu=1
#默认飞书机器人地址
fsurl=https://open.feishu.cn/open-apis/bot/v2/hook/acb1fe4b-ce7d-4001-ab56-26551c6fee48
4、配置快速启动文件
mv prometheusAlert/ /usr/local/
chmod 755 /usr/local/prometheusAlert/PrometheusAlert
## systemd管理,如果没有prometheus用户,则创建一个
cat << EOF > /usr/lib/systemd/system/prometheusalert.service
[Service]
ExecStart=/usr/local/prometheusAlert/PrometheusAlert
WorkingDirectory=/usr/local/prometheusAlert
Restart=always
[Install]
WantedBy=multi-user.target
[Unit]
Description=Prometheus Alerting Service
After=network.target
EOF
systemctl daemon-reload
systemctl start prometheusalert.service
登录:http://ip:8088
此处的用户名密码是在配置文件中进行配置的,可以自行修改
5、修改alertmanager配置文件
###### 在上述的基础上新加配置
route:
routes:
- receiver: 'web.hook'
group_wait: 10s
receivers:
- name: 'web.hook'
webhook_configs:
- url: 'http://192.168.92.101:8088/prometheusalert?type=fs&tpl=prometheus-fs&fsurl=xxx'
# url是prometheus-alert提供的固定格式。其中:
# type=fs表示为飞书
# tpl=prometheus-fs 表示是prometheus消息
# fsurl 为飞书机器人的webhook,就是创建飞书机器人拿到的webhook
# 配置完成后重启
systemctl restart alertmanager.service
最终确定的配置文件
cat alertmanager.yml
global:
resolve_timeout: 5m #处理超时时间,默认为5分钟
smtp_from: 'xxxx'
smtp_smarthost: 'smtp.qq.com:25'
smtp_auth_username: 'xxxx'
smtp_auth_password: 'xxxxxxxx'
route:
group_by: ['alertname', 'item'] # 传入报警分组在一起的标签,如item=测试和alertname=Disk的多个报警将批处理为单个组
group_wait: 30s # 最初即第一次等待多久时间发送一组警报的通知
group_interval: 300s # 在发送新警报前的等待时间
repeat_interval: 4h # 发送重复警报的周期 对于email配置中,此项不可以设置过低,否则将会由于邮件发送太多频繁,被smtp服务器拒绝
receiver: 'email' # 发送警报的接收者的名称,以下receivers name的名称
routes:
- receiver: 'web.hook'
group_wait: 10s
# 定义模板
templates:
- '/usr/local/alertmanager/template/*.tmpl'
receivers:
- name: 'web.hook'
webhook_configs:
- url: 'http://192.168.92.101:8088/prometheusalert?type=fs&tpl=prometheus-fs&fsurl=xxxxxxxxxxxx
- name: 'email'
email_configs:
- to: 'xxxxx'
inhibit_rules: # 抑制规则
- source_match:
severity: 'critical'
target_match:
severity: 'warning'
equal: ['alertname', 'dev', 'instance', 'prod']
6、验证
7、修改告警模板
自定义模板可以在这个网址中找:https://github.com/feiyu563/PrometheusAlert/issues/30
下面是我找到的一个模板
{
{ $var := .externalURL}}{
{ range $k,$v:=.alerts }}
{
{if eq $v.status "resolved"}}
**[Prometheus 恢复通知]({
{$v.generatorURL}})**
告警名称:{
{$v.labels.alertname}}
告警状态:{
{$v.status}}
开始时间:{
{TimeFormat $v.startsAt "2006-01-02 15:04:05"}}
结束时间:{
{TimeFormat $v.endsAt "2006-01-02 15:04:05"}}
实例地址:{
{$v.labels.instance}}
主机名称:{
{$v.labels.hostname}}
**{
{$v.annotations.description}}**
{
{else}}
**[Prometheus 报警通知]({
{$v.generatorURL}})**
告警名称:{
{$v.labels.alertname}}
告警状态:{
{$v.status}} > {
{$v.labels.severity}}
开始时间:{
{TimeFormat $v.startsAt "2006-01-02 15:04:05"}}
结束时间:{
{TimeFormat $v.endsAt "2006-01-02 15:04:05"}}
实例地址:{
{$v.labels.instance}}
主机名称:{
{$v.labels.hostname}}
**{
{$v.annotations.description}}**
{
{end}}
{
{ end }}
总结
- 以上是邮件和飞书发送告警的配置方法,微信、钉钉等类似。
- 可以先不配置飞书,先使用邮箱来做测试,等告警的整个流程理解之后再进行飞书等的测试
- 告警规则可以参考:https://samber.github.io/awesome-prometheus-alerts/rules,并根据自己的需要进行修改
- 告警信息的模板可以参考:https://github.com/feiyu563/PrometheusAlert/issues/30