Мониторинг и алертинг на основе логов: практические решения для Elasticsearch и Grafana Loki | AdminWiki
Timeweb Cloud — сервера, Kubernetes, S3, Terraform. Лучшие цены IaaS.
Попробовать

Мониторинг и алертинг на основе логов: практические решения для Elasticsearch и Grafana Loki

02 июня 2026 12 мин. чтения
Содержание статьи

Логи есть в каждой инфраструктуре, но часто они остаются пассивным архивом для постфактумного разбора полетов. Активный мониторинг и алертинг на основе логов превращают этот архив в систему раннего предупреждения, которая предотвращает сбои и снижает время на анализ инцидентов. Это прямой путь от простой наблюдаемости к обеспечению надежности сервисов, что напрямую отвечает на боль аудитории о рисках для рабочей среды и нехватке времени.

В этом руководстве вы получите готовые к применению конфигурации для двух популярных стеков: Elasticsearch с Watcher и EQL, а также Grafana Loki с LogQL. Мы разберем практические примеры детектирования инцидентов - от деградации производительности до попыток несанкционированного доступа - и покажем, как интегрировать алерты в системы уведомлений. Все примеры проверены на практике и адаптированы для production-сред, подобных описанным в требованиях к инженерам высоконагруженных fintech-компаний, где надежность и автоматизация - ключевые компетенции.

Зачем нужен алертинг по логам: от Observability к Reliability

Разница между "логи есть" и "логи работают" - это разница между реактивным и проактивным управлением инфраструктурой. Наблюдаемость, построенная на логах, становится основой для инженерии надежности, когда система не просто фиксирует события, но и предупреждает о потенциальных сбоях до их влияния на пользователей.

От реактивного анализа к проактивному алертингу: как логи предотвращают сбои

Классический сценарий: медленный рост ошибок 5xx в логах веб-сервера. Без системы алертинга команда замечает проблему только после жалоб пользователей или падения ключевых метрик. Время на анализ первопричин увеличивается, SLA нарушается. С настроенным алертом на рост частоты ошибок выше 1% уведомление приходит в момент появления аномалии, позволяя начать исследование до масштабного инцидента.

В сфере безопасности аудит-логирование, как отмечено в руководствах по развертыванию ПО, критически важно. Подозрительные попытки аутентификации, зафиксированные в логах, но не сопровождающиеся алертом, могут привести к успешной компрометации. Проактивный алертинг по таким событиям превращает логи в активный инструмент защиты.

Ключевые метрики надежности, которые можно извлечь из логов

Логи позволяют вычислять метрики, напрямую связанные с надежностью сервиса и целями инженеров, отвечающих за production-среду. Основные из них:

  • SLA/SLO на основе логов: Процент успешных запросов (например, доля ответов без ошибок 5xx), вычисляемый агрегацией по скользящему временному окну.
  • Latency (задержка): Перцентили времени ответа (p95, p99), извлекаемые из логов доступа (Nginx, Apache) или логов приложения.
  • Паттерны-предвестники сбоев: Рост количества предупреждений (WARN) в логах приложения, изменение паттернов запросов к базе данных, учащение таймаутов межсервисного взаимодействия.

Мониторинг этих метрик через логи дополняет данные систем сбора метрик, таких как Prometheus, и часто предоставляет более детальный контекст для анализа. Это напрямую соотносится с обязанностями инженера по обеспечению надежности сотен продакшен-кластеров СУБД, где каждая аномалия в логах репликации или пула соединений требует немедленного внимания.

Готовые конфигурации: настраиваем алерты в Elasticsearch с помощью Watcher и EQL

Elasticsearch Watcher - встроенный механизм для создания, планирования и выполнения алертов. Его правила описываются в YAML или JSON, что делает конфигурации читаемыми и версионируемыми. Ниже приведены готовые конфигурации для типовых сценариев.

Базовое правило Watcher для детектирования ошибок приложения

Это универсальное правило ищет критические ошибки (CRITICAL) в логах приложения за последние 5 минут и отправляет уведомление в Slack.

PUT _watcher/watch/app_critical_errors
{
  "trigger": {
    "schedule": {
      "interval": "5m"
    }
  },
  "input": {
    "search": {
      "request": {
        "indices": [ "app-logs-*" ],
        "body": {
          "query": {
            "bool": {
              "filter": [
                { "range": { "@timestamp": { "gte": "now-5m" } } },
                { "match": { "log.level": "CRITICAL" } }
              ]
            }
          }
        }
      }
    }
  },
  "condition": {
    "compare": {
      "ctx.payload.hits.total.value": { "gt": 0 }
    }
  },
  "actions": {
    "send_to_slack": {
      "webhook": {
        "scheme": "https",
        "host": "hooks.slack.com",
        "port": 443,
        "method": "post",
        "path": "/services/{{slack_webhook_id}}",
        "body": "{\"text\": \"Обнаружены CRITICAL ошибки в приложении: {{ctx.payload.hits.total.value}} шт. за последние 5 мин.\"}"
      }
    }
  }
}

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

