5.10. Телеметрия#
Сервер приложений предоставляет возможность экспорта телеметрической информации (трассировка, метрики и логи) во внешние аналитические системы (Grafana) по стандарту OpenTelemetry.
Функциональность реализуется библиотекой OpenTelemetry Sdk v.1.34.0.
See also
5.10.1. Трассировки#
Трассировки необходимы для понимания полного «пути», который проходит запрос в приложении.
See also
5.10.1.1. Диапазон трассировки (Span)#
Диапазон представляет собой отдельную операцию в пределах трассировки. Диапазоны могут быть вложены друг в друга, образуя
дерево трассировки. Диапазон создаётся перед выполнением (в начале) трассируемого
действия вызовом метода CoreTracer.startSpan()
и завершается после (в конце)
трассируемого действия вызовом метода CoreSpan.end()
.
CoreTelemetry coreTelemetry = CoreServer$.MODULE$.getInstance().getCurrentSolution().getTelemetry();
CoreTracer tracer = coreTelemetry.getTracer("ru.bitec.app.module");
CoreSpan span = tracer.startSpan("traced_action", new HashMap<>(), new HashMap<>(), new HashMap<>());
try {
span.addEvent("do_work");
} finally {
span.end();
}
See also
5.10.1.2. Приостанавливаемый диапазон (Pausable Span)#
Каждому рабочему сеансу с графическим интерфейсом выделяется поток, обрабатывающий команды, поступающие от клиентского
приложения. Обработка команд выполняется в бесконечном цикле. Если обработка команды привела к открытию
модального окна
или диалога
в интерфейсе пользователя, поток входит во вложенный цикл обработки команд. Это позволяет сохранить
(не раскручивать) стек вызовов, приведший к открытию модальной формы (диалога). Выход из вложенного цикла произойдёт
после закрытия модального окна (диалога). Поток может находиться во вложенном цикле неограниченное время, т.к. пользователь
может сколь угодно долго не закрывать модальную форму.
Наличие вложенных циклов приводит к искажению картины трассировки в аналитической системе (Grafana). Из-за того что все созданные, до момента открытия формы (диалога), диапазоны трассировки остаются активными и завершение диапазонов произойдёт только после закрытия формы (диалога) и выхода из вложенного цикла обработки команд, к длительности обработки команд могут добавляться неопределённые интервалы времени.
Для устранения времени ожиданий из трассировок, рабочим сеансам с графическим интерфейсом добавлен механизм приостановки активности всех диапазонов трассировки потока на время не активности потока:
диапазоны завершаются при входе потока во вложенный цикл обработки команд.
диапазоны воссоздаются перед началом обработки команды вложенным циклом.
диапазоны завершаются после обработки команды вложенным циклом.
диапазоны воссоздаются после выхода потока из вложенного цикла.
5.10.1.3. Ленивый диапазон (Lazy Span)#
Диапазоны трассировок определяются в коде. Экземпляры CoreSpan
создаются не зависимо от активности
трассировки в конфигурационном файле. С увеличением объёма бизнес-логики и числа
пользователей увеличивается число трассировок. Для возможности включения трассировок для отдельных участков прикладного
кода и/или пользователей реализован механизм создания ленивых диапазонов трассировок.
CoreTelemetry coreTelemetry = CoreServer$.MODULE$.getInstance().getCurrentSolution().getTelemetry();
CoreTracer tracer = coreTelemetry.getTracer("ru.bitec.app.module");
CoreSpan span = tracer.startSpan("traced_action",
new HashMap<String, Object>() {{
put(SpanOptions.LAZY, true);
put(SpanOptions.MAX_LAZY_DURATION_NANOS, TimeUnit.SECONDS.toNanos(2));
}}, new HashMap<>(), new HashMap<>());
try {
span.addEvent("do_work");
} finally {
span.end();
}
Note
При активации ленивого диапазона создаётся “реальный” диапазон, регистрирующий события, и отображаемый в аналитической системе.
Ленивые диапазоны активируются при:
создании вложенного не ленивого диапазона.
активации вложенного ленивого диапазона.
длительность трассируемого действия превышает
максимальную длительность пребывания диапазона в неактивном состоянии
. Создание “реального” диапазона происходит при вызовеCoreSpan.end()
для ленивого диапазона.
Caution
Ленивые диапазоны реализованы только для рабочих сеансов с графическим интерфейсом.
События, записанные методами CoreSpan.addEvent()
и CoreSpan.recordException()
в
ленивый диапазон до его активации, не будут переданы в аналитическую систему.
5.10.2. Метрики#
Метрика — это измерение услуги, полученное во время выполнения. Момент регистрации измерений известен как метрическое событие, которое состоит не только из самого измерения, но также из времени, в которое оно было получено, и связанных с ним метаданных.
Метрики приложений и запросов являются важными показателями доступности и производительности. Пользовательские метрики могут дать представление о том, как индикаторы доступности влияют на взаимодействие с пользователем или на бизнес. Собранные данные можно использовать для оповещения о сбое или принятия решений по планированию для автоматического масштабирования развертывания при высоком спросе.
Доступные инструменты
Счётчик
Гистограмма
Спидометр
5.10.3. Логи#
Перенаправление стандартных Java логов на внешний сервер телеметрии.
See also
5.10.4. Конфигурирование#
Конфигурирование выполняется с помощью файлов otel-sdk.config.yaml
и otel-globalserver.config.yaml
, по умолчанию
размещённых в каталоге {G3_HOME}\application\config
.
See also
5.10.4.1. Конфигурационные файлы#
Значения параметров конфигурационных файлов могут ссылаться на параметры окружения, используя директиву ${env:PARAMETER_NAME}
.
5.10.4.1.1. otel-sdk.config.yaml#
Основной конфигурационный файл OpenTelemetry SDK. Управляет активностью телеметрии и настройками экспорта.
file_format: "0.1"
disabled: true
resource:
attributes:
service.name: Global
#service.name: ${env:OTEL_SERVICE_NAME}
exporters:
otlp: &otlp-exporter
timeout: 10000
# https://opentelemetry.io/docs/specs/otel/protocol/exporter/#specify-protocol
protocol: grpc
endpoint: http://localhost:4318
logger_provider:
processors:
- batch:
exporter:
otlp: *otlp-exporter
meter_provider:
readers:
- periodic:
interval: 5000
timeout: 30000
exporter:
otlp: *otlp-exporter
tracer_provider:
processors:
- batch:
exporter:
otlp: *otlp-exporter
See also
5.10.4.1.1.1. Период агрегации значений#
Настройка позволяет изменить период агрегирования измерений, передаваемых в коллектор.
Возможные значения:
cumulative - Измерения агрегируются в течение всего срока работы инструмента.
delta - Для части инструментов измерения агрегируются с момента предыдущей отправки в коллектор.
lowmemory - Режим уменьшения использования памяти. Для части инструментов измерения агрегируются с момента предыдущей отправки в коллектор.
meter_provider:
readers:
- periodic:
exporter:
otlp:
# cumulative / delta / lowmemory
temporality_preference: delta
Параметр конфигурации, в зависимости от типа инструмента, влияет на само значение метрики и частоту отправки метрик в коллектор.
При значении cumulative
(по умолчанию):
Инструмент |
Периодичность отправки |
Отправляемое значение |
---|---|---|
Counter |
Всегда |
Кумулятивное |
UpDown |
Всегда |
Кумулятивное |
Histogram |
Всегда |
Кумулятивное |
Gauge |
Если установлено |
Установленное |
При значении delta
:
Инструмент |
Периодичность отправки |
Отправляемое значение |
---|---|---|
Counter |
Если установлено |
Изменение |
UpDown |
Всегда |
Кумулятивное |
Histogram |
Если установлено |
Изменение |
Gauge |
Если установлено |
Установленное |
При значении lowmemory
:
Инструмент |
Периодичность отправки |
Отправляемое значение |
---|---|---|
Counter |
Если установлено |
Изменение |
UpDown |
Всегда |
Кумулятивное |
Histogram |
Если установлено |
Изменение |
Gauge |
Если установлено |
Установленное |
Note
Если установлено
- если значение было установлено с момента предыдущей отправки метрик в коллектор.Изменение
- изменение значения с момента предыдущей отправки в коллектор.Установленное
- последнее установленное значение с момента предыдущей отправки в коллектор.5.10.4.1.2. otel-globalserver.config.yaml#
Дополнительный конфигурационный файл. Управляет настройками системной телеметрии, специфичной для сервера приложений.
instrumentation:
common:
# Значение по умолчанию для всех существующих, но не указанных в конфигурационном файле опций.
default-enabled: false
# Активность JVM метрик (Classes, CPU, GarbageCollector, Threads, MemoryPools).
runtime-telemetry:
enabled: false
# Активность экспериментальных JVM метрик (ExperimentalBufferPools, ExperimentalCPU, ExperimentalMemoryPools).
emit-experimental-telemetry:
enabled: false
# Активность перенаправления логов (Logback) на сервер сбора телеметрии.
logback-appender:
enabled: false
5.10.4.2. Перенаправление логов#
Перенаправление логов Logback на сервер сбора телеметрии выполняется путём добавления
OpenTelemetryAppender
в конфигурацию Logback. Возможны 2 варианта добавления OpenTelemetryAppender
в конфигурацию: ручной и автоматический.
Для обоих случаев необходимы:
активность телеметрии
otel-sdk.config.yaml
/disabled: false
активность перенаправления логов
otel-globalserver.config.yaml
/instrumentation/logback-appender/enabled: true
5.10.4.2.1. Ручное#
Для ручной настройки, в конфигурационные файлы logback-LoggerContext.xml
и/или logback-LoggerContext-session.xml
необходимо добавить раздел, определяющий аппендер OpenTelemetryAppender
, и добавить аппендер к требуемым
логгерам.
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<appender name="OpenTelemetry"
class="io.opentelemetry.instrumentation.logback.appender.v1_0.OpenTelemetryAppender">
<captureExperimentalAttributes>true</captureExperimentalAttributes>
<captureKeyValuePairAttributes>true</captureKeyValuePairAttributes>
</appender>
<root level="INFO">
<appender-ref ref="OpenTelemetry"/>
</root>
</configuration>
5.10.4.2.2. Автоматическое#
Если в конфигурационных файлах отсутствуют настройки OpenTelemetryAppender
, они будут автоматически добавлены
в корневой Logger(“ROOT”).
5.10.4.3. Настройки телеметрии для решения#
Настройки телеметрии для решения сохраняются в таблицу “global_system.gtk_telemetrysettings”.
CREATE TABLE global_system.gtk_telemetrysettings (
id int8 NOT NULL DEFAULT nextval('global_system.gtk_telemetrysettings_seq'::regclass),
benabled int8 NOT NULL DEFAULT 0,
nversion_dz int8 NOT NULL DEFAULT 0,
CONSTRAINT gtk_telemetrysettings_pkey PRIMARY KEY (id)
);
В которой поля:
benabled
- флаг активности телеметрии.nversion_dz
- текущая версия настроек.
Настройки считываются из базы в момент запуска решения.
После внесения изменений в настройки и изменения версии в таблице global_system.gtk_telemetrysettings
, для
уведомления всех узлов кластера об изменении настроек, необходимо вызвать метод CoreTelemetry.fireSettingsVersionChanged()
.
При получении уведомления об изменении настроек будет вызван метод CoreTelemetryEventHandler.handleSettingsVersionChanged()
объекта, полученного из CoreSolutionImageContext.telemetryEventHandler()
.
5.10.5. Метрики сервера приложений#
5.10.5.1. Время реакции на действия пользователя#
Клиент и сервер взаимодействуют используя RPC через WebSocket. Они фиксируют длительность выполнения каждого вызова. Телеметрическая информация о выполненных ранее вызовах передаётся с клиента вместе с очередным RPC, или через 2 секунды после получения ответа, в специальном системном сообщении.
Сервер, получив телеметрическую информация от клиента, направляет её в вызов метода
CoreTelemetry.EventHandler.onEvent(event)
.
Передаваемый в метод экземпляр CoreCompositeMetricRawDataEvent
содержит
в себе два экземпляра CoreMetricRawDataEvent
со
значениями двух метрик:
rpc.server.duration.nanos
- длительность обработки RPC сервером. Число наносекунд.rpc.client.duration.millis
- длительность выполнения RPC с точки зрения клиента, равнаядлительность передачи по сети
+длительность обработки RPC сервером
. Число миллисекунд.
В коде прикладного модуля GTK, где реализован метод
CoreTelemetry.EventHandler.onEvent(event)
,
производится фильтрация событий телеметрии, на основе прикладных правил, и добавление информации в инструменты OpenTelemetry.
Note
На активность метрики влияют:
активность телеметрии для сервера, определяемая в конфигурационном файле: otel-sdk.config.yaml.
активность телеметрии для решения: настройки телеметрии для решения.
5.10.5.2. Длительность загрузки#
Сервер собирает статистику и отправляет метрики в коллектор телеметрии, указанный в конфигурационном файле otel-sdk.config.yaml.
Передаваемые метрики:
server.startup.duration
- Double Counter (s). Длительность загрузки сервера приложений. От момента создания экземпляра, до завершения запуска web-сервера и его web-узлов. Метрика отправляется только один раз за время жизни экземпляра сервера приложений.
5.10.5.3. Ошибки#
Сервер собирает статистику и отправляет метрики в коллектор телеметрии, указанный в конфигурационном файле otel-sdk.config.yaml.
Передаваемые метрики:
server.error.count
- Long Counter ({error}). Общее количество ошибок (выброшенных исключений) за время работы сервера приложений.Атрибут
Значение
cause_class
Имя класса исходного исключения
5.10.5.4. Пулы соединений с БД#
Сервер собирает статистику и отправляет метрики в коллектор телеметрии, указанный в конфигурационном файле otel-sdk.config.yaml.
Передаваемые метрики:
db.client.connection.count
- Long UpDownCounter ({connection}). Количество соединений, которые в данный момент находятся в состоянии, описанном атрибутомstate
.Атрибут
Значение
state
used
илиidle
pool_name
{SOLUTION}[-{POOL}]/{SCHEMA}
*db.client.connection.idle.max
- Long UpDownCounter ({connection}). Максимально допустимое количество неактивных открытых соединений.Атрибут
Значение
pool_name
{SOLUTION}[-{POOL}]/{SCHEMA}
*db.client.connection.idle.min
- Long UpDownCounter ({connection}). Минимальное количество неактивных открытых соединений.Атрибут
Значение
pool_name
{SOLUTION}[-{POOL}]/{SCHEMA}
*db.client.connection.max
- Long UpDownCounter ({connection}). Максимально допустимое количество открытых соединений.Атрибут
Значение
pool_name
{SOLUTION}[-{POOL}]/{SCHEMA}
*db.client.connection.pending_requests
- Long UpDownCounter ({request}). Количество ожидающих запросов на открытое соединение, суммарно для всего пула..Атрибут
Значение
pool_name
{SOLUTION}[-{POOL}]/{SCHEMA}
*db.client.connection.timeouts
- Long Counter ({timeout}). Количество таймаутов соединения, произошедших при попытке получить соединение из пула.Атрибут
Значение
pool_name
{SOLUTION}[-{POOL}]/{SCHEMA}
*db.client.connection.wait_time
- Double Histogram ({s}). Время, необходимое для получения соединения из пула.Атрибут
Значение
pool_name
{SOLUTION}[-{POOL}]/{SCHEMA}
*
* Где:
{SOLUTION}
- имя решения (алиас БД)Configuration.Databases.Database.alias
.{POOL}
- имя пулаConfiguration.Databases.Database.ExtraConnectionPool.Pool.name
.{SCHEMA}
- схема БДConfiguration.Databases.Database.schema
.
5.10.5.5. HTTP-соединения#
Сервер собирает статистику и отправляет метрики в коллектор телеметрии, указанный в конфигурационном файле otel-sdk.config.yaml.
Передаваемые метрики:
http.server.request.duration
Double Histogram (second). Длительность обработки HTTP-запроса.http.server.active_requests
Long UpDownCounter ({requests}). Количество обрабатываемых HTTP-запросов.http.server.requests
Long Counter ({requests}). Количество обработанных HTTP-запросов.
5.10.5.6. Рабочие сеансы#
Сервер собирает статистику и отправляет метрики в коллектор телеметрии, указанный в конфигурационном файле otel-sdk.config.yaml.
Передаваемые метрики:
server.session.count
Long UpDownCounter ({sessions}). Количество рабочих сеансов.Атрибут
Значение
kind
ENGINE
,SOAP
,REST
,SSH
,WS
solution
{SOLUTION}
*
* Где:
{SOLUTION}
- имя решения (алиас БД)Configuration.Databases.Database.alias
.
5.10.5.7. Кластер#
Сервер собирает статистику и отправляет метрики в коллектор телеметрии, указанный в конфигурационном файле otel-sdk.config.yaml.
Передаваемые метрики:
cluster.node.count
Long UpDownCounter ({sessions}). Количество узлов кластера.Метрика передаётся только с узла-координатора кластера.Атрибут
Значение
cluster_name
{cluster_name}
*
* Где:
{cluster_name}
- имя кластераConfiguration.Cluster.name
.