如何公开多个子流程的普罗米修斯指标?

How can I expose prometheus metrics from multiple subprocesses?

我有一项服务目前在端口 8000 上通过普罗米修斯客户端公开指标。

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

每个 "thing" 公开的指标是独立的,所以我仍然想按进程公开这些指标,使用标签 thing 进行相应的识别和分析。

然而,我似乎必须在每个服务中 运行 start_http_server(8000),这将因 "port already in use" 而出错。我已尝试仅在父进程中启动服务器,但观察到了来自子进程的 none 指标。

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

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

最后我使用了 prometheus "push gateway" 来实现这一点——在每个子服务中创建一个 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()