MessagePlugin#

Плагин предназначен для:

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

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

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

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

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

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

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

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

Важно: При использовании плагина на протоколе AMQP, настройки TIMESTAMP_HEADERS_MODE в конфигурационном файле messagePlugin.conf в логи выбрасываются исключения типа WARNING, например:

2024-06-04 14:21:16.250 [Thread-3 (ActiveMQ-server-org.apache.activemq.artemis.core.server.impl.ActiveMQServerImpl$6@4012d5bc)] WARN  org.apache.activemq.artemis.core.server  - AMQ222215: Global Address Size has negative and inconsistent value as -64
2024-06-04 14:21:16.250 [Thread-3 (ActiveMQ-server-org.apache.activemq.artemis.core.server.impl.ActiveMQServerImpl$6@4012d5bc)] WARN  org.apache.activemq.artemis.core.server  - AMQ222214: Destination test-bridge has an inconsistent and negative address size=-64.
2024-06-04 14:21:18.263 [Thread-2 (ActiveMQ-server-org.apache.activemq.artemis.core.server.impl.ActiveMQServerImpl$6@4012d5bc)] WARN  org.apache.activemq.artemis.core.server  - AMQ222215: Global Address Size has negative and inconsistent value as -64

Возможное решение проблемы: отключить настройку TIMESTAMP_HEADERS_MODE и перезапустить брокер, чтобы настройка отключилась.

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

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

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

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

  • в classpath SMBX (например, 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

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

* - идентификатор сообщения может быть указан в заголовке сообщения при его отправке на брокер. Если ни в одном из заголовков идентификатор не был найден,
то идентификатор ищется в поле userId внутреннего формата сообщения SMBX. В случае, если и в 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

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

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

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

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

  messagePlugin: {
        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

        // Параметры предназначены для настройки по формированию latency-метрики(функционал находится на стадии разработки)
        // Необходимо либо BROKER_LATENCY_METRIC_MODE=OFF, либо эти настройки вообще не указывать
        BROKER_LATENCY_METRIC_MODE: "OFF"                         // необязательная настройка
        BROKER_LATENCY_METRIC_COORDINATES: "address.example.#"    // необязательная настройка
  }

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

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

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

Параметр

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

Значение по умолчанию

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

Комментарии

CONFIG_PATH

./brokerBackupPlugin.conf

Да

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

RELOAD_CHECK_PERIOD_MS

1000

5000

Нет

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

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

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

Тип

Описание

Комментарии

text

String

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

MESSAGE_ARRIVED_AT_THE_SERVER — сообщение поступает на брокер

MESSAGE_LEFT_THE_SERVER — сообщение покидает брокер при вычитке клиентом

MESSAGE_ARRIVED_AT_THE_EXPIRED_QUEUE — сообщение поступает в expiry очередь

MESSAGE_ARRIVED_AT_THE_DEAD_LETTER_QUEUE — сообщение поступает в dead-letter очередь

MESSAGE_ARRIVED_AT_THE_SERVER_DURING_DISTRIBUTION — сообщение покидает брокер при дистрибуции в кластере

brokerHost

String

Имя хоста, на котором находится брокер

-

brokerId

String

Id брокера

-

msgIdHeadersName

Array[String]

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

Поле копирует значение настройки MESSAGE_ID_HEADER_NAMES

headers

Array[String]

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

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

address

String

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

-

distributionAddress

String

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

-

user

String

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

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

msgId

String

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

-

artemisMsgId

Long

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

-

msgBodyBytesSize

Long

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

-

durable

String

Признак персистентности сообщения

Может принимать значения true, false, UNDEFINED_DURABLE

timestamp

Long

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

-

* - Если значение заголовка равно null, то отображаться такой заголовок будет как ["headerName=null"].

Если в сообщении отсутствуют заголовки с именами, которые присутствуют в настройке HEADER_NAMES_FOR_LOG, то "headers: [].

Примеры логов трассировки#

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

{
  "text": "MESSAGE_ARRIVED_AT_THE_SERVER",
  "brokerHost": "broker_host",
  "brokerId": "347be2fe-b3fb-11ec-82dc-acde48001122",
  "msgIdHeaderNames": [
    "MESSAGE_ID"
  ],
  "headers": [
    "HEADER_1=Header_value_1",
    "HEADER_2=Header_value_2"
  ],
  "address": "test_address",
  "user": "myUser",
  "msgId": "123450",
  "artemisMsgId": 12,
  "msgBodyBytesSize": 17,
  "durable": "false",
  "timestamp": 1649065204737
}
  • сообщение покидает брокер при его вычитке consumer

{
  "text": "MESSAGE_LEFT_THE_SERVER",
  "brokerHost": "broker_host_test_localhost",
  "brokerId": "06b2fd19-bb3f-11ec-b6a9-7a73e0a59c62",
  "msgIdHeaderNames": [
    "MESSAGE_ID_TEST"
  ],
  "headers": [
    "HEADER_TEST_2=null",
    "HEADER_TEST_1=Header_value_test"
  ],
  "address": "queues.test_1.Q1",
  "user": "user_consumer",
  "msgId": "125656567",
  "artemisMsgId": 16,
  "msgBodyBytesSize": 435,
  "durable": "true",
  "timestamp": 1649863991986
}
  • сообщение покидает брокер при дистрибуции сообщения в кластере

{
  "text": "MESSAGE_LEFT_THE_SERVER_DURING_DISTRIBUTION",
  "brokerHost": "broker_host",
  "brokerId": "347be2fe-b3fb-11ec-82dc-acde48001122",
  "msgIdHeaderNames": [
    "RqUID"
  ],
  "headers": [
    "HEADER_1=Header_value_1",
    "HEADER_2=null"
  ],
  "address": "test_address", 
  "distributionAddress": "localhost/127.0.0.1:9092",
  "msgId": "32435",
  "artemisMsgId": 243,
  "msgBodyBytesSize": 17,
  "durable": "true",
  "timestamp": 1649065204737
}
  • сообщение поступает в expiry-очередь на брокере

{
  "text": "MESSAGE_ARRIVED_AT_THE_EXPIRED_QUEUE",
  "brokerHost": "broker_host",
  "brokerId": "347be2fe-b3fb-11ec-82dc-acde48001122",
  "msgIdHeaderNames": [
    "MESSAGE_ID_TEST"
  ],
  "headers": [],
  "address": "ExpiryQueue",
  "msgId": "5465676",
  "artemisMsgId": 12,
  "msgBodyBytesSize": 34,
  "durable": "false",
  "timestamp": 1649065204859
}
  • сообщение поступает в dead-letter-очередь на брокере

{
  "text": "MESSAGE_ARRIVED_AT_THE_DEAD_LETTER_QUEUE",
  "brokerHost": "broker_host",
  "brokerId": "36499e25-b3fb-11ec-82dc-acde48001122",
  "msgIdHeaderNames": [
    "MESSAGE_ID_TEST"
  ],
  "headers": [
    "HEADER_TEST_1=Header_value_test"
  ],
  "address": "DLQ",
  "msgId": "ID:123450",
  "artemisMsgId": 12,
  "msgBodyBytesSize": 1024,
  "durable": "true",
  "timestamp": 1649065207104
}
  • удаление сообщения при истечении времени жизни (expiry-очередь не настроена)

{
  "text": "MESSAGE_ARRIVED_AT_THE_EXPIRED_QUEUE",
  "brokerHost": "broker_host",
  "brokerId": "3794e2dc-b3fb-11ec-82dc-acde48001122",
  "msgIdHeaderNames": [
    "MESSAGE_ID_TEST"
  ],
  "headers": [
    "HEADER_TEST_1=Header_value_test"
  ],
  "address": "UNDEFINED_EXPIRY_ADDRESS",
  "msgId": "ID:123450",
  "artemisMsgId": 9,
  "msgBodyBytesSize": 1876,
  "durable": "false",
  "timestamp": 1649065209282
}
  • удаление или перемещение сообщения через веб-интерфейс SMBX

{
   "text":"MESSAGE_DELETED_OR_MOVED",
   "brokerHost":"broker_host_test_localhost",
   "brokerId":"d816950d-7f90-11ed-8782-3a07a8ec4565",
   "msgIdHeaderNames":[
      "MESSAGE_ID_TEST"
   ],
   "headers":[
      "HEADER_TEST_1=Header_value_test"
   ],
   "address":"queues.test_1.Q1",
   "msgId":"ID:123450",
   "artemisMsgId":12,
   "msgBodyBytesSize":17,
   "durable":"false",
   "timestamp":1671449560622
}
  • перемещение сообщения при scale-down

{
   "text":"MESSAGE_SCALED_DOWN",
   "brokerHost":"broker_host_test_localhost",
   "brokerId":"d816950d-7f90-11ed-8782-3a07a8ec4565",
   "msgIdHeaderNames":[
      "MESSAGE_ID_TEST"
   ],
   "headers":[
      "HEADER_TEST_1=Header_value_test"
   ],
   "address":"queues.test_1.Q1",
   "distributionAddress": "localhost/127.0.0.1:9092",
   "msgId":"ID:123450",
   "artemisMsgId":12,
   "msgBodyBytesSize":17,
   "durable":"false",
   "timestamp":1671449560622
}