繁体   English   中英

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

[英]How can I expose prometheus metrics from multiple subprocesses?

我有一个服务,它目前在端口 8000 上使用 prometheus 客户端公开指标。

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

公开的指标对于每个“事物”都是独立的,因此我仍然想公开每个进程的这些指标,使用 label thing进行相应的识别和分析。

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

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

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

最后,我使用普罗米修斯“推送网关”来实现这一点 - 在每个子服务中创建一个基于作业 ID 推送的GatewayClient 父服务在使用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()

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM