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
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()
|