仅在不存在的情况下在 Python 中注册 Prometheus 指标

Posted

技术标签:

【中文标题】仅在不存在的情况下在 Python 中注册 Prometheus 指标【英文标题】:Registering a Prometheus metric in Python ONLY if it doesn't already exist 【发布时间】:2021-09-19 21:25:33 【问题描述】:

我正在使用多进程 prometheus 收集器(在 python 中),但单进程也可能存在此问题。

有没有办法检查 Counter Metric 是否已经存在,以防止尝试注册重复项?对以下代码的多次调用会生成附加错误。或者检查给定的指标是否存在,并获取它。

在注册表中进行某种查找?文档似乎相当缺乏。

代码:

logging_counter = prometheus_client.Counter('test', 'test')

产生错误:

ValueError:CollectorRegistry 中的时间序列重复:'test', 'test_total', 'test_created'

【问题讨论】:

【参考方案1】:

这可能是一种非常老套的方法,但这是我使它适用于单个进程的方式;

self.registry = CollectorRegistry()

def collect_metrics(self):
    sorted_keys = sorted(self.stat_msg_dict.keys())
    for key in sorted_keys:
        ..... getting metric_key, metric_name, current_value .....
        gauge = self.registry._names_to_collectors.get(metric_key, None)
        if gauge is None:
            gauge = Gauge(metric_key, metric_name, registry=self.registry)
        gauge.set(current_value)
        

在这种特殊情况下,我所有的收藏家都是仪表。

【讨论】:

【参考方案2】:

最终成为 MultiProcessCollector 设置方式的问题...确保在子进程级别使用 CollectorRegistry 而不是 Registry 进行初始化。

正确的解决方案:

prometheus_client.multiprocess.MultiProcessCollector(prometheus_client.registry.REGISTRY)

不正确的解决方案:

prometheus_client.multiprocess.MultiProcessCollector(CollectorRegistry())

【讨论】:

以上是关于仅在不存在的情况下在 Python 中注册 Prometheus 指标的主要内容,如果未能解决你的问题,请参考以下文章

是否可以在不唤醒手机的情况下在后台使用 iphone 注册和收集匹配的 UUID?

我可以在不注册我的自动测试应用程序的情况下在 Azure 上获取访问令牌吗?

在不使用 opencv 的情况下在 python 中应用 Homography 变换

如何在不使用转储的情况下在 python 中编写 json 文件

如何在不传递引用的情况下在 Python 中使用 SyncManager 跨进程共享列表

如何在不使用临时文件的情况下在 python 的 tarfile 中写入大量数据