ASGI Server-Timing middleware
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.
Sample configurations
Here are some example configurations for various frameworks and libraries.
Feel free to combine them as needed.
FastAPI
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,
),
})
Starlette
from starlette.middleware import Middleware
middleware = [
Middleware(ServerTimingMiddleware, calls_to_track={
# TODO: ...
}),
]
starlette_app = Starlette(routes=routes, middleware=middleware)
SQLAlchemy
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,
),
})
More Frameworks
Feel free to submit PRs containing examples for more libraries and ASGI frameworks.