Warm tip: This article is reproduced from serverfault.com, please click

python-使用 Flask 和带有两个工人的金枪鱼从单独的 Port 收集普罗米修斯指标

(python - Collecting prometheus metrics from a separate port using flask and gunicorn with multiple workers)

发布于 2018-04-09 16:17:26

我在kubernetes上运行了一个带有gunicorn和多个工作者进程的小 Flask 应用程序。我想使用Prometheus从此应用程序收集指标,但只能在内部在单独的端口上群集访问这些指标(这是我们当前设置所要求的)。

对于一个gunicorn worker进程,我可以使用start_http_serverpython客户端库中功能在与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中存储的指标。有没有办法做到这一点?

我对这些事情有点陌生,因此,如果我以错误的方式解决问题,我也很乐意提供建议,这将是解决我的问题的最佳方法。

Questioner
Peanut
Viewed
11
brian-brazil 2018-04-10 00:38:59

你在这里想要做的是启动一个单独的过程,以便提供指标。app函数放在自己的应用程序中的https://github.com/prometheus/client_python#multiprocess-mode-gunicorn中,并确保该prometheus_multiproc_dir函数与主应用程序相同。