Налаштування моніторингу та алертів 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.







