首页 > 其他分享 >Prometheus 告警恢复时,怎么获取恢复时的值?

Prometheus 告警恢复时,怎么获取恢复时的值?

时间:2024-08-29 17:16:41浏览次数:14  
标签:Alertmanager 恢复 Prometheus promql 标签 告警

Prometheus 告警事件中的 $value 表示当前告警触发时的值,但是在告警恢复时,Resolved 事件中的 $value 仍然是最新告警时的值,并非是恢复时的值,这是什么原因和原理?是否有办法来解决呢?

不废话,先说原理。

原理

告警规则是配置在 prometheus.yaml 中的,由 Prometheus 负责做规则判定。Prometheus 规则判定的逻辑也很简单,就是周期性的,拿着 promql 去查询数据,如果查到了数据,并且连续多次满足 for 指定的时长,就触发告警事件,如果查不到数据,就认为指标是正常健康的状态。比如:

cpu_usage_idle < 5

如上例,告警规则的 promql 中是带有阈值(< 5)的,所以只要查到了数据,就说明当前的值小于 5,只要没查到数据,就说明当前的值大于等于 5,即当前数据是健康的状态。注意,查不到数据的时候,时序库不返回数据,换句话说,数据正常的时候,因为时序库不返回数据,上层就拿不到正常状态时的值,既然拿不到正常状态时的值,也就没法在恢复时展示当前最新的值啦。

实际上,恢复时的事件,是 Alertmanager 根据 resolve_timeout 生成的,而不是 Prometheus 生成的。Alertmanager 生成恢复事件时,会把上次告警的标签和注解带过去,值呢?就是上次告警时的值,Alertmanager 不会再去查询 Prometheus 拿到最新的值。

Alertmanager 可以拿到恢复时的值么?

坦白讲,很难。Alertmanager 需要根据上次告警的标签和注解去查询 Prometheus 拿到上次告警时的值,Alertmanager 不会这么干的,核心是:

  • 从职能上,Alertmanager 去查询 Prometheus,就反向依赖了,Alertmanager 是告警的分发中心,不止是接收 Prometheus 推送过来的事件,还会接收其他告警源推送过来的事件,如果 Alertmanager 要去查询 Prometheus,那就耦合太过严重。
  • Prometheus 的告警规则中可以附加标签,和监控指标的标签一起,作为事件的标签集发给 Alertmanager,Alertmanager 需要根据这些标签去查询 Prometheus,拿到原始数据,这在某些场景下是不可行的。一个是要把标签中的附加标签剔除,只留数据标签,Alertmanager 没有办法做到;其次,有些 promql 查询结果压根就没有标签,根本没法查;再次,Alertmanager 需要解析 promql,把阈值的部分拿掉,而有些 promql 压根就不是数字阈值。

如果你想通过修改 Alertmanager 达成所愿,放弃吧。

有没有办法解决?

有。通常的解决办法有两种:

  • 告警规则里,顺便配置恢复时的 promql
  • 把阈值从 promql 中拿掉,promql 只用于查询原始数据,然后在上层做阈值判定,不管监控指标当前是否健康,都会查到原始数据

下面我以一些监控产品为例,具体来说明。

告警规则里配置恢复时的 promql

使用这个方法的产品,以夜莺(Nightingale)监控为例,来讲解具体做法。核心是配置两个地方,一个是在告警规则里配置恢复时的 promql,另一个是在告警模板里配置恢复时的值的渲染。

比如我有一个告警规则用来侦测 HTTP 地址探测失败:

夜莺告警恢复时拿到恢复时的值-告警时的promql

需要在告警规则最下面的自定义字段里,增加 recovery_promql 的配置,如下:

recovery_promql

要理解这个工作逻辑,我们先来看看 http_response_result_code 这个指标的数据长什么样子:

夜莺告警恢复时拿到恢复时的值-即时查询

从上图可以看出,这个指标包含两个 series,其中 agent_hostname 和 method 字段相同,target 字段可以区分开这俩 series。告警规则 http_response_result_code != 0 如果触发,告警事件中一定会带有 target 标签,所以,如果告警事件恢复的时候,我们用高警时的那个 target 标签去查询,一定就可以准确查到恢复时的值了。所以 recovery_promql 的配置中引用了 target 标签,其值是变量,这个变量就是告警事件中的 target 标签值。

