- Головна
- Моніторинг
- Моніторинг 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 і портів.