""" Cleanup jobs registered with APScheduler. Jobs: - cleanup_old_logs: Delete log entries older than 7 days, daily at 03:00 - cleanup_old_metrics: Delete metrics older than 1 day, every 6 hours - cleanup_old_events: Delete events older than 30 days, weekly on Sunday """ from __future__ import annotations import logging from apscheduler.triggers.cron import CronTrigger from apscheduler.triggers.interval import IntervalTrigger from core.jobs.scheduler import get_scheduler from database import get_thread_db from core.dal.log_repository import LogRepository from core.dal.metrics_repository import MetricsRepository from core.dal.event_repository import EventRepository logger = logging.getLogger(__name__) _LOG_RETENTION_DAYS = 7 _METRICS_RETENTION_DAYS = 1 _EVENT_RETENTION_DAYS = 30 def register_cleanup_jobs() -> None: """Register all cleanup jobs with the scheduler. Call at startup.""" sched = get_scheduler() sched.add_job( func=_cleanup_old_logs, trigger=CronTrigger(hour=3, minute=0), id="cleanup_old_logs", name="Clean up old log entries", replace_existing=True, ) sched.add_job( func=_cleanup_old_metrics, trigger=IntervalTrigger(hours=6), id="cleanup_old_metrics", name="Clean up old metrics", replace_existing=True, ) sched.add_job( func=_cleanup_old_events, trigger=CronTrigger(day_of_week="sun", hour=4, minute=0), id="cleanup_old_events", name="Clean up old events", replace_existing=True, ) logger.info("Cleanup jobs registered") def _cleanup_old_logs() -> None: logger.info("Running log cleanup (retention=%d days)", _LOG_RETENTION_DAYS) try: db = get_thread_db() try: log_repo = LogRepository(db) log_repo.cleanup_old(retention_days=_LOG_RETENTION_DAYS) db.commit() finally: db.close() logger.info("Log cleanup complete") except Exception as exc: logger.error("Log cleanup failed: %s", exc, exc_info=True) def _cleanup_old_metrics() -> None: logger.info("Running metrics cleanup (retention=%d days)", _METRICS_RETENTION_DAYS) try: db = get_thread_db() try: metrics_repo = MetricsRepository(db) metrics_repo.cleanup_old(retention_days=_METRICS_RETENTION_DAYS) db.commit() finally: db.close() logger.info("Metrics cleanup complete") except Exception as exc: logger.error("Metrics cleanup failed: %s", exc, exc_info=True) def _cleanup_old_events() -> None: logger.info("Running event cleanup (retention=%d days)", _EVENT_RETENTION_DAYS) try: db = get_thread_db() try: event_repo = EventRepository(db) event_repo.cleanup_old(retention_days=_EVENT_RETENTION_DAYS) db.commit() finally: db.close() logger.info("Event cleanup complete") except Exception as exc: logger.error("Event cleanup failed: %s", exc, exc_info=True)