使用带有多个工人的烧瓶和手枪从一个单独的端口收集prometheus指标

时间:2018-04-09 16:17:26

标签: python flask kubernetes gunicorn prometheus

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

对于一个gunicorn工作进程,我可以使用python客户端库中的start_http_server函数来公开与烧瓶应用程序不同的端口上的度量标准。

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

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

但是这仅适用于一个工作进程。

在客户端库的文档中也是一个section,关于如何通过为工作进程指定一个共享目录作为一个环境变量来将prometheus和gunicorn与多个工作进程一起使用,其中指针被写入({{ 1}})。

因此,根据文档,多个工作者的上述示例将是:

一个gunicorn配置文件:

prometheus_multiproc_dir

申请文件:

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())

但是在这种情况下,我真的不知道如何在单独的端口上访问存储在flask-metrics中的指标。有没有办法完成这件事?

我对这些事情有点新意,所以如果我以错误的方式接近问题,我也很乐意接受建议,这将是解决我案件的最佳方式。

2 个答案:

答案 0 :(得分:3)

您要在此处执行的操作是启动一个单独的流程,以便为指标提供服务。将app函数放在https://github.com/prometheus/client_python#multiprocess-mode-gunicorn中的应用程序中,并确保prometheus_multiproc_dir对于它和主应用程序都是相同的。

答案 1 :(得分:0)

我用Prometheus_flask_exporter做到了。

我的gunicorn配置文件就是这样-

from prometheus_flask_exporter.multiprocess import GunicornPrometheusMetrics

hostname = "0.0.0.0"
portname = 8080

def when_ready(server):
    GunicornPrometheusMetrics.start_http_server_when_ready(8000)

def child_exit(server, worker):
    GunicornPrometheusMetrics.mark_process_dead_on_child_exit(worker.pid)

包含的wsgi文件-

from prometheus_flask_exporter import PrometheusMetrics

# an extension targeted at Gunicorn deployments for prometheus scraping in flask applications
from prometheus_flask_exporter.multiprocess import GunicornPrometheusMetrics

application = Flask(__name__, static_url_path='')
CORS(application)

health = HealthCheck(application, "/healthcheck")
metrics = PrometheusMetrics(application)
metrics = GunicornPrometheusMetrics(application)