集成Prometheus
前言
FastAPI 集成 Prometheus,通过 prometheus_client 暴露指标端点,供 Prometheus 定期拉取。
安装依赖
python -m pip install fastapi uvicorn prometheus_client
示例
from random import randint
import uvicorn
from fastapi import FastAPI
from fastapi.responses import PlainTextResponse
from prometheus_client import Counter, Gauge, Histogram, REGISTRY, generate_latest
app = FastAPI()
request_counter = Counter(
"http_requests_total",
"Total HTTP Requests",
["method", "path", "status"]
)
request_duration = Histogram(
'http_request_duration_seconds',
'HTTP Request Duration',
['method', 'path'])
random_gauge = Gauge(
"http_current_users_number",
"Current Users Number",
)
@app.get('/')
async def read_root():
request_counter.labels(method="GET", path="/", status=200).inc()
# random_gauge.inc(randint(1,10)) # 增值
# random_gauge.dec(randint(1,10)) # 减值
random_gauge.set(randint(1, 10))
return {"msg": "Hello World"}
@app.get('/metrics')
async def get_metrics():
return PlainTextResponse(status_code=200, content=generate_latest(REGISTRY))
if __name__ == '__main__':
uvicorn.run(app, host='127.0.0.1', port=8000)
请求 /metrics 结果示例:
# HELP python_gc_objects_collected_total Objects collected during gc
# TYPE python_gc_objects_collected_total counter
python_gc_objects_collected_total{generation="0"} 2524.0
python_gc_objects_collected_total{generation="1"} 7725.0
python_gc_objects_collected_total{generation="2"} 2696.0
# HELP http_requests_total Total HTTP Requests
# TYPE http_requests_total counter
http_requests_total{method="GET",path="/",status="200"} 13.0
# HELP http_request_duration_seconds HTTP Request Duration
# TYPE http_request_duration_seconds histogram
# HELP http_current_users_number Current Users Number
# TYPE http_current_users_number gauge
http_current_users_number 8.0
说明
Counter:只增不减的计数器,适合请求数、错误数。Histogram:分布统计,适合耗时(可计算 P50/P99)。Gauge:可增可减的瞬时值,适合当前在线用户数等。/metrics端点建议通过中间件自动记录每个请求的 method/path/status 与耗时,而不是在每个路由里手动埋点;生产环境注意不要把/metrics暴露到公网。