refactor web pagination and add partitioned events, flap/timeout showcase agents
This commit is contained in:
@@ -14,19 +14,43 @@ from .middleware.body_limit import BodyLimitMiddleware
|
||||
from .middleware.request_id import RequestIdMiddleware
|
||||
from .services.detector import run_detector
|
||||
from .services.notifier_worker import run_notifier_worker
|
||||
from .services.partitioning import ensure_event_partitions, run_partition_maintenance
|
||||
from .settings import get_settings
|
||||
|
||||
log = get_logger("monlet.main")
|
||||
|
||||
|
||||
async def _ensure_partitions_with_retry(engine, attempts: int = 6, base_delay: float = 1.0) -> None:
|
||||
last_exc: Exception | None = None
|
||||
for i in range(attempts):
|
||||
try:
|
||||
await ensure_event_partitions(engine)
|
||||
return
|
||||
except Exception as exc:
|
||||
last_exc = exc
|
||||
log.warning("ensure_event_partitions_retry", attempt=i + 1, error=str(exc))
|
||||
await asyncio.sleep(min(base_delay * (2**i), 10.0))
|
||||
assert last_exc is not None
|
||||
raise last_exc
|
||||
|
||||
|
||||
@asynccontextmanager
|
||||
async def lifespan(app: FastAPI):
|
||||
s = get_settings()
|
||||
configure_logging(s.log_level)
|
||||
get_engine()
|
||||
engine = get_engine()
|
||||
sm = get_sessionmaker()
|
||||
# Mandatory: current month partition must exist before accepting writes.
|
||||
# Retry briefly so a transient DB unavailability at startup (compose race)
|
||||
# doesn't crash-loop the server.
|
||||
await _ensure_partitions_with_retry(engine)
|
||||
stop_event = asyncio.Event()
|
||||
tasks: list[asyncio.Task] = []
|
||||
# Partition maintenance is independent of detector — must run even when detector is off,
|
||||
# otherwise events_future_partitions runs out and ingest fails.
|
||||
tasks.append(
|
||||
asyncio.create_task(run_partition_maintenance(sm, stop_event), name="partition_maintenance")
|
||||
)
|
||||
if s.enable_detector:
|
||||
tasks.append(asyncio.create_task(run_detector(sm, stop_event), name="detector"))
|
||||
if s.enable_notifier_worker:
|
||||
|
||||
Reference in New Issue
Block a user