上下文:我想为RabbitMQ构建自己的导出器。为此,我设置了一个HTTP服务器,用于查询管理API,解析响应并以Prometheus格式构建适当的响应
我正在测量队列中的消息数,以便在队列中有太多消息时得到提醒。为此,我建立了以下指标:
rabbitmq_queue_messages{queue_name="Q1"}
我的问题是:如果删除队列,会发生什么?例如:
据我了解,在T3处,即使队列不再存在,它也会返回相同的rabbitmq_queue_messages{queue_name="Q1"} 5
响应,因为这是仪表在Prometheus上的工作方式。对我来说,这很奇怪,因为在T3,Q1已经不存在了,所以我希望不再为该队列接收数据点,而不是接收过时的数据。
我为此找到的解决方法是,在每次向出口商发出请求时都建立一个新的prometheus注册表,以一张干净的纸开始,但是似乎有些不客气,我真的不习惯这种方式。
那么,如何避免以普罗米修斯惯用的方式获取过时的仪表数据?
答案 0 :(得分:1)
如果这是使用client_java
编写的Java导出程序,则只需清除Gauge
(在myGauge.clear()
中),而不用构建全新的Registry
。
或者,如果这太繁重,并且您有办法在删除队列时得到通知,则在收到通知时只需致电Gauge.remove(queueName)
。
编辑:以前从未真正看过任何Ruby代码,但是看来Registry.unregister("rabbitmq_queue_messages")
可能是只清除一个指标(及其所有标签组合)的不那么笨手笨脚的方法。 ,也就是说,对于所有队列而言)。我看不到与Java客户端的Gauge.remove()
类似的东西,只允许删除一个样本/标签组合,但我可能会遗漏一些东西。