from my_modules.decoratory.header import format_response, feature_flag_required from my_modules.app.setup import LIMITER from my_modules.app.logger import logger from quart_common.web.wide_event import add_wide_event_context from quart import Blueprint, current_app health_bp = Blueprint("health", __name__) @health_bp.route("/convex", methods=["GET"]) @LIMITER.limit("30 per minute") @feature_flag_required("convex_health", fallback=False, status_code=404) @format_response async def get_convex_health_for_api(): add_wide_event_context(health={"check": "convex"}) runtime = getattr(current_app, "convex_runtime", None) if runtime is None: add_wide_event_context(health={"status": "unavailable", "reason": "runtime_missing"}) return { "status": "unavailable", "description": "Convex runtime is not attached to app", }, 503 is_alive = await runtime.is_alive() metrics = runtime.get_metrics() add_wide_event_context(health={"status": "ok" if is_alive else "unhealthy"}) return { "alive": is_alive, "metrics": metrics, }, 200 if is_alive else 503