События системного журнала#

Настройки отправляемых сообщений указываются в файле /conf/logback.xml. Отправляемые сообщения имеют формат JSON или XML согласно шаблону, описываемому в файле logback.xml.

В конфигурационном файле logback.xml добавлен appender name="audit-file" для настройки сбора событий Platform V Audit SE в отдельный лог-файл:

<appender name="audit-file" class="ch.qos.logback.core.rolling.RollingFileAppender">
    <file>./log/adapter-audit.log</file>

    <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
        <!-- rollover every daily -->
        <fileNamePattern>./log/adapter-audit-%d{yyyy-MM-dd}.%i.log.zip</fileNamePattern>
        <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
            <!-- or whenever the file size reaches 50MB -->
            <maxFileSize>50MB</maxFileSize>
        </timeBasedFileNamingAndTriggeringPolicy>
    </rollingPolicy>
    <encoder>
        <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{60} %X{sourceThread} - %msg%n</pattern>
    </encoder>
</appender>

Логирование включено на следующие классы:

<logger name="ru.sbt.ss.reactive.stream.adapter.audit.AuditService" level="INFO" additivity="false" >
  <appender-ref ref="audit-file" />
</logger>

<logger name="ru.sbt.ss.audit" level="INFO" additivity="false" >
  <appender-ref ref="audit-file" />
</logger>

Для логирования информации о работе EVTA необходимо в файле logback.xml заполнить блок:

<root level="INFO">
        <appender-ref ref="STDOUT"/>
        <appender-ref ref="file"/>
</root>

В блоке root укажите наименования appenders, в которых описан вывод логов в конкретные места. В данном примере описан вывод логов EVTA в консоль управления EVTA и в файл.

Логирование сообщений#

Для логирования сообщений необходимо:

  1. Настроить шаг обработки сообщения log в параметре processors конфигурационного файла adapter.conf, подробнее в документе Руководство оператора в разделе Настройки конфигурационного файла adapter.conf, подраздел Валидация сообщений и настройка логирования.

  2. Заполнить файл logback.xml необходимыми настройками логирования и поместить его в директорию conf перед запуском установки EVTA. Примеры заполненных файлов logback.xml приведены ниже в данном разделе.

  3. Определить в файле logback.xml, куда будет производиться отправка сообщений. Для этого необходимо заполнить блок настроек:

<logger name="ru.sbt.ss.reactive.stream.transformers.logging.MessageLogger" level="info" additivity="false" >
        <appender-ref ref="GateLogger"/>
        <appender-ref ref="STDOUT"/>
        <appender-ref ref="file"/>
</logger>

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

  • <appender-ref ref="GateLogger"/> – логирование в централизованную систему журналирования;

  • <appender-ref ref="STDOUT"/> – логирование в консоль управления EVTA;

  • <appender-ref ref="file"/> – логирование в файл.

  1. Прописать настройки логирования в конфигурационном файле vars.yml:

4.1 Перед установкой (переустановкой) новой версии EVTA необходимо заполнить блок:

  logging:
    logback:
      level: info #  Дефолтный уровень логирования
      loggers:
        - name: "ru.sbt.cep"
          level: info
        - name: "org.apache.kafka"
          level: warn
        - name: "com.typesafe.akka"
          level: info
    kafka: # Отправление логи в топик Kafka
      enabled: false # Включение функциональности отправки логов в топик Kafka
      retries: 3 # Количество переиницилизаций producer
      interval: 1000 # Интервал между переиницилизациями
      multiplier: 1 # Множитель интервала переинициализации
## Необязательные поля, если logging.kafka.enabled: false
#      preset_name: kafka_fpss # Название пресета для отправки логов в топик Kafka
#      topic: logstash # Наименование топика

4.2 Также необходимо указать абсолютный путь до логов в параметрах:

  logdir: /evta_logs # Абсолютный путь на конечном сервере до логов приложения
  logdir_audit: /evta_logs # Абсолютный путь на конечном сервере до логов аудита (по умолчанию равен logdir)

4.3 Можно указать дополнительную информацию о логах:

  log_size_cap: 50MB # максимальный размер лога
  log_history: 3 # время в днях для хранения логов
  log_total_size_cap: 2GB # Необязательно, общий размер всех архивных файлов, если не задано, то бесконечно

