目录
前言:基于prometheus-alert+prometheus+alertmanager实现飞书告警
1、 Alertmanager实现告警理论知识
1.1 告警
使用 Prometheus 发出警报分为两部分。Prometheus 服务器的告警规则会将告警发送给Alertmanager。然后,Alertmanager 管理这些警报,包括静音、抑制、聚合和 通过电子邮件、随叫随到的通知系统和聊天平台等方法发送通知。
配置告警和通知的主要步骤如下:
- 设置和配置 Alertmanager
- 配置 Prometheus 与 Alertmanager 通信
- 在 Prometheus 中创建报警规则
1.2 Alertmanager常见概念
Alertmanager 负责处理客户端应用程序(如 Prometheus 服务器)发送的警报。它负责消除重复、分组,并将它们路由到正确的接收器集成,如电子邮件、PagerDuty 或 OpsGenie。同时,它还负责静默和告警抑制。
以下是一些常见概念:
1.2.1、分组
分组将性质相似的警报分类为单个通知。当许多系统同时发生故障,可能同时触发数百到数千个警报时,这在较大的中断期间特别有用。
例如:当网络分区发生时,集群中正在运行数十或数百个服务实例。一半的服务实例不能再访问数据库。Prometheus的警报规则被配置为在每个服务实例无法与数据库通信时发送警报。结果,数百个警报被发送到Alertmanager。
作为用户,人们只想获得一个页面,同时仍然能够准确地看到哪些服务实例受到了影响。因此,我们可以配置Alertmanager,将警报按集群和alertname分组,这样它就会发送一个紧凑的通知。
警报分组、分组通知的定时以及这些通知的接收者由配置文件中的路由树配置。
1.2.2、抑制(Inhibition)
告警抑制,当在已经触发某些警告的情况下,压制与其相关的其他特定警告不发送通知
例如:当有一个警告触发,告知整个集群无法访问时,Alertmanager可以被配置为抑制与该集群相关的所有其他警告的通知。这有助于避免因为成百上千个不相关的警告触发而发送通知,从而帮助用户聚焦于实际的问题。
抑制是通过Alertmanager的配置文件来配置的。
1.2.3、静默(Silences)
静默是一种简单直接的方式来在特定时间内压制警告。静默的配置基于匹配器,就像路由树一样。传入的警告会检查是否匹配活跃静默中所有的等号或正则表达式匹配器。如果匹配,则不会为该警告发送任何通知。
静默是在Alertmanager的Web界面中进行配置的。
2、 Alertmanager安装配置
2.1 创建文件夹
mkdir -p /opt/alertmanager
chmod 777 -R /opt/alertmanager
cd /opt/alertmanager
mkdir template
2.2 配置模版 (好像不重要)
vi 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.3 配置alertmanager.yml
vim alertmanager.yml
alertmanager.yml内容如下:
### 进行配置文件修改
global:
resolve_timeout: 5m #处理超时时间,默认为5分钟
smtp_from: 'xxx@qq.com' # smtp_from:指定通知报警的邮箱
smtp_smarthost: 'smtp.qq.com:25' # smtp_smarthost: 使用email打开服务配置
smtp_auth_username: xxx@qq.com' # 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:
- '/opt/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']
我使用的是这个,比较简单
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: 'web.hook' # 发送警报的接收者的名称,以下receivers name的名称
receivers:
- name: 'web.hook'
webhook_configs:
- url: 'http://192.168.1.XXXX:6080/prometheusalert?type=fs&tpl=prometheus-fs&fsurl=https://open.XXXXXXXX飞书机器人'
inhibit_rules: # 抑制规则
- source_match:
severity: 'critical'
target_match:
severity: 'warning'
equal: ['alertname', 'instance']
3、启动容器
3.1 启动
docker run -d -p 9093:9093 --restart=always \
-v /opt/alertmanager/alertmanager.yml:/etc/alertmanager/alertmanager.yml \
-v /etc/localtime:/etc/localtime -v /etc/timezone:/etc/timezone \
--name alertmanager \
prom/alertmanager
3.2 验证
4、 修改prometheus的配置文件
prometheus的安装略 《Prometheus》
4.1 新增以下内容
prometheus.yml
alerting:
alertmanagers:
- static_configs:
- targets:
- "192.168.1.98:9093" # Alertmanager地址
rule_files:
- /opt/prom/prometheus/rules/*.yml # 配置规则文件
# - /opt/prom/prometheus/rules/*.rules # 配置规则文件
4.2 新增告警规则文件
vi /opt/prom/prometheus/rules/alert.yml
- 告警名称(alert):内存使用率预警。
- 告警表达式(expr)