Поиск по сайту:

Как настроить панель аналитики и мониторинга Elasticsearch для вашего бизнеса


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

Почему сбор данных полезен?

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

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

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

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

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

Что такое эластичный поиск?

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

Хотя вы также можете использовать готовые аналитические пакеты, такие как Google Analytics, Elasticsearch дает вам возможность создавать собственные информационные панели и визуализации на основе любых данных. Это схема-агностик; вы просто отправляете ему несколько журналов для хранения, и он индексирует их для поиска.

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

Вы можете загружать журналы в Elasticsearch двумя основными способами: загружать журналы на основе файлов или напрямую через API или SDK. Чтобы упростить первое, Elastic предоставляет Beats, облегченные поставщики данных, которые вы можете установить на свой сервер для отправки данных в Elasticsearch. Если вам нужна дополнительная обработка, есть также Logstash, конвейер сбора и преобразования данных для изменения журналов перед их отправкой в Elasticsearch.

Хорошим началом будет прием существующих журналов, таких как журналы доступа к веб-серверу NGINX или файловые журналы, созданные вашим приложением, с отправителем журналов на сервере. Если вы хотите настроить принимаемые данные, вы также можете регистрировать документы JSON непосредственно в API Elasticsearch. Мы обсудим, как настроить оба ниже.

Если вместо этого вы в основном используете общий веб-сайт, вы также можете заглянуть в Google Analytics, бесплатный пакет аналитики, адаптированный для владельцев веб-сайтов. Вы можете прочитать наше руководство по инструментам веб-аналитики, чтобы узнать больше.

Установка эластичного поиска

Первый шаг — запустить Elasticsearch на вашем сервере. Мы покажем шаги для дистрибутивов Linux на основе Debian, таких как Ubuntu, но если у вас нет apt-get, вы можете следовать инструкциям Elastic для своей операционной системы.

Для начала вам нужно добавить репозитории Elastic в вашу установку apt-get и установить некоторые предварительные условия:

wget -qO - https://artifacts.elastic.co/GPG-KEY-elasticsearch | sudo apt-key add -
sudo apt-get install apt-transport-https
echo "deb https://artifacts.elastic.co/packages/7.x/apt stable main" | sudo tee /etc/apt/sources.list.d/elastic-7.x.list

И, наконец, устанавливаем сам Elasticsearch:

sudo apt-get update && sudo apt-get install elasticsearch

По умолчанию Elasticsearch работает на порту 9200 и не защищен. Если вы не настроили дополнительную аутентификацию и авторизацию пользователей, вам следует держать этот порт закрытым на сервере.

Что бы вы ни делали, вы должны убедиться, что это не просто открыто для Интернета. На самом деле это обычная проблема с Elasticsearch; потому что по умолчанию он не имеет никаких функций безопасности, и если порт 9200 или веб-панель Kibana открыты для всего Интернета, любой может прочитать ваши журналы. Microsoft допустила эту ошибку с сервером Bing Elasticsearch, предоставив 6,5 ТБ журналов веб-поиска.

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

Настройка и защита Kibana

Kibana — это панель визуализации:

sudo apt-get update && sudo apt-get install kibana

Вам нужно включить службу, чтобы она запускалась при загрузке:

sudo /bin/systemctl daemon-reload
sudo /bin/systemctl enable kibana.service

Дополнительная настройка не требуется. Теперь Kibana должна работать на порту 5601. Если вы хотите изменить это, вы можете отредактировать /etc/kibana/kibana.yml.

Вы обязательно должны держать этот порт закрытым для публики, так как по умолчанию аутентификация не настроена. Однако вы можете внести свой IP-адрес в белый список, чтобы получить к нему доступ:

sudo ufw allow from x.x.x.x to any port 5601

Лучшее решение — настроить обратный прокси-сервер NGINX. Вы можете защитить это с помощью базовой аутентификации, чтобы любой, кто пытается получить к нему доступ, должен был ввести пароль. Это делает его открытым из Интернета без включения IP-адресов в белый список, но защищает его от случайных хакеров.

Даже если у вас установлен NGINX, вам необходимо установить apache2-utils и создать файл паролей с помощью htpasswd:

sudo apt-get install apache2-utils
sudo htpasswd -c /etc/nginx/.htpasswd admin

Затем вы можете создать новый файл конфигурации для Kibana:

sudo nano /etc/nginx/sites-enabled/kibana

И вставьте следующую конфигурацию:

  upstream elasticsearch {
    server 127.0.0.1:9200;
    keepalive 15;
  }

  upstream kibana {
    server 127.0.0.1:5601;
    keepalive 15;
  }

  server {
    listen 9201;
    server_name elastic.example.com;

    location / {
      auth_basic "Restricted Access";
      auth_basic_user_file /etc/nginx/.htpasswd;


      proxy_pass http://elasticsearch;
      proxy_redirect off;
      proxy_buffering off;

      proxy_http_version 1.1;
      proxy_set_header Connection "Keep-Alive";
      proxy_set_header Proxy-Connection "Keep-Alive";
    }

  }

  server {
    listen 80;
    server_name elastic.example.com;

    location / {
      auth_basic "Restricted Access";
      auth_basic_user_file /etc/nginx/.htpasswd;

      proxy_pass http://kibana;
      proxy_redirect off;
      proxy_buffering off;

      proxy_http_version 1.1;
      proxy_set_header Connection "Keep-Alive";
      proxy_set_header Proxy-Connection "Keep-Alive";
    }
  }

