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



我有一个服务,它目前在端口 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 ......

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

最新更新