4.4 Для дополнительного логирования в формате JSON добавить блок log:

# Дополнительное логирование обработки сообщения
log:
  eventIdHeader: JMSMessageID # заголовок, значение которого будет браться из сообщения для поля eventId лога
  consumerLogEnabled: false # логирование вычитки сообщения, по умолчанию false
  producerLogEnabled: false # логирование публикации сообщения, по умолчанию false
  processorsLogEnabled: false # логирование результатов работы процессоров сообщения (например, валидации), по умолчанию false
  deadLetterLogEnabled: false # логирование отправки сообщения в deadLetter, по умолчанию false

Сообщения логируются в формате JSON и состоят из следующих полей:

{
  timestamp: "Время лога в формате UNIX",
  eventId: "Значение заголовка eventIdHeader сообщения, или значение ключа, если eventIdHeader не задан в конфигурации",
  source: "Для Platform V Corax / Apache Kafka - топик, из которой вычитали сообщение; для реббита, Artemis и ibmMQ - очередь, из которой вычитали сообщение; для rest/grpc - способ подключения (rest/grpc соответственно)",
  target: "Для Platform V Corax / Apache Kafka - топик, в который публикуем сообщение; для реббита - exchange, в который публикуем сообщение; для Artemis и ibmMQ - очередь, в которую публикуем сообщение; для rest/grpc - способ подключения (rest/grpc соответственно)",
  status: "Success или error",
  message: "При значении поля status равному success - в данном поле сообщение об успешно выполненном этапе, при значении поля status равному error - сообщение об ошибке"
}

Пример полученного лога:

17:00:34.668 [adapter-work-thread-1] INFO  r.s.s.r.stream.log.LoggerService - {"timestamp":1687183234667,"eventId":1,"source":"inputTopicKk","target":null,"status":"success","message":"success receive"}
17:00:34.693 [adapter-work-thread-1] INFO  r.s.s.r.stream.log.LoggerService - {"timestamp":1687183234693,"eventId":1,"source":"inputTopicKk","target":null,"status":"error","message":"Error validate message: Message doesnt match schema '/Users/17314736/Documents/forks/reactive-stream-adapter/reactive-stream-core/src/test/resources/json/schema_first.json':\n$.name: is missing but it is required\n$.doc: is missing but it is required\n$.fields: is missing but it is required\n$.test: is not defined in the schema and the schema does not allow additional properties\n"}
16:54:55.354 [adapter-work-thread-1] INFO  r.s.s.r.stream.log.LoggerService - {"timestamp":1687269295354,"eventId":1,"source":"inputTopicKk","target":"deadLetter","status":"error","message":"Cannot send message to dead letter topic: org.apache.kafka.common.errors.TopicAuthorizationException: Not authorized to access topics: [deadLetter]"}

Пример файла logback.xml:

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <!-- Экранирование символа доллара -->
    <property scope="context" name="dollar" value="$" />

    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{60} %X{sourceThread} - %msg%n</pattern>
        </encoder>
    </appender>

    <appender name="file" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>./log/adapter.log</file>

        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!-- rollover every daily -->
            <fileNamePattern>./log/adapter-%d{yyyy-MM-dd}.%i.log.zip</fileNamePattern>
            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <!-- or whenever the file size reaches 50MB -->
                <maxFileSize>50MB</maxFileSize>
            </timeBasedFileNamingAndTriggeringPolicy>
        </rollingPolicy>
        <encoder>
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{60} %X{sourceThread} - %msg%n</pattern>
        </encoder>
    </appender>

    <appender name="audit-file" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>./log/adapter-audit.log</file>

        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!-- rollover every daily -->
            <fileNamePattern>./log/adapter-audit-%d{yyyy-MM-dd}.%i.log.zip</fileNamePattern>
            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <!-- or whenever the file size reaches 50MB -->
                <maxFileSize>50MB</maxFileSize>
            </timeBasedFileNamingAndTriggeringPolicy>
        </rollingPolicy>
        <encoder>
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{60} %X{sourceThread} - %msg%n</pattern>
        </encoder>
    </appender>
  
    <logger name="ru.sbt.ss" level="info" additivity="false" >
        <appender-ref ref="file" />
    </logger>

    <logger name="ru.sbt.ss.reactive.stream.adapter.audit.AuditService" level="INFO" additivity="false" >
        <appender-ref ref="audit-file" />
    </logger>

    <logger name="ru.sbt.ss.audit" level="INFO" additivity="false" >
        <appender-ref ref="audit-file" />
    </logger>

    <logger name="ru.sbt.cep" level="info" additivity="false" >
        <appender-ref ref="file" />
    </logger>
  
    <logger name="org.apache.kafka" level="warn" additivity="false" >
        <appender-ref ref="file" />
    </logger>
  
    <logger name="com.typesafe.akka" level="info" additivity="false" >
        <appender-ref ref="file" />
    </logger>
  
    <root level="info">
        <appender-ref ref="file" />
    </root>
