【问题标题】:How can I expose prometheus metrics from multiple subprocesses?如何从多个子流程公开普罗米修斯指标?
【发布时间】:2020-05-13 21:27:29
【问题描述】:

我有一个服务,它目前在端口 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,我认为这可能是一个解决方案,但我认为可能有一种更简单的方法,只需使用 subprocessing 和 systemctl ...

【问题讨论】:

    标签: python subprocess prometheus


    【解决方案1】:

    最后,我使用 prometheus“推送网关”来实现这一点 - 在每个子服务中创建一个 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()
    

    【讨论】:

    • 快速问题:我应该将什么作为 addr 和 thing_id 传递?我有类似的情况并试图将指标公开给子流程。这是我的问题链接:link@ifo10
    • @SahilSangani addr 是推送网关实例的地址(在我的情况下,它是 localhost:9091,因为推送网关与应用程序在同一主机上运行),而 thing_id 本质上是一个子进程标识符(在我的示例中,每个子流程都有一个标识参数,并且公开的指标总是将其作为标签包含在内) - 不确定这是否适用于您的烧瓶用例;您需要确保子流程不使用相同的标识符
    • 感谢您的解释!
    猜你喜欢
    • 2022-12-13
    • 2021-04-10
    • 2020-01-10
    • 2020-11-12
    • 2020-11-10
    • 1970-01-01
    • 1970-01-01
    • 2022-12-22
    • 1970-01-01
    相关资源
    最近更新 更多