You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

70 lines
2.1 KiB
Python

"""Events and health monitoring router.
Provides endpoints for the centralized trading event log and live health summary.
"""
from __future__ import annotations
from typing import Any
from fastapi import APIRouter, Query
router = APIRouter(prefix="/events", tags=["events"])
def _get_store():
from apps.web.services.events_store import EventsStore
return EventsStore.get()
@router.get("")
def list_events(
source: str | None = Query(None),
level: str | None = Query(None),
category: str | None = Query(None),
session_id: str | None = Query(None),
job_run_id: str | None = Query(None),
event_name: str | None = Query(None),
q: str | None = Query(None),
since: str | None = Query(None),
until: str | None = Query(None),
limit: int = Query(200, ge=1, le=1000),
offset: int = Query(0, ge=0),
system: str | None = Query(None, description="'pead' or 'orb' to scope to one system"),
) -> dict[str, Any]:
store = _get_store()
rows, total = store.query(
source=source, level=level, category=category,
session_id=session_id, job_run_id=job_run_id, event_name=event_name,
q=q, since=since, until=until,
limit=limit, offset=offset,
system=system,
)
next_offset = offset + limit if offset + limit < total else None
return {"rows": rows, "total": total, "offset": offset, "next_offset": next_offset}
@router.get("/runs")
def list_runs(limit: int = Query(20, ge=1, le=100)) -> list[dict[str, Any]]:
return _get_store().recent_runs(limit=limit)
@router.get("/sources")
def list_sources() -> list[str]:
return _get_store().distinct_sources()
@router.delete("")
def purge_events(before: str = Query(..., description="ISO-8601 datetime; delete events older than this")) -> dict[str, Any]:
deleted = _get_store().purge_before(before)
return {"deleted": deleted}
# ── Health endpoint (mounted at /health to match plan, kept in events router) ──
health_router = APIRouter(tags=["health"])
@health_router.get("/health")
def get_health() -> dict[str, Any]:
return _get_store().health_summary()