An ASGI middleware that wraps the excellent yappi profiler to let you
measure the execution time of any function or coroutine in the context of
an HTTP request, and return it as a standard Server-Timing
HTTP header.
Here are some example configurations for various frameworks and libraries. Feel free to combine them as needed.
fastapi_app.add_middleware(ServerTimingMiddleware, calls_to_track={
"1deps": (fastapi.routing.solve_dependencies,),
"2main": (fastapi.routing.run_endpoint_function,),
"3valid": (pydantic.fields.ModelField.validate,),
"4encode": (fastapi.encoders.jsonable_encoder,),
"5render": (
fastapi.responses.JSONResponse.render,
fastapi.responses.ORJSONResponse.render,
),
})
from starlette.middleware import Middleware
middleware = [
Middleware(ServerTimingMiddleware, calls_to_track={
# TODO: ...
}),
]
starlette_app = Starlette(routes=routes, middleware=middleware)
fastapi_app.add_middleware(ServerTimingMiddleware, calls_to_track={
"db_exec": (sqlalchemy.engine.base.Engine.execute,),
"db_fetch": (
sqlalchemy.engine.ResultProxy.fetchone,
sqlalchemy.engine.ResultProxy.fetchmany,
sqlalchemy.engine.ResultProxy.fetchall,
),
})
Feel free to submit PRs containing examples for more libraries and ASGI frameworks.
asyncio
's debug mode can help).asyncio.gather()
) will report the duration as if they had been
executed sequentially.