You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Prometheus Push Gateway仅返回最后值而非全部数据的问题排查

问题根源与解决方案

问题出在哪?

1. 对Push Gateway的工作机制理解错误

Push Gateway的核心作用是暂存指标供Prometheus拉取,并非存储事件历史。默认情况下:

  • 若用PUT请求推送,会直接替换对应job/instance分组下的所有指标——你每次只推一个status的指标,自然会把之前的其他status指标覆盖掉。
  • 即便用POST,如果推送逻辑不当,也会出现指标被覆盖的情况。

2. Counter指标的用法完全错误

你定义的prom_react_app_availability_total是counter类型,但实际用法违背了Prometheus的设计规则:

  • Counter是单调递增的累计值,应该记录某类事件的总发生次数(比如第1次started推1,第2次推2),而非每次事件都推固定值1。
  • 手动添加timestamp标签毫无意义,Prometheus会用自身的采集时间作为样本时间戳,不需要客户端指定。

3. 事件型需求不匹配Push Gateway的定位

你的目标是记录started/failed这类所有历史事件,但Push Gateway是用来暂存当前状态或累计统计值的,并非事件日志存储工具。

正确的解决方法

1. 调整指标设计与推送方式

  • 重新设计counter指标:针对started和failed两个状态,分别维护累计值。比如每次触发started事件,就推送prom_react_app_availability_total{owner="test", status="started"}的当前累计数(逐步递增);failed状态同理。
  • 使用POST请求推送指标,这样Push Gateway会对相同标签集的counter进行累加,而非替换。示例推送命令:
    curl -X POST --data-binary @metrics.txt http://pushgateway:9091/metrics/job/react_app/instance/ui_client
    
    其中metrics.txt内容为:
    # HELP prom_react_app_availability_total Application availability counter
    # TYPE prom_react_app_availability_total counter
    prom_react_app_availability_total{owner="test", status="started"} 2
    prom_react_app_availability_total{owner="test", status="failed"} 1
    

2. 避免误覆盖指标分组

推送时务必指定清晰的job和instance标识,确保不同状态的指标都归属到同一个分组下,不会被后续推送操作清空。

3. 事件型需求的替代方案

如果需要完整保留所有事件记录,而非仅统计次数:

  • 可以使用gauge类型,推送时附带事件的时间戳(在指标值后添加Unix时间戳),Push Gateway支持接收带时间戳的样本,这样Prometheus能采集到每个事件的时间点数据。
  • 或者直接用日志系统(如ELK栈)记录所有事件,再通过日志导出工具将事件统计为指标导入Prometheus,兼顾事件追溯和指标分析。

内容的提问来源于stack exchange,提问作者Rocco Hundertmark

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 19:45:34