上下文:我想为 RabbitMQ 构建自己的导出器。为此,我设置了一个 HTTP 服务器来查询管理 API,解析响应并使用 Prometheus 格式构建适当的响应
我正在测量队列中的消息数量,以便在队列中有太多消息时收到警报。为此,我设置了以下仪表:rabbitmq_queue_messages{queue_name="Q1"}
我的问题是:如果队列被删除会发生什么?例如:
据我了解,在 T3,即使队列不再存在,它也会返回相同的
rabbitmq_queue_messages{queue_name="Q1"} 5
响应,因为这就是量规在 Prometheus 上的工作方式。对我来说,这似乎很奇怪,因为在 T3,Q1 不再存在,所以我希望停止接收此队列的数据点,而不是接收陈旧的数据。我为此找到的解决方法是针对每个向导出商提出的请求构建一个新的 prometheus 注册表,以从一张干净的表开始,但这似乎有点麻烦,我真的不喜欢以这种方式工作。
那么,我如何才能以更符合 Prometheus 惯用的方式避免使用过时的仪表数据?
最佳答案
如果这是 Java 导出器,则使用 client_java
编写,您只需清除您的 Gauge
(在 myGauge.clear()
中)而不是构建一个全新的 Registry
.
或者,如果这太重要并且您有办法在队列被删除时得到通知,只需拨打 Gauge.remove(queueName)
当您收到通知时。
编辑:以前从未真正见过任何 Ruby 代码,但似乎 Registry.unregister("rabbitmq_queue_messages")
可能是仅清除一个指标(及其所有标签组合,即在您的情况下针对所有队列)的不那么严厉的方式。我没有看到任何类似于 Java 客户端的 Gauge.remove()
这将允许只删除一个样本/标签组合,但我可能会遗漏一些东西。
关于rabbitmq - 处理 Prometheus Gauge 中的陈旧数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58688050/