如何在应用重启后保留Prometheus TSDB中的指标值?
应用重启后计数器指标重置问题的解决办法
首先得明确:Prometheus的计数器指标本身就是内存级的单调递增计数器,应用重启后内存清空,计数器自然会回到初始值,这是标准行为。但要实现重启后基于TSDB的最后值继续累加,或者查询时得到正确的累计结果,有两种核心思路:
一、让应用启动时加载Prometheus中的历史值
如果需要应用本身的计数器从历史值开始累加,得在应用启动逻辑里加一步:
- 调用Prometheus的HTTP API,用PromQL查询对应指标的最后记录值,比如针对你的示例数据,查询
/api/abc的200状态计数器:last_over_time(api_request_count{api="/api/abc", status="200"}[1d]) - 把查询到的数值作为计数器的初始值,替代默认的0,之后应用的计数就会从这个值开始累加
- 注意:要处理查询不到结果的情况(比如第一次启动),此时还是用默认初始值
另外,也可以在应用本地用文件、数据库(比如Redis、SQLite)持久化计数器值:每次计数器更新时同步保存到本地存储,应用启动时先读取本地存储的数值初始化计数器,这种方式不需要依赖Prometheus,更可靠。
二、用PromQL自动处理计数器重置(无需修改应用)
如果只是需要在查询时得到正确的累计结果,不需要应用本身持有历史值,直接用Prometheus的内置函数即可:
- 用
increase()函数:它会自动识别计数器的重置(比如应用重启导致的数值下降),计算指定时间范围内的增量总和,比如查询过去24小时的总请求数:increase(api_request_count{api="/api/abc", status="200"}[24h]) - 用
sum_over_time()结合offset计算总累计:如果要获取从指标开始采集到现在的总次数,可以用这个组合,自动抵消重启的影响:sum( sum_over_time(api_request_count[1d]) - on(api, status) group_left() sum_over_time(api_request_count offset 1d[1d]) )
内容的提问来源于stack exchange,提问作者IshduttT
相关产品推荐
相关产品推荐

