Prometheus · CatBoost · сентябрь 2026

Сто секунд до отказа

Обычный мониторинг сообщает, что сервис уже упал. Я проверил видно ли отказ заранее.

108с
Упреждение
среднее по сработавшим тревогам
4из 5
Тревог по делу
точность 80 процентов
0из 12
У порогового правила
в тех же условиях

Слишком поздно

Админ узнает об аварии тогда, когда пользователи уже видят ошибку.

Вопрос ставился иначе. Не «сервер упал», а «сервер упадет через две минуты». Разница в том, что во втором случае еще можно вмешаться, например перерсапределить нагрузку.

И сразу второй вопрос. Допустим, приближение отказа видно в метриках. Нужна ли для этого модель, или хватит правила вида «дескрипторов больше тысячи»? Проект отвечает на оба, и второй ответ оказался важнее первого.

Аварии по расписанию

Размеченных отказов я не нашел. Ждать настоящих бессмысленно: за месяц наберется три штуки.

Поэтому аварии воспроизводились сами, по расписанию, на трех отдельных VPS. Пять типов давления, и каждое нарастает несколько минут, а не возникает мгновенно. Иначе было бы нереалистично и предсказывать было бы нечего: между «все хорошо» и «все упало» не осталось бы времени.

3 + 2
машины под авариями, плюс две для фона
165
минут эксперимента, контроля и мониторинга
84
цикла аварий
9 828
строк, шаг 5 секунд
8,1 %
доля положительных

Подтвержденные отказы по типам

59 всего
Дескрипторы и сеть сразу мешают принять соединение, поэтому дают чистый сигнал. Процессор, диск и память сами по себе отказ не вызывали: легкий обработчик их выдерживал. Эти три типа проявились только после того, как отказом я стал считать и медленный ответ.

Отказ = ?

Для пользователя страница, которая грузится восемь секунд, сломана так же, как недоступная.

Сначала отказом был только отсутствующий ответ. При таком определении три типа давления из пяти не дали ни одного события: сервис отвечал, пусть и с задержками. Поэтому отказ переопределен: нет ответа или ответ дольше 375 миллисекунд, где 375 это 99-й перцентиль задержки в спокойное время.

Дальше появилась вторая проблема. Около порога задержка колеблется, и одна авария разваливается на пять отдельных событий. Помог гистерезис: вход в отказ по 375 миллисекундам, выход только когда задержка упала ниже 250 и продержалась там примерно полминуты. Тридцать семь сырых переходов определились в тридцать одну настоящую аварию.

На что смотрит модель

Мгновенное значение метрики почти бессмысленно. Значение двигается

Тысяча дескрипторов это норма для одного сервиса и проблема для другого. Поэтому каждая метрика превращается в набор скользящих окон на 30, 60 и 120 секунд, и модель видит не число, а его поведение.

Вклад признаков по SHAP

Средний модуль вклада
Первые места делят три разные подсистемы: диск, сеть и память. Модель оправдала себя. Правило смотрит на одну метрику, а решение складывается минимум из трех, причем у одной и той же величины важны разные окна усреднения.

Две минуты форы

Машина node-2 (одна из тестовых VPS), исчерпание файловых дескрипторов, отказ в 13:35:15. Модель пересекла порог в 13:33:15

Шесть минут перед отказом

Шаг сетки 5 секунд
Листается вбок
Соединения и дескрипторы растут почти линейно шесть (!) минут подряд, но ни одно значение по отдельности не выглядит аварийным. Задержка ответа до последнего держится около ста миллисекунд и прыгает до четырех секунд уже в момент отказа.

Провал вероятности в середине оставили как есть: около 13:31 модель ошиблась, приняв начало нагрузки за обычный всплеск. Спад после срабатывания тоже не случаен. Модель обучена узнавать состояние за одну-две минуты до отказа, и когда это окно происходит, уверенность падает. Она отвечает на вопрос «скоро упадет», а не «падает прямо сейчас»

Модель против одной строки

Аналог модели простой: fd_allocated > порог. Если он справляется, машинное обучение здесь не нужно.

Чтобы сравнение было честным, оба метода поставлены в одинаковые условия, взятые из Alertmanager. Тревога поднимается, только если условие держится три интервала подряд, и не чаще раза в десять минут на сервер. Без этих условий любой детектор выдаст много срабатываний на одну аварию, и сравнивать будет нечего.

Модель

CatBoost, порог 0,757
80 % тревог по делу

Правило по одной метрике

fd_allocated выше порога
0 % тревог по делу
ПоказательМодельПравило
Тревог поднято512
Из них по делу40
Точность80 %0 %
Аварий предупреждено4 из 310 из 31
Среднее упреждение108 снет
Доля пустых тревог20 % [3,6 – 62,4]100 % [75,8 – 100]

В скобках доверительные интервалы. При пяти и двенадцати наблюдениях доказать обычно нельзя ничего, но здесь интервалы не пересекаются: верхняя граница у модели 62,4 процента, нижняя у правила 75,8. Разрыв слишком велик, чтобы это оказалось случайностью выборки.

Правило видит одно число. Модель видит движение сразу нескольких показателей.

Порог по дескрипторам сработал двенадцать раз и ни разу не попал в аварию: на живой машине это число скачет само по себе (откройте диспетчер задач на своем ПК и понаблюдайте). Модель поднимала тревогу в 5 раз реже и попадала в четырех случаях из пяти, потому что смотрит на диск, сеть и память одновременно и на три разных окна усреднения.

Как это проверялось

Случайное разбиение здесь было бы утечкой, так как соседние точки ряда почти одинаковы.

Обучение происходило на прошлом, а проверка на будущем. И отдельно проверка на машине, которую модель никогда не видела - учимся на двух, проверяемся на третьей. Это отвечает на вопрос, заработает ли система на новом для нее сервере.

Качество на невиданных машинах

PR-AUC
Базовый уровень PR-AUC равен доле положительного класса, здесь 0,095. Даже худшая машина превосходит его втрое, лучшая впятеро. Разброс между машинами больше, чем хотелось бы: на 0,329 и 0,503 нельзя утверждать, что модель одинаково переносится куда угодно.

Недостатки - чего модель не умеет (пока что)

Названная слабость перестает быть уязвимостью.

Работает прямо сейчас

Система запущена как обычный сервис systemd на боевом контуре: читает метрики из Prometheus, применяет тот же код признаков, что и при обучении, и присылает в Telegram вероятность вместе с тремя главными признаками по SHAP.

Уведомление бота в Telegram: вероятность отказа 99 процентов и три главных признака

Настоящее срабатывание. Адрес машины скрыт.

Код и данные на GitHub