Prometheus 生态的原生做法,由于阈值是放在 promql 中的,恢复时的消息中难以拿到恢复时的值,夜莺 v7.0.0.beta10 版本开始,提供了一种较为简单的内置方式,解决这个问题。下面我们就来看一下如何实现这个能力。
升级方法
从 v6 版本开始,程序自动创建表结构,所以 v6、v7 的各个小版本之间升级,相对容易,整体逻辑是:
- 1.备份,包括数据库、二进制、配置文件、integrations目录,以防万一
- 2.下载新版本解压,修改配置文件中的数据库连接地址、redis连接地址、时序库连接地址等个性化信息
- 3.停掉老版本,启动新版本(建议新老版本使用不同的安装目录,都保留不删,建个软链指向当前使用的版本)
拿到恢复时的值的原理
夜莺的告警逻辑是拿着规则中的 promql 去周期性查询,如果查不到数据就认为是正常的,如果查到了数据,就认为有触发了阈值的异常数据,进而生成告警事件。从这里逻辑可以看出,恢复的时候,promql 查不到数据,所以也就难以拿到恢复的时候的值了。
有两个办法可以解决:
- 不要把阈值放到 promql 中了,promql 查询原始数据,然后在告警引擎里边判断是否触发了阈值,而不是让时序库去判断,Flashduty 和夜莺企业版就提供了这个方式,这个方式比较容易理解,但是每次 promql 把原始数据查出来,可能会查出特别大量的数据,要小心使用
- 在告警恢复的时候,重新发起一次 promql 查询,查询当前最新值。但是要注意,比如 10 台机器同时触发了 load1 告警,某个时刻有 2 台恢复了,查询最新值的 promql 得是准确去查询恢复的 2 台,得对应起来
开源版本的夜莺,提供的是第二种方式,下面我们来看一下如何配置。
如何配置
要配置两个地方,第一个是通知模板,我以钉钉的通知模板举例,其他的通知模板大家可以参考钉钉的:
#### {{if .IsRecovered}}<font color="#008800">
标签:end,recovery,恢复,AnnotationsJSON,promql,一招,告警
From: https://www.cnblogs.com/ulricqin/p/18244076