TracingPlugin#

Описание плагина#

Плагин поддерживает стандарт OpenTelemetry. Плагин предназначен для:

  1. формирования трассировки при следующих событиях:

    • поступление сообщения на брокер/уход сообщения с брокера(при вычитке сообщения consumer)

    • перемещение сообщения в expire, dead-letter - очереди

    • перемещение сообщения с одного брокера на другой в кластерном соединении при его дистрибуции

    • перемещение или удаление сообщения вручную (через веб-клиент Артемиса)

    • перемещение сообщения с одного брокера на другой в кластерном соединении при live-only scaleDown

  2. формирования заголовка в сообщении о времени, когда сообщение покидает брокер(при его вычитке клиентом consumer)

Для трассировка необходима настройка - ru.sbt.ss.artemis.plugin.message.TracingPlugin

Подключение плагина#

Для подключения плагина к Artemis необходимо:

  • сформировать конфигурационный файл tracingPlugin.conf, в котором должны быть указаны настройки плагина

  • сформировать конфигурационный файл OpenTelemetry tracing.json

  • в broker_instance_dir/etc/broker.xml необходимо добавить настройки плагина в разделе broker-plugins

  • в classpath Artemis( e.g.:broker_instance_dir/lib) положить logger-plugin-*.jar-файл

Настройки плагина#

Для корректной работы плагина, необходимо на брокере в разделе address-settings установить настройку enable-ingress-timestamp в значение true.

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

<address-settings>
    ...
    <address-setting match="#">
        ...
        <enable-ingress-timestamp>true</enable-ingress-timestamp>
        ...
    </address-setting>
    ...
</address-settings>

Настройки плагина, связанные с формированием трассировки#

Настройка

Возможные значения

Комментарии

MODE

ON or OFF

Настройка включения/отключения плагина(если настройка не указана, то дефолтное значение - ON)

MESSAGE_ID_HEADER_NAMES

header_name_1, header_name_2, ...

Имена заголовков сообщений в которых могут лежать идентификаторы сообщений при их отправке с клиента на брокер*

HEADER_NAMES_FOR_LOG

header_name_1, header_name_2, ...

Имена заголовков сообщений по которым будут выведены значения заголовков в поле лога headers**

BLACK_LIST_ADDRESSES

address_1, address_2,...

Имена адресов по которым не будут выведены логи по событиям трассировки***

WHITE_LIST_ADDRESSES

address_1, address_2,...

Имена адресов по которым будут выведены логи по событиям трассировки****

DURABLE_HEADER_NAME

durableHeaderName

Имя заголовка в котором находится признак персистентности сообщения*****

OTEL_CONFIG_FILE

./tracing.json

Путь к файлу конфигурации OpenTelemetry

* - идентификатор сообщения может быть указан в заголовке сообщения при его отправке на брокер. Если ни в одном из заголовков идентификатор не был найдены, то идентификатор ищется в поле userId внутреннего формата сообщения Artemis. В случае если и в userId отсутствует идентификатор, то идентификатор сообщения:UNDEFINED

** - в лог будут выведены только заголовки, которые присутствуют в сообщении

*** - по дефолту в лог трассировки не выводятся сообщения для следующих адресов: activemq.management, activemq.notifications и адресов с префиксом: $.artemis.internal., notif. Если настройка не указана или значение настройки является пустая строка, то фильтрация по BLACK_LIST_ADDRESSES отсутствует. Настройка поддерживает wildcard-синтаксис для адресов

**** - Если настройка не указана или значение настройки является пустая строка, то фильтрация по WHITE_LIST_ADDRESSES отсутствует. Настройка поддерживает wildcard-синтаксис для адресов

***** - если настройка не указана, то используется имя заголовка durable

Настройки плагина по формированию заголовка сообщения, в котором указывается время ухода сообщения с брокера#

Настройка

Возможные значения

Комментарии

TIMESTAMP_HEADERS_MODE

ON_FOR_ALL

Включено формирование заголовка для всех сообщений, присутствующих на брокере*

ON_IF_EXIST

Включено формирование заголовка, если во входящем сообщении есть хотя бы один из заголовок указанных в FROM_SERVER_TIMESTAMP_HEADER_NAME

OFF

Выключено формирование заголовка

FROM_SERVER_TIMESTAMP_HEADER_NAME

Любое строковое значение

Имя заголовка сообщения в котором указывается время, когда сообщение покинуло брокер

* - формирование заголовка происходит на этапе вычитки сообщения из очереди клиентом-консьюмером

