Сервер упал в пятницу вечером. Сайт лежит, клиенты пишут в поддержку, телефон не замолкает. Ты узнаёшь об этом через два часа — от злого директора. Знакомая картина? Мониторинг — это то, что позволяет узнать о проблеме раньше, чем о ней узнают клиенты.
Что вообще нужно мониторить
Есть четыре базовых группы метрик, без которых нельзя обойтись ни на одном сервере.
CPU. Процессор — первое, на что смотрят. Нагрузка 70–80% — норма при активной работе. Если CPU стабильно выше 90% — что-то не так: утечка в коде, бесконечный цикл, криптомайнер после взлома. Один всплеск до 100% — не катастрофа, постоянно высокий показатель — повод копать.
RAM. Память заканчивается постепенно, и это особенно опасно. Приложение начинает свопировать — использовать диск как замену оперативки. Сервер тормозит, но не падает. Ты думаешь «ну и ладно», а потом получаешь OOM Killer, который без предупреждения убивает процессы. Следи за свободной памятью и за swap-активностью.
Диск. Два параметра: заполненность и скорость I/O. Заполненный диск — это полный стоп для баз данных и веб-серверов. Nginx не может записать лог — молча падает. MySQL не может создать временный файл — запрос обрывается. Порог в 80% — уже сигнал тревоги, не 95%.
Сеть. Трафик, количество соединений, ошибки пакетов. Резкий рост входящего трафика — возможная DDoS-атака или вирусный пост в соцсетях. Рост исходящего без видимых причин — сервер что-то отправляет наружу, и это повод проверить безопасность.
Метрики приложения — не путай с метриками сервера
Мониторинг ОС и мониторинг приложения — разные вещи, и нужны оба.
Для веб-приложений критичны:
- Время ответа (latency). Если запрос обрабатывается дольше 2–3 секунд — пользователь уходит. Следи за p50, p95 и p99 — медианой и хвостами распределения. Средняя цифра обманывает: среднее может быть 200ms, а 1% запросов висят по 10 секунд.
- Количество ошибок (error rate). Сколько запросов завершается с кодами 5xx. Норма — близко к нулю. Рост до 1–2% уже критичен для продакшена.
- RPS (requests per second). Сколько запросов обрабатывает сервер. Помогает понять текущую нагрузку и сравнить с историческими данными.
- Статус очередей. Если используешь Celery, RabbitMQ или Redis как брокер — следи за длиной очереди. Если задачи накапливаются и не обрабатываются, что-то пошло не так с воркерами.
Инструменты: от простого к серьёзному
Prometheus + Grafana
Де-факто стандарт в индустрии. Prometheus собирает метрики, Grafana строит дашборды.
Как это работает: Prometheus периодически «опрашивает» (scrape) эндпоинты с метриками. Каждый сервис экспортирует метрики в формате text/plain по адресу /metrics. Есть готовые экспортёры для всего — node_exporter для системных метрик Linux, postgres_exporter для PostgreSQL, nginx-prometheus-exporter для Nginx.
Установка node_exporter:
wget https://github.com/prometheus/node_exporter/releases/download/v1.7.0/node_exporter-1.7.0.linux-amd64.tar.gz
tar xvfz node_exporter-1.7.0.linux-amd64.tar.gz
sudo mv node_exporter-1.7.0.linux-amd64/node_exporter /usr/local/bin/
Запускаешь как systemd-сервис, и он начинает отдавать метрики на порту 9100. Prometheus подхватывает их каждые 15 секунд по умолчанию.
Графана даёт красивые дашборды. На сайте Grafana Labs есть готовые дашборды с ID — просто импортируешь. Дашборд 1860 (Node Exporter Full) — хорошее начало, покрывает всё основное.
Минус: требует настройки. Для одного небольшого сервера может быть избыточно. Зато бесплатно и масштабируется до сотен серверов.
Zabbix
Старый добрый монстр. Существует с 2001 года и до сих пор активно используется в корпоративной среде. Умеет почти всё: метрики, алерты, карты сети, отчёты.
Плюс — есть агент для Windows, что важно для гетерогенной инфраструктуры. Минус — интерфейс морально устарел, и настройка через веб-GUI утомляет. Новичку будет тяжело.
Netdata
Если нужно быстро поднять мониторинг с красивым интерфейсом — Netdata. Устанавливается одной командой:
wget -O /tmp/netdata-kickstart.sh https://get.netdata.cloud/kickstart.sh && sh /tmp/netdata-kickstart.sh
Через минуту на порту 19999 появляется веб-интерфейс с сотнями метрик в реальном времени. Нулевая конфигурация для базовых метрик.
Hint: Netdata хорошо работает как первый уровень мониторинга. Потом, когда нужна история и алерты, добавляешь Prometheus сверху.
Uptime Kuma
Отдельный инструмент для мониторинга доступности — проверяет, отвечает ли сайт или API. Не заменяет системный мониторинг, но дополняет.
Запускается в Docker:
docker run -d --restart=always -p 3001:3001 \
-v uptime-kuma:/app/data \
--name uptime-kuma louislam/uptime-kuma:1
Добавляешь URL-адреса, которые нужно проверять каждую минуту. Если сайт упал — приходит уведомление в Telegram, Slack или на почту. Просто и бесплатно.
Облачные SaaS-решения
Если не хочешь поднимать инфраструктуру мониторинга самостоятельно — есть Datadog, New Relic, Sentry (для ошибок приложения). Платно, но работает из коробки. Datadog берёт от $15 в месяц за хост — считай сам, оправданно ли это для твоего случая.
Алерты — самое важное
Мониторинг без алертов — это красивые графики, которые никто не смотрит. Алерты — то, ради чего всё затевается.
Правила хорошего алерта:
Алерт должен требовать действия. Если получил уведомление и можешь ничего не делать — это не алерт, это шум. Отключи или переделай.
Порог должен быть осмысленным. CPU > 80% на 5 минут — алерт. CPU > 80% на 30 секунд — норма при старте приложения. Используй функцию for в Prometheus AlertManager:
- alert: HighCPULoad
expr: 100 - (avg by(instance)(rate(node_cpu_seconds_total{mode="idle"}[2m])) * 100) > 80
for: 5m
labels:
severity: warning
annotations:
summary: "Высокая нагрузка CPU на {{ $labels.instance }}"
Разные уровни серьёзности. Warning — можно посмотреть утром. Critical — буди хоть в три ночи. Смешивать нельзя: если всё critical, ничто не critical.
Минимум каналов уведомлений. Telegram для critical, почта для daily summary — достаточно. Не плоди десять каналов, иначе уведомления начнут игнорироваться.
Логи — отдельная история
Метрики говорят «что» произошло, логи говорят «почему». Без логов диагностика превращается в гадание.
Минимальный стек: Loki + Promtail + Grafana. Promtail читает файлы логов и отправляет в Loki. Grafana показывает логи рядом с метриками — удобно, когда видишь всплеск ошибок на графике и сразу провалюешься в соответствующие строки логов.
Альтернатива — ELK Stack (Elasticsearch + Logstash + Kibana). Мощнее, но требует больше ресурсов. Elasticsearch под нагрузкой ест память охотно. Для небольшого проекта Loki предпочтительнее.
Что логировать обязательно:
- Все ошибки приложения (уровень ERROR и выше)
- Медленные запросы к БД (slow query log в MySQL/PostgreSQL)
- Запросы к Nginx/Apache с кодами 4xx и 5xx
- Попытки авторизации (особенно неудачные)
Мониторинг баз данных
База данных — чаще всего узкое место. Несколько метрик, которые стоит отслеживать всегда:
Для PostgreSQL:
- Количество активных соединений vs максимум (
max_connections)
- Время выполнения запросов
- Размер таблиц и индексов
- Количество dead tuples — признак того, что autovacuum не справляется
Для MySQL/MariaDB:
- Innodb buffer pool hit rate — должен быть выше 95%
- Threads connected
- Slow queries per second
Для PostgreSQL есть pg_stat_statements — расширение, которое копит статистику по всем запросам. После включения можешь найти самые медленные или самые частые запросы:
SELECT query, calls, mean_exec_time
FROM pg_stat_statements
ORDER BY mean_exec_time DESC
LIMIT 10;
С чего начать прямо сейчас
Если у тебя ещё нет никакого мониторинга — вот минимальный план на один вечер:
- Установи Netdata на сервер. Десять минут, нулевая конфигурация.
- Подними Uptime Kuma и добавь все критичные URL. Настрой Telegram-уведомления.
- Проверь, что логи Nginx пишутся и ты знаешь, где они лежат (
/var/log/nginx/error.log).
Этого достаточно, чтобы не проспать полное падение. Потом, когда освоишься, добавляй Prometheus, Grafana, AlertManager — по потребности.
Если хочется делегировать инфраструктурные задачи и сосредоточиться на продукте — такие вопросы часто решаются при разработке и поддержке сайта. Студия REEXY, например, занимается поддержкой сайтов и может взять на себя в том числе технические вещи — от $10 000 в месяц зависит объём задач, а не фиксированный список.
Типичные ошибки
Мониторить только uptime. «Сайт отвечает» — не значит «сайт работает». Можно получать 200 OK на главной странице, но корзина не работает и оформление заказа упало.
Игнорировать тренды. Диск занят на 60% — окей. Но если три месяца назад было 40%, а сейчас 60% — через три месяца будет 80%. Смотри не только на текущее значение, но и на динамику.
Слишком много алертов. Это называется alert fatigue. Когда уведомлений слишком много, люди начинают их игнорировать. Потом пропускают важное. Беспощадно отключай шумные алерты.
Не тестировать алерты. Настроил alertmanager — проверь, что уведомление реально приходит. Остановить node_exporter, дождаться алерта, убедиться, что Telegram-сообщение пришло. Звучит очевидно, но многие этого не делают.
Мониторить только прод. Staging и dev тоже могут преподносить сюрпризы. Хотя бы минимальный uptime-мониторинг для тестовых окружений лишним не будет.
Мониторинг — это не про красивые дашборды. Это про сон по ночам и уверенность, что ты узнаешь о проблеме первым, а не от клиента.