Added Prometheus metric endpoint on port 9000

This commit is contained in:
florian 2025-10-08 18:51:28 +02:00
parent 799ecdda67
commit 7fb139b362
3 changed files with 27 additions and 8 deletions

View File

@ -9,6 +9,7 @@ fastapi==0.118.0
h11==0.16.0 h11==0.16.0
idna==3.10 idna==3.10
mysql-connector-python==9.4.0 mysql-connector-python==9.4.0
prometheus_client==0.23.1
pycparser==2.23 pycparser==2.23
pydantic==2.12.0 pydantic==2.12.0
pydantic_core==2.41.1 pydantic_core==2.41.1

View File

@ -13,7 +13,8 @@ from hashlib import sha256
import uvicorn import uvicorn
from uvicorn_logging_config import LOGGING_CONFIG from uvicorn_logging_config import LOGGING_CONFIG
from contextlib import asynccontextmanager from contextlib import asynccontextmanager
from metrics_server import REQUEST_COUNTER
import asyncio
logger = setup_logger(__name__) logger = setup_logger(__name__)
@ -52,6 +53,11 @@ api = FastAPI(
lifespan=lifespan lifespan=lifespan
) )
@api.middleware("http")
async def prometheus_middleware(request, call_next):
response = await call_next(request)
REQUEST_COUNTER.labels(request.method, request.url.path, response.status_code).inc()
return response
def verify_api_key_dependency(db=Depends(get_db), api_key: str = Depends(api_key_header)) -> int: def verify_api_key_dependency(db=Depends(get_db), api_key: str = Depends(api_key_header)) -> int:
cursor = db.cursor() cursor = db.cursor()
@ -152,12 +158,14 @@ def unregister_token(
logger.info(f"Success: Unregistering token for user_id={user_id}, platform={request_data.platform}") logger.info(f"Success: Unregistering token for user_id={user_id}, platform={request_data.platform}")
return {"status":"unregistered"} return {"status":"unregistered"}
async def start_servers():
config_main = uvicorn.Config("main:api", host="0.0.0.0", port=8100, log_config=LOGGING_CONFIG, log_level="info")
config_metrics = uvicorn.Config("metrics_server:metrics_api", host="0.0.0.0", port=9000, log_level="info")
server_main = uvicorn.Server(config_main)
server_metrics = uvicorn.Server(config_metrics)
await asyncio.gather(server_main.serve(), server_metrics.serve())
if __name__ == "__main__": if __name__ == "__main__":
uvicorn.run( asyncio.run(start_servers())
"main:api",
host="0.0.0.0",
port=8100,
log_config=LOGGING_CONFIG,
log_level="info"
)

10
src/metrics_server.py Normal file
View File

@ -0,0 +1,10 @@
from fastapi import FastAPI, Response
from prometheus_client import generate_latest, CONTENT_TYPE_LATEST, Counter
metrics_api = FastAPI(title="Metrics Server", description="Prometheus metrics endpoint")
REQUEST_COUNTER = Counter("http_requests_total", "Total HTTP Requests", ["method", "endpoint", "status"])
@metrics_api.get("/metrics")
async def metrics():
return Response(generate_latest(), media_type=CONTENT_TYPE_LATEST)