[英]Prometheus how to expose metrics in multiprocess app with start_http_server
[英]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.