Логи есть в каждой инфраструктуре, но часто они остаются пассивным архивом для постфактумного разбора полетов. Активный мониторинг и алертинг на основе логов превращают этот архив в систему раннего предупреждения, которая предотвращает сбои и снижает время на анализ инцидентов. Это прямой путь от простой наблюдаемости к обеспечению надежности сервисов, что напрямую отвечает на боль аудитории о рисках для рабочей среды и нехватке времени.
В этом руководстве вы получите готовые к применению конфигурации для двух популярных стеков: 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 мс.
- Триггер: Алерт в Grafana на метрику
histogram_quantile(0.95, rate(http_request_duration_seconds_bucket[5m])). - Анализ логов (Loki): Инженер выполняет запрос LogQL для поиска медленных запросов в тот же период:
{job="backend-app"} | json | latency > 0.4. Запрос выявляет всплеск медленных вызовов к эндпоинту/api/v1/report. - Сопоставление с метриками: Дашборд в Grafana показывает, что рост latency коррелирует с увеличением количества активных соединений к базе данных PostgreSQL и высокой загрузкой CPU одного из инстансов приложения.
- Глубокий анализ логов БД: В логах PostgreSQL (индексированных в Elasticsearch) находится запрос, выполняемый в рамках
/api/v1/report, который из-за отсутствия индекса выполняет полное сканирование большой таблицы. - Решение: Добавление индекса и кэширование результатов запроса. Алерт по latency возвращается в норму.
Этот кейс показывает, как алерты по метрикам и логам работают вместе, обеспечивая быстрый переход от симптома к первопричине.
Кейс: Детектирование и реагирование на попытки несанкционированного доступа
Ситуация: Необходимо обнаружить и автоматически заблокировать IP, с которого идет брутфорс-атака на SSH-сервер.
- Детектирование (Elasticsearch Watcher): Создается правило, которое каждые 2 минуты ищет в логах auth (fail2ban, sshd) более 5 неудачных попыток входа с одного IP за 5 минут.
- Конфигурация действия: В секции
actionsправила Watcher настраивается webhook, который вызывает внутренний API или скрипт. Этот скрипт добавляет IP в черный список (например, через iptables или в облачный WAF) и создает тикет в системе инцидент-менеджмента. - Анализ источника: После блокировки по дополнительным логам веб-сервера и сетевого трафика (которые также должны собираться в централизованную систему, как описано в руководстве по маршрутизации логов) определяется, была ли это целевая атака или часть сканирования сети.
Такой подход закрывает цикл от детектирования до автоматизированного реагирования, что является ключевым элементом современной 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:
- Создается агрегация в Elasticsearch, которая за скользящее окно (например, 28 дней) считает общее количество запросов и количество запросов с кодом ответа 5xx.
- Формулой вычисляется процент успешных запросов:
1 - (count_5xx / total_count). - В Kibana Lens строится график этого значения во времени. Добавляется горизонтальная линия на уровне 0.999 (99.9%).
- Создается панель, показывающая оставшийся "бюджет ошибок" (error budget) - допустимое количество ошибок до нарушения SLA.
Такой дашборд дает наглядное представление о том, насколько близко система подходит к нарушению обязательств перед пользователями. Выбор между Grafana/Loki и Kibana/Elasticsearch часто зависит от уже используемого в инфраструктуре стека. Подробное сравнение их возможностей, стоимости и сложности эксплуатации в 2026 году можно найти в отдельном материале: Системы сбора и анализа логов в 2026: выбираем стек от Elastic Stack до Grafana Loki.
План внедрения: от пилота к production-системе
Внедрение системы алертинга на основе логов должно быть итеративным, чтобы минимизировать риски и избежать усталости от уведомлений.
Приоритизация: первые алерты, которые стоит настроить уже сегодня
Начните с малого, но с максимальным воздействием. Первые 3-5 правил должны закрывать самые критичные риски:
- CRITICAL/FATAL ошибки в логах приложения. Используйте базовое правило Watcher или LogQL-алерт из раздела выше.
- Рост частоты HTTP-ошибок 5xx выше 1%. Универсальный индикатор проблем бэкенда.
- Исчерпание пула соединений с базой данных. Ищите в логах приложения или логах СУБД сообщения типа "connection pool exhausted".
- Недоступность ключевого внешнего сервиса (API, платежный шлюз). Детектируется по логам таймаутов или ошибок соединения.
- Множественные неудачные попытки аутентификации с одного 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, который предоставляет единый интерфейс для доступа к множеству моделей нейросетей и может быть интегрирован в процессы для автоматической классификации инцидентов или генерации ответов на типовые запросы.