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

关于使用Prometheus+Grafana采集设备可用性数据的疑问

Prometheus抓取间隔内设备上下线无法被Gauge捕获的问题

这是预期行为,完全符合Prometheus的设计逻辑。

原因解析

Prometheus采用pull模型,定期从目标端点抓取指标数据,它记录的是每次抓取瞬间的指标值。Gauge类型指标本身只反映当前时刻的状态(比如在线为1,离线为0),如果设备在两次抓取间隔内完成了"上线→下线"或"下线→上线"的完整状态变化,Prometheus在拉取时只能看到最终的状态,中间的波动不会被捕获到。

这是因为Prometheus的定位是时间序列采样监控,而非全量事件追踪,它通过定期采样来平衡存储效率和监控精度,短于抓取间隔的瞬时状态变化不在其默认的监控范围内。

解决方案

针对这类需要捕获短时间状态波动的场景,可以尝试以下几种方案:

  • 缩短抓取间隔:将Prometheus的scrape_interval调小(比如从默认15s改为5s),减少状态变化被遗漏的概率。但要注意,过短的间隔会增加Prometheus服务器和监控目标的负载,需要根据实际资源情况权衡。
  • 结合Counter指标追踪状态变更次数:在设备上线或下线时,触发对应的Counter指标递增(例如device_state_changes_total{state="up"}和device_state_changes_total{state="down"})。即使状态变化发生在抓取间隔内,只要设备在状态变更时上报了Counter,Prometheus就能记录到变更次数,后续可以通过该指标分析设备的稳定性。
  • 使用PushGateway推送状态变更:让设备在状态发生变化时,主动将最新状态推送到PushGateway,Prometheus再从PushGateway拉取数据。这种方式适合网络不稳定或短生命周期的设备,但要注意配置PushGateway的数据过期策略,避免无效数据堆积。
  • 补充日志监控:让设备在上下线时输出结构化日志,用日志系统(如Loki)收集这些事件,在Grafana中结合Prometheus的指标数据和日志数据,实现对所有状态变更的完整追踪。

关于可用率统计的补充

如果仅用Gauge指标device_up计算近7天可用率,PromQL为:

avg_over_time(device_up[7d]) * 100

但因间隔内的状态变化被遗漏,这个值会存在一定误差。若需要更精确的可用率统计,可以结合离线时长的Counter:每次设备离线时记录开始时间,上线时计算离线时长并累加为device_offline_seconds_total,然后通过总时长减去离线时长来计算可用率:

(1 - sum_over_time(device_offline_seconds_total[7d]) / (7*24*3600)) * 100

内容的提问来源于stack exchange,提问作者Kiran Mohan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 04:35:07