我在kubernetes上运行了一个带有gunicorn和多个工作者进程的小 Flask 应用程序。我想使用Prometheus从此应用程序收集指标,但只能在内部在单独的端口上群集访问这些指标(这是我们当前设置所要求的)。
对于一个gunicorn worker进程,我可以使用start_http_server
python客户端库中的功能在与flask应用程序不同的端口上公开指标。
一个最小的示例可能看起来像这样:
from flask import Flask
from prometheus_client import start_http_server, Counter
NUM_REQUESTS = Counter("num_requests", "Example counter")
app = Flask(__name__)
@app.route('/')
def hello_world():
NUM_REQUESTS.inc()
return 'Hello, World!'
start_http_server(9001)
要启动该应用程序,请执行以下操作:
gunicorn --bind 127.0.0.1:8082 -w 1 app:app
但是,这仅适用于一个工作进程。
在客户端库的文档中,还有关于如何通过为工作进程指定共享目录作为环境变量(将度量写入到)来指定如何将prometheus和gunicorn与多个工作进程一起使用的部分prometheus_multiproc_dir
。
因此,遵循文档,针对多个工作人员的上述示例将是:
Gunicorn配置文件:
from prometheus_client import multiprocess
def worker_exit(server, worker):
multiprocess.mark_process_dead(worker.pid)
申请文件:
import os
from flask import Flask
from prometheus_client import Counter
NUM_REQUESTS = Counter("num_requests", "Example counter")
app = Flask(__name__)
@app.route('/')
def hello_world():
NUM_REQUESTS.inc()
return "[PID {}]: Hello World".format(os.getpid())
要启动该应用程序,请执行以下操作:
rm -rf flask-metrics/
mkdir flask-metrics
export prometheus_multiproc_dir=flask-metrics
gunicorn --bind 127.0.0.1:8082 -c gunicorn_conf.py -w 3 app:app
但是,在这种设置下,我真的不知道如何访问单独端口上flask-metrics中存储的指标。有没有办法做到这一点?
我对这些事情有点陌生,因此,如果我以错误的方式解决问题,我也很乐意提供建议,这将是解决我的问题的最佳方法。
你在这里想要做的是启动一个单独的过程,以便提供指标。将 app
函数放在自己的应用程序中的https://github.com/prometheus/client_python#multiprocess-mode-gunicorn中,并确保该prometheus_multiproc_dir
函数与主应用程序相同。