Дашборды и агрегации логов
От поиска отдельных событий к картине целиком: агрегаты и дашборды по логам.
Агрегация в логах — это группировка событий по полю с подсчётом (например, «число ошибок по каждому сервису»), превращающая поток строк в график или таблицу.
Зачем агрегаты, если есть поиск
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-полям, иначе значения разобьются на токены.