首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用烧瓶和多名工人从单独的港口收集普罗米修斯指标

使用烧瓶和多名工人从单独的港口收集普罗米修斯指标
EN

Stack Overflow用户
提问于 2018-04-09 16:17:26
回答 2查看 9.1K关注 0票数 8

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

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

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

代码语言:javascript
运行
复制
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)

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

代码语言:javascript
运行
复制
gunicorn --bind 127.0.0.1:8082 -w 1 app:app

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

在客户端库的文档中,还有一个关于如何在多个工作进程中使用prometheus和gunicorn的部分,方法是将工作进程的共享目录指定为写入度量的环境变量(prometheus_multiproc_dir)。

因此,在文档之后,针对多个工作人员的上述示例如下:

一个gunicorn配置文件:

代码语言:javascript
运行
复制
from prometheus_client import multiprocess

def worker_exit(server, worker):    
    multiprocess.mark_process_dead(worker.pid)

申请文件:

代码语言:javascript
运行
复制
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())

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

代码语言:javascript
运行
复制
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

但是,在这种情况下,我不知道如何访问存储在单独端口上的烧瓶度量标准。有办法完成这件事吗?

我对这些事情有点陌生,所以如果我以错误的方式处理这个问题,我也很乐意听取意见,怎样才是解决我的问题的最佳方法。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-04-09 16:38:59

在这里,您想要做的是启动一个单独的过程,以服务于度量标准。将app函数放入自己的应用程序python#多进程模式-gunicorn中,并确保它和主应用程序的prometheus_multiproc_dir是相同的。

票数 7
EN

Stack Overflow用户

发布于 2020-12-03 13:51:45

我用Prometheus_flask_exporter来做这件事。

我的配置文件是这样的-

代码语言:javascript
运行
复制
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文件包括-

代码语言:javascript
运行
复制
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)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49737354

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档