Heartbeat для AI-агентов: как обнаруживать сбои в реальном времени, а не постфактум
Два дня простоя из-за тихого сбоя Redis — без ошибок, без алертов. Разбираю три типа тихих сбоев агентов и архитектуру heartbeat-мониторинга: dead man's switch, progress-aware сигналы, автовосстановление.
В четверг вечером я запустил агента на обработку ежедневных отчётов. В пятницу утром проверил результаты — всё в порядке. В понедельник открыл dashboard и обнаружил, что за выходные агент не обработал ни одного отчёта. Два дня тишины.
Причина: Redis перезагрузился после обновления ОС. Соединение разорвалось. Агент поймал exception, retry не помог, процесс завис в ожидании reconnect — молча, без логов, без крика о помощи. Мониторинг следил за ошибками, а здесь ошибки не было. Было отсутствие активности.
Три типа тихих сбоев
Зависание. Агент ждёт ответа от внешнего сервиса. Timeout не настроен. Процесс жив, CPU — ноль. По метрикам инфраструктуры — нормально. Но агент ничего не делает.
Бесконечный цикл без прогресса. Агент получает ошибку, ловит внутри и повторяет. Процесс активен, логи пишутся. Полезная работа не выполняется.
Деградация до нуля. Агент работает, но перестал получать задачи: upstream сломался, cron сбился, API-ключ истёк. Формально жив, фактически бесполезен.
Общее: стандартный мониторинг не ловит. Метрики в норме. Ошибок нет. Человек узнаёт, когда клиент спрашивает: «А почему отчёты не пришли?»
Heartbeat: идея
Агент периодически отправляет HTTP-сигнал «я жив и работаю». Централизованный сервис принимает сигналы. Если сигнал не пришёл — тревога. Dead man's switch: реакция на отсутствие события, а не на событие.
Архитектура: Agent → Heartbeat Endpoint → Scheduler → Alert Channel.
Progress-aware heartbeat
Обычный heartbeat ловит зависания и crashи, но пропускает бесконечные циклы. Progress-aware heartbeat привязан к прогрессу: агент вызывает tick() после каждой завершённой единицы работы. Если за интервал счётчик не изменился — status stalled, алерт.
Настройка интервалов
Правило: grace = 2× interval как стартовая точка.
Real-time бот: heartbeat 30 сек, grace 60 сек.
Batch processor: 5 мин / 10 мин.
Cron-агент: heartbeat при запуске/завершении, grace = 1.5× cron interval.
Heartbeat vs мониторинг логов
Мониторинг логов ищет присутствие паттерна (ошибка, exception). Тихий сбой — отсутствие паттерна. Heartbeat — явный сигнал, не побочный эффект логирования. Идеально: оба. Логи — для диагностики, heartbeat — для обнаружения.
Расширенные паттерны
Heartbeat с метаданными. Текущая задача, размер очереди, память — передаются вместе с сигналом.
Групповой heartbeat. Для мультиагентных систем: один сигнал от группы, отдельный — от каждого.
Heartbeat-driven автовосстановление. Scheduler перезапускает агента при пропущенном сигнале.
Canary heartbeat. Агент выполняет тестовую задачу и отправляет результат — подтверждает не только жизнь, но и работоспособность.
Мой агент теперь шлёт heartbeat каждые 60 секунд. Когда Redis снова перезагрузился — через 3 минуты я получил Telegram-уведомление. Перезапустил за минуту. Один день на настройку — два дня простоя предотвращены.