前言
1. Alertmanager 发送告警的介绍
Prometheus 对指标的收集、存储与告警能力分属于 Prometheus Server 和 AlertManager 两个独立的组件,前者仅负责定义告警规则生成告警通知, 具体的告警操作则由后者完成。
Alertmanager 负责处理由 Prometheus Server 发来的告警通知,Alertmanager对告警通知进行分组、去重后,根据路由规则将其路由到不同的receiver,如Email、钉钉或企业微信等。
除了基本的告警通知能力外,Altermanager还支持对告警进行去重、分组、抑制、静默和路由等功能:
●分组(Grouping):将相似告警合并为单个告警通知的机制,在系统因大面积故障而触发告警潮时,分组机制能避免用户被大量的告警噪声淹没,进而导致关键信息的隐没
●抑制(Inhibition):系统中某个组件或服务故障而触发告警通知后,那些依赖于该组件或服务的其它组件或服务可能也会因此而触发告警,抑制便是避免类似的级联告警的一种特性,从而让用户能将精力集中于真正的故障所在
●静默(Silent):是指在一个特定的时间窗口内,即便接收到告警通知,Alertmanager也不会真正向用户发送告警信息的行为;通常,在系统例行维护期间,需要激活告警系统的静默特性
●路由(route):用于配置Alertmanager如何处理传入的特定类型的告警通知,其基本逻辑是根据路由匹配规则的匹配结果来确定处理当前告警通知的路径和行为
2.Alertmanager邮箱报警设置
(1)上传 alertmanager-0.24.0.linux-amd64.tar.gz 到 /opt 目录中,并解压
cd /opt/
tar xf alertmanager-0.24.0.linux-amd64.tar.gz
mv alertmanager-0.24.0.linux-amd64 /usr/local/alertmanager
(2)修改 alertmanager 配置文件,添加邮件告警路由信息
vim /usr/local/alertmanager/alertmanager.yml
#global 配置段用于定义全局配置
#templates 配置段负责自定义告警内容模板文件
#route 配置段用于指定如何处理传入的告警
#receiver 配置段则定义了告警信息的接收器,每个接收器都应该有其具体的定义
global: #在全局配置段设置发件人邮箱信息
resolve_timeout: 5m #定义持续多长时间未接收到告警通知后,就将告警状态标记为resolved
smtp_smarthost: 'smtp.qq.com:25'
smtp_from: '这里使用的是个人邮箱'
smtp_auth_username: '这里使用的是个人邮箱'
smtp_auth_password: 'xxxxxx' #此处为授权码,登录QQ邮箱【设置】->【账户】中的【生成授权码】获取
smtp_require_tls: false #禁用TLS的传输方式
route: #设置告警的分发策略
group_by: ['alertname'] #采用哪个标签来作为分组依据,这里使用告警名称做为规则,满足规则的告警将会被合并到一个通知中
group_wait: 20s #一组告警第一次发送之前等待的时延,即产生告警20s将组内新产生的消息合并发送,通常是0s~几分钟(默认是30s)
group_interval: 5m #一组已发送过初始告警通知的告警,接收到新告警后,下次发送通知前等待时延,通常是5m或更久(默认是5m)
repeat_interval: 20m #一组已经发送过通知的告警,重复发送告警的间隔,通常设置为3h或者更久(默认是4h)
receiver: 'my-email' #定义告警接收人
receivers: #设置收件人邮箱信息
- name: 'my-email'
email_configs:
- to: '收件人的邮箱' #设置收件人邮箱地址
send_resolved: true
(3)配置启动文件
cat > /usr/lib/systemd/system/alertmanager.service <<'EOF'
[Unit]
Description=alertmanager
Documentation=https://prometheus.io/
After=network.target
[Service]
Type=simple
ExecStart=/usr/local/alertmanager/alertmanager \
--config.file=/usr/local/alertmanager/alertmanager.yml \
--log.level=debug
ExecReload=/bin/kill -HUP $MAINPID
Restart=on-failure
[Install]
WantedBy=multi-user.target
EOF
#启动 Alertmanager
systemctl start alertmanager
systemctl enable alertmanager
netstat -natp | grep :9093
(4)添加告警规则
mkdir /usr/local/prometheus/alter_rules
vim /usr/local/prometheus/alter_rules/instance_down.yaml
groups:
#若某个 Instance 的 up 指标的值转为 0 持续超过 1 分钟后,将触发告警
- name: AllInstances
rules:
- alert: InstanceDown #告警规则的名称,一个组内的告警规则名称必须惟一
# Condition for alerting
expr: up == 0 #基于PromQL表达式的告警触发条件(布尔表达式)
for: 1m #控制在触发告警之前,测试表达式的值必须为true的时长
#表达式值为true,但其持续时间未能满足for定义的时长时,相关的告警状态为pending
#满足该时长之后,相关的告警将被触发,并转为firing状态
#表达式的值为false时,告警将处于inactive状态
# Annotation - additional informational labels to store more information
annotations: #附加在告警之上的注解信息
title: 'Instance down'
description: Instance has been down for more than 1 minute.'
# Labels - additional labels to be attached to the alert
labels:
severity: 'critical' #在告警上附加的自定义的标签
#CPU 使用率大于 80% 触发告警
- name: node_alert
rules:
- alert: cpu_alert
expr: 100 -avg(irate(node_cpu_seconds_total{mode="idle"}[1m])) by (instance)* 100 > 80
for: 5m
labels:
level: warning
annotations:
description: "instance: {{ $labels.instance }} ,cpu usage is too high ! value: {{$value}}"
summary: "cpu usage is too high"
(5)修改 prometheus 配置文件,添加 Alertmanager 实例的配置
vim /usr/local/prometheus/prometheus.yml
......
alerting:
alertmanagers:
- static_configs:
- targets:
- 192.168.80.30:9093 #任意一台k8s主机IP及exporter服务监听端口
rule_files:
- "/usr/local/prometheus/alter_rules/*.yaml"
systemctl reload prometheus
(6)进行报警测试
systemctl stop node_exporter.service
3.Alertmanager钉钉报警设置
(1)上传 prometheus-webhook-dingtalk-2.1.0.linux-amd64.tar.gz 到 /opt 目录中,并解压
cd /opt/
tar xf prometheus-webhook-dingtalk-2.1.0.linux-amd64.tar.gz
mv prometheus-webhook-dingtalk-2.1.0.linux-amd64 /usr/local/dingtalk
(2)登录阿里钉钉,并且进行设置
创建群 -> 群设置 -> 智能群助手 -> 添加机器人 -> 添加机器人 -> 自定义
消息推送 开启
Webhook 复制
安全设置 -> 勾选 加签 -> 复制
点击完成
(3)修改 dingtalk 告警插件配置文件
cd /usr/local/dingtalk
cp -p config.example.yml config.yml
vim config.yml
timeout: 5s
## Uncomment following line in order to write template from scratch (be careful!)
#no_builtin_template: true
## Customizable templates path
templates:
- contrib/templates/legacy/template.tmpl
## You can also override default template using `default_message`
## The following example to use the 'legacy' template from v0.3.0
default_message:
title: '{{ template "legacy.title" . }}'
text: '{{ template "legacy.content" . }}'
## Targets, previously was known as "profiles"
targets:
webhook1:
url: <粘贴Webhook的内容>
# secret for signature
secret: <粘贴加签的内容>
#启动服务
./prometheus-webhook-dingtalk
(4)修改 alertmanager 配置文件
vim /usr/local/alertmanager/alertmanager.yml
global:
resolve_timeout: 5m
route:
group_by: [alertname]
group_wait: 10s
group_interval: 15s
repeat_interval: 20m
receiver: 'dingding.webhook1'
receivers:
- name: 'dingding.webhook1'
webhook_configs:
- url: 'http://192.168.73.108:8060/dingtalk/webhook1/send'
send_resolved: true
systemctl reload alertmanager
(5)测试告警
systemctl stop node_exporter