仅在不存在的情况下在 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 文件