在Prometheus量规中处理过时的数据

时间:2019-11-04 06:09:33

标签: rabbitmq prometheus

上下文:我想为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注册表,以一张干净的纸开始,但是似乎有些不客气,我真的不习惯这种方式。

那么,如何避免以普罗米修斯惯用的方式获取过时的仪表数据?

1 个答案:

答案 0 :(得分:1)

如果这是使用client_java编写的Java导出程序,则只需清除Gauge(在myGauge.clear()中),而不用构建全新的Registry

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

编辑:以前从未真正看过任何Ruby代码,但是看来Registry.unregister("rabbitmq_queue_messages")可能是只清除一个指标(及其所有标签组合)的不那么笨手笨脚的方法。 ,也就是说,对于所有队列而言)。我看不到与Java客户端的Gauge.remove()类似的东西,只允许删除一个样本/标签组合,但我可能会遗漏一些东西。