Мониторинг фоновых задач и длительных процессов
Jobs-мониторинг отслеживает не факт запуска, а весь прогон целиком: когда задача стартовала, сколько шла, чем закончилась и что за ошибка её убила. Задача сообщает о себе тремя короткими запросами — start, complete, fail, — а Base388 сам ловит зависания по таймауту.
Что это такое
Job — это именованный процесс с историей запусков. Задача сообщает Base388 о старте, а в конце — об успехе или ошибке. Между этими событиями мы знаем, что прогон идёт, и следим за его длительностью. Если задача завершилась ошибкой, переросла отведённое время или была прервана новым запуском, открывается инцидент.
- Три HTTP-запроса к токенному API — /api/jobs/{token}/start, /complete и /fail. Подключается из любого языка и любого CI.
- Каждый прогон попадает в журнал: время начала, длительность, итоговый статус и текст ошибки, если он был передан.
- Успешный прогон автоматически закрывает открытый инцидент — отдельного «отбоя» слать не нужно.
Что умеет и зачем это нужно
Каждая возможность — с пояснением, какую задачу бизнеса она закрывает.
Полный жизненный цикл прогона
Задача вызывает start в начале и complete или fail в конце. Base388 сопоставляет события и хранит каждый прогон как отдельную запись с точной длительностью.
Вы видите не только «упало / не упало», но и как задача ведёт себя во времени: рост длительности предупреждает о проблеме за недели до отказа.
Контроль таймаута
Для задачи задаётся ожидаемое максимальное время. Прогон, вышедший за него, помечается как зависший, и открывается инцидент — не дожидаясь следующего запуска по расписанию.
Зависший импорт блокирует таблицы и держит соединения. Узнать об этом через час, а не на следующее утро, — это разница между неудобством и остановкой работы.
Текст ошибки в уведомлении
При вызове fail можно передать сообщение об ошибке. Оно сохраняется в прогоне и приходит вместе с алертом.
Дежурный понимает суть аварии прямо из Telegram и решает, будить ли команду, — не открывая ноутбук и не лазая по логам.
Обнаружение прерванных прогонов
Если новый старт приходит, пока предыдущий прогон не закрыт, старый помечается прерванным и порождает инцидент — типичная картина при перезапуске упавшего процесса.
Ловит «тихие» падения, когда процесс убит сигналом и не успел сообщить об ошибке вообще ничего.
История и статистика
Журнал прогонов с длительностями и график по каждой задаче показывают, как менялось поведение процесса за период.
Аргумент для планирования ресурсов: видно, что ночное окно перестаёт вмещать выгрузку, до того как она в него не влезет.
Самомониторинг консольных команд
К любой команде добавляется опция --jobs-tok=<токен>: старт отправится автоматически при запуске, complete — при коде выхода 0, fail — при ненулевом коде или исключении, вместе с текстом ошибки.
Мониторинг подключается к существующему расписанию без единой правки в коде задач.
Как это настраивается
Создайте job
Назовите задачу и укажите ожидаемое максимальное время выполнения.
Возьмите токен
Один токен даёт доступ ко всем трём эндпоинтам: start, complete, fail.
Обвяжите задачу
Вызов start в начале, complete в конце, fail в обработчике ошибок — или один флаг для консольных команд.
Разбирайте прогоны
Журнал запусков, длительности, инциденты с текстом ошибки — на странице задачи.
#!/bin/bash
JOB=https://app.base388.ru/api/jobs/ВАШ_ТОКЕН
curl -fsS -X POST "$JOB/start"
if OUTPUT=$(/usr/local/bin/import-catalog.sh 2>&1); then
curl -fsS -X POST "$JOB/complete"
else
curl -fsS -X POST "$JOB/fail" --data-urlencode "error=$OUTPUT"
fi
# Для консольных команд Base388 обвязка не нужна — достаточно флага:
# 0 2 * * * php bin/console app:data:gc --jobs-tok=ВАШ_ТОКЕН
Зачем это нужно на самом деле
Деньги живут в фоновых задачах
Выгрузка заказов в 1С, синхронизация остатков, начисление бонусов, отправка чеков — если это встало, бизнес узнаёт об этом от бухгалтерии или от клиента, обычно с опозданием в сутки.
Ошибка с контекстом вместо «что-то сломалось»
Текст ошибки в алерте сокращает путь от уведомления до починки: не надо сначала искать, где смотреть логи, а потом искать в них нужную строку.
Зависание — не то же самое, что падение
Упавший процесс хотя бы освобождает ресурсы. Зависший держит блокировки и соединения и тихо разрушает соседние сервисы. Таймаут ловит именно этот сценарий.
История для разговора с подрядчиком
Журнал прогонов за месяц — объективная картина: сколько раз задача падала, сколько шла и стало ли лучше после «мы всё починили».
Jobs или Heartbeat — в чём разница
Heartbeat — это отметка «я жив», один сигнал по факту успеха. Jobs — это полноценный протокол прогона: начало, конец, результат и время между ними. Heartbeat дешевле подключить, jobs даёт больше информации. Берите jobs там, где важно не только «запустилось», но и «сколько шло и чем кончилось».
| Вопрос | Jobs | Heartbeat |
|---|---|---|
| Главный вопрос | Как прошёл конкретный запуск? | Задача запускалась вовремя? |
| Сколько сигналов шлёт задача | Три — старт, завершение, ошибка | Один — по факту успеха |
| Что фиксируется | Длительность, статус и текст ошибки каждого прогона | Факт и время пинга |
| Когда открывается инцидент | Ошибка, превышение времени или обрыв прогона | Пинг не пришёл в срок |
| Ловит «висящую» задачу | Да, по таймауту прямо во время выполнения | Только после пропуска следующего срока |
| Сложность подключения | Три вызова вокруг тела задачи | Одна строка |
| Кому обычно подходит | Длительные ETL, импорты, отчёты, деплой-пайплайны | Бэкапы, простые cron, чужие скрипты |
Для одной команды можно указать оба флага сразу — --jobs-tok и --heartbeat-tok. Jobs даст подробности прогона, heartbeat подстрахует на случай, если планировщик не запустил задачу вовсе.
Кто это использует
Разбор сценариев, в которых этот тип мониторинга закрывает основную боль.
DevOps и системные администраторы
Внешняя точка правды рядом с внутренним стеком: cron, пайплайны, сертификаты и дежурство без шума.
Смотреть кейс SaaSSaaS-продукт и стартап
Публичный статус, обязательства по SLA перед клиентами и контроль всей продуктовой цепочки.
Смотреть кейс E-commerceИнтернет-магазин
Витрина, корзина, оплата и выгрузка остатков: контроль всей цепочки, на которой держится заказ.
Смотреть кейсЧастые вопросы
Что если задача завершилась, но забыла вызвать complete?
Можно ли подключить job из GitHub Actions или GitLab CI?
Как передать текст ошибки?
Нужно ли отдельно закрывать инцидент после починки?
Чем это отличается от логов и Sentry?
Возьмите фоновые задачи под контроль
Подключите первую задачу бесплатно и посмотрите её журнал прогонов.