Введение в стэк ELK с использованием Laravel

Введение

ELK — это аббревиатура из названий трех продуктов: Elasticsearch, Logstash и Kibana.

Logstash — инструмент, который необходим для приема первичных данных из .log файлов и иных представлений. Посредством его работы информацию можно преобразовать и отправить в общее хранилище. В наших примерах и микросервисах данные модифицируются посредство базового кода, поэтому не требовалось использование этого сервиса.  

Elasticsearch — это механизм индексирования и хранения полученной информации, а также полнотекстового поиска по ней. Он является NoSQL решением, главная задача которого — организация быстрого и гибкого поиска по полученным данным. Работа с информацией происходит с помощью REST API, который позволяет добавлять, просматривать, модифицировать и удалять данные.

Можно выделить основное устройство Elasticsearch и провести косвенную аналогию с реляционными бд:

  • Индекс - база данных
  • Документ - таблица базы данных
  • Элемент - запись в таблице

Структуру каждого индекса и содержимое его документов задается с помощью мэппинга.

Kibana — это интерфейс для Elasticsearch, который имеет большое количество возможностей по поиску данных в индексах Elasticsearch и отображению этих данных в удобочитаемых видах таблиц, графиков и диаграмм, карт.

Работа с Elasticseach

Elasticsearch может быть развернут на локальном сервере с помощью системных администраторов или настроен в автоматическом режиме на одном из серверов https://www.elastic.co/

После базовой настройки можно приступить к написанию мэппинга и созданию необходимых индексов.

Эту задачу можно выполнить несколькими путями:

В данной статьей рассмотрим второй вариант. После установки пакета

composer install elasticsearch/elasticsearch

можно приступить к написанию кода с использованием основ, описанных в документации.

Например, с помощью данного сурдокода будет создан индекс, после чего к нему будет применен описанный мэппинг:

$params = [
    'index' => $index_name
];

$response = $this->es_api->indices()->create($params);

-------------------------------------------------------

$params = [
    'index' => $index_name,
    'body' => [
        'properties' => $properties
    ]
];

return $this->es_api->indices()->putMapping($params);
Мэппинг может быть описан как массив с указанием необходимых полей внутри документа:

Мэппинг может быть описан как массив с указанием необходимых полей внутри документа:

"properties" => [
    "appVersion" =>  [
        "type" => "keyword",
    ],
    "clientApplication" =>  [
        "type" => "keyword",
    ],
    "uid" =>  [
        "type" => "keyword",
    ],
    "ip" =>  [
        "type" => "ip",
    ],
    "usage_date" => [
        "type" => "date",
        "format"  => "yyyy-MM-dd HH:mm:ss"
    ],
    "os" =>  [
        "type" => "keyword",
    ]
]

Таким образом мы создали индекс и описали структуру его документа.
После можно приступить к отправке данных и созданию элементов в elasticsearch.  

Пример кода:

$this->elastic_search
     ->createBulk(ElasticSearch::MAIN_INFO_INDEX, $main_info);
-----------------------------------------------------------------
public function createBulk($index_name, $elements) {

    $params = [];

    foreach ($elements as $element) {
        $params['body'][] = [
            'index' => [
                '_index' => $index_name,
            ]
        ];

        $params['body'][]   = $element;
    }

    if (!empty($params)) {
        try {
            $responses = $this->es_api->bulk($params);
            return $responses;
        } catch (Exception $e) {
            Log::channel("elastic_search_errors")->error("Exception when calling es_api->bulk: ". $e->getMessage());
        }
    }
}

Данные в соответствии с мэппингом будут отправлены в Elasticsearch и готовы для дальнейшей работы с ними.

Введение в работу Kibana

Из личного кабинета https://www.elastic.co/ вы сможете перейти в интерфейс Kibana.
Для создания необходимых визуализаций необходимо привязать сервис к индексам из Elasticsearch.

Для этого из соответствующего раздела настроек потребуется создать индекс-паттерн, который и будет отслеживать механизм Kibana.

Созданный индекс-паттерн main_info

В разделе визуализаций возможно построение разных представлений данных.Самое распространенное Lens (содержит множество различных диаграмм и графиков) и Maps (карты и наложенные на них данные).

Выбор типа визуализации

Интерфейс Kibana дружественен к пользователю и предлагает интуитивно понятное взаимодействие с данными.

В левой части содержится выбранный индекс и структура его документа. Центральная и правая части отводятся для отображения представлений информации и различных форм её агрегирования.

В верхней панели находится строка ввода для написания простых KQL (kibana query language) запросов, которая автоматически подсказывает доступные варианты.

Интерфейс создания визуализации

После создания визуализации, её можно сохранить и разместить с другими на одном из дашбордов для удобного просмотра всех представлений данных.

Заключение

Таким образом, посредством изучения документации Elasticsearch PHP API и сервису, написанному с использованием фреймворка Laravel, возможен перенос большого количества данных в систему Elasticsearch, которая представит высокую скорость работы в сравнении с реляционной бд.

Kibana в свою очередь поможет представить информацию в удобном и понятно виде для последующего анализа.