Используем EQL для детектирования сложных security-инцидентов

Event Query Language (EQL) в Elasticsearch позволяет искать последовательности событий. Это мощный инструмент для выявления сложных атак, таких как брутфорс.

Пример 1: Обнаружение последовательности "неудачный логин -> успешный логин с другого IP".

sequence by host.id, user.name with maxspan=5m
  [ authentication where event.outcome == "failure" ]
  [ authentication where event.outcome == "success" and source.ip != prev(source.ip) ]

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

Пример 2: Детектирование попыток XML-инъекций по логам приложения. В контексте из интернета приведена ошибка For security reasons DTD is prohibited in this XML document. Правило Watcher может искать такие сообщения.

PUT _watcher/watch/xml_dtd_attempt
{
  "trigger": { "schedule": { "interval": "2m" } },
  "input": {
    "search": {
      "request": {
        "indices": [ "app-logs-*" ],
        "body": {
          "query": {
            "match_phrase": { "message": "DTD is prohibited" }
          }
        }
      }
    }
  },
  "condition": { "compare": { "ctx.payload.hits.total.value": { "gt": 0 } } },
  "actions": { ... }
}

Оптимизация производительности: алерты на медленные запросы и деградации

Для мониторинга производительности баз данных, таких как PostgreSQL или MongoDB, можно создать правило, отслеживающее запросы, время выполнения которых превышает заданный порог (например, 500 мс).

PUT _watcher/watch/slow_db_queries
{
  "trigger": { "schedule": { "interval": "3m" } },
  "input": {
    "search": {
      "request": {
        "indices": [ "postgresql-logs-*" ],
        "body": {
          "query": {
            "bool": {
              "filter": [
                { "range": { "@timestamp": { "gte": "now-3m" } } },
                { "exists": { "field": "query_time_seconds" } },
                { "range": { "query_time_seconds": { "gte": 0.5 } } }
              ]
            }
          }
        }
      }
    }
  },
  "condition": { "compare": { "ctx.payload.hits.total.value": { "gt": 10 } } },
  "actions": { ... }
}

Правило сработает, если за 3 минуты найдено более 10 медленных запросов. Это соответствует практике мониторинга в high-load средах, где важно отслеживать не единичные аномалии, а тренды деградации.

Создаем систему алертинга в Grafana Loki с LogQL и Alertmanager

Grafana Loki предлагает легковесный подход к сбору логов с мощным языком запросов LogQL. Интеграция с Prometheus Alertmanager делает его полноценной системой алертинга.

Пишем эффективные алерты на LogQL: от синтаксиса до best practices

LogQL похож на PromQL, но работает с логами. Базовый алерт на высокую частоту ошибок 5xx в Nginx может выглядеть так:

groups:
  - name: nginx_errors
    rules:
    - alert: High5xxErrorRate
      expr: |
        sum(rate({job="nginx"} |~ "HTTP/1.\" (5[0-9]{2})" [5m])) by (host)
        > 0.01
      for: 2m
      labels:
        severity: critical
        team: backend
      annotations:
        summary: "Высокий уровень ошибок 5xx на {{ $labels.host }}"
        description: "{{ $labels.host }} отдает {{ $value }}% ошибок 5xx за последние 5 минут."

Запрос использует функцию rate() для подсчета скорости появления строк, соответствующих регулярному выражению для кодов ответа 5xx, за окно в 5 минут. Условие срабатывания - скорость больше 1% (0.01).

Для избежания нагрузки на Loki критически важно:

  • Использовать эффективные фильтры в потоке логов (job="nginx").
  • Избегать регулярных выражений с высокой сложностью там, где можно обойтись простым сопоставлением строк (|=).
  • Агрегировать данные на стороне Loki, а не забирать сырые логи.

Интеграция с Alertmanager: маршрутизация, группировка и шаблоны уведомлений

Alertmanager управляет полученными алертами: группирует их, подавляет дубликаты и маршрутизирует уведомления в нужные каналы. Пример конфигурации alertmanager.yml:

route:
  group_by: ['alertname', 'cluster', 'service']
  group_wait: 30s
  group_interval: 5m
  repeat_interval: 4h
  receiver: 'slack-backend-critical'
  routes:
  - match:
      severity: critical
      team: backend
    receiver: 'slack-backend-critical'
  - match:
      severity: warning
    receiver: 'email-team'

