rabbitmq - 处理 Prometheus Gauges 中的陈旧数据
问题描述
上下文:我想为 RabbitMQ 构建自己的导出器。为此,我设置了一个 HTTP 服务器来查询管理 API、解析响应并使用 Prometheus 格式构建适当的响应
我正在测量队列中的消息数量,以便在队列中有太多消息时收到警报。为此,我设置了以下量规:
rabbitmq_queue_messages{queue_name="Q1"}
我的问题是:如果队列被删除会怎样?例如:
- 在 T1 出口商返回 rabbitmq_queue_messages{queue_name="Q1"} 5
- 在 T2 时,由于某种原因正在删除队列
- 在 T3,我的出口商再次被要求提供指标。
据我了解,在 T3 时,即使队列不再存在,它也会返回相同的rabbitmq_queue_messages{queue_name="Q1"} 5
响应,因为这是 Prometheus 上仪表的工作方式。对我来说这似乎很奇怪,因为在 T3,Q1 不再存在,所以我希望停止接收此队列的数据点,而不是接收陈旧的数据。
我为此找到的解决方法是在对出口商的每个请求都建立一个新的普罗米修斯注册表,以从一张干净的表格开始,但这似乎有点老套,我真的不喜欢这样工作。
那么,我怎样才能避免以更 Prometheus 惯用的方式获得过时的仪表数据呢?
解决方案
如果这是一个 Java 导出器,使用 编写client_java
,你可以简单地清除你的Gauge
(in myGauge.clear()
) 而不是构建一个全新的Registry
.
或者,如果这太重了,并且您有办法在删除队列时获得通知,则只需在收到通知时调用Gauge.remove(queueName)
。
编辑:以前从未真正见过任何 Ruby 代码,但似乎这Registry.unregister("rabbitmq_queue_messages")
可能是清除一个指标(及其所有标签组合,即所有队列的情况)的不那么严厉的方法。我没有看到任何类似于 Java 客户端的Gauge.remove()
允许仅删除一个样本/标签组合的东西,但我可能会遗漏一些东西。
推荐阅读
- google-apps-script - 当源是函数时(例如 NOW()),GOOGLE 脚本“仅复制到值”不起作用
- elasticsearch - Kibana 图表中的“分组依据”
- android - 如何减少滚动视图中图像之间的空间?
- python - 尝试 Pip 安装面部识别库的问题
- javascript - 在 cube.js 中更改结果的键名
- php - 如何在图像中使用 $_SERVER 在 HTML 中使用您的 IP 地址
- ios - 当应用程序在 iOS 中第二次启动时 Firebase 停止工作
- css - 覆盖下拉菜单链接的图像滑块
- sql - 如何在 PostgreSQL 中使用 DATETIME 数据类型的列中将 Null 替换为“N/A”
- swift - 我应该如何解开一个可选但最有可能设置的成员变量?