作者 | 吴叶磊

来源 | https://aleiwu.com/post/prometheus-alert-why/

最近又被问到了 Prometheus 为啥不报警,恰好回忆起之前经常解答相关问题,不妨写一篇文章来解决下面两个问题:

  • 我的 Prometheus 为啥报警?

  • 我的 Prometheus 为啥不报警?

从 for 参数开始

我们首先需要一些背景知识:Prometheus 是如何计算并产生警报的?

看一条简单的警报规则:

- alert: KubeAPILatencyHighannotations:message: The API server has a 99th percentile latency of {{ $value }} secondsfor {{ $labels.verb }} {{ $labels.resource }}.expr: |cluster_quantile:apiserver_request_latencies:histogram_quantile{job="apiserver",quantile="0.99",subresource!="log"} > 4for: 10mlabels:severity: critical

这条警报的大致含义是,假如 kube-apiserver 的 P99 响应时间大于 4 秒,并持续 10 分钟以上,就产生报警。

首先要注意的是由 for 指定的 Pending Duration。这个参数主要用于降噪,很多类似响应时间这样的指标都是有抖动的,通过指定 Pending Duration,我们可以 过滤掉这些瞬时抖动,让 on-call 人员能够把注意力放在真正有持续影响的问题上。

那么显然,下面这样的状况是不会触发这条警报规则的,因为虽然指标已经达到了警报阈值,但持续时间并不够长:

但偶尔我们也会碰到更奇怪的事情。

为什么不报警?

(图二: 为啥不报警)历史上的 996

类似上面这样持续超出阈值的场景,为什么有时候会不报警呢?

为什么报警?

(图三: 为啥会报警)这家公司不要求996,但照样市值万亿!

类似上面这样并未持续超出阈值的场景,为什么有时又会报警呢?

采样间隔

这其实都源自于 Prometheus 的数据存储方式与计算方式。

首先,Prometheus 按照配置的抓取间隔(scrape_interval)定时抓取指标数据,因此存储的是形如 (timestamp, value) 这样的采样点。

对于警报, Prometheus 会按固定的时间间隔重复计算每条警报规则,因此警报规则计算得到的只是稀疏的采样点,而警报持续时间是否大于 for 指定的 Pending Duration 则是由这些稀疏的采样点决定的。

而在 Grafana 渲染图表时,Grafana 发送给 Prometheus 的是一个 Range Query,其执行机制是从时间区间的起始点开始,每隔一定的时间点(由 Range Query 的 step 请求参数决定) 进行一次计算采样。

这些结合在一起,就会导致警报规则计算时“看到的内容”和我们在 Grafana 图表上观察到的内容不一致,比如下面这张示意图:

上面图中,圆点代表原始采样点:

  • 40s 时,第一次计算,低于阈值

  • 80s 时,第二次计算,高于阈值,进入 Pending 状态

  • 120s 时,第三次计算,仍然高于阈值,90s 处的原始采样点虽然低于阈值,但是警报规则计算时并没有”看到它“

  • 160s 时,第四次计算,高于阈值,Pending 达到 2 分钟,进入 firing 状态

  • 持续高于阈值

  • 直到 360s 时,计算得到低于阈值,警报消除

由于采样是稀疏的,部分采样点会出现被跳过的状况,而当 Grafana 渲染图表时,取决于 Range Query 中采样点的分布,图表则有可能捕捉到 被警报规则忽略掉的”低谷“(图三)或者也可能无法捕捉到警报规则碰到的”低谷“(图二)。如此这般,我们就被”图表“给蒙骗过去,质疑起警报来了。

如何应对

首先嘛, Prometheus 作为一个指标系统天生就不是精确的——由于指标本身就是稀疏采样的,事实上所有的图表和警报都是”估算”,我们也就不必 太纠结于图表和警报的对应性,能够帮助我们发现问题解决问题就是一个好监控系统。当然,有时候我们也得证明这个警报确实没问题,那可以看一眼 ALERTS 指标。ALERTS 是 Prometheus 在警报计算过程中维护的内建指标,它记录每个警报从 Pending 到 Firing 的整个历史过程,拉出来一看也就清楚了。

