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

AlexMorozov

New member
Недавно я устал от бесконечного потока алертов, который превращал каждый день в гонку с самим собой. Три сервиса падали, пять генерировали warning, а Prometheus рёв так, что даже коллеги из соседнего отдела начинали подмигивать. Я понял: проблема не в системе, а в том, что я пытаюсь контролировать всё сразу, вместо того чтобы видеть главное. И решил радикально упростить. Перестал собирать метрики ради метрик и начал выбирать только те данные, которые реально влияют на принятие решений в течение дня.

Мой минималистичный стек теперь выглядит так: Prometheus для сбора метрик с жёсткой фильтрацией через relabeling, Grafana с двумя-тремя дашбордами на сервис и никакого «стена графиков», Alertmanager с чёткими условиями эскалации и, главное, логи через Loki, который подключается к существующему потоку stdout без какого-либо sidecar-агента. Никаких тяжёлых APM-агентов, никаких OpenSearch-кластеров с тремя репликами и шестнадцатью нод. Всё это живёт на той же Kubernetes-инфраструктуре, что и сами сервисы, и потребляет не больше ста пятидесяти мегабайт оперативной памяти в сумме на два воркера.

Самое ценное, что я понял за полгода использования этого подхода, — это принцип «одна метрика, одно решение». Каждый график на дашборде должен отвечать на конкретный вопрос: «Есть ли проблема сейчас?» или «Нужно ли что-то сделать в ближайшие пятнадцать минут?». Если метрика не приводит к действию, она не попадает в мониторинг. Я убрал из Prometheus все default-метрики контейнеров, оставил только cpu, memory, network I/O и бизнес-метрики вроде latency p99, error rate и request count. За полгода дашборды стали в четыре раза меньше, а время реакции на инциденты сократилось вдвое.

Однако минимализм — это не про отсутствие информации, а про её организацию. Я ввёл правило: любой алерт должен содержать в себе не только факт срабатывания, но и подсказку по первому шагу диагностики. Например, вместо «high error rate on service checkout» я пишу «p99 latency on checkout exceeded 500ms for 5 minutes — check downstream dependency payments first, run kubectl logs -l app=checkout --tail=100». Это звучит как мелочь, но за месяц работы я сэкономил минимум три часа, потому что не нужно было гуглить, с чего начинать. Контекст прямо в алерте экономит время в момент, когда ты не спишь и пытаешься понять, что горит.

Ещё один важный элемент моего стека — это периодический «monitoring review» раз в две недели. Я беру кофе, открываю Grafana и честно смотрю: какие алерты я игнорировал в прошлом периоде? Какие не привели ни к одному решению? Их я удаляю или делаю тише. Какие алерты срабатывали, но я всё равно не знал, что делать? Значит, мне нужно либо улучшить текст алерта, либо добавить метрику, которая даст больше контекста. Это занимает не больше сорока минут, но поддерживает систему в рабочем состоянии без накопления информационного шума.

Если вы сейчас в той же ситуации, что и я полгода назад — тонны алертов, тяжёлая инфраструктура мониторинга и постоянное ощущение, что вы ничего не контролируете, — попробуйте начать не с добавления нового инструмента, а с удаления старого. Выключите половину правил алертинга на неделю. Посмотрите, что из этого вы потеряли, а что не заметили вообще. Уверен, вы удивитесь. Минималистичный мониторинг — это не компромисс, это осознанный выбор видеть суть, а не объём данных.

А вы как боретесь с информационным перегрузом в мониторинге? Может, у вас есть свой любимый подход или, наоборот, история, когда минимализм сыграл злую шутку? Делитесь в комментариях — мне правда интересно, как другие выстраивают баланс между «всё под контролем» и «нормальная жизнь».
 
Назад
Вверх