教你一招,告警恢复时如何拿到恢复时的值?

news/2024/10/3 23:30:16

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 标签值。

效果

 

本文作者:秦晓辉,GitHub ID:UlricQin,开源监控产品 Open-Falcon、Nightingale 创始人,极客时间《运维监控系统实战笔记》作者,目前在监控/可观测性领域创业中。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hjln.cn/news/44531.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

相关文章

基于振弦采集仪的高层建筑结构安全监测技术研究

基于振弦采集仪的高层建筑结构安全监测技术研究 高层建筑的结构安全监测一直是建筑工程领域的重要课题,振弦采集仪作为一种新兴的监测技术,为解决这一问题提供了有力的工具。本文将从振弦采集仪的原理、应用场景以及优势等方面探讨其在高层建筑结构安全监测中的技术研究。 振…

java 与jdk 关系

java与jdk的关系Java与JDK的关系是,Java是一种编程语言,而JDK(Java Development Kit)是Java语言的官方开发工具包。12JDK是整个Java技术的核心,它包括了JRE(Java Runtime Environment)和一系列Java开发工具(如javac、java、javadoc等)。JRE是Java的运行环境,…

LISA: Reasoning Segmentation via Large Language Model

Motivation & Abs 现有的感知系统依赖人类的指示,难以主动推理以理解人类意图。 新任务:reasoning segmentation,模型需要根据给定的复杂 / 具有隐含意义的文本输出相应的seg mask。 新的benchmark:包含1000张左右图像的数据集(image-instruction-mask)。 模型:LISA…

Navicat 索引类型、索引方法使用

选择索引类型(有四种)1. Normal(普通索引): - 普通索引是最常见的索引类型。 - 它用于加速查询操作,提高查询性能。 - 允许重复值,可以在一个字段上创建多个普通索引。 2. Unique(唯一索引): - 唯一索引要求索引列的值是唯一的,不允许重复值。 - 它用于保证…

Photoshop 2024 mac/win版:探索图像处理的全新境界

Photoshop 2024是Adobe推出的最新图像处理与设计软件,它在继承了前作所有优秀特性的基础上,实现了多个方面的质的飞跃。这款软件凭借其卓越的图像处理性能、丰富的创意工具以及精确的选区编辑功能,成为了图像处理领域的佼佼者。 →→↓↓载Photoshop 2024 mac/win版 在功能…

MoneyPrinterPlus:AI自动短视频生成工具,赚钱从来没有这么容易过

MoneyPrinterPlus使用AI大模型技术,一键批量生成各类短视频。一键混剪短视频,批量生成短视频不是梦。自动把视频发布到抖音,快手,小红书,视频号上。这是一个轻松赚钱的项目。 短视频时代,谁掌握了流量谁就掌握了Money! 所以给大家分享这个经过精心打造的MoneyPrinterPlus项目…

基于压电陶瓷传感器的智能枕头非侵入式生命体征监测

一、摘要 在家中睡眠期间对人体生命体征进行实时监测对于实现及时检测和救援至关重要。然而,现有的用于监测人类生命体征的智能设备存在高复杂性、高成本、侵入性或低准确性的缺点。因此,迫切需要开发一种简化、无干扰、舒适、低成本的睡眠实时监测系统。在本研究中,基于低成…