我的 Promtheus 到底啥时候报警?
作者 | 吴叶磊
来源 | 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 到底啥时候报警?相关推荐
- go调用ethereum_Go语言爱好者周刊:第 76 期 — 新年计划做了吗?
这里记录每周值得分享的 Go 语言相关内容,周日发布. 本周刊开源(GitHub:polaris1119/golangweekly),欢迎投稿,推荐或自荐文章/软件/资源等,请提交 issue . 鉴 ...
- go调用ethereum_Go语言爱好者周刊:第 76 期—新年做计划了吗?
这里记录每周值得分享的 Go 语言相关内容,周日发布. 本周刊开源(GitHub:polaris1119/golangweekly[1]),欢迎投稿,推荐或自荐文章/软件/资源等,请提交 issue[ ...
- 微信PC版重大更新!电脑上也能玩小游戏了
「 点击图片获取最近两年爆款好文 」 近日,腾讯微信PC版迎来了2.9.0.测试版. 新增小程序面板,更容易找到你最近常用的内容了 打开微信PC版,就能看到左侧工具栏新增了小程序面板的符号,打开之后就 ...
- 依靠云计算推动企业业务模式变革
本文讲的是依靠云计算推动企业业务模式变革,2012年5月23-25日,主题为"发挥示范引领作用,推动云计算创新实践"的"第四届中国云计算大会"在北京国家会议中心 ...
- iPhone闯大祸!车祸检测大量误报挤占救援资源
Alex 发自 凹非寺 量子位 | 公众号 QbitAI 美国某紧急救助中心,一个周末收到了71通报警电话. 然鹅,这里面居然没有一个是真的-- 原来,该救助中心附近有座雪场,现在正值滑雪旺季. 一些 ...
- 山石网科杨庆华:边界防御已死?网络安全永远需要防护叠加而非取代
科技云报道原创. 云计算时代的汹涌而至,让"云安全"一词在近年来变得炙手可热.随着"边界防御已死"的观点在业界广为流传,有人甚至将云安全与传统边界安全划为壁垒分 ...
- 月报|公众号 3 月文章汇总
「 点击图片获取最近两年爆款好文 」 前面几个月的的文章集合: 我把这两年的精华文章都整理出来了! 「民工哥技术之路」截止2019年12月31日所有文章集合 「民工哥技术之路」2020年1月所有文章集 ...
- jsp 使用base标签 没有作用_终于弄明白衣服上,使用前请移除的标签到底是什么,起什么作用...
点击上方"机械设计一点通"关注我们,每天学习一个机械设计相关知识点 发现买的T恤上,连在衣服上有个标签,上面写着使用前请移除.里面有个一硬条状物体,不知道是什么,很好奇,便把它拆开 ...
- 电信在线防杀毒墙,到底是不是流氓软件
这几个月在老家搞了个电信宽带,每次上线,都会出来一个电信的广告.本来以为是电信的拨号软件作祟,后来google了下,发现很多地方的电信也有同样的问题,看来问题并不是出在本机上,而是电信的线路上. DN ...
最新文章
- PHP实现XML传输
- Thymeleaf 学习笔记 (2)
- OpenCASCADE:形状愈合之概述
- vim grep配置及使用
- 用HTML语言制作一个非常浪漫的生日祝福网,手把手教你制作炫酷生日祝福网页
- kafka系列之kafka分区与备份(4)
- linux下oracle 9204 soft only,在CentOS4.3(x86_64)上安装Oracle9204 for linux(x86_64)
- html调用暴风影音,暴风影音4大使用设置技巧
- 智能窗帘传感器c语言程序,单片机智能家居电路控制程序+Proteus仿真+视频(光烟雾传感器与自动窗帘)...
- 贝尔曼最优方程(Bellman Optimality Equation)
- 21世纪七大数学难题
- 科创人·望繁信创始人索强:中国版流程挖掘注定有完全不同的活法
- 工具分享:ideaIU-2019.2.4_windows正版最新(附下载链接)
- 如何实现多列对比去重
- 数据可视化之智能bi实现生态绿地数据可视化分析
- Reference定义(PhantomReference,Cleaner)
- Python-Flask
- 失去黄金时代的趣店,要走多久才能成功转型?
- Promise的理解
- 成都Java培训机构太多,该怎样选择呢?
热门文章
- 常用DOS命令全面收藏
- 手把手教你用Java实现AOP
- python3 pip3 install 报错 ModuleNotFoundError: No module named ‘_ctypes‘ 解决方法
- vector机器人 WAYS TO INTERACT WITH VECTOR 与 VECTOR 的交互方式
- linux shell 查看 cpu核数
- npm nodejs包管理工具 简介
- clion 远程调试配置失败 Failed to reload 错误
- python3 判断进程是否存在
- python中ThreadLocal的理解与使用
- java设计模式---命令模式