SpringBoot整合AlertManager,实现自定义的告警收敛以及邮件处理,告警风暴,解决重复告警问题
需求
将传感器通过Http发送到微服务(SpringBoot项目)的警报消息,通知给对应的联系人。不能重复发送相同的警告
问题分析
首先分析一波问题,这里我们先假设有一个接口可以接收传感器发送过来的请求。那么我们需要做的就是,把告警消息推送给对应的联系人。这里再一次简化,假设告警消息里面就携带了联系人的信息。
意思就是我们可以直接把收到的告警消息,解析,然后获取对应的联系人,然后通过邮件、短信、电话、钉钉等通讯工具发送。
真有这么简单吗?
这里我们忽略了一个问题。如果传感器开始发出警报了,那么就意味着,在这之后的一段时间之内,微服务平台都会接收到一模一样的告警消息。自然而然用户就会接收到大量重复的告警消息,这样就会造成“狼来了”的现象。这个问题才是我们需要实际解决的问题。
如果要解决这个问题,我们的切入点就应该是,如何去除大量的重复消息?意思就是我们需要在告警消息接收端和邮件发送端中间加入一个中间件,实现对告警消息的去重、过滤。
解决方案
从上面的分析中,我们需要实现的其实就是对告警消息的去重、过滤。而AlertManager,刚好就可以做到这件事情。
具体原理我这里就不细说了,大家可以自行百度。
官方文档地址传送门:https://prometheus.io/docs/alerting/latest/configuration/
我先讲一下我的实现方案。
1、安装AlertManager
AlertManager可以支持docker,或者二进制安装。这里我为了方便就选择了使用docker安装。如果是实际生产环境,建议不要使用docker(用户肯定不希望,自己的服务器因为需要装AlertManager,而去安装一个docker),如果是土豪那就随意了。
拉取镜像:
docker pull bitnami/alertmanager
创建配置文件:
mkdir /opt/alertmanager/
touch /opt/alertmanager/config.yml #创建一个配置文件
chmod -R 777 /opt/alertmanager/ #对该文件夹及其所有的子文件进行授权
配置文件内容:
global:
resolve_timeout: 5m
route:
group_by: [‘instance’]
group_wait: 10s
group_interval: 20s
repeat_interval: 20s
receiver: ‘webhook’
receivers:
-name: ‘webhook’
webhook_configs:
-url: ‘http://192.168.102.13:18083/rittal/alert/notify’
这里是yml格式的文件-name这里有格式问题,稍微改动一下就行。
这里使用的是webhook配置,webhook说简单点,就是http的远程调用,可以这么理解。
2、启动AlertManager
使用docker启动alertmanager
docker run -v /opt/alertmanager/:/etc/alertmanager/ -d -p 9093:9093 --name alertmanager bitnami/alertmanager:latest --config.file=/etc/alertmanager/config.yml
访问:http://192.168.56.10:9093/#/alerts 能看到这个页面那么就OK了
3、编写好一个模拟请求,发送一个警告
请求地址:http://192.168.56.10:9093/api/v1/alerts
请求体:
[
{
“labels”:{
“instance”: “XXX”
},
“annotations”:{
“msg”:“XXX”
}
}
]
labels里面就是分组依据,里面的字段名(如instance)都是在config.yml中定义好了的。必须按照config.yml中定义的来传,才能正确分组。还有正确分组了,才能准确的收敛。
4、编写一个Post的接口
这个接口用来接收经过AlertManager收敛之后的警告。
接口写好之后,然后就发送第三步中的请求。就会接收到消息了,接收到之后,想怎么通知就*发挥了。
如何恢复告警?
注意配置文件中有一个值就是resolve_timeout,这个值的意思就是,如果在这个时间之内,没有新警告发送过来,同时也没有达到重复告警的时间,那么就把该组的告警置为已解决,这样就是告警恢复了。