Как я поднял мониторинг инфраструктуры за 3 часа
Кейс junior DevOps без героизма и магии
Спойлер: ничего гениального. Зато теперь инфраструктура не «чёрный ящик».
Контекст: «у нас нет мониторинга, но он нужен вчера»
История довольно банальная.
Небольшая команда, несколько сервисов, часть в Docker, часть просто на VM. Прод падает редко, но каждый раз — внезапно. Причина стандартная: «а кто его знает, что там было».
В какой-то момент это всех достало, и мне прилетела задача:
«Подними базовый мониторинг. Не идеальный, просто чтобы видеть, что происходит».
Я тогда был Junior DevOps. Без иллюзий, без архитектурных амбиций и без времени.
Ограничения были жёсткие:
- времени — пара часов
- бюджета — 0
- доступ — обычный VPS + Docker
- цель — CPU / память / диск / контейнеры / алерты
Никакого SRE, SLO и observability-манифестов. Просто — чтобы не гадать после падения.
Что хотелось получить в итоге
Минимальный набор, без фанатизма:
- загрузка CPU
- память
- диск (и чтобы не заканчивался внезапно)
- что происходит с Docker-контейнерами
- алерт, если всё совсем плохо
Главное требование — быстро и воспроизводимо. Если завтра скажут «давай на стейдже так же», я должен повторить без боли.
Почему не Zabbix и не «что-то попроще»
Первой мыслью был Zabbix. Он умеет всё, шаблонов море, enterprise-стандарт и так далее.
Но если честно — я бы не уложился во время.
Zabbix хорош, когда:
- инфраструктура уже устоявшаяся
- есть время на шаблоны, хосты, авто-дискавери
- нужен контроль всего и сразу
У меня была другая задача: “сделать, чтобы заработало сегодня”.
Netdata я тоже смотрел, но:
- алерты там на старте довольно условные
- контейнеры видно, но кастомизировать тяжеловато
- хотелось чего-то более «стандартного»
В итоге выбор был очевиден и скучен:
Prometheus + Grafana + node_exporter + cAdvisor
Да, банально. Зато разворачивается за 15 минут, много кто работал и умеет, да и развивать в последующем труда не составит.
Архитектура «на коленке»
Вся схема выглядела так:
- отдельная VM под мониторинг
- всё в docker-compose
- никаких TLS, auth и high availability
- алерты — хоть куда-нибудь (для начала)
Схема максимально простая — и в этом её плюс.
Поднимаем стек (docker-compose)
Я сразу пошёл по пути «один compose — всё сразу».
Ничего необычного:
Node Exporter работает в режиме host network — это необходимо сбора метрик системы без изоляции в контейнере.
cAdvisor запущен с флагом privileged и монтирует системные директории в read-only режиме. Это дает доступ к информации о всех запущенных контейнерах и их ресурсах.
Именованные volumes (prom_data,graf_data) для сохранности данных Prometheus и настроек Grafana при перезапуске контейнеров.
Запуск:
Через пару минут:
- Prometheus доступен
- Grafana открывается
- экспортеры отвечают
Уже на этом этапе становится спокойнее.
Prometheus: минимум конфига
Конфиг был максимально короткий.
Без relabel, без service discovery, без Kubernetes-магии.
Я специально не усложнял: если сейчас не понятно — через месяц будет ещё хуже.
Grafana: никаких кликов вручную
Одна из распространенных ошибок, которую я видел у коллег при работе с grafana — “настроили Grafana руками, а потом забыли, как”. Я решил пойти другим путем.
Первым делом добавил Prometheus как datasource.
Дальше — дашборды. Вместо рисования панелей с нуля импортировал готовые из Grafana Community:
- Node Exporter Full — для метрик хоста
- Docker Container & Host Metrics — для контейнеров через cAdvisor
Через 10 минут у меня уже были:
- CPU по ядрам
- Память и swap
- Дисковое пространство
- Контейнеры с детализацией по потреблению ресурсов
Не идеально, местами избыточно, но наглядно.
Первые грабли (куда без них)
1. Контейнеры «что-то жрут», но непонятно кто
После запуска cAdvisor столкнулся с классической проблемой — данных слишком много. Графики показывают десятки метрик по каждому контейнеру, но первые 10 минут я просто смотрел на них и не мог понять:
- Это нормальное потребление или проблема?
- Сколько вообще "много" для этого контейнера?
- Кто конкретно сейчас жрёт ресурсы?
Решение оказалось банальным — упростить дашборд
- вынести top-контейнеры по CPU и памяти
- убрать всё лишнее
Мониторинг — это не про "показать всё возможное", а про быстрые ответы на конкретные вопросы. Если не понятно, зачем метрика на дашборде — её можно убрать.
2. Диск внезапно почти закончился
Самое смешное — первая реальная польза от мониторинга пришла не через алерты и не через сложные метрики. Я просто открыл дашборд Node Exporter и увидел:
- Диск заполнен на 85%
- Логи занимают вагон места
- Ротация не настроена
До этого момента я даже не думал проверять место на диске. Без мониторинга эта проблема всплыла бы ровно в тот момент, когда место закончилось окончательно — скорее всего, в самое неподходящее время.
Алерты: чтобы мониторинг не был телевизором
Мониторинг без алертов — это просто красивые графики. Чтобы система действительно работала, добавил базовые правила алертинга в Prometheus.
Я начал с двух правил:
- Сервис недоступен
- Диск занят на >90%
Конфигурация в prometheus/alerts.yml:
Без сложных порогов, без "умных" условий, без многоуровневой логики. Принцип простой:
Лучше ложный алерт днём, чем сюрприз ночью.
Что получилось через 3 часа
В итоге имею рабочий стек мониторинга, который:
- Показывает состояние хост-системы
- Видно метрики всех Docker-контейнеров
- Есть базовые алерты при проблемах
- Всё поднимается одной командой
- Легко переносится на другие стенды
Это не enterprise-решение с распределённым хранением метрик и сложными SLA. Но это реальный шаг от "ничего не видим" к "понимаем, что происходит".
Главные выводы (как для junior)
- Мониторинг — это не про инструменты, а про вопросы
Если ты не знаешь, что хочешь увидеть — Grafana не поможет. Инструменты — это только средство для ответов. - Лучше простой мониторинг сегодня, чем идеальный никогда
За 3 часа можно сделать работающую систему, которая уже даёт пользу. За неделю размышлений о "правильной архитектуре" — можно не сделать вообще ничего. Начни с базы, улучшай по мере необходимости. - Готовые дашборды — это нормально
Не нужно рисовать панели с нуля, если есть проверенные community-решения. Сначала — просто видеть что происходит, кастомизация придет позже. - Первый эффект почти всегда неожиданный
Я ждал проблем с CPU или памятью контейнеров, а первым делом обнаружил заполненный диск. Мониторинг показывает не то, что ты ожидаешь увидеть, а то, что на самом деле происходит.
Что бы я сделал дальше (если было бы время)
- Алерты по памяти и CPU
- Централизованное логирование, хотя бы ELK/Loki для агрегации логов из контейнеров
- Нормальную доставку алертов
- Разделение prod / stage
Но это уже следующий уровень.
Вместо заключения
Этот кейс не про героизм и не про "я всё знаю". Это про нормальную инженерную работу: взял задачу, разобрался, сделал минимально работающее решение, получил результат.
Начни с простого:
- Что я хочу видеть?
- Какие инструменты для этого подходят?
- Как быстро это поднять?
Принцип один: лучше видеть хоть что-то, чем ничего.
Раз в неделю мы проводим бесплатные встречи для начинающих DevOps-инженеров, где обсуждаем собеседования, реальную работу и подводные камни, а также проводим пробные собеседования. #devops