然后,我们在告警模板里,增加一个恢复时的值的渲染,以钉钉模板为例:

#### {{if .IsRecovered}}<font color="#008800">

标签:Alertmanager,恢复,Prometheus,promql,标签,告警
From: https://www.cnblogs.com/ulricqin/p/18387088

相关文章

  • SpringBoot+Grafana+Prometheus+Docker-Compose 快速部署与JVM监控的快速入门的简单案
    1.Java项目1.1项目结构1.2pom.xml<?xmlversion="1.0"encoding="UTF-8"?><projectxmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation=&q......
  • 如何在Android上恢复永久删除的照片?
    您是否曾经不小心从Android手机中删除了珍贵的照片,并以为它们已经永远消失了?不要恐慌。我们为您提供了有关如何在Android上恢复永久删除的照片的指南。无论是怀旧之旅还是您需要找回的重要记忆,我们都会引导您完成安全、轻松地取回这些照片的步骤。 第1部分:是否可以恢复......
  • prometheus学习笔记之cAdvisor
    一、cAdvisor简介监控Pod指标数据需要使⽤cadvisor,cadvisor由⾕歌开源,cadvisor不仅可以搜集⼀台机器上所有运⾏的容器信息,还提供基础查询界⾯和http接⼝,⽅便其他组件如Prometheus进⾏数据抓取cAdvisor可以对节点机器上的资源及容器进⾏实时监控和性能数据采集,包括CPU使⽤情......
  • 【安全运营】如何制定有效的告警处置规范与标准 - 参考框架
    告警处置规范与流程一、告警处置流程二、告警处置的注意事项告警分级标准一、告警分级定义的标准二、告警优先级的定义标准原创Drbool布博士2024年08月07日18:01广东以下为参与众多告警项目,一般的规范参考与框架及建议,旨在帮助您的团队更高效......
  • Apache DolphinScheduler中处理任务/告警/事件相关核心思路曝光
    最近在看ApacheDolphineScheduler,发现DolphinScheduler在处理任务时,通过先将任务快速的存储在数据库中,然后基于对应的Task,将Task放入队列中,然后将Task进行快速消费的思路。这种模型在很多框架中,都有体现。我们知道在Master模块时处理任务的核心模块,而API模块主要是界面中操作......
  • 关于告警,要想做好,从这些方面着手
    各类监控系统都会产生告警事件,于是,就产生了FlashDuty、PagerDuty、Opsgenie这类产品,做告警事件的收敛降噪、排班认领升级等。如果你想增强自己公司的告警事件处理能力,参考(chaoxi)这些产品的功能就可以了......
  • 【环境部署系列】浅谈灾难恢复站点:冷/暖/热站点
    原创祺印说信安一般来说,备用站点是指将人员及其工作所需的设备重新安置一段时间,直到恢复或更换正常生产环境为止的站点。包含完全冗余的硬件和软件,具有电信、电话和公用事业连接,以继续所有主要站点的操作。根据维基百科的资料解释,站点通常根据准备程度和投入运行的速度进行......
  • 【Shell脚本】根据web访问日志,封禁请求量异常的IP,如IP在半小时后恢复正常,则解除封禁
    #!/bin/bash#####################################################################################根据web访问日志,封禁请求量异常的IP,如IP在半小时后恢复正常,则解除封禁####################################################################################lo......
  • Kubernetes (K8s) 监控方案:Prometheus 实战指南
    1.引言在当今云原生时代,Kubernetes(K8s)已成为容器编排的标准解决方案。然而,随着K8s集群规模和复杂性的增加,有效的监控变得至关重要。本文将详细介绍如何使用Prometheus构建一个全面而强大的K8s监控系统,帮助您实时掌握集群状态,快速定位问题,并优化资源利用。2.监......
  • Mysql 通过binlog日志恢复数据
    Binlog日志,即binarylog,是二进制日志文件,有两个作用,一个是增量备份,另一个是主从复制,即主节点维护一个binlog日志文件,从节点从binlog中同步数据,也可以通过binlog日志来恢复数据1,登录mysql查看binlog日志的状态,输入showvariableslike‘%log_bin%’;查看binlog为off关闭状态2,开......