Heartbeat-мониторинг cron-задач: dead-man-switch на FastAPI

Heartbeat-мониторинг закрывает слепую зону обычного uptime: cron-задача не отвечает на запросы, а просто должна вовремя прислать сигнал об успешном выполнении. В статье разобрана практическая схема dead-man-switch на FastAPI, curl и фоновой проверке просроченных пингов.

Механика простая: после завершения задачи скрипт вызывает уникальный heartbeat-URL, а сервер сохраняет время последнего ping. Для каждого монитора задаются interval_sec и grace_sec; если новый ping не пришёл в окно interval + grace_period, состояние переводится в down и открывается incident. Для daily-job примерное окно составляет около 25 часов: если задача должна была отработать в 04:00, к 05:00 следующего дня уже можно алёртить.

Серверная часть строится вокруг модели HeartbeatMonitor, endpoint на FastAPI принимает GET или POST по токену, записывает ping, учитывает exit code и закрывает или открывает incident. Фоновая задача в Celery каждую минуту проверяет overdue heartbeats: берёт последний ping, прибавляет ожидаемый интервал и grace period, а затем сравнивает deadline с текущим временем.

На клиенте базовый вариант — curl после успешного выполнения команды, но для production полезнее передавать exit code, делать start/end pings и использовать wrapper-утилиту, которая сама запускает команду, собирает stdout/stderr и отправляет метаданные. Ложные срабатывания чаще всего дают слишком короткий grace period, рост времени выполнения backup, сетевые сбои, timezone drift и disk full, поэтому автор предлагает retry для curl, UTC в cron и запас по max_duration минимум 3× от среднего.

Коротко

  • Dead-man-switch ждёт не ответа сервиса, а самостоятельного ping от cron-задачи; если сигнал не пришёл в окно, открывается incident.
  • Для daily-job окно можно считать как interval_sec + grace_sec: например, 24 часа интервала и 1 час допуска дают около 25 часов.
  • FastAPI endpoint принимает ping по уникальному token, сохраняет received_at и exit_code, а затем переводит monitor в up или down.
  • Celery-проверка overdue heartbeats раз в минуту сравнивает last_ping_at + interval + grace с текущим временем.
  • Для production важны retry у curl, передача exit code, start/end pings, UTC в cron и запас max_duration для растущих задач.

FAQ

Зачем cron-задачам в продакшне нужен heartbeat-мониторинг, если уже есть обычный uptime-check для сервисов?

Uptime-check проверяет, отвечает ли сервис, но не видит, что cron перестал запускаться. Heartbeat заставляет задачу самой присылать сигнал, и отсутствие сигнала становится поводом для алёрта.

Как сервер понимает, что запланированная задача просрочена, и когда надо открывать incident по heartbeat?

Сервер хранит last_ping_at и рассчитывает deadline как interval_sec + grace_sec. Если текущее время больше deadline, monitor переводится в down и открывается incident.

Какие настройки чаще всего приводят к ложным алёртам при heartbeat-мониторинге cron-задач и workers?

Ложные алёрты возникают из-за короткого grace period, роста времени выполнения задачи, сетевых сбоев, разных timezone и disk full. Для снижения шума нужны retry, UTC и запас по max_duration.

Читайте также

  1. Самохостный AI-агент на почте, systemd и LLM
  2. Cron в Linux: полное руководство для админов + скрытые проблемы
  3. Система персональных шпаргалок прямо в терминале
  4. Книга: «Изучаем скриптинг PowerShell за месяц по часу в день (2-е издание)»
  5. 6 приёмов для отличных Shell-скриптов от сообщества Hacker News
Ключевые инсайты из новости (по версии ChatGPT)
  • Heartbeat как контроль выполнения scheduled jobs: Для cron-задач, scheduled lambda и background workers обычный uptime-мониторинг недостаточен: такие процессы не отвечают на HTTP-запросы и могут молча перестать запускаться. Для них нужен dead-man-switch: задача сама отправляет heartbeat после выполнения, а отсутствие сигнала в ожидаемом окне становится поводом для incident.
    [Мониторинг и алерты]
Для получения полного доступа оформите подписку PubMag PRO.
Зарегистрированные пользователи видят только два тезиса.
Зарегистрироваться
Инсайты автоматически генерируются с помощью искусственного интеллекта на основе текста статьи.
← Назад в лентуЧитать оригинал →
✈️ Подписывайтесь на мой Telegram-канал — там еще больше интересного про AdTech, MarTech, AI и многое другое!