但有时候 ALERTS 的说服力可能还不够,因为它本身并没有记录每次计算出来的值到底是啥,而在我们回头去考证警报时,又无法选取出和警报计算过程中一模一样的计算时间点, 因此也就无法还原警报计算时看到的计算值究竟是啥。这时候终极解决方案就是把警报所要计算的指标定义成一条 Recording Rule,计算出一个新指标来记录计算值,然后针对这个 新指标做阈值报警。kube-prometheus 的警报规则中就大量采用了这种技术(https://github.com/coreos/kube-prometheus/blob/03b36af546c26ef6106c4fd141a948293ec0a18f/manifests/prometheus-rules.yaml#L201)。

到此为止了吗?

Prometheus 警报不仅包含 Prometheus 本身,还包含用于警报治理的 Alertmanager,我们可以看一看上面那张指标计算示意图的全图:

在警报产生后,还要经过 Alertmanager 的分组、抑制处理、静默处理、去重处理和降噪处理最后再发送给接收者。而这个过程也有大量的因素可能会导致警报产生了却最终 没有进行通知,也算是能把开头的两个问题解答得差不多了吧????。

往期推荐

历史上的 996

新同事上来就把项目性能优化了一遍,瑟瑟发抖。。。

Java微服务 vs Go微服务,究竟谁更强!?

天才安全大佬即将拿股票前被拼多多辞退,原因是不愿意做黑客攻击?

当音乐学博士搞起编程,用一本书改变了Java世界!

Spring Boot 2.x基础教程:使用Flyway管理数据库版本

我的 Promtheus 到底啥时候报警?相关推荐

  1. go调用ethereum_Go语言爱好者周刊:第 76 期 — 新年计划做了吗?

    这里记录每周值得分享的 Go 语言相关内容,周日发布. 本周刊开源(GitHub:polaris1119/golangweekly),欢迎投稿,推荐或自荐文章/软件/资源等,请提交 issue . 鉴 ...

  2. go调用ethereum_Go语言爱好者周刊:第 76 期—新年做计划了吗?

    这里记录每周值得分享的 Go 语言相关内容,周日发布. 本周刊开源(GitHub:polaris1119/golangweekly[1]),欢迎投稿,推荐或自荐文章/软件/资源等,请提交 issue[ ...

  3. 微信PC版重大更新!电脑上也能玩小游戏了

    「 点击图片获取最近两年爆款好文 」 近日,腾讯微信PC版迎来了2.9.0.测试版. 新增小程序面板,更容易找到你最近常用的内容了 打开微信PC版,就能看到左侧工具栏新增了小程序面板的符号,打开之后就 ...

  4. 依靠云计算推动企业业务模式变革

    本文讲的是依靠云计算推动企业业务模式变革,2012年5月23-25日,主题为"发挥示范引领作用,推动云计算创新实践"的"第四届中国云计算大会"在北京国家会议中心 ...

  5. iPhone闯大祸!车祸检测大量误报挤占救援资源

    Alex 发自 凹非寺 量子位 | 公众号 QbitAI 美国某紧急救助中心,一个周末收到了71通报警电话. 然鹅,这里面居然没有一个是真的-- 原来,该救助中心附近有座雪场,现在正值滑雪旺季. 一些 ...

  6. 山石网科杨庆华:边界防御已死?网络安全永远需要防护叠加而非取代

    科技云报道原创. 云计算时代的汹涌而至,让"云安全"一词在近年来变得炙手可热.随着"边界防御已死"的观点在业界广为流传,有人甚至将云安全与传统边界安全划为壁垒分 ...

  7. 月报|公众号 3 月文章汇总

    「 点击图片获取最近两年爆款好文 」 前面几个月的的文章集合: 我把这两年的精华文章都整理出来了! 「民工哥技术之路」截止2019年12月31日所有文章集合 「民工哥技术之路」2020年1月所有文章集 ...

  8. jsp 使用base标签 没有作用_终于弄明白衣服上,使用前请移除的标签到底是什么,起什么作用...

    点击上方"机械设计一点通"关注我们,每天学习一个机械设计相关知识点 发现买的T恤上,连在衣服上有个标签,上面写着使用前请移除.里面有个一硬条状物体,不知道是什么,很好奇,便把它拆开 ...

  9. 电信在线防杀毒墙,到底是不是流氓软件

    这几个月在老家搞了个电信宽带,每次上线,都会出来一个电信的广告.本来以为是电信的拨号软件作祟,后来google了下,发现很多地方的电信也有同样的问题,看来问题并不是出在本机上,而是电信的线路上. DN ...

最新文章

  1. PHP实现XML传输
  2. Thymeleaf 学习笔记 (2)
  3. OpenCASCADE:形状愈合之概述
  4. vim grep配置及使用
  5. 用HTML语言制作一个非常浪漫的生日祝福网,手把手教你制作炫酷生日祝福网页
  6. kafka系列之kafka分区与备份(4)
  7. linux下oracle 9204 soft only,在CentOS4.3(x86_64)上安装Oracle9204 for linux(x86_64)
  8. html调用暴风影音,暴风影音4大使用设置技巧
  9. 智能窗帘传感器c语言程序,单片机智能家居电路控制程序+Proteus仿真+视频(光烟雾传感器与自动窗帘)...
  10. 贝尔曼最优方程(Bellman Optimality Equation)
  11. 21世纪七大数学难题
  12. 科创人·望繁信创始人索强:中国版流程挖掘注定有完全不同的活法
  13. 工具分享:ideaIU-2019.2.4_windows正版最新(附下载链接)
  14. 如何实现多列对比去重
  15. 数据可视化之智能bi实现生态绿地数据可视化分析
  16. Reference定义(PhantomReference,Cleaner)
  17. Python-Flask
  18. 失去黄金时代的趣店,要走多久才能成功转型?
  19. Promise的理解
  20. 成都Java培训机构太多,该怎样选择呢?

热门文章

  1. 常用DOS命令全面收藏
  2. 手把手教你用Java实现AOP
  3. python3 pip3 install 报错 ModuleNotFoundError: No module named ‘_ctypes‘ 解决方法
  4. vector机器人 WAYS TO INTERACT WITH VECTOR 与 VECTOR 的交互方式
  5. linux shell 查看 cpu核数
  6. npm nodejs包管理工具 简介
  7. clion 远程调试配置失败 Failed to reload 错误
  8. python3 判断进程是否存在
  9. python中ThreadLocal的理解与使用
  10. java设计模式---命令模式