master/adapter/http/fastapi/lifespan.py
2026-03-20 21:38:51 +03:00

33 lines
1 KiB
Python

from collections.abc import AsyncIterator
from contextlib import asynccontextmanager
from opentelemetry.instrumentation.fastapi import FastAPIInstrumentor
from adapter.di.container import build_container
from adapter.http.fastapi.dependencies import APP_CONFIG_STATE, APP_CONTAINER_STATE
from fastapi import FastAPI
@asynccontextmanager
async def app_lifespan(app: FastAPI) -> AsyncIterator[None]:
config = getattr(app.state, APP_CONFIG_STATE, None)
if config is None:
raise RuntimeError('config unavailable')
container = build_container(config=config)
instrumented = False
setattr(app.state, APP_CONTAINER_STATE, container)
try:
tracer_provider = container.observability.tracer_provider
if tracer_provider is not None:
FastAPIInstrumentor.instrument_app(
app,
tracer_provider=tracer_provider,
)
instrumented = True
yield
finally:
if instrumented:
FastAPIInstrumentor.uninstrument_app(app)
container.shutdown()