Код: Выделить всё
import time
from fastapi import Request
from prometheus_client import Summary, make_asgi_app, CollectorRegistry
from starlette.middleware.base import BaseHTTPMiddleware
registry = CollectorRegistry()
metrics_app = make_asgi_app(registry=registry)
summary_metrics = {}
class MyMiddleware:
def __init__(
self, app
):
self.app = app
route_names = [r.name for r in app.routes]
if len(set(route_names)) != len(route_names):
raise Exception("Route names must be unique")
for route_name in route_names:
if route_name is not None:
summary_metrics[route_name] = Summary(route_name, f'{route_name} processing time', registry=registry)
async def __call__(self, request: Request, call_next):
start_time = time.time()
response = await call_next(request)
process_time = time.time() - start_time
if request.scope.get('route'):
summary_metrics.get(request.scope.get('route')).observe(process_time)
return response
< /code>
Это мое приложение.py < /p>
app.include_router(some_valid_router)
app.mount("/metrics", metrics_app)
my_middleware = MyMiddleware(app)
app.add_middleware(BaseHTTPMiddleware, dispatch=my_middleware)
if __name__ == "__main__":
LOGGER.info("Starting up the application")
uvicorn_logger = (
UVICORN_LOG_CONFIG if config["CUSTOM_UVICORN_LOGGING"].lower() == "y" else None
)
if uvicorn_logger:
uvicorn.run(
"app:app",
host="0.0.0.0",
port=int(config["PORT"]),
reload=config["DEBUG"],
log_config=uvicorn_logger,
)
else:
uvicorn.run(
"app:app", host="0.0.0.0", port=int(config["PORT"]), reload=config["DEBUG"]
)
Я вижу общее количество запросов и общее время, проведенное, если я изменю свое промежуточное программное обеспечение на ниже и перемещаю app.add_middleware на внешнюю часть __main __ .
import time
from fastapi import Request
from prometheus_client import Summary, make_asgi_app, CollectorRegistry
from starlette.middleware.base import BaseHTTPMiddleware
registry = CollectorRegistry()
metrics_app = make_asgi_app(registry=registry)
summary_metrics = {}
REQUEST_TIME = Summary('request_processing_seconds', 'Time spent processing request', registry=registry)
class MyMiddleware:
def __init__(
self, app
):
self.app = app
async def __call__(self, request: Request, call_next):
start_time = time.time()
response = await call_next(request)
process_time = time.time() - start_time
REQUEST_TIME.observe(process_time)
return response
< /code>
может кто -нибудь сказать мне, что я делаю не так? Это мое первое взаимодействие с быстрым API. Пожалуйста, дайте мне знать, если мой подход должен быть исправлен или есть лучшие способы получить время обработки и количество запросов на метрики маршрута.
Спасибо !!
Подробнее здесь: https://stackoverflow.com/questions/773 ... -spent-and