Пример конфигурационного файла плагина tracingPlugin.conf#

  tracingPlugin: {
        OTEL_CONFIG_FILE: "./tracing.json"                  // обязательная настройка
        MODE: "ON or OFF"                                         // необязательная настройка
        MESSAGE_ID_HEADER_NAMES: "headerName_1, headerName_2"     // необязательная настройка
        HEADER_NAMES_FOR_LOG: "headerName"                        // необязательная настройка
        BLACK_LIST_ADDRESSES: "address_1, address_2, address 3"   // необязательная настройка
        WHITE_LIST_ADDRESSES: "address_21, address_22, address_33"// необязательная настройка
        DURABLE_HEADER_NAME: "_HDR_DURABLE_"                      // необязательная настройка
        TIMESTAMP_HEADERS_MODE: "ON_FOR_ALL"                      // необязательная настройка 
        FROM_SERVER_TIMESTAMP_HEADER_NAME: "TIMESTAMP_FROM_SERVER"// Обязательная настройка для режимов ON_FOR_ALL/ON_IF_EXIST
  }

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

Пример настройки плагина в broker.xml#

<broker-plugins>
    <broker-plugin class-name="ru.sbt.ss.artemis.plugin.message.TracingPlugin">
        <property key="CONFIG_PATH" value="path_to_tracingPlugin_configuration" />          <!-- ОБЯЗАТЕЛЬНЫЙ путь до конфигурационного файла /-->
        <property key="RELOAD_CHECK_PERIOD_MS" value="period_in_ms" />                      <!-- необязательная периодичность проверки планировщиком обнаружения изменений в файле конфигурации в миллисекундах /-->
    </broker-plugin>
</broker-plugins>

Настройка

Пример значения

Дефолтное значение

Обязательность

Комментарии

CONFIG_PATH

./tracingPlugin.conf

-

Да

путь до конфигурационного файла

RELOAD_CHECK_PERIOD_MS

1000

5000

Нет

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

Формат логов при трассировке сообщений#

Наименование поля

Тип

Описание

Комментарии

messaging.operation

String

Тип операции

publish - сообщение поступает на брокер

deliver - сообщение покидает брокер

messaging.artemismq.broker.id

String

Id брокера

-

messaging.artemismq.message.headers

Array[String]

значения заголовков сообщений, имена которых присутствуют в настройке HEADER_NAMES_FOR_LOG

значения заголовков сообщений отображаются в формате: ["headerName_1=headerValue_1", "headerName_2=headerValue_2", ...]*

messaging.artemismq.message.address

String

имя адреса с которым связано событие трассировки

-

messaging.artemismq.message.user.id

String

имя пользователя, ассоциированное с DN-сертификатом, прописанное в настройках брокера cert-users.properties

поле отображается только для событий поступления/ухода сообщения

messaging.message.id

String

id сообщения, сформированный при отправке сообщения на брокер

-

messaging.message.body.size

Long

размер тела сообщения в байтах

-

messaging.artemismq.message.timestamp

Long

временная метка, когда событие произошло

-

messaging.destination.name

String

имя очереди получателя сообщения

-

Если в сообщении отсутствуют заголовки с именами, которые присутствуют в настройке HEADER_NAMES_FOR_LOG, то messaging.artemismq.message.headers не отображается

Атрибуты в спанах#

Атрибут

Тип

Описание

Примеры

messaging.artemismq.message.address

string

Имя адреса, куда направлено сообщение

address.test.first.Q1

messaging.operation

string

Тип операции

publish, deliver

messaging.destination.name

string

Имя очереди получателя сообщения

queues.test.first.Q1

messaging.artemismq.message.userid

string

Идентификатор пользователя

452ad6f9kf5f4l3lf649f76048c2f887

messaging.message.body.size

int

Размер тела сообщения в байтах

435

messaging.artemismq.message.timestamp

int

Временная метка

1703844661511

messaging.artemismq.message.headers

string

Название заголовка сообщения

HEADER_TEST_2=null, HEADER_TEST_1=Header_value_test

messaging.artemismq.broker.id

string

Идентификатор брокера, на который пришло сообщение от producer

917cba4c-a632-11ee-8572-f6e76992795c

messaging.artemismq.broker.host

string

Хост брокера, на который пришло сообщение от producer

srv-68-9.sy.dev.sbt

messaging.message.id

string

Идентификатор сообщения

452a7c7c7c7048c2f887f61572b18fc2

messaging.artemismq.original.message.id

string

Родительский идентификатор сообщения

356a7c7c7457c7048c2ff615725bk59

messaging.artemismq.target.host

string

Xост брокера, на который ушло сообщение при scale down

srv-68-8.sy.dev.sbt

Пример конфигурации плагина TracingPlugin tracing.json#

# тип экспортера
otel.traces.exporter=otlp 

# порт экспортера (например, Jaeger)
otel.exporter.otlp.endpoint=http://localhost:4317

# имя сервиса
otel.service.name=artemis_opentelemetry

Пример отображения трассировки в UI#

Трейс позволяет отследить путь сообщения.

Каждое событие, происходящее с сообщением представляет собой спан - промежуток времени выполнения события, отображающий характеристики сообщения при прохождении событий.

Пример трейса

Пример отображения логов в UI#

Наименование спана <имя сервиса>: <имя очереди> <тип операции>, где имя очереди совпадает с логом messaging.destination.name, тип операции совпадает с логом messaging.operation.

Пример спана