我在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
但是,这只适用于一个工作进程。
在客户端库的文档中,还有一个关于如何在多个工作进程中使用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
但是,在这种情况下,我不知道如何访问存储在单独端口上的烧瓶度量标准。有办法完成这件事吗?
我对这些事情有点陌生,所以如果我以错误的方式处理这个问题,我也很乐意听取意见,怎样才是解决我的问题的最佳方法。
发布于 2018-04-09 16:38:59
在这里,您想要做的是启动一个单独的过程,以服务于度量标准。将app
函数放入自己的应用程序python#多进程模式-gunicorn中,并确保它和主应用程序的prometheus_multiproc_dir
是相同的。
发布于 2020-12-03 13:51:45
我用Prometheus_flask_exporter来做这件事。
我的配置文件是这样的-
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)
https://stackoverflow.com/questions/49737354
复制相似问题