65 lines
2.2 KiB
Python
65 lines
2.2 KiB
Python
"""APScheduler setup for periodic checks."""
|
|
from apscheduler.schedulers.background import BackgroundScheduler
|
|
|
|
from app.checker import run_check
|
|
from app.models import get_all_services_for_scheduler, prune_checks_retention, rollup_old_checks
|
|
|
|
|
|
def _run_all_checks():
|
|
"""Run checks for all registered services."""
|
|
services = get_all_services_for_scheduler()
|
|
for svc in services:
|
|
run_check(svc["id"], svc["target"], svc["protocol"])
|
|
|
|
|
|
def start_scheduler():
|
|
"""Start the background scheduler. Uses interval jobs per service."""
|
|
scheduler = BackgroundScheduler()
|
|
_scheduled_ids = set()
|
|
|
|
def sync_jobs():
|
|
"""Only add/remove jobs when the service list changes."""
|
|
nonlocal _scheduled_ids
|
|
services = get_all_services_for_scheduler()
|
|
current_ids = {svc["id"] for svc in services}
|
|
svc_by_id = {svc["id"]: svc for svc in services}
|
|
|
|
# Remove jobs for deleted services
|
|
for sid in _scheduled_ids - current_ids:
|
|
job_id = f"service_{sid}"
|
|
if scheduler.get_job(job_id):
|
|
scheduler.remove_job(job_id)
|
|
_scheduled_ids.discard(sid)
|
|
|
|
# Add jobs only for services that don't have one yet
|
|
for sid in current_ids:
|
|
if sid in _scheduled_ids:
|
|
continue
|
|
svc = svc_by_id[sid]
|
|
job_id = f"service_{sid}"
|
|
interval = max(10, svc["interval_seconds"])
|
|
scheduler.add_job(
|
|
run_check,
|
|
"interval",
|
|
seconds=interval,
|
|
id=job_id,
|
|
args=[svc["id"], svc["target"], svc["protocol"]],
|
|
)
|
|
_scheduled_ids.add(sid)
|
|
|
|
# Run checks immediately on startup, then schedule
|
|
_run_all_checks()
|
|
sync_jobs()
|
|
|
|
# Sync job list every 60 seconds (only adds/removes when services change)
|
|
scheduler.add_job(sync_jobs, "interval", seconds=60, id="sync_jobs")
|
|
|
|
# Roll up old checks into hourly buckets, then prune (every 15 min)
|
|
def rollup_and_prune():
|
|
rollup_old_checks()
|
|
prune_checks_retention()
|
|
|
|
scheduler.add_job(rollup_and_prune, "interval", minutes=15, id="prune_checks")
|
|
|
|
scheduler.start()
|