</configuration>

Пример конфигурации логирования в системный вывод#

<?xml version="1.0" encoding="UTF-8"?>

<configuration>
    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <!--            <pattern>%date %level [%thread] %logger{10} [%file:%line] %msg%n</pattern>-->
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{60} %X{sourceThread} - %msg%n</pattern>
        </encoder>
    </appender>

    <root level="INFO">
        <appender-ref ref="STDOUT"/>
    </root>

</configuration>

Логирование в централизованную систему журналирования Platform V Monitor (LOGA)#

Для EVTA может быть настроена отправка системных журналов в централизованную систему журналирования Platform V Monitor.

Предварительно необходимо выполнить следующие действия:

  • узнать адреса брокеров Platform V Corax / Apache Kafka централизованной системы журналирования Platform V Monitor;

  • узнать названия topics централизованной системы журналирования Platform V Monitor, куда будут отправляться журналы EVTA;

  • выпустить сертификат подключения к Platform V Corax / Apache Kafka централизованной системы журналирования Platform V Monitor.

При заполнении файла logback.xml стоит обратить внимание на заполнение следующих параметров блокa appender GateLogger:

Параметр

Описание

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

bodyType

Тип сообщения. Доступные значения: XML или JSON

JSON

rqUIDPath

путь до rquid (case sensitive) в логируемых сообщениях xpath (//rqUID) или jsonpath ($…rqUID)

$…rqUID

from

Константа для поля «from» в сообщении лога. Доступные значения: artemis, ibm_mq, grpc или rest

to

Константа для поля «to» в сообщении лога. Доступные значения: artemis, ibm_mq, grpc или rest

topic

Имя topic записи сообщений логов

client.id

Идентификатор продьюсера Platform V Corax / Apache Kafka, по которому можно однозначно идентифицировать продьюсера Platform V Corax / Apache Kafka

пусто

config.providers

Объявление провайдера шифрования паролей. Значение не изменять

decode

config.providers.decode.class

Класс провайдера шифрования паролей. Значение не изменять

config.providers.decode.param.security.encoding.key

Путь до файла, содержащего ключ шифрования паролей

config.providers.decode.param.security.encoding.class

Класс шифрования паролей. Значение не изменять

security.protocol

Тип протокола подключения к системе журналирования

SSL

ssl.endpoint.identification.algorithm

Проверка сертификата на соответствия hostname

ssl.keystore.location

Расположение файла keystore

ssl.truststore.location

Расположение файла truststore

ssl.keystore.password

Пароль keystore в зашифрованном виде

ssl.truststore.password

Пароль truststore в зашифрованном виде

ssl.key.password

Ключ шифрования паролей в зашифрованном виде

bootstrap.servers

Сервера подключения к системе журналирования

host:port,host:port

Для настройки отправки сообщений в централизованную систему журналирования Platform V Monitor необходимо заполнить блок appender GateLogger файла logback.xml:

<?xml version="1.0" encoding="UTF-8"?>

<configuration>
    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <!-- <pattern>%date %level [%thread] %logger{10} [%file:%line] %msg%n</pattern>-->
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{60} %X{sourceThread} - %msg%n</pattern>
        </encoder>
    </appender>

    <appender name="file" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>./log/adapter.log</file>

        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!-- rollover every daily -->
            <fileNamePattern>./log/adapter-%d{yyyy-MM-dd}.%i.log.zip</fileNamePattern>
            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <!-- or whenever the file size reaches 50MB -->
                <maxFileSize>50MB</maxFileSize>
            </timeBasedFileNamingAndTriggeringPolicy>
            <maxHistory>5</maxHistory>
            <cleanHistoryOnStart>true</cleanHistoryOnStart>
            <!-- <totalSizeCap>2GB</totalSizeCap> -->
        </rollingPolicy>
        <encoder>
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{60} %X{sourceThread} - %msg%n</pattern>
        </encoder>
    </appender>

    <appender name="GateLogger" class="com.github.danielwegener.logback.kafka.KafkaAppender">
      <encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder">
        <layout class="ru.sbt.synapse.logback.FpjLayout">
          <bodyType>json</bodyType>                         <!-- указываем тип сообщения xml или json  -->
          <rqUIDPath>$..rqUID</rqUIDPath>                   <!-- указываем путь до rquid (case sensitive) в логируемых сообщениях xpath (//rqUID) или jsonpath ($..rqUID) -->
          <from>rest</from>                                 <!-- константа для поля "from" в сообщении лога  -->
          <to>kafka</to>                                    <!-- константа для поля "to" в сообщении лога  -->
        </layout>
      </encoder>
      <deliveryStrategy class="com.github.danielwegener.logback.kafka.delivery.AsynchronousDeliveryStrategy"/>
      <topic>LOGGER.REST</topic>

      <producerConfig>client.id=test-noetcd-auth</producerConfig>
      <producerConfig>config.providers=decode</producerConfig>
      <producerConfig>config.providers.decode.class=ru.sbt.ss.kafka.DecryptionConfigProvider</producerConfig>
      <producerConfig>config.providers.decode.param.security.encoding.key=./ssl/secret.pass</producerConfig>
      <producerConfig>config.providers.decode.param.security.encoding.class=ru.sbt.ss.password.DefaultEncoder</producerConfig>

      <producerConfig>security.protocol=SSL</producerConfig>
      <producerConfig>ssl.endpoint.identification.algorithm=</producerConfig>
      <producerConfig>ssl.keystore.location=ssl/event-discovery.jks</producerConfig>
      <producerConfig>ssl.truststore.location=ssl/event-discovery.jks</producerConfig>

      <producerConfig>ssl.keystore.password=${dollar}{decode:xxx}</producerConfig>
      <producerConfig>ssl.truststore.password=${dollar}{decode:yyy}</producerConfig>
      <producerConfig>ssl.key.password=${dollar}{decode:zzz}</producerConfig>

      <producerConfig>bootstrap.servers=host:port,host:port</producerConfig>
      <appender-ref ref="STDOUT"/>
    </appender>

    <appender name="ASYNC-GateLogger" class="ch.qos.logback.classic.AsyncAppender">
        <appender-ref ref="GateLogger"/>
        <discardingThreshold>0</discardingThreshold>
        <queueSize>512</queueSize>
    </appender>

    <logger name="ru.sbt.ss.reactive.stream.transformers.logging.MessageLogger" level="info" additivity="false" >
        <appender-ref ref="ASYNC-GateLogger"/>
        <appender-ref ref="STDOUT"/>
        <appender-ref ref="file"/>
    </logger>

    <root level="INFO">
        <appender-ref ref="STDOUT"/>
        <appender-ref ref="file"/>
    </root>

</configuration>

Также необходимо прописать настройки логирования в конфигурационном файле vars.yml в блоке logback. Пример заполнения и детали указаны выше в данном разделе в подразделе «Логирование сообщений».

Наиболее часто встречающиеся события типа ERROR:#

  1. Неверный пароль от хранилища (значение ssl.keystore.password):

2023-05-31 12:53:10.214 [nioEventLoopGroup-3-1] ERROR ru.sbt.ss.reactive.stream.rest.handlers.PublishServerHandler  - Failure create subscriber from configuration, Error message: ru.sbt.ss.reactive.stream.adapter.config.ReactiveStreamConfigException: java.lang.IllegalArgumentException: Password decode error in key ssl.keystore.password
ru.sbt.ss.reactive.stream.rest.utils.RestException: ru.sbt.ss.reactive.stream.adapter.config.ReactiveStreamConfigException: java.lang.IllegalArgumentException: Password decode error in key ssl.keystore.password
	at ru.sbt.ss.reactive.stream.rest.utils.HandlerUtils.createSubscriberFromConfig(HandlerUtils.java:83)
	at ru.sbt.ss.reactive.stream.rest.handlers.PublishServerHandler.createSubscriber(PublishServerHandler.java:193)
	at ru.sbt.ss.reactive.stream.rest.handlers.PublishServerHandler.channelRead0(PublishServerHandler.java:93)
	at ru.sbt.ss.reactive.stream.rest.handlers.PublishServerHandler.channelRead0(PublishServerHandler.java:34)
	at io.netty.channel.SimpleChannelInboundHandler.channelRead(SimpleChannelInboundHandler.java:99)
	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:444)
	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:420)
	at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:412)
	at io.netty.handler.codec.MessageToMessageDecoder.channelRead(MessageToMessageDecoder.java:103)
	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:444)
	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:420)
	at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:412)
	at io.netty.handler.codec.ByteToMessageDecoder.fireChannelRead(ByteToMessageDecoder.java:346)
	at io.netty.handler.codec.ByteToMessageDecoder.channelRead(ByteToMessageDecoder.java:318)
	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:444)
	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:420)
	at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:412)
	at io.netty.channel.DefaultChannelPipeline$HeadContext.channelRead(DefaultChannelPipeline.java:1410)
	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:440)
	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:420)
	at io.netty.channel.DefaultChannelPipeline.fireChannelRead(DefaultChannelPipeline.java:919)
	at io.netty.channel.nio.AbstractNioByteChannel$NioByteUnsafe.read(AbstractNioByteChannel.java:166)
	at io.netty.channel.nio.NioEventLoop.processSelectedKey(NioEventLoop.java:788)
	at io.netty.channel.nio.NioEventLoop.processSelectedKeysOptimized(NioEventLoop.java:724)
	at io.netty.channel.nio.NioEventLoop.processSelectedKeys(NioEventLoop.java:650)
	at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:562)
	at io.netty.util.concurrent.SingleThreadEventExecutor$4.run(SingleThreadEventExecutor.java:997)
	at io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74)
	at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30)
	at java.base/java.lang.Thread.run(Thread.java:829)
