簡體   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