Зачем автоматизировать мониторинг и с чего начать
Автоматизированный мониторинг закрывает три задачи: находит сбой раньше пользователей, выполняет типовое действие без дежурного, оставляет след для разбора причин. Ручной обход серверов добавляет к реакции десятки минут, а ночью и в выходные задержка растет кратно. В командах из 3-5 инженеров ручной сбор метрик увеличивает время реакции на 40-60%, а перевод пяти самых частых runbook в автоматический режим сокращает MTTR с 45-60 минут до 10-15.
Первый шаг - не выбор софта, а инвентаризация. Без списка хостов, сервисов и зависимостей автоматика реагирует на шум и перезапускает не то, что сломалось. Команда, пропустившая этот этап, обычно получает сотни алертов в сутки и через месяц отключает уведомления, возвращаясь к ручным проверкам.
Рабочий порядок работ: инвентаризация, установка агентов, определение порогов, маршрутизация алертов, автоматические действия, проверки в пайплайне. Ошибки на этапе проектирования дороже всего, базовые принципы разобраны в материале про проектирование системы мониторинга для инфраструктуры.
Инвентаризация инфраструктуры: что и как фиксировать
Соберите минимальный набор полей по каждому объекту. Формат вторичен: YAML-файл в git, NetBox или отдельная CMDB. Важна полнота и единый источник правды, который обновляют вместе с изменением инфраструктуры.
| Что фиксируем | Пример | Зачем нужно |
|---|---|---|
| Имя хоста и IP | web-01, 10.0.10.11 | однозначная привязка метрик и алертов |
| Роль | frontend, СУБД, брокер | выбор шаблона и набора проверок |
| Сервисы и порты | nginx 80/443, postgres 5432 | контроль доступности и правил firewall |
| Зависимости | api -> postgres, redis | подавление вторичных алертов |
| Владелец и канал связи | team-payments, #pay-oncall | маршрутизация уведомлений |
| Критичность и SLA | critical, доступность 99,9% | приоритет и скорость реакции |
NetBox уместен, когда нужны IPAM и учет стоек. Для парка до 200 хостов хватает Ansible inventory в YAML: один файл служит источником данных и для мониторинга, и для управления конфигурациями. Начинайте с 5-10 критичных сервисов и расширяйте список по мере разбора инцидентов. Если инстансы в облаке создаются автоматически, inventory генерируйте динамически через API провайдера, иначе список устареет за неделю.
Выбор и настройка агентов мониторинга
Критерии выбора: масштаб парка, скорость появления новых хостов, бюджет, поддержка контейнеров и Kubernetes, наличие готовых шаблонов и API для автоматизации. Для парка из 20-200 серверов разница между платформами заметна меньше, чем качество настроенных порогов и маршрутов уведомлений.
Сравнение инструментов: Prometheus, Zabbix, Nagios
| Инструмент | Модель сбора | Масштабируемость | Kubernetes | Сложность старта |
|---|---|---|---|---|
| Prometheus + экспортеры | pull, service discovery | высокая (federation, Thanos) | нативная (operator, автообнаружение подов) | средняя |
| Zabbix | push и pull (агент, SNMP, active checks) | высокая (прокси и шардирование) | базовая (шаблоны, трапы) | низкая |
| Nagios Core | pull через плагины и NRPE | средняя, ручное описание хостов | слабая | средняя |
| Sensu | push, событийная модель | высокая | средняя | средняя |
Prometheus сильнее в динамических средах: поды и инстансы исчезают и появляются каждую минуту, а service discovery подхватывает их без ручной правки конфигов. Zabbix удобнее для классических серверов, сетевого оборудования и задач, где нужен агент с активными проверками и понятный веб-интерфейс. Nagios остается рабочим вариантом для небольших парков с готовыми плагинами, но требует ручного сопровождения списка хостов. Sensu подходит командам, которые уже живут в событийной модели и хотят гибкую маршрутизацию.
Практичные комбинации: до 50 хостов и минимум контейнеров - Zabbix с прокси; Kubernetes-first среда - Prometheus, экспортеры, Grafana, Alertmanager; гибрид - Zabbix для железа, сети и SNMP, Prometheus для приложений и кластеров.
Установка и конфигурация агентов: пошаговый пример
node_exporter на Ubuntu или Debian удобнее ставить из репозитория дистрибутива:
apt update apt install -y prometheus-node-exporter systemctl enable --now prometheus-node-exporter systemctl status prometheus-node-exporter
Проверка, что агент отдает метрики: curl -s localhost:9100/metrics | head -20. Пустой ответ или отказ в соединении означает, что служба не поднялась либо порт закрыт.
Для мониторинга Nginx через Zabbix agent добавьте пользовательский параметр. В файл /etc/zabbix/zabbix_agentd.d/nginx.conf:
UserParameter=nginx.active,curl -s http://127.0.0.1/nginx_status | awk 'NR==1 {print $3}'
UserParameter=nginx.requests,curl -s http://127.0.0.1/nginx_status | awk 'NR==3 {print $3}'
Server=10.0.10.5
ServerActive=10.0.10.5
Hostname=web-01
Откройте порты 9100 для node_exporter, 10050 для Zabbix agent и 10051 для Zabbix server, ограничив источники адресами системы мониторинга. Публично доступный экспортер с метриками раскрывает версии ядра, список ФС и имена сервисов.
Управление конфигурациями агентов централизуйте: ручная правка 50 серверов гарантирует расхождения, из-за которых часть метрик пропадает. Ansible-роль или Puppet-модуль с шаблоном конфига и перезапуском службы решает задачу; примеры ролей и плейбуков есть в руководстве по автоматизации инфраструктуры для DevOps и сисадминов.
Определение порогов срабатывания и настройка алертов
Порог без базовой линии бесполезен. Соберите статистику за 2-3 недели, посмотрите p95 и p99 по ключевым метрикам, учтите суточный профиль и всплески от ночных заданий. Затем ставьте порог на 20-30% выше нормального пика и добавляйте условие длительности, чтобы одиночный скачок не поднимал дежурного.
| Метрика | Warning | Critical | Условие |
|---|---|---|---|
| Загрузка CPU | 80% | 95% | 5 минут подряд |
| Свободное место на диске | 15% | 10% | 10 минут подряд |
| Доля ответов 5xx | 1% | 5% | окно 5 минут |
| Время ответа p95 | 500 мс | 1,5 с | окно 10 минут |
| Глубина очереди | 1000 | 5000 | окно 5 минут |
Правило Alertmanager для диска и ошибок приложения:
groups:
- name: infra
rules:
- alert: DiskSpaceLow
expr: (node_filesystem_avail_bytes{fstype!~"tmpfs|overlay"} / node_filesystem_size_bytes) < 0.10
for: 10m
labels:
severity: warning
annotations:
summary: "Мало места на {{ $labels.instance }} ({{ $labels.mountpoint }})"
- alert: HighErrorRate
expr: sum(rate(http_requests_total{code=~"5.."}[5m])) by (job) / sum(rate(http_requests_total[5m])) by (job) > 0.01
for: 5m
labels:
severity: critical
Подавление шума строится на четырех приемах: группировка по сервису или хосту, inhibition (не шуметь о приложениях, когда упал узел), silences на окна плановых работ, дедупликация повторных сигналов. Маршрутизация в почту, мессенджеры, on-call и тикеты описана в статье об интеграции мониторинга с уведомлениями и тикетированием.
Как избежать ложных срабатываний и алертной усталости
Критерий простой: алерт требует действия. Если по сигналу ничего не делают неделями, он вредит больше, чем помогает. Для диска рабочая схема такая: 85% - предупреждение в рабочие часы, 95% - критично круглосуточно плюс автоматическая задача на очистку логов и временных файлов.
Динамические пороги снимают часть шума. Функция predict_linear в PromQL предсказывает заполнение диска на 4 часа вперед и срабатывает до того, как закончится место. Для сезонных сервисов порог задают отдельно по рабочим дням и выходным. Пересматривайте значения раз в квартал и после каждого крупного релиза: профиль нагрузки меняется, а старые пороги начинают срабатывать вхолостую.
Эскалацию включайте только для критичных сервисов с SLA. Схема из трех шагов (дежурный, через 15 минут тимлид, через 30 минут руководитель направления) на 20 второстепенных сервисах приводит к тому, что people начинают игнорировать звонки.
Интеграция мониторинга с CI/CD
Задача интеграции: не пускать деградацию в продакшен. Метрики, которые имеет смысл проверять в пайплайне: доля 5xx, p95 времени ответа после прогрева, потребление CPU и памяти, число перезапусков контейнера, глубина очереди, длительность миграций базы.
Базовая схема проверки: сборка и юнит-тесты, деплой в staging, smoke-тесты, окно прогрева 2-5 минут, запрос метрик из Prometheus, сравнение с baseline, промоушен в продакшен или откат. Без окна прогрева job проверяет метрики холодного старта и валит пайплайн на пустом месте.
Пример пайплайна с проверкой метрик после деплоя
Фрагмент .gitlab-ci.yml с блокирующей проверкой доли ошибок:
stages:
- build
- deploy
- verify
deploy_staging:
stage: deploy
script:
- ./deploy.sh staging
environment:
name: staging
verify_metrics:
stage: verify
script:
- sleep 180
- |
ERR=$(curl -sG "$PROM_URL/api/v1/query" \
--data-urlencode 'query=sum(rate(http_requests_total{env="staging",code=~"5.."}[5m])) / sum(rate(http_requests_total{env="staging"}[5m]))' \
-H "Authorization: Bearer $PROM_TOKEN" | jq -r '.data.result[0].value[1] // "0"')
echo "error rate: $ERR"
awk -v e="$ERR" 'BEGIN {exit !(e < 0.01)}'
rules:
- if: '$CI_COMMIT_BRANCH == "main"'
Job падает, если доля ошибок превышает 1%, и блокирует следующие стадии. В Jenkins аналог собирается плагином HTTP Request или общей библиотекой с шагом verifyMetrics, где вызов Prometheus API обернут в функцию. Аннотации деплоя отправляйте в Grafana через API: на графиках будет видно, какая версия дала всплеск.
Автоматический откат делайте по тем же метрикам: отдельная стадия rollback возвращает предыдущий образ, повторно ждет прогрева и проверяет error rate. Если и после откака метрики не восстановились, инцидент переводится в ручной режим и поднимает дежурного.
Стенд для нагрузочных тестов держите отдельно от продакшена. Облачный контур поднимается за минуты и не мешает рабочим сервисам: виртуальные серверы, Kubernetes и базы данных удобно брать через Timeweb Cloud и удалять сразу после прогона.
Предупреждение: пайплайну нужен сетевой доступ к Prometheus и токен с правами только на чтение. Не выставляйте систему мониторинга в интернет, ставьте reverse proxy с авторизацией и ограничением по IP раннеров.
Автоматизация реакции на инциденты: Ansible, webhooks, ChatOps
Три подхода дополняют друг друга: Ansible выполняет самовосстановление на хостах, webhooks запускают внешние сценарии, ChatOps отвечает за коммуникацию и ручные команды. Начинайте с действий, которые безопасно повторять: перезапуск сервиса, очистка временных файлов, расширение диска, снятие дампа процесса. Интеграцию с PagerDuty, Opsgenie и Mattermost удобно строить поверх одной точки маршрутизации, чтобы дежурный получал сигнал в привычном канале.
Плейбук Ansible для автоматического перезапуска сервиса
- name: Перезапуск Nginx при падении
hosts: web
become: true
serial: 1
tasks:
- name: Проверить состояние сервиса
ansible.builtin.command: systemctl is-active nginx
register: nginx_state
changed_when: false
failed_when: false
- name: Перезапустить nginx
ansible.builtin.service:
name: nginx
state: restarted
when: nginx_state.stdout != "active"
- name: Записать действие в лог
ansible.builtin.lineinfile:
path: /var/log/autoheal.log
line: "{{ ansible_date_time.iso8601 }} nginx restarted on {{ inventory_hostname }}"
create: true
Запуск из Alertmanager через webhook-приемник:
receivers:
- name: autoheal
webhook_configs:
- url: http://runner.internal:8080/hooks/restart-nginx
send_resolved: false
route:
receiver: default
routes:
- matchers:
- alertname="ServiceDown"
- service="nginx"
receiver: autoheal
repeat_interval: 30m
Ограничения обязательны. Задайте лимит не больше одного перезапуска на хост за 10 минут (serial и throttle в AWX), иначе при циклическом падении автоматика станет генератором рестартов и замаскирует первопричину. Исключите сервисы, где рестарт разрушает данные: СУБД в момент записи, брокер с незакоммиченными сообщениями. Обязательно проверьте сценарий на staging перед включением на продакшене.
Webhooks закрывают внешние действия: масштабирование группы инстансов, перевод API в read-only, запуск функции в облаке, создание тикета. Payload Alertmanager содержит labels и annotations, по ним выбирается действие, а обратный вызов подтверждает выполнение. Расширенная схема с ротацией дежурных, автоматическими runbook и разбором без поиска виновных разобрана в руководстве по построению зрелой системы реагирования на инциденты.
Настройка ChatOps для управления инцидентами
Бот в Slack, Mattermost или Telegram получает алерты через webhook Alertmanager и принимает команды: /ack принять инцидент, /silence 1h заглушить на час, /restart nginx перезапустить сервис, /scale api 4 поднять реплики. Слэш-команда вызывает API оркестратора или job template в AWX, а результат возвращается в тред обсуждения.
Выигрыш в скорости заметен на координации: история действий и решений остается в одном канале, дежурный не переключается между пятью системами, трассировка инцидента собирается автоматически. Принятие инцидента командой /ack фиксирует время начала работы, что дальше используется при расчете MTTA и MTTR.
Если алертов много, поток стоит сжимать в короткую сводку перед отправкой в канал. Для этого подключают LLM через агрегатор API, например AiTunnel с доступом к GPT, Gemini и Claude по единому интерфейсу: модель группирует родственные сигналы и выделяет вероятную первопричину.
Права бота ограничивайте. Команды перезапуска и масштабирования должны выполняться только для сервисов из белого списка и только участниками on-call группы, иначе любой пользователь канала получит доступ к управлению инфраструктурой.
Типичные ошибки и как их избежать
- Инвентаризация постфактум. Мониторинг ставят на часть серверов, остальные живут без метрик. Решение: сверка inventory с реальностью раз в месяц, автоматическая генерация списка хостов.
- Алерты без действия. Сигнал приходит, но что с ним делать, не описано. Решение: у каждого алерта есть ссылка на runbook и владелец.
- Автоматизация без тестов. Плейбук перезапуска впервые запускается на продакшене в момент аварии. Решение: прогон на staging и в тестовом контуре с эмуляцией сбоя.
- Метрики с высокой кардинальностью. Метка с ID запроса или сессией раздувает базу и замедляет запросы. Решение: ограничить набор меток, агрегировать на стороне экспортера.
- Единый порог для всех сервисов. Кэш и биллинг ведут себя по-разному. Решение: baseline для каждой группы сервисов.
- Отсутствие документации. Через полгода никто не помнит, почему порог выставлен именно так. Решение: короткая заметка рядом с правилом в git.
Пример из практики: команда с парком из 120 сервисов начала с 12 алертов на критичные узлы, добавила автоперезапуск для трех stateless-сервисов и проверку error rate в пайплайне. Через квартал MTTR по типовым сбоям упал примерно на 50%, а количество ночных вызовов дежурного сократилось вдвое. Разбор похожих грабель, включая шумные алерты и хрупкую архитектуру сбора, собран в статье про типовые ошибки при разработке систем мониторинга.
Заключение: план внедрения за 7 шагов
- Инвентаризация: хосты, роли, сервисы, порты, зависимости, SLA. Начните с 5-10 критичных сервисов.
- Выбор инструментов: Prometheus и экспортеры для динамических сред, Zabbix для классических серверов и сети.
- Установка агентов: репозитории дистрибутива, проверка через curl localhost:9100/metrics, централизованные конфиги через Ansible.
- Пороги: baseline за 2-3 недели, запас 20-30% над пиком, условие длительности, пересмотр раз в квартал.
- Интеграция с CI/CD: проверка error rate и p95 после деплоя в staging, блокировка промоушена, автоматический откат.
- Автоматизация реакции: плейбуки Ansible для самовосстановления, webhooks для внешних сценариев, ChatOps для команд и координации.
- Тестирование и документация: прогон сценариев на staging, лимиты на автодействия, runbook и владелец у каждого алерта.
Внедряйте итеративно: каждый шаг должен давать работающий результат, который можно проверить на реальном инциденте. Начните на этой неделе с инвентаризации и одного автодействия для самого частого сбоя в вашей практике, дальше расширяйте контур по мере накопления статистики.