Caused by: ru.sbt.ss.reactive.stream.adapter.config.ReactiveStreamConfigException: java.lang.IllegalArgumentException: Password decode error in key ssl.keystore.password
	at ru.sbt.ss.reactive.stream.adapter.AdapterReactiveFactory.createSubscriber(AdapterReactiveFactory.java:175)
	at ru.sbt.ss.reactive.stream.rest.utils.HandlerUtils.createSubscriberFromConfig(HandlerUtils.java:80)
	... 29 common frames omitted
Caused by: java.lang.IllegalArgumentException: Password decode error in key ssl.keystore.password
	at ru.sbt.ss.reactive.stream.adapter.config.VaultHelper.decode(VaultHelper.java:65)
	at ru.sbt.ss.reactive.stream.adapter.AdapterReactiveFactory.createSubscriber(AdapterReactiveFactory.java:169)
	... 30 common frames omitted
Caused by: ru.sbt.ss.password.ConfigKeyDecryptionException: org.jasypt.exceptions.EncryptionOperationNotPossibleException
	at ru.sbt.ss.password.ConfigDecryptor.decrypt(ConfigDecryptor.java:50)
	at ru.sbt.ss.reactive.stream.adapter.config.VaultHelper.decode(VaultHelper.java:62)
	... 31 common frames omitted
