Heartbeat-мониторинг cron-задач

Heartbeat отвечает на один вопрос: «эта задача вообще запускалась?». Ваш скрипт дёргает короткий URL при каждом успешном прогоне. Пинг не пришёл вовремя — Base388 открывает инцидент и пишет вам. Настройка занимает одну строку в существующем cron.

1 строка
Столько нужно добавить в cron
GET/POST
Пинг работает откуда угодно
Из закрытого контура
Входящий доступ не нужен
Авто-инцидент
Пропуск пинга = инцидент

Что это такое

Heartbeat — это «сигнал жизни», который ваша задача подаёт сама. Вы создаёте heartbeat, получаете персональный Ping URL и указываете ожидаемую периодичность. Каждый успешный прогон задачи дёргает этот адрес. Если очередной пинг не пришёл в срок, Base388 фиксирует пропуск, открывает инцидент и уведомляет вас — а когда пинг снова пойдёт, инцидент закроется сам.

  • Ping URL принимает и GET, и POST — подойдёт curl, wget, планировщик Windows, GitHub Actions, systemd timer, код приложения.
  • Не требует входящего доступа к вашему серверу: соединение всегда исходящее. Работает за NAT, в закрытом контуре и на машине без белого IP.
  • История пингов и событий хранится согласно retention тарифа: видно, когда задача шла ровно, а когда начала опаздывать.

Что умеет и зачем это нужно

Каждая возможность — с пояснением, какую задачу бизнеса она закрывает.

Персональный Ping URL

На каждый heartbeat выдаётся уникальный токен и адрес вида /hb/{token}. Секрет знает только ваша задача, ничего настраивать на стороне сети не нужно.

Что это даёт

Подключение занимает минуту и не требует участия админа: любой разработчик добавит строку в существующий cron.

Ожидаемая периодичность и допуск

Вы говорите, как часто задача должна отчитываться. Base388 считает пинг просроченным, если он не пришёл в срок, и заводит инцидент.

Что это даёт

Задача, тихо переставшая запускаться, — самый незаметный вид аварии. Heartbeat превращает «ничего не произошло» в явный сигнал.

Инцидент и авто-восстановление

Пропуск открывает инцидент того же вида, что и падение сайта, — с таймлайном и комментариями. Первый же новый пинг закрывает его автоматически.

Что это даёт

Аварии cron и аварии сайта живут в одном списке и в одном отчёте. Не нужно держать в голове два разных пульта.

Свои каналы уведомлений

Каждому heartbeat назначаются свои каналы: ночной бэкап — в личку админу, выгрузка остатков — в чат отдела. Тихие часы и правила повторов работают так же, как для сайтов.

Что это даёт

Ответственный узнаёт о своей задаче, а не весь чат обо всех. Меньше шума — выше шанс, что на алерт отреагируют.

Самомониторинг ваших кронов

К любой консольной команде можно добавить опцию --heartbeat-tok=<токен>: пинг уйдёт автоматически и только при успешном завершении. Упавшая команда пинг не отправит и уйдёт в просрочку.

Что это даёт

Обвязку не нужно писать вручную и поддерживать в каждом скрипте — достаточно одного флага в строке cron.

Учёт в отчётах

События heartbeat попадают в общий журнал инцидентов и в периодические отчёты о доступности, которые приходят на выбранный канал раз в день, неделю или месяц.

Что это даёт

Регулярность фоновых процессов становится измеримой, а не предметом веры.

Как это настраивается

01

Создайте heartbeat

Назовите задачу и укажите, как часто она должна отчитываться.

02

Скопируйте Ping URL

Персональный адрес показывается сразу после создания.

03

Добавьте пинг в задачу

Одна строка в конце cron-задачи или один запрос в конце скрипта — после успешного завершения.

04

Забудьте о ней

Пока задача идёт, вы ничего не получаете. Пропала — приходит уведомление.

