Мониторинг системы

Мониторинг системы — инструмент для поддержания стабильности и эффективности платформы управления данными. Архитектура поддерживает интеграцию с системами наблюдения через Micrometer, а также предоставляет REST API для пользовательских метрик, что делает ее удобным инструментом для разработчиков и системных администраторов.

Сбор метрик

Сбор метрик производится двумя путями:

  • Внешними мониторинговыми системами, которые поддерживают Micrometer (https://micrometer.io/). Метрики, которые собираются этим способом являются динамическими.

  • Получение метрик через новые запросы REST API приложения. Эти метрики являются статическими.

Для получения динамических метрик должен быть реализован отдельный модуль, который будет регистрировать необходимую имплементацию io.micrometer.core.instrument.MeterRegistry в компоненте com.universe.mdm.monitoring.core.service.DynamicMetricsComponent.

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

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

Статистические метрики

Для добавления разработчиком новой статической метрики необходимо вызвать метод com.universe.mdm.monitoring.core.service.StaticMetricsComponent#add.

Стандартные статические метрики:

  • com.universe.mdm.monitoring.core.cluster.size – размер кластера Universe (количество узлов).

Динамические метрики

Для добавления разработчиком новой динамической метрики необходимо вызвать один из статических методов класса org.unidata.mdm.system.type.monitoring.UniverseMetrics.

Типы метрик:

  • Counter (счетчик) – метрика, которая отслеживает монотонно возрастающее значение (вещественное число). Увеличение значения происходит вручную разработчиком в коде.

  • Timer (таймер) – метрика, которая отслеживает количество и длительность событий. Запись длительности события происходит вручную разработчиком в коде.

  • Distribution summary (распределение значений) – метрика, которая отслеживает количество и некоторую численную характеристику событий. Таймер является ее частным случаем, где численной характеристикой событий является их длительность. Запись некоторой численной характеристики события происходит вручную разработчиком в коде.

  • Gauge (датчик) – метрика, которая отслеживает значение некой численной характеристики. Разработчик предоставляет способ получения значения датчика, система мониторинга самостоятельно проверяет значение.

  • Function counter (счетчик от функции) – метрика, которая отслеживает монотонно возрастающее значение (вещественное число). Разработчик предоставляет способ получения значения счетчика, система мониторинга самостоятельно проверяет значение.

  • Function timer (таймер от функции) – метрика, которая отслеживает два монотонно возрастающих значения: число событий и общее длительность этих событий. Разработчик предоставляет способ получения значения счетчика событий и их общей длительности, система мониторинга самостоятельно проверяет эти значения.

Идентификаторы метрик:

  • Метрики имеют уникальный идентификатор, состоящий из следующих элементов: - Имя; - Набор тегов (тегом является пара из ключа и значения), набор может быть пустым.

  • Дополнительными свойствами идентификаторов являются: - Описание; - Единица измерения.

По умолчанию всем метрикам добавляется тег universe.cluster.node, значением которого является ID текущего узла кластера Universe.

Текущие метрики приложения Universe MDM (список может изменяться):

  • workflow.task.complete.time – таймер, который собирает длительность времени выполнения пользовательских задач бизнес-процессов (время между созданием задачи и ее завершением).

    • У метрики присутствует тег process.definition.id – ID бизнес-процесса в модели бизнес-процессов.

  • http.requests.time – таймер, который собирает длительность обработки HTTP-запросов.

    • Метрики имеют теги:

      • http.method – метод HTTP (GET, POST, DELETE и т.д.);

      • http.path.template – шаблон пути запроса, например, /universe-backend/api/v2/data/model/nested-entities/{id};

      • http.response.code – HTTP код статуса ответа (200, 500 и т.п.).

  • database.connection.pool.total – датчик количества существующих подключений к БД.

  • database.connection.pool.available – датчик количества неиспользуемых подключений к БД.

    • Метрики имеют теги:

      • pool.name – имя пула подключений;

      • xa – значение true, если пул поддерживает распределенные транзакции (используется Hikari для этого пула), и false, если пул не поддерживает распределенные транзакции (используется Bitronix для этого пула).

  • data.import.xlsx.total.time – таймер, который отслеживает длительность обработки запросов импорта записей через XLSX.

  • data.import.xlsx.average.time.per.record – таймер, который отслеживает длительность обработки запросов импорта записей через XLSX в среднем на одну запись.

  • universe.async.rare.task.total – счетчик числа задач, выполненных в AsyncRareTaskExecutor.

Метрики Micrometer:

  • Метрики JVM – различные метрики о состоянии виртуальной машины Java: количество тредов, работа сборщика мусора, используемая память и т.п;

  • Метрики логирования – число записей в лог по уровню (поддерживаются и Logback из стандартной поставки, и Log4j из кастомных сборок);

  • Метрики Tomcat – различные метрики о состоянии Tomcat;

  • Метрики системы – различные метрики о состоянии системы: загруженность CPU и т.п.