- Главная
- Мониторинг
- Мониторинг cron-задач
Мониторинг cron: узнайте, когда задача не выполнилась
У каждого heartbeat-монитора есть свой URL для пинга. Задача вызывает его по завершении, и если следующий пинг не приходит в течение периода плюс запаса времени, открывается инцидент.
- От $7 в месяц на Starter
- Тариф Free: 30 мониторов для HTTP(S), ключевых слов, ping и портов
- Free без банковской карты
пинг получен 2 мин назад
- Последний пинг
- 2 мин назад
- Время последнего запуска
- 14 мин
- Следующий пинг через
- 58 мин
- Запас времени
- 5 мин
Иллюстративный пример
Проверьте прямо сейчас, в браузере
Без регистрации. Мониторинг cron-задач: введите адрес и посмотрите, что именно отслеживает такой монитор. Ничего из введённого не сохраняется.
Замените hb_YOUR_TOKEN на токен созданного монитора. Благодаря && неудачный скрипт не отправляет пинг, а -fsS молчит, пока curl не сбоит.
Что именно проверяет этот монитор
Пропущенный пинг
Вы задаёте, как часто задача должна пинговать, и запас времени в секундах. Нет пинга к этому сроку — открывается инцидент.
Пинг о сбое
Вызов /fail сразу помечает задачу как неудачную и сохраняет ваше сообщение или код выхода в качестве причины.
Пинг о старте
Вызов /start фиксирует, что запуск начался. Он появляется в истории монитора, но дедлайн определяют пинги о завершении.
Вывод задачи
Тело POST-запроса (или ?msg=) до 10 КБ сохраняется вместе с пингом, так что последние строки лога попадают в инцидент.
Мониторинг cron-задач: как выглядит оповещение
Одно и то же событие приходит письмом, сообщением в Telegram или карточкой в Slack. Это текст, который отправляют каналы; хост, время и числа выдуманы.
nightly-backup
nightly-backup · Heartbeat missed, last ping 26 h ago
| Error | Heartbeat missed, last ping 26 h ago |
|---|---|
| Since | 14:02:11 UTC |
| Target | /hb/hb_•••••••• |
| Next step | The job did not ping on time. Check the cron/task runner and its logs. |
AcknowledgeOpen incident
Tenium · checked from Amsterdam · 14:02 UTC
Tenium alerts
🔴 MISSED · nightly-backup · Heartbeat missed, last ping 26 h ago
reply /ack or acknowledge · open incident
TTenium APP 2:02 PM
MISSED · nightly-backup
nightly-backup · Heartbeat missed, last ping 26 h ago
- Error: Heartbeat missed, last ping 26 h ago
- Target: /hb/hb_••••••••
Подтвердить получениеOpen incident
The job did not ping on time. Check the cron/task runner and its logs. · checked from Amsterdam
Мониторинг cron-задач: e-mail, Discord и Google Chat работают на всех тарифах, Slack, Telegram, Teams и Mattermost — с тарифа Starter. SMS и голосовых звонков нет.
Сколько обычно длится ночная задача
Heartbeat с /start и финальным пингом даёт ещё и длительность каждого запуска, поэтому задача, которая вдруг идёт втрое дольше, заметна сразу.
Насколько поздно задача может запуститься, прежде чем вы узнаете
У heartbeat нет проверок по расписанию. Вы сами задаёте период, в который задача должна пинговать, и запас времени; обнаружение — их сумма.
Пропущенный пинг — это не сетевое измерение, поэтому подтверждение из нескольких регионов здесь не нужно: оповещение уходит, как только прошёл дедлайн.
Как настроить мониторинг cron-задач за 30 секунд
Создайте heartbeat
Выберите тип Heartbeat, назовите задачу и укажите, как часто она должна пинговать и какой запас времени допустим, оба значения в секундах.
Скопируйте URL для пинга
После сохранения создаётся уникальный адрес вида /hb/<token> на хосте приложения Tenium. Пинговать может любой, кто знает адрес, поэтому относитесь к нему как к секрету.
Добавьте в задачу один вызов
Допишите вызов curl -fsS в строку cron или вызовите адрес в конце своего скрипта.
Выберите контакты для оповещений
Пропуски heartbeat не проходят подтверждение из нескольких регионов, потому что ничего сетевого не проверяется.
Что означает каждая ошибка
Это текст, который инцидент показывает в строке «Error», типичная причина и что проверить первым.
MISSEDHeartbeat missed, last ping 26 h ago
Дедлайн (период плюс запас) прошёл без пинга: под подозрением демон cron, сервер, скрипт или сетевой вызов. Сначала загляните в собственный лог задачи.
Выглядит как: Heartbeat missed, last ping 26 h ago
NEVERHeartbeat missed, never pinged (created 3 h ago)
Монитор создан, но первый пинг так и не пришёл: обычно неверный адрес или задача, которую так и не добавили в расписание.
Выглядит как: Heartbeat missed, never pinged (created 3 h ago)
/failJob reported failure (exit 2)
Ваш скрипт вызвал /fail, поэтому инцидент открывается сразу, а причиной становятся ваше сообщение или код выхода. Ждать дедлайна не нужно.
Выглядит как: Job reported failure (exit 2)
LATEJob ran, ping arrived late
Запуск оказался дольше периода плюс запас. Если это повторяется, увеличьте запас или исправьте медленную задачу.
Выглядит как: Job ran, ping arrived late
SILENTScript failed but the ping still went out
Без && (или ловушки с /fail) curl выполняется, даже если скрипт упал. Ставьте пинг в цепочку после команды.
Выглядит как: Script failed but the ping still went out
Мониторинг cron-задач: что входит в тарифы
| Free $0/мес. | Starter $7/мес. | Pro $29/мес. | Agency $59/мес. | |
|---|---|---|---|---|
| Доступно | — | ✓ | ✓ | ✓ |
| Мониторы | 30 | 100 | 300 | 1000 |
| Самый быстрый интервал | 5 мин | 1 мин | 30 с | 30 с |
| Регионы | 1 | 2 | 2 | 2 |
| Heartbeat для cron | — | 20 | 100 | 500 |
| Собственные заголовки | — | — | ✓ | ✓ |
| Оповещения о медленном ответе | — | — | ✓ | ✓ |
| Эскалация на второй контакт | — | — | ✓ | ✓ |
| Страницы статуса | 1 | 3 | 10 | Без ограничений |
Эта проверка доступна с тарифа Starter. Проверки HTTP(S), ключевых слов, ping и портов есть на всех тарифах.
Другие типы мониторов
Как определяется опоздание
У heartbeat-монитора два числа, оба в секундах: как часто задача должна пинговать и какой запас времени допустим. Дедлайн — это время последнего пинга о завершении плюс период плюс запас. Как только часы проходят этот момент, открывается инцидент с сообщением вроде «Heartbeat пропущен, последний пинг 26 часов назад». До первого пинга отсчёт идёт от момента создания монитора, поэтому новый heartbeat, от которого задача так и не дала о себе знать, тоже оповещает.
Дедлайн сдвигается вместе с каждым пингом и не привязан к настенным часам. Ночной бэкап с периодом 86400 и запасом 3600 считается опоздавшим, если следующий пинг пришёл позже чем через 25 часов после предыдущего. Отсюда практический вывод: выбирайте запас так, чтобы он покрывал самый долгий обычный запуск вместе с разбросом старта. Если задача стартует в 03:00, обычно заканчивается к 03:20, но иногда идёт 80 минут, запас в час слишком мал, а два часа безопасны. Дедлайны проверяются с интервалом самого монитора, поэтому оповещение может отставать от дедлайна на один интервал.
Три адреса
После сохранения монитора вы получаете адрес для пинга вида https://YOUR-APP-HOST/hb/hb_TOKEN. Токен — единственный секрет, поэтому не кладите его в публичные репозитории. Работают и GET, и POST, а успешный вызов отвечает «ok».
- Сам адрес или /finish: задача выполнена. Дедлайн сбрасывается, открытый инцидент закрывается, и отправляется оповещение о восстановлении.
- /fail: задача завершилась неудачно. Инцидент открывается сразу, не дожидаясь дедлайна, а причиной становится отправленное вами сообщение.
- /start: задача стартовала. Это сохраняется в истории монитора, так что виден запуск, который начался и не закончился, но дедлайн не сдвигается.
- Заметки: ?msg=текст или ?exit=2 в GET-запросе либо тело POST до 10 КБ, например хвост лога. Инцидент покажет их.
Рецепты с curl
Делайте эти однострочники короткими, остальное сделает оболочка. Подставьте свой адрес.
- Обычный cron: 0 3 * * * /usr/local/bin/backup.sh && curl -fsS -m 10 --retry 3 https://YOUR-APP-HOST/hb/hb_TOKEN > /dev/null. Из-за && неудачный скрипт пинг не отправляет, и срабатывает оповещение о пропуске.
- Немедленное оповещение о сбое: backup.sh && curl -fsS $URL || curl -fsS "$URL/fail?msg=backup+failed". Вторая ветка сразу открывает инцидент.
- Вывод в оповещении: out=$(backup.sh 2>&1); curl -fsS --data-binary "$out" $URL/finish. В ветке сбоя вызывайте $URL/fail, чтобы хвост лога попал в инцидент.
- systemd: добавьте ExecStartPost=/usr/bin/curl -fsS https://YOUR-APP-HOST/hb/hb_TOKEN в сервис типа oneshot, чтобы вызов выполнялся только после успешного завершения основной команды.
- Kubernetes CronJob или CI: поставьте curl последним шагом скрипта задачи, в GitHub Actions или GitLab — завершающим шагом запланированного workflow.
Расписания, которые форма не умеет описать
Heartbeat работает с обычным периодом, а не с выражением cron и не с часовым поясом. Поэтому задаче, которая запускается только по будням, нужен период, достаточный, чтобы перекрыть выходные, например 3 суток, а это значит, что сбой в пятницу заметят только в понедельник. Лучше так: период в одни сутки и два монитора, или пусть задача пингует каждый день, включая пинг «делать нечего» в выходные. Для ежемесячных задач подойдёт период 32 дня плюс сутки запаса. Чтобы посчитать реальный интервал между запусками необычного выражения, воспользуйтесь конструктором cron.
Что heartbeat замечает, а что нет
Он замечает всё, что не даёт задаче дойти до последней строки: остановленный демон cron, перезагрузку, после которой запись отключилась, заполненный диск, изменённый PATH, истёкший пароль, зависший процесс, который никогда не завершается, и ошибочную правку crontab. Он не может знать, что завершившаяся задача ещё и выполнилась правильно. Скрипт бэкапа, который завершается с кодом ноль после записи пустого файла, спокойно отправит пинг. Ставьте пинг после шага проверки, например после проверки размера файла или подсчёта строк, чтобы успех что-то значил.
Heartbeat не проходит подтверждение из нескольких регионов, потому что ничего сетевого не проверяется: сервер либо отозвался, либо нет. Пропущенный пинг во время активного окна обслуживания не открывает инцидента, а монитор на паузе продолжает записывать пинги без оповещений.
Лимиты и тарифы
Heartbeat-мониторы начинаются со Starter, на Free их нет. Количество: 20 на Starter, 100 на Pro и 500 на Agency. Каждый адрес для пинга принимает до 30 вызовов в минуту, а с одного IP-адреса на все токены вместе разрешено 60. Сверх этого эндпоинт отвечает 429, так что пинговать чаще раза в несколько секунд из загруженного цикла бессмысленно. Для воркеров очередей пингуйте раз в минуту с периодом 120 и запасом 60. Каналы оповещений такие же, как у любого монитора, а для ночной задачи, которая не имеет права упасть, с тарифа Pro доступна эскалация, см. эскалацию оповещений. Форматы адресов перечислены в документации heartbeat API.
Частые вопросы: мониторинг cron-задач
Что делать, если у сервера нет выхода в интернет?
Задаче нужно сделать один исходящий HTTPS-запрос, поэтому изолированный от сети хост не может отчитаться напрямую. Пусть соседняя машина, которая нас видит, вызывает heartbeat после того, как прочитает файл статуса с изолированной.
Можно ли создавать heartbeat через API?
Да, как монитор типа heartbeat с периодом и запасом времени. Запрос показан в документации API, а доступ на запись требует тарифа Pro или выше.
Защищён ли адрес для пинга аутентификацией?
Учётными данными служит случайный токен в адресе. Если он утёк, удалите монитор и создайте новый, чтобы старый адрес перестал работать.
Считаются ли пинги проверками, за которые я плачу?
Нет. Heartbeat — это один монитор в общем лимите тарифа, а количество пингов на это не влияет, кроме ограничения по частоте.
Попробуйте мониторинг cron-задач на Starter
Эта проверка начинается с тарифа Starter за $7 в месяц. Тариф Free, без банковской карты, даёт 30 мониторов с проверками HTTP(S), ключевых слов, ping и портов.