Настройка мониторинга и алертов Elasticsearch (Kibana)
Elasticsearch не будет сообщать о проблемах сам — нужно настроить мониторинг заранее. Наиболее частые сценарии: диск заполнился, кластер ушёл в red статус из-за нераспределённых шардов, heap достиг 95% и включился GC storm. Без алертов вы узнаёте об этом от пользователей.
Stack Monitoring в Kibana
Kibana Stack Monitoring — встроенный дашборд для мониторинга Elasticsearch, Logstash, Kibana, Beats. Данные мониторинга собираются через Metricbeat или через встроенный механизм (устаревший, не рекомендуется).
Настройка Metricbeat для сбора метрик ES:
# metricbeat.yml
metricbeat.modules:
- module: elasticsearch
xpack.enabled: true
period: 10s
hosts: ["https://localhost:9200"]
username: "remote_monitoring_user"
password: "${ES_MONITOR_PASSWORD}"
ssl.certificate_authorities: ["/etc/elasticsearch/certs/ca.crt"]
scope: cluster
metricsets:
- ccr
- cluster_stats
- enrich
- index
- index_recovery
- index_summary
- ml_job
- node
- node_stats
- pending_tasks
- shard
output.elasticsearch:
hosts: ["https://monitoring-es:9200"]
username: "metricbeat_writer"
password: "${MONITOR_WRITER_PASSWORD}"
Метрики лучше писать в отдельный мониторинговый кластер, а не в тот же, который мониторим — иначе при проблемах с основным кластером теряем и мониторинг.
Ключевые метрики
Cluster health — первое, на что смотреть:
-
green— все шарды (primary + replica) назначены -
yellow— primary шарды OK, часть replica не назначена (нормально для одного узла, проблема для продакшена) -
red— часть primary шардов не назначена, данные недоступны
JVM Heap Used % — критический показатель:
- < 75% — нормально
- 75–85% — мониторить, возможен частый GC
-
85% — опасная зона, производительность деградирует
-
95% — JVM замирает на GC, кластер перестаёт отвечать
Disk usage per node — ES блокирует индексацию при заполнении диска:
- Порог
flood_stage(по умолчанию 95%) — индекс переходит в read-only - Порог
high_watermark(90%) — начинается перебалансировка шардов - Порог
low_watermark(85%) — перебалансировка завершается, норма
Search latency — время выполнения запросов. p50, p95, p99. Смотреть на p95 — всплески на 1–2% запросов сигнализируют о проблемах.
Indexing rate — документов/сек. Резкое падение — проблемы с ресурсами.
Watcher — алерты в Elasticsearch
Elastic Watcher (X-Pack) — встроенный механизм алертов. Настраивается через API или Kibana UI.
Алерт на red статус кластера:
PUT _watcher/watch/cluster_status_red
{
"trigger": {
"schedule": {
"interval": "1m"
}
},
"input": {
"http": {
"request": {
"host": "localhost",
"port": 9200,
"path": "/_cluster/health",
"auth": {
"basic": {
"username": "elastic",
"password": "{{ctx.metadata.es_password}}"
}
}
}
}
},
"condition": {
"compare": {
"ctx.payload.status": {
"eq": "red"
}
}
},
"actions": {
"send_telegram": {
"webhook": {
"scheme": "https",
"host": "api.telegram.org",
"port": 443,
"method": "post",
"path": "/bot{{ctx.metadata.telegram_token}}/sendMessage",
"params": {
"chat_id": "{{ctx.metadata.telegram_chat_id}}",
"text": "ALERT: Elasticsearch cluster status is RED! Time: {{ctx.execution_time}}"
}
}
}
}
}
Алерт на заполнение диска > 85%:
PUT _watcher/watch/disk_usage_high
{
"trigger": {
"schedule": { "interval": "5m" }
},
"input": {
"http": {
"request": {
"path": "/_nodes/stats/fs",
"auth": { "basic": { "username": "elastic", "password": "changeme" } }
}
}
},
"condition": {
"script": {
"source": """
for (node in ctx.payload.nodes.values()) {
def total = node.fs.total.total_in_bytes;
def free = node.fs.total.free_in_bytes;
def used_pct = (total - free) / total * 100;
if (used_pct > 85) return true;
}
return false;
"""
}
},
"actions": {
"log": {
"logging": {
"level": "warn",
"text": "High disk usage detected on Elasticsearch node"
}
}
}
}
Настройка алертов через Kibana UI
В Kibana 8.x — раздел Alerts & Actions (Stack Management > Rules). Визуальный конструктор правил без написания JSON вручную.
Готовые шаблоны: Elasticsearch cluster health, nodes changed, version mismatch, CPU usage, JVM memory.
Каналы уведомлений: Email, Slack, PagerDuty, Webhook (Telegram, Teams).
Метрики через Prometheus + Grafana
Если инфраструктура уже использует Prometheus, подключить elasticsearch_exporter:
docker run -d \
--name elasticsearch_exporter \
-p 9114:9114 \
prometheuscommunity/elasticsearch-exporter:latest \
--es.uri=https://elastic:changeme@localhost:9200 \
--es.ssl-skip-verify \
--es.all \
--es.indices \
--es.shards
Prometheus scrape_config:
- job_name: 'elasticsearch'
static_configs:
- targets: ['localhost:9114']
scrape_interval: 30s
Импорт Grafana дашборда ID 6483 (Elasticsearch Overview) — готовый дашборд с основными метриками.
Логи Elasticsearch
Ключевые лог-файлы на каждом узле:
/var/log/elasticsearch/myapp-prod.log — основной лог
/var/log/elasticsearch/myapp-prod_gc.log — GC лог (анализировать при heap проблемах)
/var/log/elasticsearch/myapp-prod_server.log — системные события
Запросы медленного поиска логируются через slow log:
PUT /products/_settings
{
"index.search.slowlog.threshold.query.warn": "5s",
"index.search.slowlog.threshold.query.info": "2s",
"index.search.slowlog.threshold.fetch.warn": "1s",
"index.indexing.slowlog.threshold.index.warn": "5s"
}
Сроки
Базовый мониторинг через Kibana Stack Monitoring с Metricbeat — 1 рабочий день. Настройка алертов через Watcher или Kibana Rules с уведомлениями в Telegram/Slack — ещё 1 день. Grafana-дашборд с Prometheus — 1 день при наличии готовой инфраструктуры Prometheus.