Этот конфиг настраивает Kibana на прослушивание порта 80, используя файл паролей, который вы создали ранее. Вам нужно изменить elastic.example.com, чтобы оно соответствовало названию вашего сайта. Перезапустите NGINX:

sudo service nginx restart

И теперь вы должны увидеть панель инструментов Kibana после ввода пароля.

Вы можете начать работу с некоторыми образцами данных, но если вы хотите извлечь из этого что-то значимое, вам нужно будет приступить к отправке собственных журналов.

Подключение грузоотправителей бревен

Чтобы загрузить журналы в Elasticsearch, вам необходимо отправить их с исходного сервера на ваш сервер Elasticsearch. Для этого Elastic предоставляет легкие грузоотправители бревен под названием Beats. Есть множество битов для разных вариантов использования; Metricbeat собирает системные показатели, такие как загрузка ЦП. Packetbeat — это анализатор сетевых пакетов, который отслеживает данные трафика. Heartbeat отслеживает время безотказной работы URL-адресов.

Самый простой из них для большинства основных журналов называется Filebeat, и его можно легко настроить для отправки событий из файлов системного журнала.

Установите Filebeat из apt. Кроме того, вы можете скачать бинарный файл для своего дистрибутива:

sudo apt-get install filebeat

Чтобы настроить его, вам нужно отредактировать файл конфигурации:

sudo nano /etc/filebeat/filebeat.yml

Здесь есть две основные вещи для редактирования. В разделе filebeat.inputs вам нужно изменить «enabled» на true, а затем добавить все пути журналов, которые Filebeat должен искать и отправлять.

Затем в разделе «Вывод Elasticsearch»:

Если вы не используете localhost, вам необходимо добавить имя пользователя и пароль в этом разделе:

username: "filebeat_writer" 
password: "YOUR_PASSWORD"

Затем запустите Filebeat. Имейте в виду, что после запуска он сразу же начнет отправлять все предыдущие журналы в Elasticsearch, что может содержать много данных, если вы не меняете файлы журналов:

sudo service filebeat start

Использование Kibana (осмысление шума)

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

Шаблон индекса может соответствовать нескольким индексам с использованием подстановочных знаков. Например, по умолчанию Filebeat ведет журналы, используя индексы на основе ежедневного времени, которые можно легко заменить через несколько месяцев, если вы хотите сэкономить место:

filebeat-*

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

Вы можете просмотреть журналы на вкладке «Обнаружение» на боковой панели. Filebeat индексирует документы с отметкой времени на основе того, когда они были отправлены в Elasticsearch, поэтому, если вы уже некоторое время используете свой сервер, вы, вероятно, увидите много записей в журнале.

Если вы никогда раньше не искали свои журналы, вы сразу поймете, почему наличие открытого SSH-порта с аутентификацией по паролю — это плохо: поиск «неверный пароль» показывает, что на этом обычном сервере Linux без отключенного входа с паролем есть более 22 000 журналов. записи от автоматических ботов, пробующих случайные пароли root в течение нескольких месяцев.

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

Визуализации состоят из двух компонентов: метрик и сегментов. В разделе «Метрики» значения вычисляются на основе полей. На площадном графике это представляет ось Y. Это включает, например, получение среднего значения всех элементов или вычисление суммы всех записей. Min/Max также полезны для обнаружения выбросов в данных. Процентильные ранги могут быть полезны для визуализации единообразия данных.

Сегменты в основном организуют данные в группы. На площадном графике это ось X. Простейшей формой этого является гистограмма даты, которая показывает данные во времени, но она также может группироваться по значимым терминам и другим факторам. Вы также можете разделить всю диаграмму или серию по определенным терминам.

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

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

Прямое ведение журнала API

Ведение журнала с помощью Beats удобно для подключения Elasticsearch к существующим службам, но если вы используете собственное приложение, может иметь смысл отказаться от посредника и напрямую регистрировать документы.

Прямая регистрация довольно проста. Elasticsearch предоставляет API для этого, поэтому все, что вам нужно сделать, это отправить документ в формате JSON по следующему URL-адресу, заменив indexname индексом, в который вы публикуете:

http://example.com:9200/indexname/_doc

Вы можете, конечно, сделать это программно с языком и библиотекой HTTP по вашему выбору.

Однако, если вы отправляете несколько журналов в секунду, вы можете реализовать очередь и массово отправлять их по следующему URL-адресу:

http://example.com:9200/_bulk

Однако он предполагает довольно странное форматирование: пары объектов, разделенные новой строкой. Первый задает используемый индекс, а второй — фактический документ JSON.

{ "index" : { "_index" : "test"} }
{ "field1" : "value1" }
{ "index" : { "_index" : "test2"} }
{ "field1" : "value1" }
{ "index" : { "_index" : "test3"} }
{ "field1" : "value1" }

Возможно, у вас нет готового способа справиться с этим, поэтому вам, возможно, придется справиться с этим самостоятельно. Например, в C# вы можете использовать StringBuilder как эффективный способ добавления необходимого форматирования к сериализованному объекту:

private string GetESBulkString<TObj>(List<TObj> list, string index)
{
      var builder = new StringBuilder(40 * list.Count);

      foreach (var item in list)
      {
           builder.Append(@"{""index"":{""_index"":""");
           builder.Append(index);
           builder.Append(@"""}}");

           builder.Append("n");

           builder.Append(JsonConvert.SerializeObject(item));
           builder.Append("n");
       } 

       return builder.ToString();
}