使用flask和gunicorn与多个worker从单独的端口收集prometheus指标

Pea*_*nut 7 python flask gunicorn kubernetes prometheus

我在 kubernetes 上运行了一个带有 gunicorn 和多个工作进程的小烧瓶应用程序。我想使用 prometheus 从这个应用程序中收集指标,但指标应该只能在单独的端口上内部访问集群(因为这在我们当前的设置中是必需的)。

对于一个 gunicorn 工作进程,我可以使用start_http_serverpython 客户端库中的功能在与烧瓶应用程序不同的端口上公开指标。

一个最小的例子可能如下所示:

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)
Run Code Online (Sandbox Code Playgroud)

要启动应用程序,请执行以下操作:

gunicorn --bind 127.0.0.1:8082 -w 1 app:app
Run Code Online (Sandbox Code Playgroud)

然而,这只适用于一个工作进程。

在客户端库的文档中还有一介绍了如何通过将工作进程的共享目录指定为写入指标的环境变量来将 prometheus 和 gunicorn 与多个工作进程一起使用 ( prometheus_multiproc_dir)。

因此,按照文档,多个工作人员的上述示例将是:

一个 gunicorn 配置文件:

from prometheus_client import multiprocess

def worker_exit(server, worker):    
    multiprocess.mark_process_dead(worker.pid)
Run Code Online (Sandbox Code Playgroud)

申请文件:

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())
Run Code Online (Sandbox Code Playgroud)

要启动应用程序,请执行以下操作:

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
Run Code Online (Sandbox Code Playgroud)

但是,在此设置中,我真的不知道如何访问存储在单独端口上的 flask-metrics 中的指标。有没有办法做到这一点?

我对这些事情有点陌生,所以如果我以错误的方式解决问题,我也很乐意提供建议,什么是解决我的案例的最佳方式。

bri*_*zil 6

您在这里要做的是启动一个单独的流程来为指标提供服务。将https://github.com/prometheus/client_python#multiprocess-mode-gunicorn中的 app函数放在它自己的应用程序中,并确保它和主应用程序都相同。prometheus_multiproc_dir