Prometheus告警
# Prometheus告警介绍
# 告警介绍
在监控体系中,Prometheus本身并没有告警功能,它仅仅负责评估告警规则并生成告警。具体的告警操作由Alertmanager负责,它用于处理告警,包括去重、分组、抑制和发送通知等。
# 告警规则
告警规则是由PromQL编写的布尔表达式,每次评估告警规则都会基于其查询的返回结果来判断是否触发告警,如果返回结果为false
则表示正常,如果返回结果为true
则表示异常,将触发告警。
# AlertManager介绍
# 介绍
Alertmanager是Prometheus监控系统的关键组件之一,专门负责处理由 Prometheus 服务器发送过来的告警。尽管Alertmanager是由Prometheus项目维护的,但它作为一个独立的组件运行,需要单独安装和配置。
它的设计目的是提供一种统一的告警处理方式,尽管它的客户端通常Prometheus,但也支持与其他监控工具集成,接收并处理来自它们的告警。
# 功能
# 分组 (Grouping)
分组规则可以将相似的告警合并为一组作为单个通知进行发送。减少告警通知的数量,即能避免告警风暴对接收者造成的干扰,也能避免关键信息的隐没。分组规则可以基于告警的标签来定义,如根据环境、应用或严重性等进行分组。
比如检测多个系统的运行状况,但因为停电导致所以系统不运行,只有告警系统在运行。这个时候如果没有配置分组就会报出很多相似的告警信息,而如果分组了的话,就可以防止出现很多相似的告警信息。
# 去重 (Deduplication)
去重规则能确保在一定时间内只发送一次通知,减少冗余的告警信息,使得告警通知更加清晰。
# 抑制 (Inhibition)
抑制规则用于暂时抑制某些告警通知。当特定条件满足时,可以抑制(即暂时不发送)某些告警通知。抑制是避免类似的级联告警的一种特性,从而让用户能将精力集中于真正的故障所在,而抑制其他关联告警。
比如某个组件告警了,原本依赖于它的其他组件也应该跟着报警,但通过抑制规则可以阻止依赖于该组件的其他组件也跟着报警。
# 静默 (Silent)
静默规则允许用户临时静默一组特定的告警通知。通过配置静默规则,可以指在一个特定时间内即便接收到告警,Alertmanager也不会真正向用户发送通知。
通常在系统例行维护期间,需要激活告警系统的静默特性,防止维护时一直报警。
# 路由 (Route)
路由规则用于告诉Alertmanager如何处理告警通知,它基于告警的标签进行匹配,并且可以嵌套,从而提供高度灵活的配置方式来处理当前告警通知的路径和行为。
路由规则可以按告警级别或分组,对特定的一个或一组接收人进行告警通知发送,以确保告警能够及时准确地被相应负责人处理。
# 告警媒介
Alertmanager支持多种告警媒介(即通知方式),包括但不限于电子邮件、钉钉、Webhook等。通过配置,可以实现将告警通知发送到几乎任何支持接收消息的系统或服务。
# AlertManager部署配置
- 下载并解压二进制包
https://prometheus.io/download/
- 配置AlertManager
vim ./alertmanager.yml
- 全局配置
global:
# 告警状态由存在变为恢复的等待时间
# 如果指定时间内没有恢复会再次发送,它比route中配置的时间间隔优先级更高
resolve_timeout: 5m
2
3
4
- 路由配置
# 配置路由,定义告警通知的路径和行为
route:
# 分组标签,指定告警根据哪些标签进行分组
group_by: ['alertname']
# 在同一组告警发送前等待的时间,这个是为了把更多的告警作为同一个批次发出
group_wait: 30s
# 同一组告警不同批次之间等待的时间
group_interval: 5m
# 重复告警的等待时间,收到的重复告警要等待多久后才再次发出
repeat_interval: 1h
# 默认接收者,如果没有匹配任何子路由,则使用此接收者
receiver: 'default-receiver'
# 子路由列表,每个子路由可以指定更具体的匹配规则和接收者
routes:
# 匹配标签,表示当告警标签包含env=pro和service=database时使用该子路由
- match:
env: pro
service: database
# 为匹配的告警指定接收者
receiver: 'team-DB-email'
# 使用正则表达式匹配标签,表示匹配service为web或api的告警
- match_re:
service: ^(web|api)$
receiver: 'team-Webhook'
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
- 接收者配置
# 配置接收者,定义了发送告警通知的具体方法
receivers:
# 接收者名称,用于路由中引用
- name: default-receiver
# 邮件配置,定义发送邮件告警通知的参数
email_configs:
# 邮件接收地址
- to: 'admin@example.com'
- name: team-Webhook
# Webhook配置
webhook_configs:
# 指定Webhook的目标URL
- url: 'http://127.0.0.1:5001/'
# 指定是否在恢复时也发送通知,默认false
send_resolved: true
# 指定额外的HTTP配置(可选)
http_config:
# 指定用于认证的BearerToken(可选)
bearer_token: 'your-bearer-token'
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
钉钉告警可以使用:https://github.com/timonwong/prometheus-webhook-dingtalk
- 抑制配置
inhibit_rules:
# 匹配源告警(触发抑制机制的告警)
- source_match:
# 匹配的告警名(可选)
alertname: InstanceDown
# 匹配的告警级别(可选)
severity: 'critical'
# 匹配目标告警(需要抑制的告警)
target_match:
severity: 'critical'
# 源告警和目标告警在这些标签上的值必须相等,告警抑制才会生效,用于确保只有相关联的告警之间才会发生抑制
equal: ["instance"]
# 正则匹配源告警,与source_match的区别在于可以正则匹配
- source_match_re:
service: 'database-(.*)'
# 正则匹配目标告警,与target_match的区别在于可以正则匹配
target_match_re:
service: 'webserver-(.*)'
equal: ['instance']
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
标签配置在告警规则的labels字段中,默认标签有:alertname、severity、instance、job
注意:需要确保源告警和目标告警的匹配配置不一致,也就是两者匹配到的必须是不同的告警,否则抑制不会生效。
# Prometheus告警配置
# 配置AlertManager信息
一般还会将AlertManager作为监控目标,配置方法同Targets配置。
# 静态配置方式
# 主配置文件prometheus.yml中添加以下配置
alerting:
alertmanagers:
- static_config:
- targets:
- 192.168.10.20:5001
2
3
4
5
6
7
# 文件发现配置方式
## 主配置文件prometheus.yml中添加以下配置
alerting:
alertmanagers:
- file_sd_configs:
- files:
- "targets/alertmanager.yml"
# 创建文件发现配置文件
# vim ./targets/alertmanager.yml
- targets:
- 192.168.10.20:5001
labels:
app: alertmanager
job: alertmanager
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 配置告警规则
vim ./prometheus.yml
# 加载alert_rules文件夹内的文件到告警规则
rule_files:
- "alert_rules/*.yml"
2
3
vim ./alert_rules/instances.yml
# 表示使用规则组,方便组织和管理告警规则
groups:
# 规则组名称
- name: AllInstances
# 规则配置
rules:
# 告警规则名称
- alert: HighRequestLatency
# PromQL表达式,定义何时触发告警,结果需要是布尔值
expr: job:request_latency_seconds:mean5m{job="myjob"} > 0.5
# 触发条件满足多长时间后才真正触发告警,以避免短暂波动造成的误报
for: 10m
# 告警通知内容
annotations:
# 发送的告警通知标题
title: "High request latency "
# 发送的告警通知描述,{{ $value }}会替换为触发告警的PromQL表达式的实际值
description: "This service has a mean request latency above 0.5s (current value: {{ $value }}s)"
# 指定附加标签
labels:
# 告警级别标签(必带),可以自定义,但一般为以下三个级别:warning(警告)、critical(严重)、emergency(紧急)
severity: critical
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
- 配置完后,如果是使用静态配置,则需要重启Prometheus使配置生效。