夜莺 v7.beta10 发版,告警恢复时可以拿到恢复时的值了
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">💚{{.RuleName}}</font>{{else}}<font color="#FF0000">💔{{.RuleName}}</font>{{end}} --- {{$time_duration := sub now.Unix .FirstTriggerTime }}{{if .IsRecovered}}{{$time_duration = sub .LastEvalTime .FirstTriggerTime }}{{end}} - **告警级别**: {{.Severity}}级 {{- if .RuleNote}} - **规则备注**: {{.RuleNote}} {{- end}} {{- if not .IsRecovered}} - **当次触发时值**: {{.TriggerValue}} - **当次触发时间**: {{timeformat .TriggerTime}} - **告警持续时长**: {{humanizeDurationInterface $time_duration}} {{- else}} {{- if .AnnotationsJSON.recovery_value}} - **恢复时值**: {{formatDecimal .AnnotationsJSON.recovery_value 4}} {{- end}} - **恢复时间**: {{timeformat .LastEvalTime}} - **告警持续时长**: {{humanizeDurationInterface $time_duration}} {{- end}} - **告警事件标签**: {{- range $key, $val := .TagsMap}} {{- if ne $key "rulename" }} - `{{$key}}`: `{{$val}}` {{- end}} {{- end}}
这里最为关键的逻辑是判断 .AnnotationsJSON.recovery_value
的逻辑:
{{- if .AnnotationsJSON.recovery_value}} - **恢复时值**: {{formatDecimal .AnnotationsJSON.recovery_value 4}} {{- end}}
如果 .AnnotationsJSON
中包含 recovery_value
就展示,展示的时候把 recovery_value
保留 4 位小数。这个 .AnnotationsJSON
是夜莺告警规则中的自定义字段部分,如果告警事件中有恢复时的值,就会在这个字段中体现。
另一个要配置的,是告警规则,你想让哪个告警规则支持获取恢复时的值,就在告警规则的自定义字段中加上 recovery_promql
字段。比如我有一个告警规则用来侦测 HTTP 地址探测失败:
需要在告警规则最下面的自定义字段里,增加 recovery_promql 的配置,如下:
要理解这个工作逻辑,我们先来看看 http_response_result_code 这个指标的数据长什么样子:
从上图可以看出,这个指标包含两个 series,其中 agent_hostname 和 method 字段相同,target 字段可以区分开这俩 series。告警规则 http_response_result_code != 0
如果触发,告警事件中一定会带有 target 标签,所以,如果告警事件恢复的时候,我们用高警时的那个 target 标签去查询,一定就可以准确查到恢复时的值了。所以 recovery_promql 的配置中引用了 target 标签,其值是变量,这个变量就是告警事件中的 target 标签值。
效果
后续计划
近期夜莺还计划做的事情如下:
- 仪表盘:支持内嵌 Grafana
- 告警规则:通知时支持配置过滤标签,避免告警事件中一堆不重要的标签
- 机器管理:自定义标签拆分管理,agent 自动上报的标签和用户在页面自定义的标签分开管理,对于 agent 自动上报的标签,以 agent 为准,直接覆盖服务端 DB 中的数据
- 机器管理:机器支持角色字段,即无头标签,用于描述混部场景
- 机器管理:把业务组的 busigroup 标签迁移到机器的属性里,让机器支持挂到多个业务组
- 告警规则:增加 Host Metrics 类别,支持按照业务组、角色、标签等筛选机器,规则 promql 支持变量,支持在机器颗粒度配置变量值
- 告警通知:重构整个通知逻辑,引入事件处理的 pipeline,支持对告警事件做自定义处理和灵活分派
v7 正式版何时发版?
按每年惯例,v7 正式版会在 7 月底发版,每个大版本会持续支持 2 年。这也意味着,v5 版本将不再提供社区支持,建议 v5 版本的用户尽快升级到 v7 版本。升级方案可以查阅如下链接:
https://flashcat.cloud/docs/content/flashcat-monitor/nightingale-v7/install/upgrade/

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
🎉 领域驱动设计 - 模型即服务 | Wow 3.8.0 发布
领域驱动|事件驱动|测试驱动|声明式设计|响应式编程|命令查询职责分离|事件溯源 官方文档:https://wow.ahoo.me/ 更新内容 Wow 编译器支持 Kotlin 2.0 ! 特性(query): 添加Queryable. withCondition以支持重写过滤器(Condition)。 依赖(core): 更新com.google.guava:guava到v33.2.1-jre 依赖(test): 更新io.mockk:mockk到v1.13.11 依赖(compiler): 编译器支持Kotlin 2.0 依赖(compensation): 更新jte到v3.1.12 依赖(dashboard): 更新monaco-editor到0.49.0 依赖(dashboard): 更新ng-zorro-antd到v17.4.1 依赖(dashboard): 更新tslib到v2.6.3 依赖(dashboard): 更新angular到v17.3.11 依赖(build): 更新gradle到v8.8 依赖(doc): 更新vitepress到v1.2.3 简介 Wow是一...
- 下一篇
把 FolkMQ 内嵌到 SpringBoot2 项目里(比如 “诺依” 啊)
FolkMQ (消息中间件)支持内嵌、单机、集群、多重集群等多种部署方式。 内嵌版,就相当于 H2 或 SQLite 数据库一样。给一些小项目(或者特别需求)带来了方便。 大项目,则可以使用独立部署的 “单机版” 或 “集群版” 内嵌个消息中间件,体积会不会太大啦?!!不会,单机版只有9Mb,内嵌版才7Mb。超级小的啦! 1、了解 FolkMQ 内嵌版 FolkMQ 内嵌版(带 Web 控制台界面的),体积增加 7Mb,就可以附加完整消息中间件的能力喽。比如你在用 “诺依” 开发个小项目,需要消息中间件,但是又不想独立部署。这就很适合呢! 内嵌版与单机板,功能一模一样 控制台界面是基于 Solon 框架开发的,非常小巧。(可以用宿主项目的端口,也可以独立端口) 支持内嵌到 jFinal,Solon,SpringBoot2,SpringBoot3,Vert.X 等框架里 说起来 Solon 真是中间件的控制台良配,又小又强又可以内嵌。太爱了! 2、怎么集成呐? 此例,我们的控制台使用宿主项目的 HTTP 端口。所以需要与 SpringBoot2 的 Servlet 能力对接。 a) 引入...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- SpringBoot2整合MyBatis,连接MySql数据库做增删改查操作
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果
- CentOS关闭SELinux安全模块
- SpringBoot2更换Tomcat为Jetty,小型站点的福音
- CentOS8安装Docker,最新的服务器搭配容器使用
- CentOS7,8上快速安装Gitea,搭建Git服务器
- Windows10,CentOS7,CentOS8安装Nodejs环境
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- CentOS7安装Docker,走上虚拟化容器引擎之路
- SpringBoot2整合Redis,开启缓存,提高访问速度