![](/img/trans.png)
[英]Expose package metrics to Prometheus with prometheus_client
[英]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.