目录
引言
-
Prometheus 对指标的收集、存储同告警能力分属于
Prometheus Server
和AlertManager(通用组件)
两个独立的组件,前者仅负责基于 “告警规则” 生成告警通知,具体的告警操作则由后者完成。 -
Alertmanager 负责处理由客户端发来的告警通知客户端通常是 Prometheus server,但它也支持接收来自其它工具的告警。
-
Alertmanager 对告警通知进行分组、去重后,根据路由规则将其路由到不同的 receiver,如 Email、短信或 PagerDuty 等。
-
目前 Alertmanager 还不支持钉钉,那用户完全可以通过 Webhook 与钉钉机器人进行集成,从而通过钉钉接收告警信息。
-
同时 AltManager 还提供了 静默 和 告警抑制机制 来对告警通知行为进行优化。
PS:webhook 是一个 APR 概念,webhook 是一种 web 回调或者 http 的 push APT。Webhook 作为一个轻量的事件处理应用。
一、定义
1. 告警功能概述
-
prometheus 对指标的收集、存储与告警能力分属于 Prometheus server 和 alertmanager 两个独立的组件,pro-server 只负责通过 “告警规则” 生成告警通知,具体告警操作是由 alertmmanager 完成。
-
告警规则是由 PromQL 编写的布尔值表达式使用 >< = 与一个常用量值,比如 80% 进行比较,其返回值为 true 或 false。
-
prometheus-server 对抓取到的指标序列与告警规则中做为比较的 Prometheus 匹配,则会把此样本值抓取过来作比较,若返回值为 true 则认为指标异常,不能满足 false,则为正常值以上表达式为告警规则表达式。
比如:筛选一个指标数据 cpu 使用率 <0% 系统异常
2. 通知告警信息
一旦条件表达式为 true 就会触发通知信息,送给 altermanager,由 alter 借助特定服务的 API 或者访问入口,将此信息发出去,一般称为告警媒介,也可以借助邮件进行告警(SMTP)。
3. Prometheus 监控系统的告警逻辑
-
route:告警路由,分组、分类分发告警消息给不同渠道。
-
prometheus 通过 alter-rule 规则,生成告警通知给 altermanager,altermanager 会生成本地的告警路由表(第一路由默认称为根路由,所有的告警信息都需要一个根路由,没有一个匹配项,则需要设置一个默认路由)为实现将特定的信息发送给特定的用户。
例如:
按消息级别来看: 严重、中等、普通级别、红色报警、蓝色报警,应用发送方
按分组: 业务运维、系统运维、基础设施运维、k8s 运维
3.1 告警功能
除了基本的告警通知能力外,Altermanager 还支持对告警进行去重、分组、抑制。
3.2 静默、抑制、分组等功能
分组(Grouping):将相似告警合并为单个告警通知的机制,在系统因大面积故障而触发告警潮时,分组机制能避免用户被大量的告警噪声淹没,进而导致关键信息的隐没。
抑制(Inhibition):系统中某个组件或服务故障而触发告警通知后,那些依赖于该组件或服务的其它组件或服务可能也会因此而触发告警,抑制便是避免类似的级联告警的一种特性,从而让用户能将精力集中于真正的故障所在。
静默(silent):是指在一个特定的时间窗口内,即便接收到告警通知,Alertmanager 也不会真正向用户发送告警信息的行为;通常,在系统例行维护期间,需要激活告警系统的静默特性。
路由(route):用于配置 Alertmanager 如何处理传入的特定类型的告警通知,其基本逻辑是根据路由匹配规则的匹配结果来确定处理当前告警通知的路径和行为。
二、部署告警对接邮箱
192.168.10.20
在 prometheus-server 端定义告警规则,指定 alertmanager 的位置,将告警信息发送给 alert 处理
1. 下载安装包
wget http://101.34.22.188/prometheus/alertmanager-0.21.0.linux-amd64.tar.gz
tar zxvf alertmanager-0.21.0.linux-amd64.tar.gz -C /usr/local/
ln -s /usr/local/alertmanager-0.21.0.linux-amd64/ /usr/local/alertmanager
- 配置文件解析
cat /usr/local/alertmanager/alertmanager.yml
global: #全局参数
resolve_timeout: 5m
route: #路由信息
group_by: ['alertname'] #分组
group_wait: 30s #分组缓冲/等待时间
group_interval: 5m #重新分组时间
repeat_interval: 1h #重新告警间隔
receiver: 'web.hook' #接收方/媒介
receivers:
- name: 'web.hook'
webhook_configs:
- url: 'http://127.0.0.1:5001/' #标注5001端口
inhibit_rules: #抑制规则的策略
- source_match: #匹配项
severity: 'critical' #严重的级别
target_match:
severity: 'warning' #target匹配warning级别
equal: ['alertname', 'dev', 'instance'] #符合alertname、dev、instance
2. 修改配置文件
cd /usr/local/alertmanager
cp alertmanager.yml alertmanager.yml.bak
--------------------------------------
vim alertmanager.yml
global:
resolve_timeout: 5m
smtp_from: 1520509800@qq.com
smtp_auth_username: 1520509800@qq.com
smtp_auth_password: xjoxalmmtxtbhgja
smtp_require_tls: false
smtp_smarthost: 'smtp.qq.com:465'
route:
group_by: ['alertname']
group_wait: 10s
group_interval: 10s
repeat_interval: 1h
receiver: 'email-test'
receivers:
- name: 'email-test'
email_configs:
- to: 1520509800@qq.com
send_resolved: true
3. 配置绑定的邮箱
略(自行百度)
4. 启动 alertmanager
cd /usr/local/alertmanager/
nohup ./alertmanager &
- 配置文件
#需要注意prometheus的位置
cd /usr/local/prometheus-2.27.1.linux-amd64/
mkdir alert-config
cd alert-config/
mkdir alert_rules targets
cd alert_rules/
---------------------------------------------------------------------
vim instance_down.yaml #邮件会接收到的信息
groups:
- name: AllInstances
rules:
- alert: InstanceDown
#Condition for alerting
expr: up == 0
for: 1m
#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'
cd ..
cd targets/
vim alertmanagers.yaml
- targets:
- 192.168.10.20:9093
labels:
app: alertmanager
----------------------------------------------------------------------------------------------
vim nodes-linux.yaml
- targets:
- 192.168.10.30:9100
- 192.168.10.40:9100
- 192.168.10.50:9100
labels:
app: node-exporter
job: node
--------------------------------------------------------------------------------------------
vim prometheus-servers.yaml
- targets:
- 192.168.10.20:9090
labels:
app: prometheus
job: prometheus
-----------------------------------------------------------
[root@prometheus /usr/local/prometheus-2.27.1.linux-amd64/alert-config]#tree
.
├── alert_rules
│ └── instance_down.yaml
└── targets
├── alertmanagers.yaml
├── nodes-linux.yaml
└── prometheus-servers.yaml
- prometheus 启动文件
[root@prometheus /usr/local/prometheus-2.27.1.linux-amd64]#cp prometheus.yml prometheus.yml.bak
###注意各个配置文件路径,可用绝对路径
[root@prometheus /usr/local/prometheus-2.27.1.linux-amd64]#vim prometheus.yml
# my global config
# Author: MageEdu <mage@magedu.com>
# Repo: http://gitlab.magedu.com/MageEdu/prometheus-configs/
global:
scrape_interval: 15s # Set the scrape interval to every 15 seconds. Default is every 1 minute.
evaluation_interval: 15s # Evaluate rules every 15 seconds. The default is every 1 minute.
# scrape_timeout is set to the global default (10s).
# Alertmanager configuration
alerting:
alertmanagers:
- file_sd_configs:
- files:
- "/usr/local/prometheus-2.27.1.linux-amd64/alert-config/targets/alertmanagers*.yaml"
# Load rules once and periodically evaluate them according to the global 'evaluation_interval'.
rule_files:
- "rules/*.yaml"
- "/usr/local/prometheus-2.27.1.linux-amd64/alert-config/alert_rules/*.yaml"
# A scrape configuration containing exactly one endpoint to scrape:
# Here it's Prometheus itself.
scrape_configs:
# The job name is added as a label `job=<job_name>` to any timeseries scraped from this config.
- job_name: 'prometheus'
# metrics_path defaults to '/metrics'
# scheme defaults to 'http'.
file_sd_configs:
- files:
- /usr/local/prometheus-2.27.1.linux-amd64/alert-config/targets/prometheus-*.yaml
refresh_interval: 2m
# All nodes
- job_name: 'nodes'
file_sd_configs:
- files:
- /usr/local/prometheus-2.27.1.linux-amd64/alert-config/targets/nodes-*.yaml
refresh_interval: 2m
- job_name: 'alertmanagers'
file_sd_configs:
- files:
- /usr/local/prometheus-2.27.1.linux-amd64/alert-config/targets/alertmanagers*.yaml
refresh_interval: 2m
5. 启动 prometheus
指定修改的配置文件启动
cd /usr/local/prometheus-2.27.1.linux-amd64/
nohup ./prometheus --config.file=./prometheus.yml &
6. 模拟故障
-
停止一台 node_exporter,等一会看看有没有报警邮件
-
查看 prometheus-ui
- 查看QQ邮箱