如何从多个子流程中公开prometheus度量?

2024-05-23 15:08:20 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个服务,目前在8000端口向prometheus客户端公开度量

我想将此进程更改为控制父进程,它为每个“事物”生成一个(独立)子进程,即子进程由thing_id参数化,父进程调用systemctl start child@thing_id

公开的度量是独立于每个“事物”的,因此我仍然希望在每个进程中公开这些度量,使用标签thing进行相应的识别和分析

然而,似乎我必须在每个服务中运行start_http_server(8000),这将由于“端口已在使用”而出错。我只尝试在父进程中启动服务器,但没有观察到来自子进程的任何指标

我可以定义一些端口范围,每个进程有一个http服务器,并相应地增加目标数量,但这似乎相当笨拙

我已经研究了https://github.com/prometheus/client_python/blob/master/prometheus_client/multiprocess.py,我相信这可能是一个解决方案,但我认为可能有一个更简单的方法,只使用子流程和systemctl


Tags: 端口服务器clientidchildhttp客户端参数
1条回答
网友
1楼 · 发布于 2024-05-23 15:08:20

最后,我使用普罗米修斯的“推送网关”实现了这一点——在每个子服务中创建一个GatewayClient根据作业id推送。当父服务使用delete_from_gateway停止子进程时,父服务会进行清理

https://sysadmins.co.za/install-pushgateway-to-expose-metrics-to-prometheus/的帮助下安装了推送网关

基本客户端代码如下

from prometheus_client import push_to_gateway, CollectorRegistry

class GatewayClient:
    def __init__(self, addr, thing_id):
        self.gateway_address = addr
        self.job_id = "thing-{}".format(thing_id)
        self.registry = CollectorRegistry()
        # define metrics etc
        self.some_counter = Counter('some_counter', 'A counter', registry=self.registry)

    async def start(self):
        while True:
            # push latest data
            push_to_gateway(self.gateway_address, job=self.job_id, registry=self.registry
            await asyncio.sleep(15)

    # methods to set metrics etc
    def inc_some_counter(self):
        self.some_counter.inc()

相关问题 更多 >