Prometheus非抓取间隔内的进程CPU等应用指标数据会丢失吗?
Prometheus 抓取间隔内CPU指标采集问题解答
首先明确Prometheus的采集逻辑:Prometheus本身是 pull 型采集模式,只有在触发抓取请求的时刻才会从被采集端拉取指标数据,非抓取时段不会主动向被采集端索要数据。
你提到的process_cpu_system_seconds_total属于 Counter 类型指标,这类指标的数值是由被采集端(集成了Prometheus SDK的业务进程/对应的exporter)自行持续维护统计的,和Prometheus是否发起抓取无关:进程会实时累加自启动以来消耗的系统态CPU总秒数,哪怕Prometheus十几分钟没抓取,这个数值也会在被采集端一直准确更新。
接下来回答你关心的峰值是否丢失的问题:
- 首先不会出现「15s间隔内的CPU消耗完全不被统计」的情况:这15s内所有的CPU耗时都会被累计到
process_cpu_system_seconds_total的数值里,下一次Prometheus抓取时会拿到更新后的累计值,整个区间的总CPU消耗是完整被记录的,没有数据丢失。 - 你用
rate(process_cpu_system_seconds_total[15s]) * 100算出来的是两个相邻抓取点之间的平均CPU使用率,如果15s内只有几秒CPU飙到90%,其余时段使用率很低,最终计算出来的平均值会远低于90%,你看不到这个瞬时峰值——这不是数据丢失,是rate函数的计算逻辑决定了它只能输出区间平均值,瞬时的细粒度波动会被抹平。
关于「n秒抓取间隔内的数据是否会丢失」的结论:
累计类的统计数据不会丢失,所有n秒内的指标变化都会被计入下一次抓取的数值中;仅会丢失该n秒区间内的细粒度瞬时采样点,无法还原区间内的指标波动细节。
如果需要捕捉更短周期的CPU峰值,只需调小scrape_interval的配置值即可,比如设置为5s就能拿到更细粒度的采样数据,降低峰值被抹平的概率。
内容的提问来源于stack exchange,提问作者Sana.91
相关产品推荐
相关产品推荐