Caused by: org.jasypt.exceptions.EncryptionOperationNotPossibleException: null
	at org.jasypt.encryption.pbe.StandardPBEByteEncryptor.decrypt(StandardPBEByteEncryptor.java:1169)
	at org.jasypt.encryption.pbe.StandardPBEStringEncryptor.decrypt(StandardPBEStringEncryptor.java:738)
	at ru.sbt.ss.password.CustomTextEncryptor.decrypt(CustomTextEncryptor.java:43)
	at ru.sbt.ss.password.BaseEncryptor.decrypt(BaseEncryptor.java:93)
	at ru.sbt.ss.password.ConfigDecryptor.decrypt(ConfigDecryptor.java:48)
	... 32 common frames omitted
  1. Неверный пароль от ключа в хранилище (значение ssl.key.password):

2023-05-31 12:59:16.285 [nioEventLoopGroup-3-1] ERROR ru.sbt.ss.reactive.stream.rest.handlers.PublishServerHandler  - Failure create subscriber from configuration, Error message: ru.sbt.ss.reactive.stream.adapter.config.ReactiveStreamConfigException: java.lang.IllegalArgumentException: Password decode error in key ssl.key.password
ru.sbt.ss.reactive.stream.rest.utils.RestException: ru.sbt.ss.reactive.stream.adapter.config.ReactiveStreamConfigException: java.lang.IllegalArgumentException: Password decode error in key ssl.key.password
	at ru.sbt.ss.reactive.stream.rest.utils.HandlerUtils.createSubscriberFromConfig(HandlerUtils.java:83)
	at ru.sbt.ss.reactive.stream.rest.handlers.PublishServerHandler.createSubscriber(PublishServerHandler.java:193)
	at ru.sbt.ss.reactive.stream.rest.handlers.PublishServerHandler.channelRead0(PublishServerHandler.java:93)
	at ru.sbt.ss.reactive.stream.rest.handlers.PublishServerHandler.channelRead0(PublishServerHandler.java:34)
	at io.netty.channel.SimpleChannelInboundHandler.channelRead(SimpleChannelInboundHandler.java:99)
	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:444)
	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:420)
	at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:412)
	at io.netty.handler.codec.MessageToMessageDecoder.channelRead(MessageToMessageDecoder.java:103)
	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:444)
	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:420)
	at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:412)
	at io.netty.handler.codec.ByteToMessageDecoder.fireChannelRead(ByteToMessageDecoder.java:346)
	at io.netty.handler.codec.ByteToMessageDecoder.channelRead(ByteToMessageDecoder.java:318)
	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:444)
	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:420)
	at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:412)
	at io.netty.channel.DefaultChannelPipeline$HeadContext.channelRead(DefaultChannelPipeline.java:1410)
	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:440)
	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:420)
	at io.netty.channel.DefaultChannelPipeline.fireChannelRead(DefaultChannelPipeline.java:919)
	at io.netty.channel.nio.AbstractNioByteChannel$NioByteUnsafe.read(AbstractNioByteChannel.java:166)
	at io.netty.channel.nio.NioEventLoop.processSelectedKey(NioEventLoop.java:788)
	at io.netty.channel.nio.NioEventLoop.processSelectedKeysOptimized(NioEventLoop.java:724)
	at io.netty.channel.nio.NioEventLoop.processSelectedKeys(NioEventLoop.java:650)
	at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:562)
	at io.netty.util.concurrent.SingleThreadEventExecutor$4.run(SingleThreadEventExecutor.java:997)
	at io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74)
	at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30)
	at java.base/java.lang.Thread.run(Thread.java:829)