Подключение в одну строку
# Пинг уходит только если бэкап завершился успешно (&&)
0 3 * * * /usr/local/bin/backup.sh && curl -fsS https://app.base388.ru/hb/ВАШ_ТОКЕН

# Из PHP/Python/Node — тот же адрес, обычный GET или POST
curl -fsS -X POST https://app.base388.ru/hb/ВАШ_ТОКЕН

# Для консольных команд Base388 — встроенный флаг, без обвязки
* * * * * php bin/console app:reports:send --heartbeat-tok=ВАШ_ТОКЕН

Зачем это нужно на самом деле

Бэкап, которого нет

Классическая катастрофа: бэкап «делается» полгода, а в день восстановления выясняется, что задача отвалилась в первую же неделю. Heartbeat ловит это в первый пропущенный прогон.

Тишина — не значит «всё хорошо»

Скрипт, который перестал запускаться, не пишет ошибок и не шлёт писем. Он просто молчит. Heartbeat инвертирует логику: тревога срабатывает именно на молчание.

Данные, которые устарели незаметно

Остановившаяся выгрузка цен или остатков не ломает сайт — она делает его врущим. Заказы принимаются на то, чего нет на складе, а по старым ценам.

Ноль доверия к чужой инфраструктуре

Heartbeat не требует пускать нас внутрь: соединение исходящее. Это часто единственный способ мониторить задачи в контуре, куда внешний доступ закрыт принципиально.

Heartbeat или Jobs — в чём разница

Оба типа мониторят фоновые процессы, но отвечают на разные вопросы. Heartbeat спрашивает «запуск был?». Jobs спрашивает «как именно он прошёл?». Простое правило: если вам достаточно знать, что задача жива, берите heartbeat. Если нужно знать длительность, результат и текст ошибки — берите jobs.

Вопрос Heartbeat Jobs
Главный вопрос Задача запускалась вовремя? Как прошёл конкретный запуск?
Сколько сигналов шлёт задача Один — по факту успеха Три — старт, завершение, ошибка
Что фиксируется Факт и время пинга Длительность, статус и текст ошибки каждого прогона
Когда открывается инцидент Пинг не пришёл в срок Ошибка, превышение времени или обрыв прогона
Ловит «висящую» задачу Только после пропуска следующего срока Да, по таймауту прямо во время выполнения
Сложность подключения Одна строка Три вызова вокруг тела задачи
Кому обычно подходит Бэкапы, простые cron, чужие скрипты Длительные ETL, импорты, отчёты, деплой-пайплайны

Их можно использовать вместе: для одной и той же команды указать и --heartbeat-tok, и --jobs-tok. Тогда вы получите и контроль регулярности, и подробный журнал каждого прогона.

Частые вопросы

Что если задача выполнилась, но с ошибкой?
Ставьте пинг после проверки результата — например через && в shell. Тогда неуспешный прогон просто не отправит пинг, и heartbeat уйдёт в просрочку. Если нужен разбор именно ошибок, используйте jobs-мониторинг.
Нужен ли моему серверу белый IP?
Нет. Пинг — это исходящий запрос от вашей задачи к нам. Никакого входящего доступа к вашей машине не требуется.
Можно ли пинговать из планировщика Windows или из CI?
Да, подойдёт любой инструмент, умеющий делать HTTP-запрос: curl, wget, PowerShell, шаг в GitHub Actions или GitLab CI, код приложения.
Что будет, если задача разово опоздала на минуту?
Инцидент открывается при просрочке ожидаемого интервала, а правила уведомлений позволяют задать тихие часы и частоту напоминаний, чтобы разовое опоздание не превращалось в поток сообщений.
Сколько heartbeat-задач можно завести?
Количество зависит от тарифа — лимит указан на странице тарифов, там же есть подбор по вашему сценарию.

Проверьте, жив ли ваш ночной бэкап

Создайте heartbeat, добавьте строку в cron — и узнайте правду уже завтра утром.