首页 > 解决方案 > 处理 Prometheus Gauges 中的陈旧数据

问题描述

上下文:我想为 RabbitMQ 构建自己的导出器。为此,我设置了一个 HTTP 服务器来查询管理 API、解析响应并使用 Prometheus 格式构建适当的响应

我正在测量队列中的消息数量,以便在队列中有太多消息时收到警报。为此,我设置了以下量规: rabbitmq_queue_messages{queue_name="Q1"}

我的问题是:如果队列被删除会怎样?例如:

  1. 在 T1 出口商返回 rabbitmq_queue_messages{queue_name="Q1"} 5
  2. 在 T2 时,由于某种原因正在删除队列
  3. 在 T3,我的出口商再次被要求提供指标。

据我了解,在 T3 时,即使队列不再存在,它也会返回相同的rabbitmq_queue_messages{queue_name="Q1"} 5响应,因为这是 Prometheus 上仪表的工作方式。对我来说这似乎很奇怪,因为在 T3,Q1 不再存在,所以我希望停止接收此队列的数据点,而不是接收陈旧的数据。

我为此找到的解决方法是在对出口商的每个请求都建立一个新的普罗米修斯注册表,以从一张干净的表格开始,但这似乎有点老套,我真的不喜欢这样工作。

那么,我怎样才能避免以更 Prometheus 惯用的方式获得过时的仪表数据呢?

标签: rabbitmqprometheus

解决方案


如果这是一个 Java 导出器,使用 编写client_java,你可以简单地清除你的Gauge(in myGauge.clear()) 而不是构建一个全新的Registry.

或者,如果这太重了,并且您有办法在删除队列时获得通知,则只需在收到通知时调用Gauge.remove(queueName)

编辑:以前从未真正见过任何 Ruby 代码,但似乎这Registry.unregister("rabbitmq_queue_messages")可能是清除一个指标(及其所有标签组合,即所有队列的情况)的不那么严厉的方法。我没有看到任何类似于 Java 客户端的Gauge.remove()允许仅删除一个样本/标签组合的东西,但我可能会遗漏一些东西。


推荐阅读