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 参数啦。