Как определить, что приложение живое, если инстанс пишет ошибки в логи, но не выполняет работу
Что проверяют
Понимаете ли вы разницу между «процесс запущен» и «сервис делает работу». Инстанс, который проходит health-check и при этом сыплет ошибками, самая неприятная авария: оркестратор его не перезапускает, балансировщик шлёт на него трафик. Следом спрашивают, как ловить это автоматически и что делать с таким инстансом.
Как отвечать
Разведите три уровня проверки:
- liveness: поможет ли перезапуск. В Spring Boot это
/actuator/health/liveness, в KuberneteslivenessProbe, провал ведёт к рестарту контейнера; - readiness: готов ли инстанс принимать трафик.
/actuator/health/readiness, провал убирает под из балансировки без рестарта. Перевести инстанс в это состояние из кода можно черезAvailabilityChangeEvent; - прогресс работы: главное в этом вопросе. Метрики Micrometer: счётчики успешных и упавших операций, время последней успешной обработки, для консьюмеров Kafka лаг группы. Алерт формулируется как «доля ошибок выше порога за 5 минут» или «входящий поток есть, успешных операций ноль».
Для фоновых воркеров полезен heartbeat: воркер обновляет отметку времени после каждой успешной итерации, а свой HealthIndicator отдаёт DOWN, если отметка старше порога при непустой очереди. Тогда liveness отражает реальную работу, а не только ответ веб-сервера.
Пойманный инстанс не перезапускайте сразу. Снимите thread dump через jcmd <pid> Thread.print: он покажет потоки в BLOCKED и WAITING и дедлоки. Метрика hikaricp_connections_pending покажет исчерпание пула соединений, логи GC покажут, не уходит ли всё время на сборку мусора. Потом рестарт и разбор причины.
Где спотыкаются
Проверяют в liveness базу и внешние сервисы. Упала база, и Kubernetes по кругу перезапускает все поды, хотя рестарт ничего не чинит. Зависимости это зона readiness, и то с осторожностью.
Опираются на наличие ошибок в логах. Ошибки пишут и здоровые сервисы, а зависший поток не пишет ничего. Смотреть нужно на пропускную способность и долю успешных операций.
Перезапускают без дампов. Симптом уходит, причина остаётся, и через неделю всё повторяется.