Мониторинг фоновых задач и длительных процессов

Jobs-мониторинг отслеживает не факт запуска, а весь прогон целиком: когда задача стартовала, сколько шла, чем закончилась и что за ошибка её убила. Задача сообщает о себе тремя короткими запросами — start, complete, fail, — а Base388 сам ловит зависания по таймауту.

3 события
start / complete / fail
Таймаут
Зависшая задача видна во время прогона
Журнал прогонов
Длительность и статус каждого запуска
Текст ошибки
Приезжает прямо в уведомление

Что это такое

Job — это именованный процесс с историей запусков. Задача сообщает Base388 о старте, а в конце — об успехе или ошибке. Между этими событиями мы знаем, что прогон идёт, и следим за его длительностью. Если задача завершилась ошибкой, переросла отведённое время или была прервана новым запуском, открывается инцидент.

  • Три HTTP-запроса к токенному API — /api/jobs/{token}/start, /complete и /fail. Подключается из любого языка и любого CI.
  • Каждый прогон попадает в журнал: время начала, длительность, итоговый статус и текст ошибки, если он был передан.
  • Успешный прогон автоматически закрывает открытый инцидент — отдельного «отбоя» слать не нужно.

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

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

Полный жизненный цикл прогона

Задача вызывает start в начале и complete или fail в конце. Base388 сопоставляет события и хранит каждый прогон как отдельную запись с точной длительностью.

Что это даёт

Вы видите не только «упало / не упало», но и как задача ведёт себя во времени: рост длительности предупреждает о проблеме за недели до отказа.

Контроль таймаута

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

Что это даёт

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

Текст ошибки в уведомлении

При вызове fail можно передать сообщение об ошибке. Оно сохраняется в прогоне и приходит вместе с алертом.

Что это даёт

Дежурный понимает суть аварии прямо из Telegram и решает, будить ли команду, — не открывая ноутбук и не лазая по логам.

Обнаружение прерванных прогонов

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

Что это даёт

Ловит «тихие» падения, когда процесс убит сигналом и не успел сообщить об ошибке вообще ничего.

История и статистика

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

Что это даёт

Аргумент для планирования ресурсов: видно, что ночное окно перестаёт вмещать выгрузку, до того как она в него не влезет.

Самомониторинг консольных команд

К любой команде добавляется опция --jobs-tok=<токен>: старт отправится автоматически при запуске, complete — при коде выхода 0, fail — при ненулевом коде или исключении, вместе с текстом ошибки.

Что это даёт

Мониторинг подключается к существующему расписанию без единой правки в коде задач.

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

01

Создайте job

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

02

Возьмите токен

Один токен даёт доступ ко всем трём эндпоинтам: start, complete, fail.

03

Обвяжите задачу

Вызов start в начале, complete в конце, fail в обработчике ошибок — или один флаг для консольных команд.

04

Разбирайте прогоны

Журнал запусков, длительности, инциденты с текстом ошибки — на странице задачи.

Обвязка задачи
#!/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 подстрахует на случай, если планировщик не запустил задачу вовсе.

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

Что если задача завершилась, но забыла вызвать complete?
Прогон превысит ожидаемое время и будет помечен как зависший — откроется инцидент. Если следующий старт придёт раньше, предыдущий прогон пометится прерванным.
Можно ли подключить job из GitHub Actions или GitLab CI?
Да. Эндпоинты — обычные HTTP-запросы с токеном в URL, они вызываются шагом пайплайна так же, как из cron.
Как передать текст ошибки?
В теле запроса к /fail. Он сохраняется в записи прогона и попадает в уведомление, которое уходит в ваши каналы.
Нужно ли отдельно закрывать инцидент после починки?
Нет. Первый успешный прогон закрывает инцидент автоматически и отправляет уведомление о восстановлении.
Чем это отличается от логов и Sentry?
Логи и трекеры ошибок показывают то, что произошло внутри запущенного процесса. Jobs следит за самим фактом и рамками прогона — включая случаи, когда процесс не стартовал, был убит или завис и не написал в лог ничего.

Возьмите фоновые задачи под контроль

Подключите первую задачу бесплатно и посмотрите её журнал прогонов.