我在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中的指标。有没有办法完成这件事?
我对这些事情有点新意,所以如果我以错误的方式接近问题,我也很乐意接受建议,这将是解决我案件的最佳方式。
答案 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)