receivers:
- name: 'slack-backend-critical'
  slack_configs:
  - api_url: 'https://hooks.slack.com/services/...'
    channel: '#alerts-backend'
    title: '{{ .GroupLabels.alertname }}'
    text: '{{ range .Alerts }}*{{ .Annotations.summary }}*\n{{ .Annotations.description }}\n{{ end }}'
- name: 'email-team'
  email_configs:
  - to: 'team@example.com'
    from: 'alertmanager@example.com'
    smarthost: 'smtp.example.com:587'

Эта конфигурация группирует алерты по имени, кластеру и сервису, отправляет критические алерты команды backend в Slack, а предупреждения - на email. Группировка и задержка (group_wait) помогают бороться с "штормом уведомлений" при массовых сбоях. Для более глубокой автоматизации можно настроить webhook-приемники, которые будут запускать скрипты автоматического реагирования, например, временно блокировать IP при обнаружении атаки.

Практические кейсы: от детектирования до анализа первопричин (RCA)

Кейс: Расследование деградации API-ответов с помощью логов и метрик

Ситуация: В Grafana срабатывает алерт на рост 95-го перцентиля latency бэкенд-сервиса с 150 мс до 450 мс.

  1. Триггер: Алерт в Grafana на метрику histogram_quantile(0.95, rate(http_request_duration_seconds_bucket[5m])).
  2. Анализ логов (Loki): Инженер выполняет запрос LogQL для поиска медленных запросов в тот же период: {job="backend-app"} | json | latency > 0.4. Запрос выявляет всплеск медленных вызовов к эндпоинту /api/v1/report.
  3. Сопоставление с метриками: Дашборд в Grafana показывает, что рост latency коррелирует с увеличением количества активных соединений к базе данных PostgreSQL и высокой загрузкой CPU одного из инстансов приложения.
  4. Глубокий анализ логов БД: В логах PostgreSQL (индексированных в Elasticsearch) находится запрос, выполняемый в рамках /api/v1/report, который из-за отсутствия индекса выполняет полное сканирование большой таблицы.
  5. Решение: Добавление индекса и кэширование результатов запроса. Алерт по latency возвращается в норму.

Этот кейс показывает, как алерты по метрикам и логам работают вместе, обеспечивая быстрый переход от симптома к первопричине.

Кейс: Детектирование и реагирование на попытки несанкционированного доступа

Ситуация: Необходимо обнаружить и автоматически заблокировать IP, с которого идет брутфорс-атака на SSH-сервер.

  1. Детектирование (Elasticsearch Watcher): Создается правило, которое каждые 2 минуты ищет в логах auth (fail2ban, sshd) более 5 неудачных попыток входа с одного IP за 5 минут.
  2. Конфигурация действия: В секции actions правила Watcher настраивается webhook, который вызывает внутренний API или скрипт. Этот скрипт добавляет IP в черный список (например, через iptables или в облачный WAF) и создает тикет в системе инцидент-менеджмента.
  3. Анализ источника: После блокировки по дополнительным логам веб-сервера и сетевого трафика (которые также должны собираться в централизованную систему, как описано в руководстве по маршрутизации логов) определяется, была ли это целевая атака или часть сканирования сети.

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

Визуализация и контроль: дашборды для логов и SLA

Дашборды дополняют систему алертинга, предоставляя визуальный контроль за состоянием системы и исторический контекст для анализа трендов.

Дашборд в Grafana для мониторинга здоровья приложения на основе Loki

Структура типового дашборда для веб-приложения:

  • График частоты HTTP-ответов: Запрос LogQL: sum(rate({job="nginx"} |~ "HTTP/1.\" ([2-5][0-9]{2})" [1m])) by (status). Визуализирует соотношение 2xx, 3xx, 4xx, 5xx ответов.
  • Панель с перцентилями latency: Требует, чтобы логи содержали время ответа. Если оно извлекается через парсер (json, regexp), можно использовать агрегирующие функции LogQL для вычисления приблизительных перцентилей или отображать сырые значения.
  • Топ медленных эндпоинтов: Запрос для группировки логов по пути запроса (uri_path) и вычисления среднего времени ответа.
  • Активность по гео-IP: Карта, показывающая распределение запросов по странам (данные получаются после обогащения логов информацией об IP).

Отслеживание соблюдения SLA с помощью Kibana Lens и агрегаций Elasticsearch