Caused by: ru.sbt.ss.reactive.stream.adapter.config.ReactiveStreamConfigException: java.lang.IllegalArgumentException: Password decode error in key ssl.key.password
	at ru.sbt.ss.reactive.stream.adapter.AdapterReactiveFactory.createSubscriber(AdapterReactiveFactory.java:175)
	at ru.sbt.ss.reactive.stream.rest.utils.HandlerUtils.createSubscriberFromConfig(HandlerUtils.java:80)
	... 29 common frames omitted
Caused by: java.lang.IllegalArgumentException: Password decode error in key ssl.key.password
	at ru.sbt.ss.reactive.stream.adapter.config.VaultHelper.decode(VaultHelper.java:65)
	at ru.sbt.ss.reactive.stream.adapter.AdapterReactiveFactory.createSubscriber(AdapterReactiveFactory.java:169)
	... 30 common frames omitted
Caused by: ru.sbt.ss.password.ConfigKeyDecryptionException: org.jasypt.exceptions.EncryptionOperationNotPossibleException
	at ru.sbt.ss.password.ConfigDecryptor.decrypt(ConfigDecryptor.java:50)
	at ru.sbt.ss.reactive.stream.adapter.config.VaultHelper.decode(VaultHelper.java:62)
	... 31 common frames omitted
