经常在夜莺社区收到用户反馈,说查询某个监控指标,昨天的峰值是 xx,今天再次查询,发现昨天的峰值看不到了,然后开始吐槽,你们这监控怎么搞的,一点都不准啊。事实真的是这样吗?
核心摘要
- 历史峰值“看不到了”,常见原因是查询历史数据时
step变大,返回结果不再覆盖每一个原始采集点。 step=15表示每 15 秒返回一个数据点,step=60表示每分钟返回一个数据点;如果原始采集频率是 15 秒,较大的 step 可能跳过短暂峰值。- Prometheus、Grafana、Nightingale 通常会根据查询时间范围自动计算 step,以平衡查询效率和图表可读性。
- 如果要确认原始峰值或实际采集频率,可以在 Nightingale 即时查询 Table 视图中使用 range vector,例如在 PromQL 后加
[5m]。 - step 是查询分辨率,不等于监控数据是否准确;要看原始数据,就让 step 接近或等于实际采集频率。
真实原因
本质上,这是因为 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 参数如何影响历史峰值
step 可以理解为查询结果的时间分辨率。它控制的是查询接口返回数据点的间隔,不直接改变时序库中已经存储的原始数据。
如果原始数据每 15 秒采集一次,但你查询 24 小时甚至更长时间范围时使用 step=360,图表上看到的是每 360 秒一个点。短暂峰值如果发生在两个返回点之间,就可能没有出现在图上。此时正确的判断不是“监控不准”,而是“当前查询分辨率不适合观察原始峰值”。
怎么控制 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。
FAQ
Q1:历史峰值看不到,是不是 Prometheus 数据丢了?
A:不一定。常见原因是查询时间范围变大后,系统自动计算了更大的 step,图表没有展示每一个原始采集点。
Q2:step 和采集频率是什么关系?
A:采集频率决定原始数据多久产生一个点,step 决定查询结果多久返回一个点。想看原始数据时,step 应该接近或等于采集频率。
Q3:为什么监控系统要自动放大 step?
A:为了避免长时间范围查询返回过多数据点,影响查询效率、图表可读性,甚至拖垮浏览器。
Q4:怎么查看某个指标的实际采集频率?
A:可以在 Nightingale 即时查询页面使用 Table 视图,在 PromQL 后追加类似 [5m] 的范围查询,查看 5 分钟内原始数据点的时间戳间隔。
