"""Celery 任务监控 API""" import time import redis as redis_lib from fastapi import APIRouter, Depends from app.core.celery_app import celery_app from app.core.config import settings from app.middleware.permission_middleware import require_permission router = APIRouter(prefix="/api/monitor", tags=["任务监控"]) def _get_redis(): return redis_lib.from_url(settings.REDIS_URL, decode_responses=True) @router.get("/tasks") def get_task_status(_: dict = Depends(require_permission('*'))): """获取 Celery 任务状态概览""" try: insp = celery_app.control.inspect() active = insp.active() or {} scheduled = insp.scheduled() or {} reserved = insp.reserved() or {} r = _get_redis() last_run = r.get("check_all_devices:last_run") is_running = bool(r.get("check_all_devices:running")) interval_str = r.get("system:check_interval_seconds") interval = int(interval_str) if interval_str else 1800 next_run = None if last_run and not is_running: next_run = float(last_run) + interval return { "workers": list(active.keys()), "active_count": sum(len(v) for v in active.values()), "scheduled_count": sum(len(v) for v in scheduled.values()), "check_running": is_running, "last_check": float(last_run) if last_run else None, "next_check": next_run, "check_interval_seconds": interval, } except Exception as e: return {"error": str(e)}