Prometheus
将数据采集和报警分成了两个模块。报警规则配置在Prometheus Servers
上,然后发送报警信息到AlertManger
,然后我们的AlertManager
就来管理这些报警信息,包括 silencing、inhibition,聚合报警信息过后通过 email、PagerDuty、HipChat、Slack 等方式发送消息提示。
部署完学习过程中也就明白了 Alertmanager 在监控当中的位置。
部署 Alertmanager
部署方式和 Prom 也几乎一样,下载一个命令+配置文件,指定配置文件运行即可
下载安装包链接:https://prometheus.io/download/#alertmanager
mkdir /opt/monitoring/alert && cd $_
wget https://github.com/prometheus/alertmanager/releases/download/v0.24.0/alertmanager-0.24.0.linux-amd64.tar.gz
tar zxf alertmanager-0.24.0.linux-amd64.tar.gz
mv alertmanager-0.24.0.linux-amd64 alertmanage && cd $_
使用 systemd 管理服务启停
$ vim /usr/lib/systemd/system/alertmanager.service
[Unit]
Descriptioin=alertmanager
[Service]
# 这里注意命令和配置文件所在位置
ExecStart=/opt/monitoring/alert/alertmanager \
--config.file=/opt/monitoring/alert/alertmanager/alertmanager.yml
ExecReload=/bin/kill -HUP $MAINPID
KillMode=process
Restart=on-failure
[Install]
WantedBy=multi-user.target
修改配置文件: https://prometheus.io/docs/alerting/latest/configuration/
$ vim /opt/monitoring/alert/alertmanager/alertmanager.yml
# 最上方添加
global:
# 如果告警之后5分钟内没有再次告警或者更新告警,则被认为已解决
resolve_timeout: 5m
# 邮箱服务器配置
smtp_from: 841597730@qq.com
smtp_smarthost: smtp.qq.com:465
smtp_auth_username: '841597730@qq.com'
smtp_auth_password: 'xxxxxxxxxxxxxxxx' # 邮箱授权码
# 配置路有树,触发告警后的处理
route:
group_by: ['alertname'] # 根据告警规则组名进行分组,这里也可以是指标的某个标签
group_wait: 30s # 分组内第一个告警等待时间,时间内有第二个告警则合并发送
group_interval: 5m # 该分组内的告警间隔
repeat_interval: 5m # 重复告警发送间隔
receiver: 'googlemail' # 接收方,与下方receivers.name对应
# 还可以继续添加routes进行分组发送告警
routes:
- receiver: 'backend-wechat'
group_wait: 10s
match_re: # 带有以下标签指标的告警将被发送到receivers.name为backend-wechat
service: java
# 告警接收人
receivers:
- name: 'googlemail'
email_configs:
- to: 'mupeifeiyi@gmail.com'
send_resolved: true
- name: 'backend-wechat'
email_configs:
- to: 'mupeifeiyi@gmail.com'
send_resolved: true # 接收告警恢复的通知
启动服务并开机自启
systemctl enable --now alertmanager
可以直接访问 http://192.168.1.11:9093
进入 alertmanager 的 web 界面
Prom 与 Alert 的通信
在 Prometheus 的配置文件中添加 Alertmanager 的接收告警地址
alerting:
alertmanagers:
- static_configs:
- targets:
- 192.168.1.11:9093
# 指定告警规则文件的存放位置
rule_files:
- "rules/*.yml"
编写告警规则
告警规则是在 prom 所在的位置写的,也是有 prom 来加载的
$ mkdir /opt/monitoring/prometheus/rules && cd $_
$ vim test.yml
groups:
- name: test # 与alertmanager的分组alertname对应
rules:
# 任何实例5分钟内无法访问发出告警
- alert: 实例无法访问 # 告警规则名称
expr: up == 0 # 基于PromQL的触发条件
for: 1m # 条件持续满足1分钟触发
labels: # 自定义标签,与prom标签无关
test: 2
annotations: # 告警信息
summary: "{{ $labels.instance }} 无法访问"
description: "{{ $labels.instance }} 持续5分钟无法访问"
# 此处的$labels后面接的都是prom中指标的标签
重启 prom
访问 prom 告警规则界面,查看规则, http://ip:9090/rules
模拟告警
停掉一台节点的 node_exporter
prom 告警界面将变为以下内容,可以看到告警规则中自定义的标签也会出现在符合规则的节点
告警收敛
告警太多,会导致运维人员对告警的麻木,总感觉看了之后没用,或者一些比较不重要的告警,不利于重要故障的处理。
alert 可以对告警收敛合并发送,避免大量的告警个数产生
group 分组
默认启用分组功能,默认也是通过 alertname 的标签来分组,alertname 也会是告警实例的指标标签,也可以使用其他的指标
配合 group_interval
和 repeat_interval
两个配置进行告警分组的收敛。
告警抑制
抑制规则在 alertmanager 中配置
inhibit_rules:
- source_match:
# 在prom告警规则中自定义的标签,告警等级
level: 'high' # 告警级别
target_match: # 抑制告警级别,具有以下标签的告警将被忽略
level: 'warning'
equal: ['instance']
以上的抑制表示,当具有 level 为 high 的告警触发后,忽略 level 为 warning 的告警,且这个规则是在具有同样的 alertname 和 instance 的指标下才会触发这种抑制规则。
示例:instance 表示的是主机ip,一台主机宕机后,主机上的所有端口都会报警,这种情况下,只需要报警主机宕机即可,其他端口报警都可忽略。
告警静默
特定时间静音提醒的机制
访问 alert 的 ui 界面,http://ip:9093/#/silences
,进行配置即可