Caused by: org.jasypt.exceptions.EncryptionOperationNotPossibleException: null
	at org.jasypt.encryption.pbe.StandardPBEByteEncryptor.decrypt(StandardPBEByteEncryptor.java:1169)
	at org.jasypt.encryption.pbe.StandardPBEStringEncryptor.decrypt(StandardPBEStringEncryptor.java:738)
	at ru.sbt.ss.password.CustomTextEncryptor.decrypt(CustomTextEncryptor.java:43)
	at ru.sbt.ss.password.BaseEncryptor.decrypt(BaseEncryptor.java:93)
	at ru.sbt.ss.password.ConfigDecryptor.decrypt(ConfigDecryptor.java:48)
	... 32 common frames omitted
  1. Ошибка при указании одного и того же порта на publish и subscribe:

2023-05-31 13:13:17.611 [main] ERROR ru.sbt.ss.reactive.stream.adapter.AdapterApplication  - Adapter fail 2 retry java.net.BindException: Address already in use
java.util.concurrent.ExecutionException: java.net.BindException: Address already in use
	at java.base/java.util.concurrent.FutureTask.report(FutureTask.java:122)
	at java.base/java.util.concurrent.FutureTask.get(FutureTask.java:205)
	at ru.sbt.ss.reactive.stream.rest.SubscribeRestServer.run(SubscribeRestServer.java:55)
	at ru.sbt.ss.reactive.stream.adapter.egress.EgressApplicationStarter.startApplication(EgressApplicationStarter.java:124)
	at ru.sbt.ss.reactive.stream.adapter.AdapterApplication.run(AdapterApplication.java:81)
	at ru.sbt.ss.reactive.stream.adapter.egress.EgressMain.main(EgressMain.java:11)
Caused by: java.net.BindException: Address already in use
	at java.base/sun.nio.ch.Net.bind0(Native Method)
	at java.base/sun.nio.ch.Net.bind(Net.java:459)
	at java.base/sun.nio.ch.Net.bind(Net.java:448)
	at java.base/sun.nio.ch.ServerSocketChannelImpl.bind(ServerSocketChannelImpl.java:227)
	at io.netty.channel.socket.nio.NioServerSocketChannel.doBind(NioServerSocketChannel.java:141)
	at io.netty.channel.AbstractChannel$AbstractUnsafe.bind(AbstractChannel.java:562)
	at io.netty.channel.DefaultChannelPipeline$HeadContext.bind(DefaultChannelPipeline.java:1334)
	at io.netty.channel.AbstractChannelHandlerContext.invokeBind(AbstractChannelHandlerContext.java:600)
	at io.netty.channel.AbstractChannelHandlerContext.bind(AbstractChannelHandlerContext.java:579)
	at io.netty.handler.logging.LoggingHandler.bind(LoggingHandler.java:230)
	at io.netty.channel.AbstractChannelHandlerContext.invokeBind(AbstractChannelHandlerContext.java:602)
	at io.netty.channel.AbstractChannelHandlerContext.bind(AbstractChannelHandlerContext.java:579)
	at io.netty.channel.DefaultChannelPipeline.bind(DefaultChannelPipeline.java:973)
	at io.netty.channel.AbstractChannel.bind(AbstractChannel.java:260)
	at io.netty.bootstrap.AbstractBootstrap$2.run(AbstractBootstrap.java:356)
	at io.netty.util.concurrent.AbstractEventExecutor.runTask(AbstractEventExecutor.java:174)
	at io.netty.util.concurrent.AbstractEventExecutor.safeExecute(AbstractEventExecutor.java:167)
	at io.netty.util.concurrent.SingleThreadEventExecutor.runAllTasks(SingleThreadEventExecutor.java:470)
	at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:569)
	at io.netty.util.concurrent.SingleThreadEventExecutor$4.run(SingleThreadEventExecutor.java:997)
	at io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74)
	at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30)
	at java.base/java.lang.Thread.run(Thread.java:829)