Привет, меня зовут Евгений, я тимлид B2B-направления в Ситимобил. Одной из задач нашей команды является поддержка интеграций по заказу такси от партнеров, и для обеспечения стабильного сервиса мы всегда должны понимать, что происходит в наших микросервисах. И для этого надо постоянно следить за логами.

В Ситимобил для работы с логами мы используем ELK-стек (ElasticSearch, Logstash, Kibana), и объём приходящих туда данных огромен. Найти в этой массе запросов проблемы, которые могут появиться после деплоя нового кода, довольно сложно. И для их наглядного выявления в Kibana есть раздел Dashboard.

На Хабре есть довольно много статей с примерами, как настроить ELK-стек для получения и хранения данных, но о создании Dashboard актуальных материалов нет. Поэтому я хочу показать, как в Kibana создавать визуальное представление данных на основе приходящих логов.


Настройка


Чтобы было нагляднее, я создал Docker-образ с ELK и Filebeat. И поместил в контейнер небольшую программу на Go, которая для нашего примера будет генерировать тестовые логи. Детально описывать конфигурирование ELK не буду, на Хабре достаточно написано об этом.

Клонируем репозиторий с конфигурацией docker-compose и настройками ELK, и запускаем его командой docker-compose up. Намеренно не добавляю ключ -d, чтобы видеть процесс работы ELK-стека.

git clone https://github.com/et-soft/habr-elk
cd habr-elk
docker-compose up

Если всё настроено правильно, то в логах мы увидим запись (возможно, не сразу, процесс запуска контейнера со всем стеком может занимать несколько минут):

{"type":"log","@timestamp":"2020-09-20T05:55:14Z","tags":["info","http","server","Kibana"],"pid":6,"message":"http server running at http://0:5601"}

По адресу localhost:5061 должна открыться Kibana.



Единственное, что нам нужно настроить, это создать Index Pattern для Kibana с информацией о том, какие данные надо отображать. Для этого выполним curl-запрос или сделаем ряд действий в графическом интерфейсе.

$ curl -XPOST -D- 'http://localhost:5601/api/saved_objects/index-pattern' \
    -H 'Content-Type: application/json' \
    -H 'kbn-xsrf: true' \
    -d '{"attributes":{"title":"logstash-*","timeFieldName":"@timestamp"}}'


Создание Index Pattern через графический интерфейс
Для настройки выбираем в левом меню раздел Discover, и попадаем на страницу создания Index pattern.


Нажав на кнопку «Create index pattern», попадаем на страницу создания индекса. В поле «Index pattern name» вводим «logstash-*». Если всё настроено правильно, ниже Kibana покажет попавшие под правило индексы.


На следующей странице выбираем ключевое поле с временной отметкой, в нашем случае это @timestamp.


В результате появится страница настроек индекса, но сейчас дополнительных действий от нас не требуется.



Теперь мы можем снова перейти в раздел Discover, где увидим записи логов.


Dashboard


В левом меню нажимаем на раздел создания Dashboard и попадаем на соответствующую страницу.


Нажимаем на «Create new dashboard» и попадаем на страницу добавления объектов в Dashboard.


Нажимаем на кнопку «Create new», и система предложит выбрать вид отображения данных. В Kibana их большое количество, но мы рассмотрим создание графического представления «Vertical Bar» и табличного «Data Table». Остальные виды представления настраиваются похожим образом. 

Некоторые доступные объекты имеют метки B и E — это означает, что формат экспериментальный или в стадии бета-тестирования. Со временем формат может поменяться или совсем исчезнуть из Kibana.

Vertical Bar


Для примера «Vertical Bar» создадим гистограмму соотношения успешных и неуспешных статусов ответа нашего сервиса. По окончании настроек получим следующий график:


К успешным мы будем относить все запросы со статусом ответа < 400, а к проблемным — >= 400.

Для создания графика «Vertical Bar» нам необходимо выбрать источник данных. Выбираем Index Pattern, который создали ранее.


По умолчанию, после выбора источника данных появится один сплошной график. Настроим его.


В блоке «Buckets» нажмем кнопку «Add», выберем «X-asis» и настроим ось Х. Отложим по ней временные отметки поступления записей в лог. В поле «Aggregation» выбираем «Date Histogram», а в «Field» выбираем «@timestamp», указывающий на временное поле. «Minimum interval» оставим в состоянии «Auto», и он будет автоматически подстраиваться под наше отображение. 


Нажав на кнопку «Update», мы увидим график с количеством запросов каждые 30 секунд.


Теперь настроим столбцы по оси Y. Сейчас у нас отображается общее число запросов в выбранный интервал времени.


Изменим значение «Aggregation» на «Sum Bucket», который позволит нам совместить данные по успешным и неуспешным запросам. В блоке Bucket -> Aggregation выбираем агрегацию по «Filters» и задаём фильтрацию по «statusCode >= 400». А в поле «Custom label» указываем наше название показателя для более понятного отображения в легенде на графике и в общем списке.


Нажав кнопку «Update» под блоком настроек, получим график с проблемными запросами.


Если нажать на круг около легенды, то появится окно, в котором можно поменять цвет столбцов.


Теперь добавим на график данные об успешных запросах. В разделе «Metrics» нажимаем кнопку «Add» и выбираем «Y-axis».


В созданной метрике делаем такие же настройки, как и для ошибочных запросов. Только в фильтре указываем «statusCode < 400».


Изменив цвет нового столбца, получим отображение соотношения проблемных и успешных запросов.


Нажав в верхней части экрана кнопку «Save» и указав название, мы увидим на Dashboard первый график.


Data Table


Теперь рассмотрим табличное представление «Data Table». Создадим таблицу со списком всех URL, к которым были запросы, и число этих запросов. Как и в примере с Vertical Bar, сначала выбираем источник данных.


После этого на экране отобразится таблица с одной колонкой, которая показывает общее число запросов за выбранный интервал времени.


Мы будем изменять только блок «Buckets». Нажимаем кнопку «Add» и выбираем «Split rows».


В поле «Aggregation» выбираем «Terms». А в появившемся поле «Field» выбираем «url.keyword».


Указав в поле «Custom label» значение «Url» и нажав «Update», мы получим желаемую таблицу с числом запросов по каждому из URL за выбранный промежуток времени.


В верхней части экрана снова нажмём кнопку «Save» и укажем название таблицы, например Urls. Вернемся назад на Dashboard и увидим оба созданных отображения.


Работа с Dashboard


Создавая Dashboard, в настройках объектов отображения мы устанавливали только основные параметры вида. Нет смысла указывать в объектах данные для фильтров, например, «диапазон дат», «фильтрацию по useragent», «фильтрацию по стране запроса» и т.д. Гораздо удобнее указывать желаемый временной промежуток или задавать необходимую фильтрацию в панели запросов, которая находится над объектами.


Добавленные на этой панели фильтры применятся ко всему Dashboard, и все объекты отображения перестроятся в соответствии с актуальными отфильтрованными данными.

Заключение


Kibana — мощный инструмент, позволяющий визуализировать любые данные в удобном виде. Я постарался показать настройку двух основных видов отображения. Но и другие виды настраиваются похожим образом. А обилие настроек, которые я оставил «за кадром», позволят вам очень гибко настраивать графики под свои потребности.