繁体   English   中英

在 Http 服务器错误上更新 API Prometheus 指标

[英]updating API Prometheus metrics on an Http server error

我在一个带有多个容器的 docker 项目上工作,我想使用 python Prometheus 库来监控容器中的一些指标,在 docker-network 内的本地端口上公开每个容器的指标,并将它们收集到另一个名为 Prometheus_exporter 的容器中。

为此,我在我的 FastAPI 上定义了几个 Prometheus 指标,我想在 http 服务器上使用 Prometheus 库的“start_http_server”方法公开它们。 这是我的 API 代码以及我如何使用它:

api.py :在这个文件中,我定义了我的 API 及其端点

from prometheus_client import Counter, Histogram, start_http_server
app = FastAPI()

num_q = Counter('api_num_queries','counts number of requests sent to API', ['endpoint'])
num_err = Counter('api_num_errors','counts number of errors occurred')
latency = Histogram('api_latency', 'latency calculator')

@app.get('/userdata/{uid}')
@latency.time()
@num_err.count_exceptions()
def get_user_data(uid):
    udata = redis.get(uid)

    return udata
    

@app.get('/bookdata/{bid}')
@latency.time()
@num_err.count_exceptions()
def get_book_data(bid):
    bdata = redis.get(bid)
    
    return bdata

main.py :在这个文件中我发布了我的 API

import uvicorn
from api import app
from prometheus_client import start_http_server

if __name__ == '__main__':
    uvicorn.run("main:app", host="0.0.0.0", port=8080, workers=10)

问题是当我将start_http_server(8000)放在main.py文件中时,如下所示:

import uvicorn
from api import app
from prometheus_client import start_http_server

if __name__ == '__main__':
    start_http_server(8000)
    uvicorn.run("main:app", host="0.0.0.0", port=8080, workers=10)

指标已公开,但在 api.py 中的指标发生变化时,它们不会更新并保持初始零值

我尝试的另一种方法是在api.py中使用start_http server(8000)

from prometheus_client import Counter, Histogram, start_http_server
app = FastAPI()

num_q = Counter('api_num_queries','counts number of requests sent to API', ['endpoint'])
num_err = Counter('api_num_errors','counts number of errors occurred')
latency = Histogram('api_latency', 'latency calculator')

@app.get('/userdata/{uid}')
@latency.time()
@num_err.count_exceptions()
def get_user_data(uid):
    udata = redis.get(uid)
    
    start_http_server(8000)
    return udata
    

@app.get('/bookdata/{bid}')
@latency.time()
@num_err.count_exceptions()
def get_book_data(bid):
    bdata = redis.get(bid)
    
    start_http_server(8000)
    return bdata

这在第一次工作正常并且指标以其最新值公开,但是当我发送新请求时,我得到“端口已在使用”错误。

我应该怎么做以及如何正确公开我的指标?

好的,我想出了一些办法。 这不是一个真正的解决方案,但它有效! 这个问题的原因是http_start_server()命令没有自动重置或更新端口上的信息,这是prometheus_client库的问题。

为了解决这个问题,您可以在 API 中定义一个新的\metrics端点,如下所示,并在每次发送请求时返回您的指标:

from prometheus_client import generate_latest, CollectorRegistry
metrics_reg = CollectorRegistry()
#define your metrics and specify all the metrics registrys to be metrics_reg

@app.get('/metrics')
def get_metrics():
    return generate_latest(metrics_reg) 

此解决方案仅适用于 API 模块。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM