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

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

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

В этой статье представлены идеи о том, КАКотслеживать ключевые показатели эффективности вашего приложения, используя преимущества практики структурированного ведения журнала и стека инструментов Elasticsearch & Kibana ('ELK'). Результатом станет высококачественный и эффективный механизм мониторинга приложений, который легко настроить и масштабировать при необходимости. Интерфейс мониторинга будет представлять собой панель инструментов Kibana, построенную из различных визуализаций.

Структурированное ведение журнала

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

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

Стек Elasticsearch (ELK)

Стек ELK — это бесплатное решение, состоящее из нескольких проектов с открытым исходным кодом. Мы сосредоточимся на двух из них: Elasticsearch — распределенной поисковой системе на основе JSON и Kibana — мощном интерфейсе к системе с функциями визуализации и наблюдения. Ниже представлена ​​информация о компании.

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

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

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

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

Информационные панели –коллекция визуализаций, которые можно легко настроить и спроектировать в соответствии со своими потребностями. Вы также можете управлять диапазоном времени и фильтровать определенные значения, просто щелкнув любое поле, отображаемое на панели инструментов. Со всеми этими функциями мы можем создать красивую и полезную панель инструментов для различных целей и типов пользователей (уровень управления, техническая группа, бизнес-пользователи и т. д.).

Запросы — будучи одной из ведущих поисковых систем на сегодняшний день, вы можете убедиться, что стек ELK предоставляет все возможности запросов и агрегирования. Как поисковая система, она погружается гораздо (!) глубже, чем просто базовые функции запросов, охватывая такие важные понятия, как точность поиска, полнота и многое другое. Однако вся эта мощь имеет свою цену, поскольку язык запросов уникален для стека ELK (в отличие от других инструментов запросов на основе SQL), а это означает, что есть кривая обучения и многое, что нужно переварить. Это один из недостатков Elasticsearch. Тема возможностей поиска выходит за рамки данной статьи, при необходимости ознакомьтесь с документацией ELK.

The Other — Light Choice: инструмент Seq

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

Практический пример использования ELK для мониторинга KPI вашего приложения — шаг за шагом

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

Приведенный ниже пример взят из приложения .NET, процесс будет одинаковым в разных платформах.

Настроить библиотеку журналов — мы будем использовать Serilog в качестве нашей библиотеки журналов. Serilog — это сторонняя библиотека ведения журналов .NET с открытым исходным кодом. Его легко настроить в приложении и переопределить встроенное ведение журнала Microsoft, оно ориентировано на структурированное ведение журнала, имеет большое сообщество пользователей и относительно хорошую документацию. Serilog также поставляется с готовыми интеграциями с широким спектром инструментов и платформ. Эти интеграции называются Sinks и доступны при добавлении соответствующих пакетов. Один из этих приемников интегрируется со стеком ELK, который мы будем использовать. Ниже приведены пакеты Serilog, которые я использовал.

/*csproj file*/
    <PackageReference Include="Serilog.Settings.Configuration" Version="3.2.0" />
    <PackageReference Include="Serilog.Sinks.Elasticsearch" Version="8.4.1" />

Далее мы добавим необходимые настройки для Serilog в JSON-файл app.settings.

"Serilog": {
    "ElasticsearchUri": "MY_ELK_SERVER_URI",
    "ElasticsearchUsername": "USERNAME",
    "ElasticsearchPassword": "PASSWORD",
    "Name": "SOME_FIELD",
    "Tool": "SOME_FIELD",
    "MinimumLevel": {
      "Default": "Information",
      "Override": {
        "Microsoft": "Information",
        "System": "Warning"
      }
    },
    "IndexFormat": "MY_INDEX_NAME"
  }

Последним шагом будет создание регистратора с его конфигурациями в файле Program.cs. В этом примере используется базовая аутентификация по имени пользователя и паролю.

var builder = new ConfigurationBuilder();
BuildConfig(builder);
Log.Logger = new LoggerConfiguration()
                .ReadFrom.Configuration(builder.Build())
                .Enrich.FromLogContext()
                .Enrich.WithProperty("Server", builder.Build().GetSection("Serilog")["Name"])
                .Enrich.WithProperty("Tool", builder.Build().GetSection("Serilog")["Tool"])
                .WriteTo.Elasticsearch(new ElasticsearchSinkOptions(new Uri(builder.Build().GetSection("Serilog")["ElasticsearchUri"]))
                {
                    ModifyConnectionSettings = x =>
                        x.BasicAuthentication(builder.Build().GetSection("Serilog")["ElasticsearchUsername"],
                            builder.Build().GetSection("Serilog")["ElasticsearchPassword"]),
                    AutoRegisterTemplateVersion = AutoRegisterTemplateVersion.ESv7,
                    AutoRegisterTemplate = true,
                    IndexFormat = builder.Build().GetSection("Serilog")["IndexFormat"]
                })
                .CreateLogger();

Конфигурации сделаны. Теперь, в каждом классе, который мы хотели бы использовать наш регистратор, все, что нам нужно сделать, это внедрить класс интерфейса ILogger (используя внедрение зависимостей) и использовать его функции API. Поскольку мы уже настроили переопределение регистратора по умолчанию, будет использоваться Serilog. Существует несколько уровней ведения журнала, наиболее часто используемые из них — «Отладка», «Информация», «Предупреждение», «Ошибка» и «Критический». Ниже приведен пример внедрения зависимостей и API ведения журнала.

/*Class (.cs file)*/

private readonly ILogger<CLASS_NAME> _log;
//Constructor
public CLASS_NAME(ILogger<CLASS_NAME> logger)
        {
            _log = logger;
        }
  
private void Func(List<CLASS_NAME> list)
{
foreach (var inst in list)
   {
        _log.LogWarning("Db Monitor - Low Wifi Signal: Institution:   {Title}, Number of Patients: {NumOfPatientsLowWifiCount}."
         , inst.title, inst.count);
    }
}

Установка ELK — вам потребуется установить Elasticsearch и Kibana. Они могут быть размещены в Windows, Linux, macOS, а также могут работать в Docker. Вот список предоставляемых инсталляционных пакетов. Вот пошаговое руководство по локальной установке. Каждый документ (данные), который регистрируется в ELK, принадлежит определенному индексу. После завершения установки вам нужно будет создать индекс из Kibana, и все готово. Не забудьте обновить app.settings, указав новое имя индекса.

Моя версия стека ELK — 7.8.1.

Визуализации ELK

Как только ваши данные журнала будут успешно отправлены в новый индекс ELK, вы сможете просмотреть их на странице обнаружения (меню →Kibana →Discover). Убедитесь, что вы выбрали правильный индекс для просмотра данных. Развернув строку данных, вы увидите список полей, отправленных вами как часть структурированных данных журнала. В первый раз, если вы видите восклицательный знак рядом с именем поля — это означает, что это поле еще не сопоставлено, вам нужно будет обновить список полей индекса, чтобы иметь возможность запрашивать (или визуализировать) на основе этого поля. Чтобы обновить список полей индекса, перейдите в «Управление» → «Управление стеком» → «Kibana» → «Шаблоны индексов» → выполните поиск и щелкните соответствующий индекс → нажмите значок «Обновить список полей» в правом верхнем углу страницы.

Мы готовы построить визуализацию. Перейдите в меню к Kibana → Visualize и создайте новую визуализацию. Мы рассмотрим пример построения вертикальной перекладины.

Большинство визуализаций в Kibana имеют 3 раздела настроек: Данные, Метрики и оси и Настройки панели.

Данные: сначала выберите ось Y, которая представляет собой показатель агрегации данных, который будет отображаться на этой гистограмме. Здесь есть различные варианты агрегирования. В этом примере мы выбираем обычный «Количество», который просто отображает количество релевантных документов и не требует дополнительных настроек.

Перейдите к настройкам оси X. В Kibana это называется Buckets. Вы также должны выбрать метод агрегации. Здесь мы выбираем опцию «Условия», которая позволяет вам выбрать определенное поле (из тех полей, которые вы регистрируете) и установить предпочтение заказа.

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

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

Настройки панели: Еще несколько легенд, порогов и настроек сетки. Мы оставим его со значениями по умолчанию.

Сохраните визуализацию, чтобы выполнить эту задачу.

Другие типы визуализаций, настроенные на этой панели:

  • Линейный график: Агрегирование по максимуму корзины гистограммы метрики и даты.
  • Круговая диаграмма: агрегирование суммы метрики и сегмента полей терминов.
  • Таблица данных: 4 поля терминов сегментов и 3 метрики агрегирования.

Информационные панели ELK

Панель инструментов в ELK — это не что иное, как набор визуализаций, отображаемых на одной странице. Функциональность панели управления гибкая и интуитивно понятная. Перейдите в Kibana → Dashboard и создайте новый. Затем нажмите «добавить существующий», чтобы выбрать визуализации, которые мы только что создали выше. После добавления вы можете перетаскивать и настраивать размер каждой визуализации с помощью маленькой стрелки в правом нижнем углу окна. Другие параметры доступны под кнопкой шестеренки в правом верхнем углу каждой визуализации.

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

Сохраните панель мониторинга, чтобы выполнить эту задачу.

Мы сделали. Все, что вам нужно, это убедиться, что данные вашего журнала продолжают передаваться в ELK. Оттуда ваш новый инструмент мониторинга будет выполнять свою работу, продолжать обрабатывать данные и отображать их в удобочитаемой и удобной форме. Вы можете поделиться своим дашбордом с коллегами (Поделиться → Постоянные ссылки).

Любой зритель может настроить временной диапазон панели мониторинга, отфильтровать значения, просто щелкнув значки (+) и (-) при наведении курсора на соответствующие поля, или просмотреть конкретную визуализацию, чтобы получить всю необходимую информацию с панели инструментов.

Бонус — создание визуализации тепловой карты с помощью Kibana

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

Для создания новой визуализации карты перейдите в меню Kibana → Карты → Создать карту.

Добавление слоя карты. Одна из замечательных особенностей карт Kibana — это длинный список готовых к использованию карт, доступных в Elastic Maps Service. На момент написания этих строк доступно более 70 карт, включая карту стран мира, штаты США, провинции Китая и многие другие страны и регионы.

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

Добавление слоя данных. Наведите указатель мыши на слой карты, который мы только что добавили, и щелкните значок карандаша, чтобы отредактировать слой. В разделе «Объединение терминов» щелкните значок (+), чтобы добавить новый термин. Левый источник — это первый добавленный нами слой карты, выберите поле для объединения данных, в моем случае это английское название провинции. Правильный источник — наши данные журнала. Сначала выберите индекс, затем соответствующее поле данных структурированного журнала для сравнения с левым полем карты. В моем случае это поле под названием «Провинция» (оно должно быть идентично английскому названию, представленному полем «имя (en)» левого источника).

После завершения определения термина соединения наведите указатель мыши на строку «использовать метрику» в запросе «Соединение терминов». Метрика по умолчанию — «количество», мы изменим ее на «Среднее» и выберем соответствующее поле данных журнала структуры — Всего клиентов.

Теперь на карте отображается новая метрика — среднее значение поля Total Customers на карте по отношению к соответствующему полю данных провинции. Наконец, чтобы иметь эффект тепловой карты в отношении значения Total Customers — прокрутите вниз до раздела «Стиль слоя» и установите для параметра «Цвет заливки» значение «По значению», выберите поле клиентов и ваш любимый цвет, в моем случае это зеленый.

Мы сделали. Конечным результатом является визуализация тепловой карты, которая показывает уровень значения поля (Всего клиентов) по отношению к местоположению на карте (Провинция). Чем он зеленее, тем выше значение. Это отличный способ визуализировать географические данные на красивой интерактивной карте. Теперь вы можете добавить эту карту на панель инструментов, как и любую другую визуализацию, после чего пользователь сможет взаимодействовать с картой, наводя курсор на провинции, чтобы увидеть значения, увеличить или уменьшить масштаб или добавить фильтр. Как всегда, карты Kibana предлагают гораздо больше опций и возможностей, не стесняйтесь копаться и узнавать.

Конец.

Став Софер, февраль 2022 г.