Дашборды и агрегации логов

От поиска отдельных событий к картине целиком: агрегаты и дашборды по логам.

Агрегация в логах — это группировка событий по полю с подсчётом (например, «число ошибок по каждому сервису»), превращающая поток строк в график или таблицу.

Зачем агрегаты, если есть поиск

Discover отвечает на «покажи события». Дашборд отвечает на «как обстоят дела в целом»: сколько всего ошибок, какой сервис лидирует по сбоям, растёт ли число 500-х. Это уже не чтение строк, а агрегация миллионов событий в несколько чисел и графиков. На дашборд смотрят, чтобы заметить аномалию до того, как пользователи начнут жаловаться.

Типичные панели дашборда логов

Дашборд расследования обычно собирают из таких панелей:

  • Ошибки во времени — линейный график числа событий с level: ERROR по минутам. Всплеск виден сразу.
  • Топ сервисов по ошибкам — горизонтальная гистограмма: группировка по service.name, метрика — count, сортировка по убыванию. Видно виновника.
  • Распределение HTTP-статусов — круговая диаграмма по status: доля 2xx/4xx/5xx.
  • Топ ошибочных URL — таблица: группировка по url.path среди событий со status >= 500.
  • Карта запросов — по полю geo.location из geoip.
  +------------------+  +---------------------+
  | Ошибки/мин (line)|  | Топ сервисов (bar)  |
  |   __/\__/\___    |  | billing  ########   |
  |                  |  | auth     ####       |
  +------------------+  +---------------------+
  +------------------+  +---------------------+
  | Статусы (pie)    |  | Топ ошибочных URL   |
  |  5xx 12% 4xx 8%  |  | /api/checkout  431  |
  +------------------+  +---------------------+

Как работает под капотом: bucket и metric агрегации

Elasticsearch делит агрегации на два вида. Bucket-агрегации раскладывают события по корзинам: terms — по уникальным значениям поля (корзина на каждый сервис), date_histogram — по интервалам времени (корзина на минуту), range — по диапазонам. Metric-агрегации считают число внутри корзины: count, avg, sum, percentiles. График «ошибки по сервисам» — это terms по service.name (bucket) + count (metric). Kibana строит этот JSON за вас, но понимать механику полезно для сложных панелей.

{
  "aggs": {
    "by_service": {
      "terms": { "field": "service.name", "size": 10 }
    }
  }
}

Этот запрос вернёт по 10 топ-сервисам число их событий — ровно панель «топ сервисов по ошибкам» (с фильтром на level: ERROR).

Дашборд как инструмент, а не украшение

Частая ошибка — делать «красивый» дашборд со множеством панелей, на который никто не смотрит, потому что он не отвечает на конкретный вопрос. Полезный дашборд проектируют от задачи: дашборд дежурного отвечает «всё ли в порядке прямо сейчас» (свежие ошибки, аномалии, состояние ключевых сервисов) и обновляется в реальном времени; дашборд разбора инцидента помогает копать (распределения, топы, корреляции); дашборд для руководства показывает тренды за недели. Один универсальный дашборд «обо всём» обычно плох для всех трёх задач. Хорошее правило: каждая панель должна отвечать на вопрос, который кто-то реально задаёт, иначе её не должно быть.

Стоит помнить и о цене дашборда для кластера. Каждая панель — это агрегирующий запрос к Elasticsearch, и дашборд из двадцати панелей с автообновлением раз в пять секунд по широкому диапазону времени создаёт ощутимую постоянную нагрузку, конкурирующую с индексацией логов. Поэтому дашборды проектируют с оглядкой: разумный диапазон по умолчанию, не слишком частое автообновление, отказ от тяжёлых агрегаций с огромным size там, где хватит топ-10.

Частые ошибки

  • terms по полю text. Агрегация terms по text-полю либо не работает, либо разбивает значения на токены (получите корзины «billing» и «api» вместо «billing-api»). Агрегируйте по keyword.
  • Слишком большой size в terms. Запрос топ-10000 значений с высокой кардинальностью тяжёл для кластера. Берите разумный size.
  • Дашборд на «весь период». Дашборд, считающий агрегаты за месяцы по умолчанию, медленный и пугающий. Задавайте дефолтный разумный диапазон (последние 24 часа).

Итоги

  • Дашборды отвечают на «как дела в целом», агрегируя миллионы событий в графики и таблицы.
  • Типовые панели логов: ошибки во времени, топ сервисов, распределение статусов, топ URL, карта.
  • Под капотом — bucket-агрегации (terms, date_histogram) для группировки и metric-агрегации (count, avg) для чисел.
  • Агрегируйте по keyword-полям, иначе значения разобьются на токены.
Проверьте себя
1. Чем дашборд отличается от поиска в Discover?
AДашборд работает быстрее Discover на тех же данных
BДашборд агрегирует множество событий в графики и таблицы (картина в целом), а Discover показывает отдельные события
CДашборд не использует Elasticsearch
DМежду ними нет разницы
2. Какая комбинация агрегаций строит панель «топ сервисов по числу ошибок»?
Arange по времени + sum
Bterms по service.name (bucket) + count (metric)
Cdate_histogram + avg
Dpercentiles + terms
3. Почему агрегацию terms нужно делать по keyword-полю, а не по text?
Atext-поля занимают больше места
BПо text значение разбивается на токены, и вместо «billing-api» получатся отдельные корзины «billing» и «api»
Cterms вообще не работает с числами
Dkeyword быстрее индексируется