前言
在之前,我们安装了Alertmanager,并使用在promethues中添加了对Alertmanager的监控功能。
接下需要实现告警通知了,当发现异常时,将告警信息通知给相关人员,其流程如下:
Alertmanager支持多种通知方式,也就是支持多种通知接受者receiver:
- webhook:web回调或者http服务的推送API接口
- wechat:通过微信 API发送
- VictorOps :VictorOps API发出
- OpsGenie :通过OpsGenie API发送
- sns:短信
- Slack :通过Slack webhooks发送。该通知包含一个附件
- Pushover :通过Pushover API发送
- PagerDuty :通过PagerDuty API发送
- email:电子邮件
实现webhook推送告警信息
接下来使用webhook方式,实现告警信息接受。
之前也说过设置警报和通知的主要步骤:
- 配置 Prometheus与 Alertmanager对接
- 在 Prometheus 中创建警报规则
- 设置和配置Alertmanager
1. 配置 Prometheus与 Alertmanager对接
要实现Prometheus向Alertmanager中发送信息,只需要配置alertmanager连接地址即可。
修改prometheus.yml,添加alertmanager地址:
# Alertmanager配置
alerting:
alertmanagers:
- static_configs:
# 配置alertmanager连接地址
- targets: ['localhost:9093']
2. Prometheus添加告警规则
在实际环境中,告警规则肯定有很多,比如对服务器异常进行告警,就有宕机、CPU使用率超过100%、内存使用率超过80%、硬盘使用率超过80%等等。
所以,我们需要创建一个文件夹,针对每个监控对象,创建一个配置文件。
这里直接在Prometheus的程序主目录下创建一个alert_rules文件夹,用于存放所有的告警规则。
然后在alert_rules目录下创建一个alert_nacos.yml文件,用于创建nacos相关的告警规则。
然后再prometheus.yml配置中,添加规则文件目录,prometheus启动时,会在alert_rules和rules目录下,查找规则配置文件并加载。
# 服务器加载规则文件的位置
rule_files:
- "rules/*.yml"
- "alert_rules/*.yml"
编辑alert_nacos.yml配置,添加如下规则,针对Nacos宕机时,发送告警通知到Alertmanager。
# 相关的规则设置定义在一个group下。在每一个group中我们可以定义多个告警规则(rule)
groups:
# name:组名。报警规则组名称
- name: alters
# rules:定义规则
rules:
# alert:告警规则的名称
- alert: Nacos Down
# expr:基于PromQL表达式告警触发条件,用于计算是否有时间序列满足该条件。
expr: up{
job="nacos"} == 0
# for:评估等待时间,可选参数。用于表示只有当触发条件持续一段时间后才发送告警。在等待期间新产生告警的状态为pending。
for: 1m
# labels:自定义标签,允许用户指定要附加到告警上的一组附加标签。
labels:
# severity: 指定告警级别。有三种等级,分别为warning、critical和emergency。严重等级依次递增。
severity: emergency
target: nacos
# annotations: 附加信息,比如用于描述告警详细信息的文字等,annotations的内容在告警产生时会一同作为参数发送到Alertmanager。
annotations:
# summary描述告警的概要信息
# description用于描述告警的详细信息。
description: "description"
summary: "{
{ $labels.instance }} 已停止运行超过 1 分钟!"
重启Prometheus,查看控制台,发现当前规则已被激活,也可以看到详细的规则信息。
还可以通过Rules菜单,查看规则信息及状态,这里可以看到当前规则信息、状态、错误信息、上次执行时间、执行耗时等信息。
3. Alertmanager配置webhook告警通知
使用Spring boot创建一个web项目,提供一个API接口,用于接收告警通知。
@RestController
@RequestMapping("/alertmanager")
public class AlertmanagerController {
@RequestMapping("/hook")
public Object hook(@RequestBody String body){
System.out.println("接受到告警信息:"+body);
System.out.println("告警信息发送到数据库。。。");
return "success";
}
}
在alertmanager.yml中添加route及receivers配置,webhook_configs中的url配置配我们提供了webhook接口地址。
# 全局配置,全局配置,包括报警解决后的超时时间、SMTP 相关配置、各种渠道通知的 API 地址等等。
global:
# 告警超时时间
resolve_timeout: 5m
# 路由配置,设置报警的分发策略,它是一个树状结构,按照深度优先从左向右的顺序进行匹配。
route:
# 用于将传入警报分组在一起的标签。
# 基于告警中包含的标签,如果满足group_by中定义标签名称,那么这些告警将会合并为一个通知发送给接收器。
group_by: ['alertname']
# 发送通知的初始等待时间
group_wait: 30s
# 在发送有关新警报的通知之前需要等待多长时间
group_interval: 5m
# 如果已发送通知,则在再次发送通知之前要等待多长时间,通常约3小时或更长时间
repeat_interval: 30s
# 接受者名称
receiver: 'web.hook'
# 配置告警消息接受者信息,例如常用的 email、wechat、slack、webhook 等消息通知方式
receivers:
# 接受者名称
- name: 'web.hook'
# webhook URL
webhook_configs:
- url: 'http://127.0.0.1:9111/alertmanager/hook'
重新启动,查看控制台,当前是没有信息提示的。
4. 测试
关掉监控的Nacos程序,
发现当前告警规则,从Inactive转为了Pending状态,也就是从正常监控未激活警报状态,转为了已满足触发条件,但没有满足发送时间条件状态,当经过了rules.for配置的时间后,当前告警还在触发,则会进入Firing状态触发警报,将通知发给Alertmanager。
查看Alertmanager控制台,发现收到了一条告警通知。
在查看我们定义的webhook,收到了告警信息,因为这里设置的repeat_interval为30S,所以只要当前告警存在,就是每半分钟发送一次。
当前收到的告警信息,其结构如下,我们可以根据接收的信息,再通过自己的应用程序采用不同的方式发送给运维人员。
{
"receiver":"web\\.hook",
"status":"firing",
"alerts":[
{
"status":"firing",
"labels":{
"alertname":"Nacos Down",
"instance":"localhost:8848",
"job":"nacos",
"severity":"emergency",
"target":"nacos"
},
"annotations":{
"description":"description",
"summary":"localhost:8848 已停止运行超过 1 分钟!"
},
"startsAt":"2021-09-22T02:23:24.38636357Z",
"endsAt":"0001-01-01T00:00:00Z",
"generatorURL":"http://DESKTOP-GQBQ1GQ:9090/graph?g0.expr=up%7Bjob%3D%22nacos%22%7D+%3D%3D+0\u0026g0.tab=1",
"fingerprint":"451c9ca7ae1697e6"
}
],
"groupLabels":{
"target":"nacos"
},
"commonLabels":{
"alertname":"Nacos Down",
"instance":"localhost:8848",
"job":"nacos",
"severity":"emergency",
"target":"nacos"
},
"commonAnnotations":{
"description":"description",
"summary":"localhost:8848 已停止运行超过 1 分钟!"
},
"externalURL":"http://DESKTOP-GQBQ1GQ:9093",
"version":"4",
"groupKey":"{}:{target=\"nacos\"}",
"truncatedAlerts":0
}
版权声明:本文不是「本站」原创文章,版权归原作者所有 | 原文地址: