Prometheus 历史峰值看不到了,这监控不准啊
经常在夜莺社区收到用户反馈,说查询某个监控指标,昨天的峰值是 xx,今天再次查询,发现昨天的峰值看不到了,然后开始吐槽,你们这监控怎么搞的,一点都不准啊。事实真的是这样吗?
真实原因
本质上这是因为 Prometheus 生态在查询历史数据时提供了一个 step 参数,大多数人对这个知识匮乏导致的疑问。
上图是 Prometheus 的官方文档,其他的时序库比如 VictoriaMetrics、Thanos 都是兼容 Prometheus 接口的,所以逻辑是相同的。其中说明了 step 参数的含义:Query resolution step width in duration format or float number of seconds。
比如 step=15
,返回的数据就是每 15 秒一个数据点,如果 step=60
,返回的数据就是每分钟一个数据点。假设原始数据采集的时候,是每 15 秒采集一次,那 step=15
就能完整展示原始数据,如果 step=60
,就会有部分数据被丢掉,导致历史峰值看不到。
怎么控制 step 参数
大部分用户查询监控数据的时候,压根没有关注这个值,但是仍然可以查询数据。这是因为,Prometheus、Grafana、Nightingale 等都会根据用户选择的时间范围自动计算 step,以保证返回的数据不会太密集太多,也不会太稀疏太少。
不同的监控系统,对于数据稀疏与否的配置不同,以 Nightingale 举例。比如你要查询最近 1 小时的数据,Nightingale 自动计算的 step 就是 15:
如果查询最近 24h 的数据,Nightingale 自动计算的 step 就是 360:
当然,你也可以手工指定 step 的值,比如手工指定为 15:
可以看到,手工指定 step 为 15,返回的数据就是每 15 秒一个数据点,这样就能完整展示原始数据了,但是数据量会比较大,图表看起来也很稠密。如果要看一年的数据,仍然强制 step 为 15 话,返回的数据可能会把浏览器干蹦。
如何知道实际采集频率
Prometheus 这个设计逻辑,一个是可以保证查询效率,另一个是为了时间戳对齐,方便不同的指标之间做计算,并非是监控不准。如果你想使用原始数据绘图,那就把 step 的大小设置为监控数据采集时的频率即可。
但是作为用户,如果采集规则不是你配置的,你不知道采集频率怎么办?此时可以到 Nightingale 的即时查询页面,使用 Table 视图,查看指标一段时间的数据,比如:
Promql 最后加了一个 [5m]
是查询 5 分钟的数据,这是 Promql 的知识不展开了。下面的内容展示的是 5 分钟内的原始数据,并且时间戳自动展示为人类易读的方式,而且自动计算了时间戳之间的差值,这样就很方便知道采集频率了。上图中可以看到采集频率是 60 秒一次。
另外,在这个视图中如果你发现某个指标的采集频率不固定,那很可能是相同的数据重复采集了,比如同时有两个 categraf 在采集相同的一个监控目标,这种情况通常是不符合预期的,需要排查。
总结
Prometheus 生态的 step 参数是一个很重要的概念,对于监控数据的查询有着重要的影响。大部分情况下,用户不需要关心这个参数,因为监控系统会自动计算 step,以保证查询效率和数据展示的合理性。但是如果你想看原始数据,或者想了解监控数据的采集频率,那就需要了解 step 参数的含义,以及如何手工指定 step 参数啦。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· .NET Core 托管堆内存泄露/CPU异常的常见思路
· PostgreSQL 和 SQL Server 在统计信息维护中的关键差异
· DeepSeek “源神”启动!「GitHub 热点速览」
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 我与微信审核的“相爱相杀”看个人小程序副业
· C# 集成 DeepSeek 模型实现 AI 私有化(本地部署与 API 调用教程)
· DeepSeek R1 简明指南:架构、训练、本地部署及硬件要求