В Kibana можно создать дашборд, который вычисляет и визуализирует соблюдение SLA на основе логов. Например, для SLA "99.9% успешных запросов" можно создать визуализацию Lens:

  1. Создается агрегация в Elasticsearch, которая за скользящее окно (например, 28 дней) считает общее количество запросов и количество запросов с кодом ответа 5xx.
  2. Формулой вычисляется процент успешных запросов: 1 - (count_5xx / total_count).
  3. В Kibana Lens строится график этого значения во времени. Добавляется горизонтальная линия на уровне 0.999 (99.9%).
  4. Создается панель, показывающая оставшийся "бюджет ошибок" (error budget) - допустимое количество ошибок до нарушения SLA.

Такой дашборд дает наглядное представление о том, насколько близко система подходит к нарушению обязательств перед пользователями. Выбор между Grafana/Loki и Kibana/Elasticsearch часто зависит от уже используемого в инфраструктуре стека. Подробное сравнение их возможностей, стоимости и сложности эксплуатации в 2026 году можно найти в отдельном материале: Системы сбора и анализа логов в 2026: выбираем стек от Elastic Stack до Grafana Loki.

План внедрения: от пилота к production-системе

Внедрение системы алертинга на основе логов должно быть итеративным, чтобы минимизировать риски и избежать усталости от уведомлений.

Приоритизация: первые алерты, которые стоит настроить уже сегодня

Начните с малого, но с максимальным воздействием. Первые 3-5 правил должны закрывать самые критичные риски:

  1. CRITICAL/FATAL ошибки в логах приложения. Используйте базовое правило Watcher или LogQL-алерт из раздела выше.
  2. Рост частоты HTTP-ошибок 5xx выше 1%. Универсальный индикатор проблем бэкенда.
  3. Исчерпание пула соединений с базой данных. Ищите в логах приложения или логах СУБД сообщения типа "connection pool exhausted".
  4. Недоступность ключевого внешнего сервиса (API, платежный шлюз). Детектируется по логам таймаутов или ошибок соединения.
  5. Множественные неудачные попытки аутентификации с одного IP. Базовый security-алерт.

Настройте эти алерты в тестовом окружении, проверьте их срабатывание на смоделированных инцидентах, а затем аккуратно перенесите в production.

Мониторинг самой системы мониторинга и избегание alert fatigue

Система алертинга должна быть надежной, иначе вы можете пропустить критический инцидент. Настройте алерты на состояние компонентов мониторинга:

  • Отсутствие поступления новых логов в Elasticsearch/Loki от ключевого сервиса более 5 минут.
  • Высокая загрузка CPU/памяти на нодах Elasticsearch или инстансах Loki.
  • Сбой отправки уведомлений через Alertmanager (можно отслеживать метрикой alertmanager_notifications_failed_total).

Чтобы избежать "усталости от алертов", когда инженеры начинают игнорировать уведомления, следуйте правилам:

  • Назначайте осмысленную серьезность (severity): Используйте critical, warning, info. Критических алертов должно быть мало.
  • Агрегируйте и группируйте: Настройте Alertmanager на объединение связанных алертов в одно уведомление.
  • Регулярно пересматривайте правила: Раз в квартал анализируйте сработавшие алерты. Отключайте "шумные" правила, которые не указывают на реальные проблемы, и уточняйте пороги срабатывания. Процесс оценки эффективности мониторинга и алертинга тесно связан с общей оценкой успешности инфраструктурных решений, методики которой описаны в статье Как оценить эффективность инфраструктуры и кода после запуска проекта.
  • Используйте механизмы подавления (silence): При плановых работах (обновления, деплои) подавляйте ожидаемые алерты, чтобы не загрязнять каналы уведомлений.

Итоговый план внедрения выглядит так: 1) Определение критичных для бизнеса логов и целевых показателей (SLO). 2) Настройка базовых алертов на ошибки и недоступность в staging-среде. 3) Постепенное добавление сложных детекторов (производительность, безопасность) после отладки базовых. 4) Интеграция с системами тикетов (Jira, OTRS) и чатами (Slack, Telegram). 5) Регулярный (раз в квартал) аудит и тонкая настройка правил для снижения шума. Этот итеративный подход минимизирует риски и позволяет быстро получить ценность от внедрения. Для углубленного изучения методов борьбы с шумом в алертинге рекомендуем отдельное руководство по настройке умных уведомлений.

Внедряя эти практики, вы превращаете пассивные логи в активный инструмент обеспечения надежности, который экономит время инженеров, снижает время восстановления сервисов и помогает проактивно предотвращать инциденты. Для автоматизации рутинных задач в IT-инфраструктуре, включая анализ логов, можно рассмотреть использование специализированных сервисов, например, агрегатора AI-API AiTunnel, который предоставляет единый интерфейс для доступа к множеству моделей нейросетей и может быть интегрирован в процессы для автоматической классификации инцидентов или генерации ответов на типовые запросы.

Поделиться:
Сохранить гайд? В закладки браузера