2. Настройка программы

2.1. Настройка технических средств

Серверы, на которых устанавливается Типовое ПО «Витрина данных», должны соответствовать техническим характеристикам указанным в документе «Техническое описание системы» раздел Рекомендуемые технические и программные средства, в котором приводятся требования к серверному оборудованию (CPU, RAM, HDD и т.д.), программному обеспечению и каналам связи.

Необходимые настройки для серверов описаны в документе «Руководство по установке», в котором приводятся требования к серверам, доступности портов для каждого сервера, настройка протоколов, наличие библиотек и т.д.

2.2. Настройка программных средств

Все предварительные действия необходимые перед установкой программы, процесс установки и проверка корректной установки программы описан в документе «Руководство по установке» в разделе «Подготовка к установке».

Внимание

Программные средства настраиваются в зависимости от используемой конфигурации. Состав компонентов приведен в разделе Состав компонентов в дистрибутиве документа «Техническое описание системы».

2.2.1. Настройка ProStore

2.2.1.1. Настройка Сервиса исполнения запросов (query-execution)

Конфигурация инстанса узла Сервиса исполнения запросов (query-execution) Prostore представляет собой текстовый YAML-файл, параметры которого организованы в древовидную структуру.

Файл конфигурации содержит логику и порядок работы Сервиса исполнения запросов.

Для наглядности конфигурация сервиса исполнения запросов разделена на отдельные секции.

Пример файла конфигурации Prostore приведен в разделе Конфигурация ноды документации Prostore.

2.2.1.2. Настройка коннекторов

Следующие коннекторы требуют настройки конфигурации:

  • Kafka-Clickhouse writer connector;

  • Kafka-Postgres writer connector;

  • Kafka Jet writer connector.

Конфигурация коннектора представляет собой текстовый YAML-файл, параметры которого организованы в древовидную структуру.

Пример файла конфигурации Prostore приведен в разделе Конфигурация коннекторов документации Prostore.

2.2.2. Настройка СМЭВ QL Сервера

2.2.2.1. Конфигурирование сервера

Конфигурирование СМЭВ QL сервера выполняется путем изменения параметров настроек, определенных в файлах credentials.yaml и application.yaml.

  • application.yaml - конфигурирует поведение сервера;

  • credentials.yaml - конфигурирует представление сервера.

2.2.2.1.1. Конфигурация файла application.yml
ktor:
  deployment:
    port: "$PORT:8080"
  application:
    modules:
      - ru.gov.digital.smevql.ApplicationKt.mainModule

sources:
  directory: "$SOURCES_DIR:sources"
models:
  directory: "$MODELS_DIR:models"
states:
  directory: "$STATES_DIR:states"

swagger:
  file: smevql-openapi.yaml # путь к файлу openapi спецификации
  servers:
    - "http://127.0.0.1:8080/smevql/api/v1"

storage: # Блок параметров хранения информации
  adapter: redis # На текущий момент поддерживается только redis
  pool: # Настройка подключений к redis
    - host: 127.0.0.1
      port: 6379
  max-pool-size: 20 # Максимальный размер пула соединений
  user: "" # Пользователь для подключения к redis
  password: "" # Пароль

access: # Блок настроек доступа к выполнению операций чтения данных и операций стейтмашины. Допускается задание черного или белого списка
  black-list: [ ] # Указывает список потребителей, для которых доступ запрещен
  white-list: [ ] # Указывает список потребителей, для которых доступ разрешен

request:
  strategy: delegate # Стратегия исполнения запросов delegate|atomic
  timeout: 20s # Таймаут исполнения запросов
  base-path: smevql/api/v1 # Префикс для всех роутов
  max-nested-level: 5 # Предельная вложенность запрашиваемых ресурсов
  pagination:
    default: 100 # Количество элементов на странице по умолчанию
    max: 1000 # Максимальное количество элементов на странице
  logging:
    long:
      duration: 20s # Продолжительность исполнения запросов к источникам, выше которой необходимо производить логирование
      percentage: 100 # Процент логирования длительных запросов к источникам. Допустимо использовать вещественные числа, например, 0.1 - только каждый тысячный долгий запрос
  limits: # Блок параметров конфигурации лимитов
    enabled: true # флаг влюкчения проверок лимитов
    total: # Параметры по всем запросам
      value: 500000 # Общее число запросов в период времени
      period: 1D # Период лимитирования
    mnemonic: # Блок настроек лимитирования по потребителям
      value: 5000 # Число запросов в период времени
      period: 1D # Период лимитирования
    purpose: # Блок настроек лимитирования по целям
      value: 5000 # Число запросов в период времени
      period: 1D # Период лимитирования
    user: # Блок настроек лимитирования по пользователям
      value: 1000 # Число запросов в период времени
      period: 1D # Период лимитирования
    records-ttl:
      day: 1M # Период хранения дневной статистики
      week: 1M # Период хранения статистики за неделю
      month: 1Y # Период хранения статистики за месяц
      year: 2Y # Период хранения статистики за год
  async: # Блок настроек асинхронного выполнения запросов
    request-in: 10s # Значение интервала опроса получения данных асинхронного результата. Выдается в качестве значения атрибута request_in на запрос получения данных
    read-timeout: 5m # Таймаут вычитывания асинхронных данных из источников. Используется для источников с типом smevql, если была возвращена информация по асинхронным результатам

delta:
  commit-interval: 60s # Интервал фиксации дельты источника при изменении данных
  force-commit-interval: 30m # Интервал принудительной фиксации дельт всех источников

state:
  max-nested-event: 5 # Максимально допустимая вложенность связанных переходов стейт машины
  max-updated-rows: 1 # Максимальное количество обновляемых строк при событии стейт машины

index-recommendations: # Рекомендации по аналитике
  enabled: true # Флаг включения формирования рекомендаций
  period: 7D  # Период формирования. 7 дней
  concurrency: 10 # Количество параллельных корутин сохранения статистики

# Массив описания standalone таблиц
standalone-tables: [ ]
# Пример описания
# standalone-tables:
#  - readable-table: "misdm05.readable_book"
#    writable-table: "misdm05.writable_book"
#    anchor: "update_at"
#    soft-delete: "delete_at"

# Массив описания proxy таблиц
proxy-tables: [ ]
# Пример описания
# proxy-tables:
#  - table: "misdm05.notebook"
#    anchor: "update_at"
#    soft-delete: "delete_at"

push: # Настройки отправки push уведомлений
  notification-path: "/{target}/push/notify" # Шаблон пути агента, на который необходимо отправлять нотификации
  state-machine-enabled: false # Признак публикации нотификаций на основе событий стейт машины
  status-prostore-enabled: true # Признак публикации нотификаций на основе событий статусов Простора
  prostore:
    status-event-topic:
      topic: "$PS_STATUS_EVENT_TOPIC:status.event"
      property:
        bootstrap.servers: "$PS_KAFKA:localhost:9092"
        group.id: smevql-server-status-event
        auto.offset.reset: earliest
  retry:
    max-attempts: 3 # Количество попыток отправки нотификации
    min-period: 5s # Минимальный период ожидания перед повторной попыткой
    max-period: 10s # Максимальный период ожидания перед повторной попыткой

storage-queue:
  host: "$QUEUE_HOST:localhost"
  port: "$QUEUE_PORT:5432"
  database: "$QUEUE_DATABASE:smevql"
  schema: "$QUEUE_SCHEMA:smevqlqueue"
  user: "$QUEUE_USER:"
  password: "$QUEUE_PASSWORD:"

environment: "$ENVIRONMENT:dev"

agent: # Параметры конфигурирования агента СМЭВ4
  host: 127.0.0.1 # Хост агента
  port: 8171 # Порт приема api-gateway запросов
  mnemonic: "" # Мнемоника агента

signature: # Блок настроек механизма подписания
  enabled: true # Признак включения подписания и проверки подписи
  validate-enabled: false # Признак предоставления дополнительного URL проверки подписи
  algorithm: "GOST3410_2012_256" # Алгоритм формирования подписи
  serial-number: "" # Серийный номер ключа подписи
  alias: "" # Алиас ключа. Заполняется либо серийный номер, либо алиас
  notarius: # Блок настроек сервиса Notaris, используемый для подписания
    host: localhost # Хост, на котором доступен Notaris
    port: 8080 # Порт, на котором доступен Notaris

Настройка конфигурации СМЭВ QL сервера осуществляется путем редактирования параметров настроек в файле application.yml, в котором могут быть настроены следующие секции:

  • sources - определение директории хранения источников;

  • models - определение директории хранения моделей;

  • states - определение директории хранения состояний;

  • swagger - настройка файла openapi спецификации;

  • storage - управление подключением к внутреннему хранилищу данных СМЭВ-QL;

  • access - блок настроек доступа к выполнению операций чтения данных и операций стейт-машины;

  • request - блок настроек исполнения запросов;

  • delta - управление принудительными коммитами дельт витрин данных;

  • state - установка ограничений в машинах-состояний;

  • index_recommendations - рекомендации по аналитике;

  • push - настройки отправки push уведомлений; - environment - определяет значение среды разработки;

  • agent - параметры конфигурирования Агента СМЭВ4;

  • signature - блок настроек механизма подписания.

2.2.2.1.1.1. Секция storage

В секции storage настраиваются параметры хранения информации, например:

storage: # Блок параметров хранения информации
  adapter: redis # На текущий момент поддерживается только redis
  pool: # Настройка подключений к redis
    - host: 127.0.0.1
      port: 6379
  max_pool_size: 20 # Максимальный размер пула соединений
  user: "" # Пользователь для подключения к redis
  password: "" # Пароль

Параметры конфигурации

  • adapter - система хранения данных, на текущий момент поддерживается только redis;

  • pool - указание host и port для подключения к хранилищу данных;

  • host - адрес хоста;

  • port - порт хоста;

  • max_pool_size - максимальный размер пула соединений;

  • user - имя пользователя для авторизации в системе хранения данных;

  • password - пароль для авторизации в системе хранения данных.

2.2.2.1.1.2. Секция access

В секции access настраивается доступ к выполнению операций чтения данных и операций стейт-машины.

Допускается задание черного или белого списка.

Например:

access: # Блок настроек доступа к выполнению операций чтения данных и операций стейтмашины. Допускается задание черного или белого списка
  black_list: [ ] # Указывает список потребителей, для которых доступ запрещен
  white_list: [ ] # Указывает список потребителей, для которых доступ разрешен

Параметры конфигурации

  • black_list - перечень мнемоник ИС Потребителей, которым запрещен доступ к СМЭВ QL. Не заполняется, если заполнен white_list!

  • white_list - перечень мнемоник ИС Потребителей, которым разрешен доступ к СМЭВ QL. Не заполняется, если заполнен black_list!

2.2.2.1.1.3. Секция request

В секции request хранятся настройки исполнения запросов, например:

request:
  timeout: 20s # Таймаут исполнения запросов
  base_path: smevql/api/v1 # Префикс для всех роутов
  max_nested_level: 5 # Предельная вложенность запрашиваемых ресурсов
  pagination:
      default: 100 # Количество элементов на странице по умолчанию
      max: 1000 # Максимальное количество элементов на странице
  logging:
      long:
      duration: 20s # Продолжительность исполнения запросов к источникам, выше которой необходимо производить логирование
      percentage: 100 # Процент логирования длительных запросов к источникам. Допустимо использовать вещественные числа, например, 0.1 - только каждый тысячный долгий запрос
  limits: # Блок параметров конфигурации лимитов
      total: # Параметры по всем запросам
      value: 500000 # Общее число запросов в период времени
      period: 1D # Период лимитирования
      mnemonic: # Блок настроек лимитирования по потребителям
      value: 5000 # Число запросов в период времени
      period: 1D # Период лимитирования
      purpose: # Блок настроек лимитирования по целям
      value: 5000 # Число запросов в период времени
      period: 1D # Период лимитирования
      user: # Блок настроек лимитирования по пользователям
      value: 1000 # Число запросов в период времени
      period: 1D # Период лимитирования
      records_ttl:
      day: 1M # Период хранения дневной статистики
      week: 1M # Период хранения статистики за неделю
      month: 1Y # Период хранения статистики за месяц
      year: 2Y # Период хранения статистики за год
  async: # Блок настроек асинхронного выполнения запросов
      request_in: 10s # Значение интервала опроса получения данных асинхронного результата. Выдается в качестве значения атрибута request_in на запрос получения данных
      read_timeout: 5m # Таймаут вычитывания асинхронных данных из источников. Используется для источников с типом smevql, если была возвращена информация по асинхронным результатам

Параметры конфигурации

  • timeout - таймаут исполнения запросов;

  • base_path - префикс для роута запросов. Например, smevql/api/v1;

  • max_nested_level - предельная вложенность запрашиваемых ресурсов;

  • pagination - управление количеством элементов при ответе. Содержит следующие атрибуты:

    • default - количество элементов на странице по умолчанию;

    • max - максимальное количество элементов на странице;

  • logging - управление логированием «долгих» запросов. Содержит следующие атрибуты:

    • duration - продолжительность исполнения запросов к источникам, выше которой необходимо производить логирование. Например: 20s;

    • percentage - процент логирования длительных запросов к источникам. Допустимо использовать вещественные числа, например, 0.1 - только каждый тысячный долгий запрос;

  • limits - установка ограничений на количество запросов. Содержит следующие атрибуты:

    • total - общее допустимое количество запросов к серверу:

      • value - целочисленное значение количества запросов, например: 1000;

      • period - на какой период устанавливается ограничение, например: 1D (на сутки)

    • mnemonic - допустимое для одного потребителя данных количество запросов к серверу:

      • value - целочисленное значение количества запросов, например: 100;

      • period - на какой период устанавливается ограничение, например: 1D (на сутки);

    • purpose - допустимое количество запросов к одному ресурсу (таблице, объекту)

      • value - целочисленное значение количества запросов, например: 100;

      • period - на какой период устанавливается ограничение, например: 1D (на сутки);

    • user - допустимое количество запросов для пользователя:

      • value - целочисленное значение количества запросов, например: 100;

      • period - на какой период устанавливается ограничение, например: 1D (на сутки);

    • records_ttl - настройка хранения статистики по лимитам:

      • day: 1M - период хранения дневной статистики;

      • week: 1M - период хранения статистики за неделю;

      • month: 1Y - период хранения статистики за месяц;

      • year: 2Y- период хранения статистики за год;

  • async - блок настроек асинхронного выполнения запросов. Содержит следующие атрибуты:

    • request_in - значение интервала опроса получения данных асинхронного результата. Выдается в качестве значения атрибута request_in на запрос получения данных;

    • read_timeout - таймаут вычитывания асинхронных данных из источников. Используется для источников с типом smevql, если была возвращена информация по асинхронным результатам

2.2.2.1.1.4. Секция delta

В секции delta настраивается управление принудительными коммитами дельт витрин данных.

Например:

delta:
  commit_interval: 60s # Интервал фиксации дельты источника при изменении данных
  force_commit_interval: 30m # Интервал принудительной фиксации дельт всех источников

Параметры конфигурации

  • commit_interval - интервал фиксации дельты источника при изменении данных, например 60s;

  • force_commit_interval - интервал принудительной фиксации дельт всех источников, например 30s.

Если commit_interval: 0 и force_commit_interval: 0, то для добавления/изменения/удаления данных в Prostore не используется механизм открытия и закрытия дельт, а данные меняются прямым запросом.

При этом возникают следующие ограничения:

  • в бекап текущей реализации данные, софрмированние вне дельт, не попадают;

  • в результаты запросов к материализованным представлениям данные, софрмированние вне дельт, не попадают;

  • в рамках подписок данные, софрмированние вне дельт, не передаются.

2.2.2.1.1.5. Секция state

В секции state устанавливаются ограничения в стейт машинах.

Например:

state:
  max_nested_event: 5 # Максимально допустимая вложенность связанных переходов стейт машины
  max_updated_rows: 1 # Максимальное количество обновляемых строк при событии стейт машины

Параметры конфигурации

  • max_nested_event - максимально допустимая вложенность связанных переходов стейт машины, например 5;

  • max_updated_rows - максимальное количество обновляемых строк при событии стейт машины, например 1.

2.2.2.1.1.6. Секция index_recommendations

В секции index_recommendations настраиваются рекомендации по аналитике, например:

index_recommendations: # Рекомендации по аналитике
  period: 7D  # Период формирования. 7 дней

Параметры конфигурации

  • period - устанавливается период формирования аналитики, например 7 дней.

2.2.2.1.1.7. Секция standalone-tables

В секции standalone-tables настраиваются данные standalone таблиц.

Например:

standalone-tables: [ ]
# Пример описания
# standalone-tables:
#  - readable-table: "misdm05.readable_book"
#    writable-table: "misdm05.writable_book"
#    anchor: "update_at"
#    soft-delete: "delete_at"

Параметры конфигурации

  • readable-table - название readable таблицы;

  • writable-table - название writable таблицы;

  • anchor - название атрибута характеризующего дату и время последнего изменения данных в нетемпоральной таблице;

  • soft-delete - название атрибута характеризующего дату и время удаления данных в нетемпоральной таблице.

2.2.2.1.1.8. Секция proxy-tables

В секции proxy-tables настраиваются данные прокси-таблиц.

Например:

# Массив описания proxy таблиц
  proxy-tables: [ ]
  # Пример описания
  # proxy-tables:
  #  - table: "misdm05.notebook"
  #    anchor: "update_at"
  #    soft-delete: "delete_at"

Параметры конфигурации

  • table - название прокси таблицы;

  • anchor - название атрибута характеризующего дату и время последнего изменения данных в нетемпоральной прокси таблице;

  • soft-delete - название атрибута характеризующего дату и время удаления данных в нетемпоральной прокси таблице.

2.2.2.1.1.9. Секция push

В секции push содержатся настройки сервиса формирования push-уведомлений.

Например:

push: # Настройки отправки push уведомлений
  notification-path: "/{target}/push/notify" # Шаблон пути агента, на который необходимо отправлять нотификации
  state-machine-enabled: false # Признак публикации нотификаций на основе событий стейт машины
  status-prostore-enabled: true # Признак публикации нотификаций на основе событий статусов Простора
  prostore:
    status-event-topic:
      topic: "$PS_STATUS_EVENT_TOPIC:status.event"
      property:
        bootstrap.servers: "$PS_KAFKA:localhost:9092"
        group.id: smevql-server-status-event
        auto.offset.reset: earliest
  retry:
    max-attempts: 3 # Количество попыток отправки нотификации
    min-period: 5s # Минимальный период ожидания перед повторной попыткой
    max-period: 10s # Максимальный период ожидания перед повторной попыткой

Параметры конфигурации

  • notification_path - шаблон пути агента, на который необходимо отправлять нотификации;

  • state_machine_enabled - признак публикации нотификаций на основе событий стейт машины;

  • retry - настройки попыток отправок нотификаций.

2.2.2.1.1.10. Секция agent

В секции agent указываются параметры подключения к Агенту СМЭВ4 поставщика, например:

agent: # Параметры конфигурирования агента СМЭВ4
  host: 127.0.0.1 # Хост агента
  port: 8171 # Порт приема api-gateway запросов
  mnemonic: "" # Мнемоника агента

Параметры конфигурации

  • host - хост агента;

  • port - порт приема api-gateway запросов;

  • mnemonic - мнемоника агента СМЭВ4.

2.2.2.1.1.11. Секция signature

В секции signature настраивается управление механизмом цифровой подписи.

Например:

signature: # Блок настроек механизма подписания
  enabled: true # Признак включения подписания и проверки подписи
  validate_enabled: false # Признак предоставления дополнительного URL проверки подписи
  algorithm: "GOST3410_2012_256" # Алгоритм формирования подписи
  serial_number: "" # Серийный номер ключа подписи
  alias: "" # Алиас ключа. Заполняется либо серийный номер, либо алиас
  notarius: # Блок настроек сервиса Notaris, используемый для подписания
      host: localhost # Хост, на котором доступен Notaris
      port: 8080 # Порт, на котором доступен Notaris

Параметры конфигурации

  • enable - включение (true), отключение (false) подписи ответов и проверки подписей других источников;

  • validate_enabled - признак предоставления дополнительного URL проверки подписи (доступность вызова REST-метода проверки подписи);

  • algorithm - алгоритм формирования подписи. На текущий момент доступен только GOST3410_2012_256;

  • serial_number - серийный номер ключа подписи;

  • alias - алиас ключа, заполняется либо серийный номер, либо алиас;

  • notarius - настройки подключения (host и port) к модулю криптографии notarius.

2.2.2.1.2. Конфигурация файла credentials.yml
version: 1.0.0
system:
    mnemonic: smev_ql_mnemonic
    instance: smev_ql_instance

Параметры конфигурации

  • version - номер версии СМЭВ QL;

  • mnemonic - мнемоника СМЭВ QL, по этому параметру осуществляется идентификация СМЭВ QL сервер во внешних системах и СМЭВ4;

  • instance - наименование инстанса СМЭВ QL.

2.2.2.1.3. Общий сценарий выполнения
  1. Администратор системы открывает на редактирование нужный файл (credentials.yaml и/или application.yaml) настроек СМЭВ QL сервер и меняет требуемые параметры.

  2. Перезапускает приложение для применения новых настроек. Для этого открывает консоль утилиты работы со СМЭВ QL и выполняет команду:

./smevql restart

2.2.3. Настройка СМЭВ3-адаптера

2.2.3.1. Конфигурация СМЭВ3-адаптер (application.yml)

Файл application.yml – основной конфигурационный файл CМЭВ3-адаптера, в котором задана логика и порядок работы адаптера:

  • получение входящих запросов, их обработка;

  • настройка подключения к СМЭВ и FTP-серверу СМЭВ3, к Prostore через REST-запросы;

  • настройка алгоритма формирования и проверки электронной подписи(ЭП) и т.д.

2.2.3.1.1. Пример файла application.yml
vertx:
  #Настройки вертикса
  #тут можно указать все настройки из документации для vertx
  props:
    # метрики
    metricsOptions:
      enabled: true
      # тип метрик, например prometheusOptions | jmxMetricsOptions
      prometheusOptions:
        enabled: true
        startEmbeddedServer: true
        embeddedServerOptions:
          #порт для сервера с метриками
          port: 9033
  web-client:
    max-pool-size: 20

spring:
  main:
    allow-bean-definition-overriding: true

iua: # Блок настроек взаимодействия с сервисом ИУА
  it-system: "" # мнемоника информационной системы
  wsdl-url: http://localhost:7575/ws/?wsdl # адрес к wsdl веб сервиса ИУА
  endpoint-address: "" # Endpoint для запросов к сервису ИУА. По умолчанию указывать не требуется
  retry-count: 2
  retry-delay: 500ms

smev:
  # self | iua
  # self- собственная реализация подписи и взаимодействия с транспортом
  # iua- подписание и работа с транспортом через адаптер ИУА
  implementation: self
  #url смэва
  endpointUrl: http://localhost:7979/api/v1/soap/
  keystoreType: "DUMMY"
  keystoreFile: x
  keystorePass: x
  privateKeyAlias: x
  privateKeyPass: x
  certificateAlias: x
  signatureURI: "http://www.w3.org/2001/04/xmldsig-more#dummy"
  # алгоритм подписи
  signatureAlgorithm: "DUMMY"
  #метод подписи
  digestMethod: "http://www.w3.org/2001/04/xmldsig-more#dummy"
  #версия схемы смев
  #availiabe 1.2 and 1.3
  version: 1.3
  #верификация входящих сообщений
  incomingVerificationEnabled: false
  #подпись исходящих сообщений
  outgoingSigningEnabled: false
  #таймаут отправки сообщения в смев
  timeout: 30000
  #время между попытками перепосылки в смев
  retry-timeout: 30000
  #максимальный размер очереди, ожидающей отправки сообщений
  webMaxWaitQueueSize: -1
  #пул коннектов
  webMaxPoolSize: 20

receiver:
  receiver-property:
    - selector: # селектор сообщений из смэв
        # используется при smev3->implementation: self, должно быть пусто или может отсутствовать при использовании smev3->implementation: iua
        namespace: a
        # используется при smev3->implementation: self, должно быть пусто или может отсутствовать при использовании smev3->implementation: iua
        root-element-name: b
        # используется при smev3->implementation: iua, должно быть пусто или может отсутствовать при использовании smev3->implementation: self
        router-extra-queue: some_request
      # пебл шаблон, который будет обрабатываться для определенного selector
      template: smev3-adapter/templates/smev.xml.peb
      # задержка между запросами, в случае если очередь пуста
      idle-delay: PT1m
      # файл, который будет отправлен в случае ошибки
      fallback-response: smev3-adapter/templates/fallback.xml
    - selector:
        namespace: urn://x-artefacts-testperson/1.0
        root-element-name: TestPersonRequest
        router-extra-queue: some_request
      template: smev3-adapter/templates/smev.xml.peb
      idle-delay: PT1m

  response-receiver-property:
    - selector: # селектор из смэв
        # используется при smev3->implementation: self, должно быть пусто или может отсутствовать при использовании smev3->implementation: iua
        namespace: a
        # используется при smev3->implementation: self, должно быть пусто или может отсутствовать при использовании smev3->implementation: iua
        root-element-name: b
        # используется при smev3->implementation: iua, должно быть пусто или может отсутствовать при использовании smev3->implementation: self
        router-extra-queue: some_request
      # пебл шаблон, который будет обрабатываться для определенного selector
      template: smev3-adapter/templates/smev.xml.peb
      # задержка между запросами, в случае если очередь пуста
      idle-delay: PT1m

persistence-mode: prostore # prostore -default, zookeeper

prostore-rest-client:
  persistence-datamart: persistence
  datasource: # по умолчанию пусто, тогда берется единственный датасорс из настроек Простора
  table-variables: smev3_adapter_variables
  host: ${PS_HOST:localhost}
  port: ${PS_PORT:9195}
  http:
    max-pool-size: ${PS_MAX_POOL_SIZE:8}
  default-schema: demo_view


environment:
  name: ${ENVIRONMENT_NAME:test}

zookeeper:
  connection-string: ${ZOOKEEPER_DS_ADDRESS:t5-adsp-01.ru-central1.internal}
  retryPolicy:
    baseSleepTime: 1000
    maxRetries: 3
    maxSleepTime: 3000
  chroot: ${ZOOKEEPER_DS_CHROOT:/adapter}

migration:
  zk-enabled: ${MIGRATION_ZK_ENABLE:false}

paramstorage:
  base-path: '/smev/paramstorage'

sign:
  #алгоритм подписи файла
  digest-algorithm: 1.2.643.7.1.1.2.2

blob:
  blob-source: # настройки подключения к BLOB адаптеру
    host: 'localhost'
    port: 8080
    path:
  ftp-destination:
    host: localhost # хост фтп смева
    port: 21 # порт фтп смева
    # path: aaa/bbb/ccc # корневой каталог
    user: user # пользователь
    password: 123 # пароль

rest:
  enabled: false # вкл/выкл
  get: /le # путь get запроса
  post: /le # путь post запроса
  template: smev3-adapter/templates/smev.xml.peb # обрабатываемый шаблон

# рассылка смев
scheduler:
  templates:
    - enabled: false # вкл/выкл
      interval: PT30s # интервал между запусками
      template: smev3-adapter/templates/pfr-delta.peb # обрабатываемый шаблон

pool:
  reader-executor: 20 # корутин пул для обработки смев шаблонов
  schedule-executor: 1 # корутин пул для обработки  шедулера
  logExecutor: 20

logging:
  level:
    root: info
    ru:
      rtlabs:
        smev:
          logging: trace
  request-response:
    smev-request: true
    smev-response: true

http-server:
  port: ${SERVER_PORT:8080}

backup:
  mode: ${BACKUP_MODE:rest} # kafka | rest
  rest:
    uri: ${BACKUP_URI:/backup}
  backupTopic: ${BACKUP_TOPIC:adapter.backup}
  statusTopic: ${STATUS_TOPIC:adapter.status}
  kafka:
    consumer:
      property:
        bootstrap.servers: ${KAFKA_BOOTSTRAP_SERVERS:localhost:9092}
        group.id: ${SMEV3_BACKUP_GROUP_ID:smev3-adapter_adapter_command}
        auto.offset.reset: latest
    producer:
      property:
        bootstrap.servers: ${KAFKA_BOOTSTRAP_SERVERS:localhost:9092}


# Параметры подключения к сервису печатных форм. Указывается при использовании функции toSpf
spf:
  host: ${SPF_HOST:localhost}
  port: ${SPF_PORT:8080}
  # Дополнительные параметры. Указываются ключ-значения сертификатов, необходимых для сервиса ПФ
  params: {}

# Настройки модуля сбора информации о компонентах витрины
component-info:
  enabled: true
  # DataSource Prostore
  datasource: ''
  # Схема Prostore
  datamart: component_info
  # Имя таблицы для записи информации о компоненте
  table-name: component_info
  # Период попыток создания схемы, при неуспехе
  create-table-period: 60s
  # Период публикации health-check
  publish-period: 60s
  # Период после которого компонент считается неактивным при отсутствии health-check
  timeout-active: 300s
  # Список элементов конфига маскируемых при отправке,
  #  если указан узловой элемент, то маскируются все вложенные в него элементы
  secrets:
    - keys

# Допускаются лишь скалярные строковые значения,
# так например переменная pebble-variables→host станет доступна в pebble как {{host}}
pebble-variables: { }

2.2.3.2. Параметры конфигурации

Настройка конфигурации CМЭВ3-адаптера осуществляется путем редактирования параметров настроек в файле application.yml.

Обязательными параметрами для настройки CМЭВ3-адаптера являются секции: smev, receiver, datasource. Остальные параметры следует оставить без изменения и настраивать только для решения определенных бизнес-задач.

Pebble-шаблоны для настройки задаются в секциях: receiver-property, rest и scheduler.

Для каждого вида сведений, предоставляемых Витриной, следует создавать отдельное сопоставление receiver и устанавливать значения receiver-property. Остальные параметры следует оставить без изменения.

В файле конфигурации могут быть настроены следующие секции:

  • vertx – настройка параметров фреймворка Vert.x (подробнее на сайте разработчиков: https://vertx.io/docs/).

  • spring – подключение к фреймворку spring boot (используется для разработки);

  • iua - блок настроек взаимодействия с сервисом ИУА;

  • smev – настройки подключения к CМЭВ3-адаптеру;

  • receiver- настройка взаимодействия СМЭВ-запросов с Peblle-шаблонами (для каждого receiver можно настроить количество instance);

  • persistence-mode - настройки хранения данных;

  • prostore-rest-client - блок параметров конфигурирования взаимодействия с ProStore;

  • datasource – параметры подключения к ProStore;

  • environment - настройки окружения;

  • zookeeper – параметры подключения к Zookeeper;

  • migration – настройка параметров миграции сервисной базы данных CМЭВ3-адаптера**` в базу данных **Zookeeper;

  • paramstorage – указывается корневой путь хранилища параметров;

  • deltastorage – указывается корневой путь хранилища дельт;

  • sign - настройка формирования и проверки электронной подписи(ЭП) в SOAP-пакетах СМЭВ3;

  • blob - интеграция с BLOB-адаптер;

  • rest - настройки подключения для возможности выполнения rest-запросов к СМЭВ3-адаптеру и получения ответов на них;

  • scheduler - настройка планировщика заданий (запуск дельт по расписанию);

  • pool - размер прерываемого кода;

  • logging – настраивается логирование работы модуля;

  • http-server - указывается порт веб-сервера;

  • backup - настройки бекапирования;

  • spf - Параметры подключения к сервису печатных форм (Указывается при использовании функции toSpf);

  • component-info - настройки модуля сбора информации о компонентах витрины.

2.2.3.2.1. Секция vertx

Секция vertx предназначена для настройки параметров фреймворка Vert.x (подробнее на сайте разработчиков: https://vertx.io/docs/). Для включения сбора метрик используйте следующий код:

vertx:
  #Настройки вертикса
  #тут можно указать все настройки из документации для vertx
  props:
    # метрики
    metricsOptions:
      enabled: true
      # тип метрик, например prometheusOptions | jmxMetricsOptions
      prometheusOptions:
        enabled: true
        startEmbeddedServer: true
        embeddedServerOptions:
          #порт для сервера с метриками
          port: 9033
  web-client:
    max-pool-size: 20
2.2.3.2.2. Секция spring

Секция spring подключение к фреймворку spring boot (используется для разработки).

Например:

spring:
  main:
    allow-bean-definition-overriding: true
2.2.3.2.3. Секция iua

Секция iua хранит блок настроек взаимодействия с сервисом ИУА.

Например:

iua:
  it-system: ""
  wsdl-url: http://localhost:7575/ws/?wsdl
  endpoint-address: "" # Endpoint для запросов к сервису ИУА. По умолчанию указывать не требуется
  retry-count: 2
  retry-delay: 500ms

Параметры настроек

  • it-system - мнемоника информационной системы;

  • wsdl-url - адрес к wsdl веб сервиса ИУА;

  • endpoint-address - Endpoint для запросов к сервису ИУА. По умолчанию указывать не требуется;

  • idle-delay - периодичность опроса очереди СМЭВ3 для получения новых запросов (в формате ISO 8601).

  • retry-count - кол-во попыток осуществления запросов к сервису;

  • retry-delay - период задержки в секундах.

2.2.3.2.4. Секция smev

Секция smev отвечает за настройки подключения к СМЭВ3.

Например:

smev:
  endpointUrl: http://127.0.0.1:7979/api/v1/soap/
  keystoreType: "DUMMY"
  keystoreFile: x
  keystorePass: x
  privateKeyAlias: x
  privateKeyPass: x
  certificateAlias: x
  signatureURI: "http://www.w3.org/2001/04/xmldsig-more#dummy"
  signatureAlgorithm: "DUMMY"
  digestMethod: "http://www.w3.org/2001/04/xmldsig-more#dummy"
  incomingVerificationEnabled: false
  outgoingSigningEnabled: true
  #таймаут отправки сообщения в смев
  timeout: 30000
  #время между попытками перепосылки в смев
  retry-timeout: 30000
  #максимальный размер очереди, ожидающей отправки сообщений
  webMaxWaitQueueSize: -1
  #пул коннектов
  webMaxPoolSize: 20

В случае, когда СМЭВ3 не отвечает на запрос, в новой версии СМЭВ3-адаптера (секция smev), добавлена возможность, которая позволяет задать время ожидания ответа (timeout) перед повторной отправкой запроса к СМЭВ3:

  • timeout - таймаут отправки сообщения в СМЭВ3;

  • retry-timeout - время между повторной попыткой отправки запроса в СМЭВ3;

  • webMaxWaitQueueSize - максимальный размер очереди, ожидающей отправки сообщений;

  • webMaxPoolSize - пул коннектов.

Примечание

Для удобного отслеживания в лог-файлах всех запросов/ответов к СМЭВ3 в рамках одной бизнес-операции, в файл logback-json.xml добавлен параметр ReqMessageID. При обработке ошибки от СМЭВ3, в лог-файл добавляется описание ошибки и код ошибки СМЭВ3 (в том случае, если СМЭВ3 вернул данный код в блоке description).

2.2.3.2.5. Секция receiver

Секция receiver предназначена для настройки параметров взаимодействия СМЭВ-запросов с peblle-шаблонами.

Например:

receiver:
  receiver-property:
    - selector: # селектор сообщений из смэв
        # используется при smev3->implementation: self, должно быть пусто или может отсутствовать при использовании smev3->implementation: iua
        namespace: a
        # используется при smev3->implementation: self, должно быть пусто или может отсутствовать при использовании smev3->implementation: iua
        root-element-name: b
        # используется при smev3->implementation: iua, должно быть пусто или может отсутствовать при использовании smev3->implementation: self
        router-extra-queue: some_request
      # пебл шаблон, который будет обрабатываться для определенного selector
      template: smev3-adapter/templates/smev.xml.peb
      # задержка между запросами, в случае если очередь пуста
      idle-delay: PT1m
      # файл, который будет отправлен в случае ошибки
      fallback-response: smev3-adapter/templates/fallback.xml
    - selector:
        namespace: urn://x-artefacts-testperson/1.0
        root-element-name: TestPersonRequest
        router-extra-queue: some_request
      template: smev3-adapter/templates/smev.xml.peb
      idle-delay: PT1m

  response-receiver-property:
    - selector: # селектор из смэв
        # используется при smev3->implementation: self, должно быть пусто или может отсутствовать при использовании smev3->implementation: iua
        namespace: a
        # используется при smev3->implementation: self, должно быть пусто или может отсутствовать при использовании smev3->implementation: iua
        root-element-name: b
        # используется при smev3->implementation: iua, должно быть пусто или может отсутствовать при использовании smev3->implementation: self
        router-extra-queue: some_request
      # пебл шаблон, который будет обрабатываться для определенного selector
      template: smev3-adapter/templates/smev.xml.peb
      # задержка между запросами, в случае если очередь пуста
      idle-delay: PT1m

Параметры настроек

  • selector - селектор сообщений из СМЭВ;

  • namespace - пространство имен в XML.

  • root-element-name - имя корневого элемента запроса обрабатываемого ВС (как указано в заявке на регистрацию ВС);

  • router-extra-queue - очередь роутера, используется при smev3->implementation: iua, должно быть пусто или может отсутствовать при использовании smev3->implementation: self;

  • template имя файла, содержащего pebble-шаблон обработки запросов для данного ВС;

  • idle-delay - периодичность опроса очереди СМЭВ3 для получения новых запросов (в формате ISO 8601).

Пример файла smev.xml.peb

<TestPersonResponse xmlns="urn://x-artefacts-testperson/1.0">
{% set my_blob = fromblob ("/Picture_13.jpg", "my_fname", "my_mime") %}
<photo>{{ toftp ("some test 1", "file.txt", "text/plain") }}</photo>
<photo>{{ toftp ("some test 2", "file.txt", "text/plain") }}</photo>
<photo>{{ toftp ("some test 3", "file2.txt", "text/plain") }}</photo>
<photo>{{ tomtom (my_blob, my_mime) }}</photo>
</TestPersonResponse>

Пример файла fallback.xml (Ответ при ошибке обработки запроса)

<TestPersonResponse xmlns="urn://x-artefacts-testperson/1.0">
    <text>Произошла ошибка при обработке запроса: %error_message%</text>
</TestPersonResponse>
2.2.3.2.6. Секция persistence-mode

В секции persistence-mode указывается настройка хранения данных: или в Prostore или в Zookeeper. в случае выбора Prostore автоматически создаются необходимые таблицы.

Например:

persistence-mode: ${PERSISTENCE_MODE:prostore} # prostore -default, zookeeper

Параметры настроек

  • persistence-mode - настройка хранения данных, например PERSISTENCE_MODE:prostore.

2.2.3.2.7. Секция prostore-rest-client

В секции prostore-rest-client реализован блок параметров конфигурирования взаимодействия с ProStore.

Например:

prostore-rest-client:
  persistence-datamart: persistence
  datasource: # по умолчанию пусто, тогда берется единственный датасорс из настроек Простора
  table-variables: smev3_adapter_variables
  host: ${PS_HOST:localhost}
  port: ${PS_PORT:9195}
  http:
    max-pool-size: ${PS_MAX_POOL_SIZE:8}
  default-schema: demo_view

Параметры настроек

  • persistence-datamart - датамарт, где будут располагаться таблицы хранения данных, используется при persistence-mode = prostore

  • datasource - источник данных, например persistence;

  • table-variables - таблица переменных СМЭВ3-адаптера, например smev3_adapter_variables;

  • host - адрес Prostore, например PS_HOST:t5-prostore-01.ru-central1.internal;

  • port - порт Prostore, например PS_PORT:9195;

  • max-pool-size - максимальное число подключений к Prostore, например PS_MAX_POOL_SIZE:8.

2.2.3.2.8. Секция environment

В секции environment указывается среда разработки (dev, test, stable, prod)

Например:

environment:
  name: ${ENVIRONMENT_NAME:test}

Параметры настроек

  • name - Название окружения, например ENVIRONMENT_NAME:test.

2.2.3.2.9. Секция zookeeper

Секция zookeeper предназначена для настройки параметров подключения к Zookeeper.

Например:

zookeeper:
  connection-string: ${ZOOKEEPER_DS_ADDRESS:t5-adsp-01.ru-central1.internal}
  retryPolicy:
    baseSleepTime: 1000
    maxRetries: 3
    maxSleepTime: 3000
  chroot: ${ZOOKEEPER_DS_CHROOT:/adapter}

Параметры настроек

  • connect-string - адреса серверов для подключения к Zookeeper (разделитель - ,);

  • baseSleepTime - начальное значение таймаута ожидания при повторных запросах;

  • maxRetries - максимальное количество повторных запросов;

  • maxSleepTime - максимальное значение таймаута ожидания при повторных запросах.

2.2.3.2.10. Секция migration

Секция migration реализована настройка миграции зукипера для задачи бекапирования.

Например:

migration:
  zk-enabled: ${MIGRATION_ZK_ENABLE:false}

Параметры настроек

  • enabled - подключение миграции, например {MIGRATION_ENABLE:false}.

2.2.3.2.11. Секция paramstorage

В секции paramstorage указывается корневой путь до сервера Zookeeper для механизма параметров (ключ-значение).

Например:

paramstorage:
  base-path: '/smev/paramstorage'
2.2.3.2.12. Секция deltastorage

В секции deltastorage указывается корневой путь до сервера Zookeeper для механизма дельт.

Например:

deltastorage:
  base-path: '/smev/deltastorage'
2.2.3.2.13. Секция sign

Секция sign предназначена для формирования и проверки электронной подписи (ЭП) в SOAP-пакетах СМЭВ3.

Например:

sign:
  digest-algorithm: 1.2.643.7.1.1.2.2

Параметры настроек

  • digest-algorithm - алгоритм ключа проверки электронной подписи.

2.2.3.2.14. Секция blob

Секция blob предназначена для настройки взаимодействия модуля СМЭВ3-адаптер с:

  • BLOB-адаптером для считывания BLOB-полей (см. Взаимодействие через СМЭВ3-адаптер);

  • FTP-сервером СМЭВ3, на который модуль СМЭВ3-адаптер выгружает содержимое BLOB-полей и/или большие табличные данные.

Например:

blob:
  blob-source: # настройки подключения к BLOB адаптеру
    host: 'localhost'
    port: 8080
    path:
  ftp-destination:
    host: localhost # хост фтп смева
    port: 21 # порт фтп смева
    # path: aaa/bbb/ccc # корневой каталог
    user: user # пользователь
    password: 123 # пароль

Параметры настроек

  • blob-source - настройка подключения к BLOB-адаптеру;

  • ftp-destination - настройка подключения к FTP-серверу СМЭВ3.

2.2.3.2.15. Секция rest

Секция rest предназначена для настройки возможности выполнения REST-запросов к СМЭВ3-адаптеру и получения ответов на них.

Например:

rest:
  enabled: false # вкл/выкл
  get: /le # путь get запроса
  post: /le # путь post запроса
  template: smev3-adapter/templates/smev.xml.peb # обрабатываемый шаблон

Параметры настроек

  • enabled - включение настроек;

  • get - путь GET запроса;

  • post - путь POST запроса;

  • template - путь к Pebble-шаблону.

2.2.3.2.16. Секция scheduler

Секция scheduler предназначена для настройки планировщика заданий в случае, если планируется использовать механизм отправки дельт по расписанию.

Например:

scheduler:
  templates:
    - enabled: false
      interval: PT30s
      template: smev3-adapter/templates/pfr-delta.peb

Параметры настроек

  • enabled - включение планировщика заданий;

  • interval - интервал между отправкой дельт;

  • template - путь к Pebble-шаблону.

2.2.3.2.17. Секция pool

В секции pool указывается размер прерываемого кода.

Например:

pool:
  reader-executor: 20
  schedule-executor: 1
  logExecutor: 20

Параметры настроек

  • reader-executor - корутин пул для обработки смев шаблонов;

  • schedule-executor - корутин пул для обработки шедулера.

2.2.3.2.18. Секция logging

В секции logging настраивается логирование работы модуля.

Например:

logging:
  level:
    root: info
    ru:
      rtlabs:
        smev:
          logging: trace
  request-response:
    smev-request: true
    smev-response: true

Параметры настроек

  • smev-request - логирование запросов;

  • smev-response - логирование ответов.

2.2.3.2.19. Секция http-server

В секции http-server указывается порт веб-сервера.

Например:

server:
  port: ${SERVER_PORT:8080}

Параметры настроек

  • port - порт веб-сервера, например: SERVER_PORT:8080.

2.2.3.2.20. Секция backup

Секция backup предназначена для настроек бекапирования модуля.

Например:

backup:
  mode: ${BACKUP_MODE:rest} # kafka | rest
  rest:
    uri: ${BACKUP_URI:/backup}
  backupTopic: ${BACKUP_TOPIC:adapter.backup}
  statusTopic: ${STATUS_TOPIC:adapter.status}
  kafka:
    consumer:
      property:
        bootstrap.servers: ${KAFKA_BOOTSTRAP_SERVERS:localhost}
        group.id: ${CSV_UPLOADER_BACKUP_GROUP_ID:csv_uploader_adapter_command}
        auto.offset.reset: latest
    producer:
      property:
        bootstrap.servers: ${KAFKA_BOOTSTRAP_SERVERS:localhost}

Параметры настроек

  • mode - режим бекапирования, например BACKUP_MODE:rest;

  • uri - путь к файлу бекапирования в случае выбора REST-сервисов для режима бэкапирования;

  • backupTopic - топик для отправки сохраненных данных, например: {BACKUP_TOPIC:adapter.backup};

  • statusTopic - топик для отправки статусов бэкапирования, например: {STATUS_TOPIC:adapter.status}.

2.2.3.2.21. Секция spf

В секции spf указываются параметры подключения к сервису печатных форм. Указывается при использовании функции toSpf.

Например:

spf:
  host: ${SPF_HOST:localhost}
  port: ${SPF_PORT:8080}
  # Дополнительные параметры. Указываются ключ-значения сертификатов, необходимых для сервиса ПФ
  params: {}

Параметры настроек

  • host - адрес подключения, например {SPF_HOST:localhost};

  • port - порт подключения, например: {SPF_PORT:8080};

  • params - Дополнительные параметры. Указываются ключ-значения сертификатов, необходимых для сервиса ПФ.

2.2.3.2.22. Секция component-info

В секции component-info хранятся настройки компонента сбора информации о компонентах витрины.

Например:

component-info:
  enabled: true
  datasource: ''
  datamart: component_info
  table-name: component_info
  create-table-period: 60s
  publish-period: 60s
  timeout-active: 300s
  secrets:
    - keys

Параметры настроек

  • enabled - статус подключения компонента, указывается булево значение;

  • datasource - датасорс Prostore;

  • datamart - схема Prostore;

  • table-name - имя таблицы для записи информации о компоненте;

  • create-table-period - период попыток создания схемы, при неуспехе, указывается в секундах;

  • publish-period - период публикации health-check, указывается в секундах;

  • timeout-active - период после которого компонент считается неактивным при отсутствии health-check, указывается в секундах;

  • secrets - список элементов конфига маскируемых при отправке, если указан узловой элемент, то маскируются все вложенные в него элементы.

2.2.4. Настройка CSV-Uploader

2.2.4.1. Конфигурация CSV-uploader (application.yml)

Файл application.yml – основной конфигурационный файл модуля CSV-uploader, в котором задана логика и порядок работы загрузчика, а также другие настройки необходимые для корректной работы адаптера.

2.2.4.1.1. Пример файла application.yml
http-server:
  # Порт для старта веб сервера
  port: ${HTTP_PORT:8080}
  # Включить веб-сервер
  enabled: ${HTTP_ENABLED:true}

file-size:
  # Ограничение на размер оправляемого файла (мегабайты)
  restriction: ${SEND_FILE_SIZE_RESTRICTION:1024}

logging.level:
  root: info
  ru.itone: debug

environment:
  # Папка для ошибочных файлов
  error-folder: ${ENVIRONMENT_ERROR_FOLDER:error}

prostore-rest-client:
  persistence-datamart: ${PERSISTENCE_DATAMART:persistence} # датамарт, в котором будут располагаться таблицы с данными сервиса
  datasource: ${PERSISTENCE_DATASOURCE:} # по умолчанию пусто, тогда берется единственный датасорс из настроек Простора
  table-flk-journal: ${PERSISTENCE_FLK_JOURNAL_TABLE:csv_uploader_flk_journal} # таблица журнала ФЛК
  table-upload-journal: ${PERSISTENCE_UPLOAD_JOURNAL_TABLE:csv_uploader_upload_journal} # таблица журнала загрузок
  table-settings: ${PERSISTENCE_SETTINGS_TABLE:csv_uploader_settings} # таблица хранения настроек сервиса
  storage-duration: 14d # продолжительность хранения данных в журналах
  cleanup-interval: 10m # периодичность очистки данных из таблиц журналов
  host: ${PS_HOST:localhost}
  port: ${PS_PORT:9195}
  http:
    max-pool-size: ${PS_MAX_POOL_SIZE:8}

validation:
  rest-uploader-url: ${REST_UPLOADER_URL:http://localhost:8081}

upload:
  # требуется токен для аутентификации на rest-uploader
  jwt-auth: ${JWT_AUTH:false}
  jwt-token: ${JWT_TOKEN:null}

# Настройки парсера csv файлов
csv-parser:
  # Символ разделителя значений
  separator: ${CSV_PARSER_SEPARATOR:;}
  # Символ кавычки
  quote-char: ${CSV_PARSER_QUOTE_CHAR:"}
  # Символ экранирования значений
  escape-char: ${CSV_PARSER_ESCAPE_CHAR:'}
  # Настройка интерпретации значений как null. Допустимые значения:
  #  - EMPTY_SEPARATORS - пустое значение между двумя разделителями, например ;;
  #  - EMPTY_QUOTES - пустые кавычки, например ;"";
  #  - BOTH - оба варианта
  #  - NEITHER - никогда. Пустая строка всегда определяется как пустая строка
  field-as-null: ${CSV_PARSER_FIELD_AS_NULL:EMPTY_SEPARATORS}

metrics:
  port: ${METRICS_PORT:9837}

backup:
  mode: ${BACKUP_MODE:rest} # kafka | rest
  rest:
    uri: ${BACKUP_URI:/backup}
  backupTopic: ${BACKUP_TOPIC:adapter.backup}
  statusTopic: ${STATUS_TOPIC:adapter.status}
  kafka:
    consumer:
      property:
        bootstrap.servers: ${KAFKA_BOOTSTRAP_SERVERS:localhost}
        group.id: ${CSV_UPLOADER_BACKUP_GROUP_ID:csv_uploader_adapter_command}
        auto.offset.reset: latest
    producer:
      property:
        bootstrap.servers: ${KAFKA_BOOTSTRAP_SERVERS:localhost}

2.2.4.2. Параметры конфигурации

Настройка конфигурации CSV-uploader осуществляется путем редактирования параметров настроек в файле application.yml.

В файле конфигурации CSV-uploader могут быть настроены следующие секции:

  • http-server - настройки порта подключения;

  • file-size - ограничение на размер отправляемого файла (мегабайты);

  • logging.level - настройка сохранения лог-файла;

  • environment - определяет папку для ошибочных файлов;

  • prostore-rest-client - блок параметров конфигурирования взаимодействия с ProStore;

  • validation - адрес подключения модуля REST-Uploader;

  • upload - требование токена для аутентификации на REST-Uploader;

  • csv-parser - настройка парсинга CSV;

  • metrics - настройка получения метрик;

  • backup - настройка бэкапирования модуля;

2.2.4.2.1. Секция http-server

Секция http-server предназначена для настройки порта и протокола передачи данных (одно из значений http или https).

Например:

http:
        port: ${HTTP_PORT:8080}
        enabled: ${HTTP_ENABLED:true}

Параметры конфигурации

  • port - порт для старта веб-сервера, например HTTP_PORT:8080;

  • enabled - статус включения/отключения веб-сервера, например HTTP_ENABLED:true.

2.2.4.2.2. Секция file-size

Секция file-size отвечает за ограничение на размер отправляемого файла (указывется в мегабайтах).

file-size:
        restriction: ${SEND_FILE_SIZE_RESTRICTION:1024}

Параметры конфигурации

  • restriction - ограничение на размер отправляемого файла, например SEND_FILE_SIZE_RESTRICTION:1024.

2.2.4.2.3. Секция logging.level

В секции logging.level настраиваются записи логирования.

Например:

logging.level:
        root: info
        ru.itone: debug
2.2.4.2.4. Секция environment

В секции environment указывается папка для ошибочных файлов.

Например:

environment:
        error-folder: ${ENVIRONMENT_ERROR_FOLDER:error}

Параметры конфигурации

  • error-folder - папка для ошибочных файлов, например ENVIRONMENT_ERROR_FOLDER:error.

2.2.4.2.5. Секция prostore-rest-client

В секции prostore-rest-client реализован блок параметров конфигурирования взаимодействия с ProStore.

Например:

prostore-rest-client:
  persistence-datamart: ${PERSISTENCE_DATAMART:persistence}
  datasource: ${PERSISTENCE_DATASOURCE:}
  table-flk-journal: ${PERSISTENCE_FLK_JOURNAL_TABLE:csv_uploader_flk_journal}
  table-upload-journal: ${PERSISTENCE_UPLOAD_JOURNAL_TABLE:csv_uploader_upload_journal}
  table-settings: ${PERSISTENCE_SETTINGS_TABLE:csv_uploader_settings}
  storage-duration: 14d
  cleanup-interval: 10m
  host: ${PS_HOST:localhost}
  port: ${PS_PORT:9195}
  http:
    max-pool-size: ${PS_MAX_POOL_SIZE:8}

Параметры настроек

  • persistence-datamart - датамарт, в котором будут располагаться таблицы с данными сервиса, например PERSISTENCE_DATAMART:persistence;

  • datasource - по умолчанию пусто, берется единственный датасорс из настроек Prostore;

  • table-flk-journal - таблица журнала ФЛК, например PERSISTENCE_FLK_JOURNAL_TABLE:csv_uploader_flk_journal;

  • table-upload-journal - таблица журнала загрузок, например PERSISTENCE_UPLOAD_JOURNAL_TABLE:csv_uploader_upload_journal;

  • table-settings - таблица хранения настроек сервиса, например PERSISTENCE_SETTINGS_TABLE:csv_uploader_settings;

  • storage-duration - продолжительность хранения данных в журналах, например 14d, указывается в днях;

  • cleanup-interval - периодичность очистки данных из таблиц журналов, например 10m, указывается в минутах;

  • host - адрес Prostore, например PS_HOST:localhost;

  • port - порт Prostore, например PS_PORT:9195;

  • max-pool-size - максимальное число подключений к Prostore, например PS_MAX_POOL_SIZE:8.

2.2.4.2.6. Секция validation

В секции validation реализован механизм настройки валидации ФЛК.

Например:

rest-uploader-url: ${REST_UPLOADER_URL:http://localhost:8081}

Параметры конфигурации

  • rest-uploader-url - URL к сервису REST-Uploader для выполнения валидации, например {REST_UPLOADER_URL:http://localhost:8081}.

2.2.4.2.7. Секция upload

В секции upload реализована настройка требования токена для аутентификации на REST-Uploader (если true, то при переключении на вкладку Загрузка появляется модальное окно для задания токена в текстовом виде и кнопка Сохранить).

Например:

    upload:
            jwt-auth: ${JWT_AUTH:false}
jwt-token: ${JWT_TOKEN:null}

Параметры конфигурации

  • jwt-auth - требование токена для аутентификации на REST-Uploader у пользователя при отправке данных на загрузку из пользовательского интерфейса, например {JWT_AUTH:false};

  • jwt-token - токен аутентификации REST-Uploader, используется для загрузки по расписанию в версии 2.0

2.2.4.2.8. Секция csv-parser

Внимание

При загрузке файлов с форматно-логическим контролем, важно, чтобы настройки секции csv-parser были одинаковыми в модулях CSV-Uploader(если используется его UI),REST-Uploader и DATA-Uploader.

Секция csv-parser - настройка парсинга CSV.

Например:

# Настройки парсера csv файлов
csv-parser:
  # Символ разделителя значений
  separator: ${CSV_PARSER_SEPARATOR:;}
  # Символ кавычки
  quote-char: ${CSV_PARSER_QUOTE_CHAR:"}
  # Символ экранирования значений
  escape-char: ${CSV_PARSER_ESCAPE_CHAR:'}
  # Настройка интерпретации значений как null. Допустимые значения:
  #  - EMPTY_SEPARATORS - пустое значение между двумя разделителями, например ;;
  #  - EMPTY_QUOTES - пустые кавычки, например ;"";
  #  - BOTH - оба варианта
  #  - NEITHER - никогда. Пустая строка всегда определяется как пустая строка
  field-as-null: ${CSV_PARSER_FIELD_AS_NULL:EMPTY_SEPARATORS}

Параметры конфигурации

  • separator - Символ разделителя значений, например CSV_PARSER_SEPARATOR:;;

  • quote-char - символ кавычки, например CSV_PARSER_QUOTE_CHAR:";

  • escape-char - Символ экранирования значений, например CSV_PARSER_ESCAPE_CHAR:';

    Настройка интерпретации значений как null. Допустимые значения:

    • EMPTY_SEPARATORS - пустое значение между двумя разделителями, например ;;

    • EMPTY_QUOTES - пустые кавычки, например ;»»;

    • BOTH - оба варианта;

    • NEITHER - никогда. Пустая строка всегда определяется как пустая строка

  • field-as-null - способ определения null поля, например CSV_PARSER_FIELD_AS_NULL:EMPTY_SEPARATORS.

Дополнительное описание параметров

  1. Параметр CSV_PARSER_ESCAPE_CHAR работает следующим образом: если символ экранирования и символ кавычки равны ", то будет использован RFC4180Parser, который считывает все символы между двумя двойными кавычками, при этом двойная кавычка в тексте поля должна быть экранирована двойной кавычкой (Например "поле, ""содержащее двойную кавычку""" будет считано как поле, "содержащее двойную кавычку"). В противном случае будет использован CSVParser, использующий символ экранирования для обозначения «непечатаемых символов».

  2. Параметр CSV_PARSER_FIELD_AS_NULL может принимать следующие значения:

    • EMPTY_SEPARATORS - два разделителя полей (см. csv-parser/separator) подряд считаются null. Например: строка [aaa,,ccc] содержит значения [«aaa», null, «bbb»], а строка [aaa,»»,ccc] содержит значения [«aaa», «», «bbb»].

    • EMPTY_QUOTES - два «ограничителя строки» (см. csv-parser/escape-char) подряд считаются null. Например: строка [aaa,»»,ccc] содержит значения [«aaa», null, «bbb»], а строка [aaa,,ccc] содержит значения [«aaa», «», «bbb»].

    • BOTH - оба варианта (см. EMPTY_SEPARATORS и EMPTY_QUOTES) считаются null. Например: обе строки [aaa,»»,ccc] и [aaa,,bbb] содержат одинаковое значение [«aaa», null, «bbb»].

    • NEITHER - ни один из вариантов (см. EMPTY_SEPARATORS и EMPTY_QUOTES) не считается null. Например: обе строки [aaa,»»,ccc] и [aaa,,bbb] содержат одинаковое значение [«aaa», «», «bbb»].

2.2.4.2.9. Секция metrics

Секция metrics предназначена для настройки параметров метрик.

Например:

metrics:
  port: ${METRICS_PORT:9837}

Параметры конфигурации

  • port - Порт для метрик, например METRICS_PORT:9837.

2.2.4.2.10. Секция backup

Секция backup предназначена для настроек бекапирования модуля.

Например:

backup:
  mode: ${BACKUP_MODE:rest} # kafka | rest
  rest:
    uri: ${BACKUP_URI:/backup}
  backupTopic: ${BACKUP_TOPIC:adapter.backup}
  statusTopic: ${STATUS_TOPIC:adapter.status}
  kafka:
    consumer:
      property:
        bootstrap.servers: ${KAFKA_BOOTSTRAP_SERVERS:localhost}
        group.id: ${CSV_UPLOADER_BACKUP_GROUP_ID:csv_uploader_adapter_command}
        auto.offset.reset: latest
    producer:
      property:
        bootstrap.servers: ${KAFKA_BOOTSTRAP_SERVERS:localhost}

Параметры настроек

  • mode - режим бекапирования, например BACKUP_MODE:rest;

  • uri - путь к файлу бекапирования в случае выбора REST-сервисов для режима бэкапирования;

  • backupTopic - топик для отправки сохраненных данных, например: {BACKUP_TOPIC:adapter.backup};

  • statusTopic - топик для отправки статусов бэкапирования, например: {STATUS_TOPIC:adapter.status}.

2.2.5. Настройка DATA-Uploader – Модуль исполнения асинхронных заданий

2.2.5.1. Конфигурация модуля DATA-Uploader (application.yml)

Файл application.yml – основной конфигурационный файл модуля, в котором задана его логика и порядок работы модуля: обеспечение обработки очереди файлов, настройка подключения к ядру витрины (секция: prostore), а также другие настройки необходимые для корректной работы модуля.

2.2.5.1.1. Пример файла application.yml

В конфигурационном файле следует задавать только те настройки, которые необходимы для решения текущих бизнес-задач.

http-server:
  port: ${SERVER_PORT:8082}

persistence-mode: ${PERSISTENCE_MODE:prostore} # prostore, zookeeper&redis

prostore-rest-client:
  persistence-datamart: ${PERSISTENCE_DATAMART:persistence}
  datasource: ${PERSISTENCE_DATASOURCE:} # по умолчанию пусто, тогда берется единственный датасорс из настроек Простора
  table-completed-inserts-datamarts: ${PERSISTENCE_COMPLETED_INSERTS_TABLE:data_uploader_completed_inserts_datamarts}
  table-deltas-open: ${PERSISTENCE_OPEN_DELTAS_TABLE:data_uploader_deltas_open}
  # Таблица активных экземляров сервиса data-uploader (используется при persistence-mode: prostore)
  table-data-uploader-health-check: ${PERSISTENCE_HEALTH_CHECK_TABLE:data_uploader_health_check}
  # Имя таблицы с задачами загрузки данных (используется при persistence-mode: prostore)
  table-validation-complete: ${PERSISTENCE_VALIDATION_COMPLETE_TABLE:validation_complete}
  # Имя таблицы хранения статусов запросов (используется при persistence-mode: prostore)
  table-requests-status: ${PERSISTENCE_STATUS_TABLE:status}
  # Имя таблицы хранения данных файлов (используется при persistence-mode: prostore)
  table-files: ${PERSISTENCE_FILES_TABLE:files}
  # Имя таблицы хранения активных экземпляров сервисов
  table-data-uploader-active: ${PERSISTENCE_ACTIVE_TABLE:data_uploader_active}
  health-check-refresh-period-sec: ${HEALTH_CHECK_REFRESH_PERIOD:120}
  health-check-wait-period-sec: ${HEALTH_CHECK_WAIT_PERIOD:300}
  host: ${PS_HOST:localhost}
  port: ${PS_PORT:9090}
  http:
    max-pool-size: ${PS_MAX_POOL_SIZE:8}



redis:
  type: ${REDIS_TYPE:STANDALONE}
  connection-string: ${REDIS_CONNECTION_STRING:redis://localhost:6379}
  password: ${REDIS_PASSWORD:eYVX7EwVmmxKPCDmwMtyKVge8oLd2t81}
  max-pool-size: ${REDIS_MAX_POOL_SIZE:6}
  max-pool-waiting: ${REDIS_MAX_POOL_WAITING:24}
  max-waiting-handlers: ${REDIS_MAX_WAITING_HANDLERS:32}
net-client-options:
   tcp-user-timeout: 30
   idle-timeout: 30

upload:
  concurrency: ${UPLOAD_CONCURRENCY:100} # Общее количество параллельных задач загрузки
  send-concurrency: ${UPLOAD_SEND_CONCURRENCY:10} # Количество параллельных отправок данных в кафку для каждого файла
  poll-interval: ${UPLOAD_POLL_INTERVAL:500ms} # Интервал опроса очереди сообщений на загрузку
  mode: ${UPLOAD_MODE:mppw} # mppw|llw
  llw-batch: ${UPLOAD_LLW_BATCH:1000} # Число записей в одной команде upsert/delete. Используется только при mode=llw
  creating-delta-on-upload-request: ${DELTA_CREATING_MODE:enable} # enable|disable|period Используется только при mode=llw
  period: ${CREATING_DELTA_ON_UPLOAD_REQUEST_PERIOD:300}s # Используется только при mode=llw и creating-delta-on-upload-request=period
  check-uniqueness: true # выполнять ли проверку уникальности первичных ключей
  pool:
    size: ${UPLOAD_POOL_SIZE:16}
  retry:
    attempts: 5
    delay: 1m


data-storage:
  compress: ${DATA_STORAGE_COMPRESS:zstd} # zstd/none  редактируется синхронно для модулей rest-uploader/data-uploader!!!
  type: ${DATA_STORAGE_TYPE:dir} # redis|dir|s3
  # Директория хранения файлов для типа dir
  dir: ${DATA_STORAGE_DIR:/tmp}
  s3:
    endpoint: ${S3_ENDPOINT:http://127.0.0.1:9000/}
    bucket: ${S3_BUCKET:data} # Имя бакета
    region: ${S3_REGION:}
    access-key: ${S3_USER:minioadmin} # Пользователь, под которым происходит взаимодействие с s3
    secret-key: ${S3_PASSWORD:minioadmin} # Пароль пользователя для взаимодействия с s3

environment:
  name: ${ENVIRONMENT_NAME:test}

zookeeper:
  connection-string: ${ZOOKEEPER_DS_ADDRESS:localhost}
  connection-timeout-ms: ${ZOOKEEPER_DS_CONNECTION_TIMEOUT_MS:30000}
  session-timeout-ms: ${ZOOKEEPER_DS_SESSION_TIMEOUT_MS:8640000}
  chroot: ${ZOOKEEPER_DS_CHROOT:/adapter}

csv-parser:
  separator: ${CSV_PARSER_SEPARATOR:;}
  quote-char: ${CSV_PARSER_QUOTE_CHAR:"}
  escape-char: ${CSV_PARSER_ESCAPE_CHAR:'}
  # Настройка интерпретации значений как null. Допустимые значения:
  #  - EMPTY_SEPARATORS - пустое значение между двумя разделителями, например ;;
  #  - EMPTY_QUOTES - пустые кавычки, например ;"";
  #  - BOTH - оба варианта
  #  - NEITHER - никогда. Пустая строка всегда определяется как пустая строка
  field-as-null: ${CSV_PARSER_FIELD_AS_NULL:EMPTY_SEPARATORS}
  # опция позволяет парсить мультистроковые значения

active:
  timeout: ${ACTIVE_TIMEOUT:60}
  time-to-live: ${ACTIVE_TTL:180}

delta:
  timeout: ${DELTA_TIMEOUT:300}
  row-max-count: ${DELTA_MAX_ROWS:500000}
  chunk-row-max-count: ${DELTA_CHUNK_ROWS:10000}
  chunk-data-max-size: ${DELTA_CHUNK_DATA_SIZE:1048576}
  # параметр ожидания перед повторной попыткой открытия дельты в случае ошибки
  open-delay: ${DELTA_OPEN_DELAY:60}s
  # количество попыток открытия дельты в случае ошибки
  open-attempts: ${DELTA_OPEN_ATTEMPTS:5}
  # период проверки открытых дельт
  open-check: ${DELTA_OPEN_CHECK:60}s
  # количество попыток фиксации дельты в случае ошибки
  commit-attempts: ${DELTA_COMMIT_ATTEMPTS:5}
  # период ожидания перед повторной попыткой фиксации дельты
  commit-error-delay: ${DELTA_COMMIT_DELAY:1}s
  # количество попыток отката дельты в случае ошибки
  rollback-attempts: ${DELTA_COMMIT_ATTEMPTS:3}
  # период ожидания перед повторной попыткой отката дельты
  rollback-error-delay: ${DELTA_COMMIT_DELAY:5}s


response:
  time-to-live: ${RESPONSE_TTL:36000}

# Настройки модуля сбора информации о компонентах витрины
component-info:
  enabled: true
  # DataSource Prostore
  datasource: ''
  # Схема Prostore
  datamart: component_info
  # Имя таблицы для записи информации о компоненте
  table-name: component_info
  # Период попыток создания схемы, при неуспехе
  create-table-period: 60s
  # Период публикации health-check
  publish-period: 60s
  # Период после которого компонент считается неактивным при отсутствии health-check
  timeout-active: 300s
  # Список элементов конфига маскируемых при отправке,
  #  если указан узловой элемент, то маскируются все вложенные в него элементы
  secrets:
    - redis.password


metrics:
  port: ${METRICS_PORT:9837}

2.2.5.2. Параметры конфигурации

Настройка конфигурации DATA-Uploader осуществляется путем редактирования параметров настроек в файле application.yml, где настраиваются секции:

  • http-server - указывается порт сервера;

  • persistence-mode - настройки хранения данных;

  • prostore-rest-client - блок параметров конфигурирования взаимодействия с ProStore.

  • redis - настройка подключения к Redis;

  • upload - указываются настройки параллельной загрузки данных;

  • data-storage - директория хранения файлов для типа dir;

  • environment - определяет значение среды разработки;

  • zookeeper - определяет настройки подключения к Zookeeper;

  • csv-parser - настройка парсера CSV-файлов;

  • active - настройки интервалов между попытками перехода в активное состояние и времени жизни ключа флага активности;

  • delta - настройка обработок загрузок и отправок заданий на загрузку дельт;

  • response - настройка времени хранения ответов по заданию в Redis;

  • component-info - настройки модуля сбора информации о компонентах витрины;

  • metrics - настройка получения метрик.

2.2.5.2.1. Секция http-server

В секции http-server указывается порт веб-сервера.

Например:

server:
  port: ${SERVER_PORT:8081}

Параметры настроек

  • port - порт веб-сервера, например: SERVER_PORT:8081.

2.2.5.2.2. Секция persistence-mode

В секции persistence-mode указывается настройка хранения данных: или в Prostore или в Zookeeper. в случае выбора Prostore автоматически создаются необходимые таблицы.

Например:

persistence-mode: ${PERSISTENCE_MODE:prostore} # prostore | zookeeper

Параметры настроек

  • persistence-mode - настройка хранения данных, например PERSISTENCE_MODE:prostore.

2.2.5.2.3. Секция prostore-rest-client

В секции prostore-rest-client реализован блок параметров конфигурирования взаимодействия с Prostore.

Например:

prostore-rest-client:
  persistence-datamart: ${PERSISTENCE_DATAMART:persistence}
  datasource: ${PERSISTENCE_DATASOURCE:} # по умолчанию пусто, тогда берется единственный датасорс из настроек Простора
  table-completed-inserts-datamarts: ${PERSISTENCE_COMPLETED_INSERTS_TABLE:data_uploader_completed_inserts_datamarts}
  table-deltas-open: ${PERSISTENCE_OPEN_DELTAS_TABLE:data_uploader_deltas_open}
  # Таблица активных экземляров сервиса data-uploader (используется при persistence-mode: prostore)
  table-data-uploader-health-check: ${PERSISTENCE_HEALTH_CHECK_TABLE:data_uploader_health_check}
  # Имя таблицы с задачами загрузки данных (используется при persistence-mode: prostore)
  table-validation-complete: ${PERSISTENCE_VALIDATION_COMPLETE_TABLE:validation_complete}
  # Имя таблицы хранения статусов запросов (используется при persistence-mode: prostore)
  table-requests-status: ${PERSISTENCE_STATUS_TABLE:status}
  # Имя таблицы хранения данных файлов (используется при persistence-mode: prostore)
  table-files: ${PERSISTENCE_FILES_TABLE:files}
  # Имя таблицы хранения активных экземпляров сервисов
  table-data-uploader-active: ${PERSISTENCE_ACTIVE_TABLE:data_uploader_active}
  health-check-refresh-period-sec: ${HEALTH_CHECK_REFRESH_PERIOD:120}
  health-check-wait-period-sec: ${HEALTH_CHECK_WAIT_PERIOD:300}
  host: ${PS_HOST:localhost}
  port: ${PS_PORT:9090}
  http:
    max-pool-size: ${PS_MAX_POOL_SIZE:8}

Параметры настроек

  • persistence-datamart - датамарт, где будут располагаться таблицы хранения данных, используется при persistence-mode = prostore

  • datasource - источник данных, например PERSISTENCE_DATASOURCE:, по умолчанию пусто, в этом случае берется единственный датасорс из настроек Простора;

  • table-completed-inserts-datamarts - таблица с данными по завершенным запросам добавления данных, например PERSISTENCE_COMPLETED_INSERTS_TABLE:data_uploader_completed_inserts_datamarts;

  • table-deltas-open - таблица с данными по открытым дельтам, например PERSISTENCE_OPEN_DELTAS_TABLE:data_uploader_deltas_open;

  • table-data-uploader-health-check - таблица с heath-check, например PERSISTENCE_HEALTH_CHECK_TABLE:data_uploader_health_check;

  • table-validation-complete - таблица с задачами загрузки данных, напрммер PERSISTENCE_VALIDATION_COMPLETE_TABLE:validation_complete;

  • table-requests-status - таблица хранения статусов запросов. например PERSISTENCE_STATUS_TABLE:status;

  • table-files - таблица хранения данных файлов, например PERSISTENCE_FILES_TABLE:files;

  • table-data-uploader-active - таблица хранения активных экземпляров сервисов, например PERSISTENCE_ACTIVE_TABLE:data_uploader_active;

  • health-check-refresh-period-sec: ${HEALTH_CHECK_REFRESH_PERIOD:120} - период обновления heath-check в секундах, например HEALTH_CHECK_REFRESH_PERIOD:120;

  • health-check-wait-period-sec - период ожидания heath-check в секундах, например HEALTH_CHECK_WAIT_PERIOD:300;

  • host - адрес Prostore, например PS_HOST:t5-prostore-01.ru-central1.internal;

  • port - порт Prostore, например PS_PORT:9195;

  • max-pool-size - максимальное число подключений к Prostore, например PS_MAX_POOL_SIZE:8.

2.2.5.2.4. Секция redis

Секция redis определяет настройки подключения к Redis.

Например:

redis:
  type: ${REDIS_TYPE:STANDALONE}
  connection-string: ${REDIS_CONNECTION_STRING:redis://localhost:6379}
  password: ${REDIS_PASSWORD:eYVX7EwVmmxKPCDmwMtyKVge8oLd2t81}
  max-pool-size: ${REDIS_MAX_POOL_SIZE:6}
  max-pool-waiting: ${REDIS_MAX_POOL_WAITING:24}
  max-waiting-handlers: ${REDIS_MAX_WAITING_HANDLERS:32}
  net-client-options:
    tcp-user-timeout: 30
    idle-timeout: 30

Параметры настроек

  • type - тип подключения к Redis (STANDALONE/CLUSTER), например REDIS_TYPE:STANDALONE;

  • connection-string - указывается список серверов для подключения (перечисление через запятую), например REDIS_CONNECTION_STRING:redis://localhost:6379;

  • password - пароль для подключения, например REDIS_PASSWORD:eYVX7EwVmmxKPCDmwMtyKVge8oLd2t81;

  • max-pool-size - устанавливается максимальный размер пула, например REDIS_MAX_POOL_SIZE:6;

  • max-pool-waiting - устанавливается максимальный размер пула ожидающих команд, например REDIS_MAX_POOL_WAITING:24;

  • max-waiting-handlers - устанавливается максимальный размер ожидающих обработчиков, например REDIS_MAX_WAITING_HANDLERS:32;

  • net-client-options - параметры Redis клиента:

  • tcp-user-timeout - таймаут на соединение;

  • idle-timeout - таймаут ожидания ответа от редиса.

2.2.5.2.5. Секция upload

Секция upload определяет настройки параллельной загрузки данных.

Например:

upload:
  concurrency: ${UPLOAD_CONCURRENCY:100} # Общее количество параллельных задач загрузки
  send-concurrency: ${UPLOAD_SEND_CONCURRENCY:10} # Количество параллельных отправок данных в кафку для каждого файла
  poll-interval: ${UPLOAD_POLL_INTERVAL:500ms} # Интервал опроса очереди сообщений на загрузку
  mode: ${UPLOAD_MODE:mppw} # mppw|llw
  llw-batch: ${UPLOAD_LLW_BATCH:1000} # Число записей в одной команде upsert/delete. Используется только при mode=llw
  creating-delta-on-upload-request: ${DELTA_CREATING_MODE:enable} # enable|disable|period Используется только при mode=llw
  period: ${CREATING_DELTA_ON_UPLOAD_REQUEST_PERIOD:300}s # Используется только при mode=llw и creating-delta-on-upload-request=period
  check-uniqueness: true # выполнять ли проверку уникальности первичных ключей
  pool:
    size: ${UPLOAD_POOL_SIZE:16}
  retry:
    attempts: 5
    delay: 1m

Параметры настроек

  • concurrency - общее количество параллельных задач загрузки, например 100;

  • send-concurrency - количество параллельных отправок данных в кафку для каждого файла, например 10;

  • poll-interval - интервал опроса очереди сообщений на загрузку, например 500ms;

  • mode - режим загрузки, например UPLOAD_MODE:mppw;

    возможные значения: mppw / llw;

  • llw-batch - число записей в одной команде upsert/delete, например UPLOAD_LLW_BATCH:1000, используется только при mode=llw;

  • creating-delta-on-upload-request - создание дельты при запросе загрузки, например DELTA_CREATING_MODE:enable, используется только при mode=llw;

    возможные значения: enable/ disable / period;

  • period - период создания дельты при запросе загрузки (в секундах), например CREATING_DELTA_ON_UPLOAD_REQUEST_PERIOD:300, используется только при mode=llw и creating-delta-on-upload-request=period;

  • check-uniqueness - флаг выполнения проверки уникальности первичных ключей;

  • pool/size - размер пула загрузки, например UPLOAD_POOL_SIZE:16;

  • retry - повтор попытки загрузки;

  • attempts - количество попыток;

  • delay - период задержки (в минутах).

2.2.5.2.6. Секция data-storage

В секции data-storage указывается директория хранения файлов для типа dir.

Например:

data-storage:
  compress: ${DATA_STORAGE_COMPRESS:zstd} # zstd/none  редактируется синхронно для модулей rest-uploader/data-uploader!!!
  type: ${DATA_STORAGE_TYPE:dir} # redis|dir|s3
  # Директория хранения файлов для типа dir
  dir: ${DATA_STORAGE_DIR:/tmp}
  s3:
    endpoint: ${S3_ENDPOINT:http://127.0.0.1:9000/}
    bucket: ${S3_BUCKET:data} # Имя бакета
    region: ${S3_REGION:}
    access-key: ${S3_USER:minioadmin} # Пользователь, под которым происходит взаимодействие с s3
    secret-key: ${S3_PASSWORD:minioadmin} # Пароль пользователя для взаимодействия с s3

Параметры настроек

  • compress - настройки сжатия директории хранения файлов, например DATA_STORAGE_COMPRESS:zstd.

Внимание

блок compress редактируется синхронно для модулей rest-uploader/data-uploader

  • type - тип файлов, например DATA_STORAGE_TYPE:dir;

    возможные значения: redis / dir / s3;

  • dir - директория хранения файлов для типа dir, например DATA_STORAGE_DIR:/tmp;

  • s3 - настройки облачного хранилища S3;

  • endpoint - адрес конечной точки, например S3_ENDPOINT:http://127.0.0.1:9000/;

  • bucket - имя бакета, например S3_BUCKET:data

  • region - регион хранилища;

  • access-key - пользователь, под которым происходит взаимодействие с s3, например S3_USER:minioadmin;

  • secret-key- пароль пользователя для взаимодействия с s3, например S3_PASSWORD:minioadmin.

2.2.5.2.7. Секция environment

В секции environment выбирается среда разработки (например, значение test, prod и т.д).

Например:

environment:
        name: ${ENVIRONMENT_NAME:test}

Параметры конфигурации

  • name - название окружения, например ENVIRONMENT_NAME:test.

2.2.5.2.8. Секция zookeeper

В секции zookeeper настраиваются параметры подключения к Zookeeper.

Например:

zookeeper:
  connection-string: ${ZOOKEEPER_DS_ADDRESS:localhost}
  connection-timeout-ms: ${ZOOKEEPER_DS_CONNECTION_TIMEOUT_MS:30000}
  session-timeout-ms: ${ZOOKEEPER_DS_SESSION_TIMEOUT_MS:8640000}
  chroot: ${ZOOKEEPER_DS_CHROOT:/adapter}

Параметры настроек

  • connection-string - Подключение к Zookeeper DS, например ZZOOKEEPER_DS_ADDRESS:localhost;

  • connection-timeout-ms - Zookeeper DS таймаут подключения, например ZOOKEEPER_DS_CONNECTION_TIMEOUT_MS:30000;

  • session-timeout-ms - Zookeeper DS таймаут сессии, например ZOOKEEPER_DS_SESSION_TIMEOUT_MS:40000;

  • chroot - Zookeeper DS chroot path, например ZOOKEEPER_DS_CHROOT:/adapter.

2.2.5.2.9. Секция csv-parser

Внимание

При загрузке файлов с форматно-логическим контролем, важно, чтобы настройки секции csv-parser были одинаковы в модулях CSV-Uploader(если используется его UI),REST-Uploader и DATA-Uploader.

Секция csv-parser - настройка парсинга CSV.

Например:

csv-parser:
  separator: ${CSV_PARSER_SEPARATOR:;}
  quote-char: ${CSV_PARSER_QUOTE_CHAR:"}
  escape-char: ${CSV_PARSER_ESCAPE_CHAR:'}
  field-as-null: ${CSV_PARSER_FIELD_AS_NULL:EMPTY_SEPARATORS}
  multiline-limit: 0

Параметры конфигурации

  • separator - Символ разделителя значений, например CSV_PARSER_SEPARATOR:;;

  • quote-char - символ кавычки, например CSV_PARSER_QUOTE_CHAR:";

  • escape-char - Символ экранирования значений, например CSV_PARSER_ESCAPE_CHAR:';

    Настройка интерпретации значений как null. Допустимые значения:

    • EMPTY_SEPARATORS - пустое значение между двумя разделителями, например ;;

    • EMPTY_QUOTES - пустые кавычки, например ;»»;

    • BOTH - оба варианта

    • NEITHER - никогда. Пустая строка всегда определяется как пустая строка

  • field-as-null - способ определения null поля, например CSV_PARSER_FIELD_AS_NULL:EMPTY_SEPARATORS.

  • multiline-limit - параметры парсинга мультистроковых значений.

Внимание

Парсер может зависать если в данных встречаются вложенные неэкранированные кавычки..

  1. Параметр CSV_PARSER_ESCAPE_CHAR работает следующим образом: если символ экранирования и символ кавычки равны ", то будет использован RFC4180Parser, который считывает все символы между двумя двойными кавычками, при этом двойная кавычка в тексте поля должна быть экранирована двойной кавычкой (Например "поле, ""содержащее двойную кавычку""" будет считано как поле, "содержащее двойную кавычку"). В противном случае будет использован CSVParser, использующий символ экранирования для обозначения «непечатаемых символов».

  2. Параметр CSV_PARSER_FIELD_AS_NULL может принимать следующие значения:

    • EMPTY_SEPARATORS - два разделителя полей (см. csv-parser/separator) подряд считаются null. Например: строка [aaa,,ccc] содержит значения [«aaa», null, «bbb»], а строка [aaa,»»,ccc] содержит значения [«aaa», «», «bbb»].

    • EMPTY_QUOTES - два «ограничителя строки» (см. csv-parser/escape-char) подряд считаются null. Например: строка [aaa,»»,ccc] содержит значения [«aaa», null, «bbb»], а строка [aaa,,ccc] содержит значения [«aaa», «», «bbb»].

    • BOTH - оба варианта (см. EMPTY_SEPARATORS и EMPTY_QUOTES) считаются null. Например: обе строки [aaa,»»,ccc] и [aaa,,bbb] содержат одинаковое значение [«aaa», null, «bbb»].

    • NEITHER - ни один из вариантов (см. EMPTY_SEPARATORS и EMPTY_QUOTES) не считается null. Например: обе строки [aaa,»»,ccc] и [aaa,,bbb] содержат одинаковое значение [«aaa», «», «bbb»].

2.2.5.2.10. Секция active

В секции active настраиваются интервалы между попытками перехода в активное состояние и времени жизни ключа флага активности.

Например:

active:
    timeout: ${ACTIVE_TIMEOUT:60}
    time-to-live: ${ACTIVE_TTL:180}

Параметры настроек

  • timeout - интервал между попытками перехода в активное состояние;

  • time-to-live - время жизни ключа флага активности.

2.2.5.2.11. Секция delta

Секция delta предназначена для указания настройки обработок загрузок и отправок заданий на загрузку дельт.

Например:

delta:
  timeout: ${DELTA_TIMEOUT:300}
  row-max-count: ${DELTA_MAX_ROWS:500000}
  chunk-row-max-count: ${DELTA_CHUNK_ROWS:10000}
  chunk-data-max-size: ${DELTA_CHUNK_DATA_SIZE:1048576}
  # параметр ожидания перед повторной попыткой открытия дельты в случае ошибки
  open-delay: ${DELTA_OPEN_DELAY:60}s
  # количество попыток открытия дельты в случае ошибки
  open-attempts: ${DELTA_OPEN_ATTEMPTS:5}
  # период проверки открытых дельт
  open-check: ${DELTA_OPEN_CHECK:60}s
  # количество попыток фиксации дельты в случае ошибки
  commit-attempts: ${DELTA_COMMIT_ATTEMPTS:5}
  # период ожидания перед повторной попыткой фиксации дельты
  commit-error-delay: ${DELTA_COMMIT_DELAY:1}s
  # количество попыток отката дельты в случае ошибки
  rollback-attempts: ${DELTA_COMMIT_ATTEMPTS:3}
  # период ожидания перед повторной попыткой отката дельты
  rollback-error-delay: ${DELTA_COMMIT_DELAY:5}s

Параметры настроек

  • timeout - максимальный интервал времени между первой считанной записью цикла загрузки и отправкой заданий на загрузку дельт, например DELTA_TIMEOUT:300;

  • row-max-count - максимальное количество обработанных записей для старта отправки заданий на загрузку дельт, например DELTA_CHUNK_ROWS:10000;

  • chunk-row-max-count - количество сообщений в одном чанке, например DELTA_CHUNK_ROWS:10000;

  • chunk-data-max-size - максимальный размер чанка, например DELTA_CHUNK_DATA_SIZE:1048576;

  • open-delay - параметр ожидания (в секундах) перед повторной попыткой открытия дельты в случае ошибки, например DELTA_OPEN_DELAY:60;

  • open-attempts - количество попыток открытия дельты в случае ошибки, например DELTA_OPEN_ATTEMPTS:5;

  • open-check - период проверки открытых дельт (в секундах), например DELTA_OPEN_CHECK:60;

  • commit-attempts - количество попыток фиксации дельты в случае ошибки, например DELTA_COMMIT_ATTEMPTS:5;

  • commit-error-delay - период ожидания перед повторной попыткой фиксации дельты (в секундах), например DELTA_COMMIT_DELAY:1;

  • rollback-attempts - количество попыток отката дельты в случае ошибки, например DELTA_COMMIT_ATTEMPTS:3;

  • rollback-error-delay - период ожидания перед повторной попыткой отката дельты (в секундах), например DELTA_COMMIT_DELAY:5.

2.2.5.2.12. Секция response

Секция response определяет настройка времени хранения ответов по заданию в Redis.

Например:

response:
    time-to-live: ${RESPONSE_TTL:36000}

Параметры настроек

  • time-to-live - Сколько времени Redis будет хранить ответ по заданию (ключ status.<uuid>).

2.2.5.2.13. Секция component-info

В секции component-info хранятся настройки компонента сбора информации о компонентах витрины.

Например:

component-info:
  enabled: true
  datasource: ''
  datamart: component_info
  table-name: component_info
  create-table-period: 60s
  publish-period: 60s
  timeout-active: 300s
  secrets:
    - keys

Параметры настроек

  • enabled - статус подключения компонента, указывается булево значение;

  • datasource - датасорс Prostore;

  • datamart - схема Prostore;

  • table-name - имя таблицы для записи информации о компоненте;

  • create-table-period - период попыток создания схемы, при неуспехе, указывается в секундах;

  • publish-period - период публикации health-check, указывается в секундах;

  • timeout-active - период после которого компонент считается неактивным при отсутствии health-check, указывается в секундах;

  • secrets - список элементов конфига маскируемых при отправке, если указан узловой элемент, то маскируются все вложенные в него элементы.

2.2.5.2.14. Секция metrics

Секция metrics предназначена для настройки параметров метрик.

Например:

metrics:
  port: ${METRICS_PORT:9837}

Параметры настроек

  • port - порт для метрик, например METRICS_PORT:9837.

2.2.6. Настройка REST-Uploader – Модуль асинхронной загрузки данных из сторонних источников

2.2.6.1. Конфигурация модуля REST-Uploader (application.yml)

Файл application.yml – основной конфигурационный файл модуля, в котором задана его логика и порядок работы модуля: асинхронная загрузка данных из источников, настройка подключения к ядру витрины (секция: prostore), а также другие настройки необходимые для корректной работы модуля.

2.2.6.1.1. Пример файла application.yml

В конфигурационном файле следует задавать только те настройки, которые необходимы для решения текущих бизнес-задач.

http-server:
  port: ${SERVER_PORT:8081}

executor:
  reader-pool-size: ${EXECUTOR_READER_POOL_SIZE:20}

file-size:
  restriction: ${SEND_FILE_SIZE_RESTRICTION:512}

environment:
  # Название окружения
  name: ${ENVIRONMENT_NAME:test}

data-storage:
  compress: ${DATA_STORAGE_COMPRESS:zstd} # zstd/none  редактируется синхронно для модулей rest-uploader/data-uploader!!!
  compression-ratio: ${DATA_STORAGE_COMPRESSION_RATIO:4} # допустимый диапазон [-7;22] где -7 самый быстрый, а 22 наибольшее сжатие
  type: ${DATA_STORAGE_TYPE:dir} # redis|dir|s3
  # Директория хранения файлов для типа dir
  dir: ${DATA_STORAGE_DIR:/tmp}
  s3:
    endpoint: ${S3_ENDPOINT:http://127.0.0.1:9000/}
    region: ${S3_REGION:}
    bucket: ${S3_BUCKET:data} # Имя бакета
    access-key: ${S3_USER:minioadmin} # Пользователь, под которым происходит взаимодействие с s3
    secret-key: ${S3_PASSWORD:minioadmin} # Пароль пользователя для взаимодействия с s3

conditions:
  # включение ФЛК и поведение при обнаружении ошибок
  mode: warning
  # период хранения журналов ошибок
  save-time: 1d
  # путь хранения журналов ошибок на общем диске:
  save-path: /tmp/rest-uploader/reports
  # путь к хранению правил в Zookeeper
  zookeeper-path: rest-uploader/conditions
  # таймаут обработки запроса. 0 - таймаут отключен
  rest-timeout: 60s
  # период жизни группы
  save_group_time: 1d
  validation:
    # таймаут выполнения асинхронной проверки
    validation-timeout: 1h
    # таймаут получения сообщений из redis
    poll-timeout: 30s
    # количество корутин асинхронной валидации
    max-concurrent-handle: 1
    # размер порции вычитки сообщений из redis
    batch-size: 1
    # признак выполнения проверки кодировки
    charset-check-enabled: true
    # допустимые кодировки для механизма автоопределения
    valid-charsets: [ UTF-8, US-ASCII, TIS-620]
  health-check:
    # период жизни флага активности
    timeout-active: 3m
    # период обновления статуса
    publish-period: 30s

zookeeper:
  connection-string: ${ZOOKEEPER_DS_ADDRESS:localhost}
  connection-timeout-ms: ${ZOOKEEPER_DS_CONNECTION_TIMEOUT_MS:30000}
  session-timeout-ms: ${ZOOKEEPER_DS_SESSION_TIMEOUT_MS:40000}
  chroot: ${ZOOKEEPER_DS_CHROOT:/adapter}
  retry-count: 3
  retry-base-sleep-time-ms: 1_000


persistence-mode: ${PERSISTENCE_MODE:prostore} # prostore, zookeeper

prostore-rest-client: # требуется синхронно менять в приложениях rest-uploader и data-uploader !!!
  persistence-datamart: ${PERSISTENCE_DATAMART:persistence}
  datasource: ${PERSISTENCE_DATASOURCE:} # по умолчанию пусто, тогда берется единственный датасорс из настроек Простора
  table-conditions: ${PERSISTENCE_TABLE_CONDITIONS:rest_uploader_conditions}
  table-ids: ${PERSISTENCE_TABLE_IDS:rest_uploader_ids}
  # Таблица активных экземляров сервиса rest-uploader (используется при persistence-mode: prostore)
  table-rest-uploader-health-check: ${PERSISTENCE_TABLE_HEALTH_CHECK:rest_uploader_health_check}
  # Таблица групп файлов (используется при persistence-mode: prostore)
  table-group-info: ${PERSISTENCE_TABLE_GROUP_INFO:group_info}
  # Таблица данных о файлах в группе (используется при persistence-mode: prostore)
  table-group-content: ${PERSISTENCE_TABLE_GROUP_CONTENT:group_content}
  # Таблица уникальных значений полей в группе (используется при persistence-mode: prostore)
  table-group-uniq: ${PERSISTENCE_TABLE_GROUP_UNIQ:group_uniq}
  # Таблица очереди файлов на ФЛК (используется при persistence-mode: prostore)
  table-validation-queue: ${PERSISTENCE_TABLE_VALIDATION_QUEUE:validation_queue}
  # Таблица очереди файлов на загрузку (используется при persistence-mode: prostore)
  table-validation-complete: ${PERSISTENCE_TABLE_VALIDATION_COMPLETE:validation_complete}
  # Таблица статусов запросов (используется при persistence-mode: prostore)
  table-requests-status: ${PERSISTENCE_TABLE_STATUS:status}
  # Таблица с файлами (используется при persistence-mode: prostore)
  table-files: ${PERSISTENCE_TABLE_FILES:files}
  host: ${PS_HOST:localhost}
  port: ${PS_PORT:9090}
  http:
    max-pool-size: ${PS_MAX_POOL_SIZE:8}

response:
  time-to-live: ${RESPONSE_TTL:10h} # Период хранения информации о статусе запроса

control:
  delta:
    # подключение возможности управления дельтами от клиента. Управление дельтами от клиента допускается только при настройках
    # delta-> creating-delta-on-upload-request=disable у модулей data-uploader/podd-adapter-mppw
    enable: ${CONTROL_DELTA_ENABLE:true}

redis:
  type: ${REDIS_TYPE:STANDALONE}
  connection-string: ${REDIS_CONNECTION_STRING:redis://localhost:6379}
  password: ${REDIS_PASSWORD:eYVX7EwVmmxKPCDmwMtyKVge8oLd2t81}
  max-pool-size: ${REDIS_MAX_POOL_SIZE:6}
  max-pool-waiting: ${REDIS_MAX_POOL_WAITING:24}
  max-waiting-handlers: ${REDIS_MAX_WAITING_HANDLERS:32}
  net-client-options:
    tcp-user-timeout: 30
    idle-timeout: 30


auth:
  secret: ${AUTH_SECRET:gPHaT%ACXGQaQ30%1id%K7@C}
  enabled: ${AUTH_ENABLED:true}
  access-list-path: rest-uploader/ids

metrics:
  port: ${METRICS_PORT:9837}

# Настройки парсера csv файлов
csv-parser:
  # Символ разделителя значений
  separator: ${CSV_PARSER_SEPARATOR:;}
  # Символ кавычки
  quote-char: ${CSV_PARSER_QUOTE_CHAR:"}
  # Символ экранирования значений
  escape-char: ${CSV_PARSER_ESCAPE_CHAR:'}
  # Настройка интерпретации значений как null. Допустимые значения:
  #  - EMPTY_SEPARATORS - пустое значение между двумя разделителями, например ;;
  #  - EMPTY_QUOTES - пустые кавычки, например ;"";
  #  - BOTH - оба варианта
  #  - NEITHER - никогда. Пустая строка всегда определяется как пустая строка
  field-as-null: ${CSV_PARSER_FIELD_AS_NULL:EMPTY_SEPARATORS}

backup:
  mode: ${BACKUP_MODE:rest} # kafka | rest
  rest:
    uri: ${BACKUP_URI:/backup}
  backupTopic: ${BACKUP_TOPIC:adapter.backup}
  statusTopic: ${STATUS_TOPIC:adapter.status}
  kafka:
    consumer:
      property:
        bootstrap.servers: ${KAFKA_BOOTSTRAP_SERVERS:localhost:9092}
        group.id: ${REST_UPLOADER_BACKUP_GROUP_ID:rest-uploader_adapter_command}
        auto.offset.reset: latest
    producer:
      property:
        bootstrap.servers: ${KAFKA_BOOTSTRAP_SERVERS:localhost:9092}


# Настройки модуля сбора информации о компонентах витрины
component-info:
  enabled: true
  # DataSource Prostore
  datasource: ''
  # Схема Prostore
  datamart: component_info
  # Имя таблицы для записи информации о компоненте
  table-name: component_info
  # Период попыток создания схемы, при неуспехе
  create-table-period: 60s
  # Период публикации health-check
  publish-period: 60s
  # Период после которого компонент считается неактивным при отсутствии health-check
  timeout-active: 300s
  # Список элементов конфига маскируемых при отправке,
  #  если указан узловой элемент, то маскируются все вложенные в него элементы
  secrets:
    - redis.password

2.2.6.2. Параметры конфигурации

Настройка конфигурации REST-uploader осуществляется путем редактирования параметров настроек в файле application.yml, где настраиваются секции:

  • http-server - указывается порт сервера;

  • executor - настраивается размер пула для запросов;

  • file-size - настраиваются ограничения на размер загружаемого файла;

  • environment - настройки окружения;

  • data-storage - директория хранения файлов для типа dir;

  • conditions - включение форматно-логического контроля и поведение при обнаружении ошибок;

  • zookeeper - настройки подключения к Zookeeper;

  • persistence-mode - настройки хранения данных;

  • prostore-api-client - блок параметров конфигурирования взаимодействия с Prostore;

  • response - настройка периода хранения информации о статусе запроса;

  • control - подключение возможности управления дельтами от клиента;

  • redis - настройка подключения к Redis;

  • auth- указывается секрет для валидации токенов;

  • metrics - настройка получения метрик;

  • csv-parser - настройка парсинга CSV;

  • backup - настройки бекапирования;

  • component-info - настройки модуля сбора информации о компонентах витрины.

2.2.6.2.1. Секция http-server

В секции http-server указывается порт веб-сервера.

Например:

http-server:
  port: ${SERVER_PORT:8081}

Параметры настроек

  • port - порт веб-сервера, например: SERVER_PORT:8081.

2.2.6.2.2. Секция executor

Секция executor предназначена для указания размера пула для запросов.

Например:

executor:
  reader-pool-size: ${EXECUTOR_READER_POOL_SIZE:20}

Параметры настроек

  • reader-pool-size - Размер пула для запросов, например EXECUTOR_READER_POOL_SIZE:20

2.2.6.2.3. Секция file-size

В секции file-size можно настраивать ограничения на размер загружаемого файла.

Например:

file-size:
  restriction: ${SEND_FILE_SIZE_RESTRICTION:512}

Параметры настроек

  • file-size-restriction - ограничение на размер загружаемого файла, например SEND_FILE_SIZE_RESTRICTION:512.

2.2.6.2.4. Секция environment

Секция environment предназначена для настройки среды окружения.

Например:

environment:
  name: ${ENVIRONMENT_NAME:test}

Параметры настроек

  • name - Название окружения, например ENVIRONMENT_NAME:test.

2.2.6.2.5. Секция data-storage

В секции data-storage указывается директория хранения файлов для типа dir.

Например:

data-storage:
  compress: ${DATA_STORAGE_COMPRESS:zstd} # zstd/none
  compression-ratio: ${DATA_STORAGE_COMPRESSION_RATIO:4} # допустимый диапазон [-7;22] где -7 самый быстрый, а 22 наибольшее сжатие
  type: ${DATA_STORAGE_TYPE:dir} # redis|dir|s3
  # Директория хранения файлов для типа dir
  dir: ${DATA_STORAGE_DIR:/tmp}
  s3:
    endpoint: ${S3_ENDPOINT:http://127.0.0.1:9000/}
    bucket: ${S3_BUCKET:data} # Имя бакета
    region: ${S3_REGION:}
    access-key: ${S3_USER:minioadmin} # Пользователь, под которым происходит взаимодействие с s3
    secret-key: ${S3_PASSWORD:minioadmin} # Пароль пользователя для взаимодействия с s3

Параметры настроек

  • compress - настройки сжатия директории хранения файлов, например DATA_STORAGE_COMPRESS:zstd

Внимание

блок compress редактируется синхронно для модулей rest-uploader/data-uploader

  • type - тип файлов, например DATA_STORAGE_TYPE:dir;

    возможные значения: redis / dir / s3;

  • dir - директория хранения файлов для типа dir, например DATA_STORAGE_DIR:/tmp;

  • s3 - настройки облачного хранилища S3;

  • endpoint - адрес конечной точки, например S3_ENDPOINT:http://127.0.0.1:9000/;

  • bucket - имя бакета, например S3_BUCKET:data

  • region - регион хранилища;

  • access-key - пользователь, под которым происходит взаимодействие с s3, например S3_USER:minioadmin;

  • secret-key- пароль пользователя для взаимодействия с s3, например S3_PASSWORD:minioadmin.

2.2.6.2.6. Секция conditions

В секции conditions - реализована возможность включения форматно-логического контроля и настройки поведения при обнаружении ошибок.

Например:

conditions:
  mode: warning
  save-time: 1d
  save-path: /tmp/rest-uploader/reports
  zookeeper-path: rest-uploader/conditions
  rest-timeout: 60s
  save_group_time: 1d
  validation:
    validation-timeout: 1h
    poll-timeout: 30s
    max-concurrent-handle: 1
    batch-size: 1
    charset-check-enabled: true
  health-check:
    timeout-active: 3m
    publish-period: 30s

Параметры настроек

  • mode - включение ФЛК и поведение при обнаружении ошибок, например warning;

  • save-time - период хранения журналов ошибок, например 1d;

  • save-path - путь хранения журналов ошибок на общем диске, например /tmp/rest-uploader/reports;

  • zookeeper-path - путь к хранению правил в Zookeeper, например rest-uploader/conditions;

  • rest-timeout - таймаут обработки запроса, например 60s, 0 - таймаут отключен;

  • save_group_time - период жизни группы, например 1d;

  • validation-timeout - таймаут выполнения асинхронной проверки, например 1h;

  • poll-timeout - таймаут получения сообщений из redis, например 30s;

  • max-concurrent-handle - количество корутин асинхронной валидации, например 1;

  • batch-size - размер порции вычитки сообщений из redis, например 1;

  • charset-check-enabled - признак выполнения проверки кодировки, например true;

  • timeout-active - период жизни флага активности, например 3m;

  • publish-period - период обновления статуса, например 30s;

Для настройки mode реализованы режимы:

skip_string

  1. При необходимости пропуска строк формируется обновленный файл и сохраняется в queue с прежним ключом, после проверки всего файла;

  2. Подтверждается чтение комплексной записи из stream validation_queue, которая затем удаляется из стрима;

  3. Размещается запись в list с именем validation_complete;

  4. В Redis записывается статус 0 – Буферизирован;

  5. В зависимости от наличия group_id в комплексной записи:

    • при отсутствии group_id – завершается обработка файла;

    • при наличии group_id – обновляется статус в groupContent_[group_id] и выполняется проверка комплектности группы в соответствии с шагами 3-6 Журнал по группе файлов.

warning

  1. Подтверждается чтение комплексной записи из stream validation_queue и удаляется из стрима;

  2. Размещается запись в list с именем validation_complete;

  3. В Redis записывается статус 0- Буферизирован;

  4. В зависимости от наличия group_id в комплексной записи:

    • при отсутствии group_id - завершает обработку файла;

    • при наличии group_id - обновляет статус в groupContent_[group_id] и выполняет проверка комплектности группы в соответствии с шагами 3-6 Журнал по группе файлов.

skip_file/ skip_on_first_error:

  1. Подтверждается чтение комплексной записи из stream validation_queue, которая затем удаляется из стрима;

  2. Удаляется файл из hset queue по ключу;

  3. В Redis записывает статус 7 – Ошибки ФЛК;

  4. В зависимости от наличия group_id в комплексной записи:

    • при отсутствии group_id – завершается обработка файла;

    • при наличии group_id – обновляется статус в groupContent_[group_id] и проверяется комплектность группы в соответствии с шагами 3-6 Журнал по группе файлов.

skip_string_except_last пропускаются строки не прошедшие ФЛК по уникальности кроме последней

  1. При необходимости пропуска строк формируется обновленный файл и сохраняется в queue с прежним ключом, после проверки всего файла;

  2. Подтверждается чтение комплексной записи из stream validation_queue, которая затем удаляется из стрима;

  3. Размещается запись в list с именем validation_complete;

  4. В Redis записывается статус 0 – Буферизирован;

  5. В зависимости от наличия group_id в комплексной записи:

    • при отсутствии group_id – завершается обработка файла;

    • при наличии group_id – обновляется статус в groupContent_[group_id] и выполняется проверка комплектности группы в соответствии с шагами 3-6 Журнал по группе файлов.

2.2.6.2.7. Секция zookeeper

В секции zookeeper указываются параметры настроек к Zookeeper.

Например:

zookeeper:
  connect-string: ${ZOOKEEPER_DS_ADDRESS:localhost}
  connection-timeout-ms: ${ZOOKEEPER_DS_CONNECTION_TIMEOUT_MS:30000}
  session-timeout-ms: ${ZOOKEEPER_DS_SESSION_TIMEOUT_MS:40000}
  retry-count: 3
  retry-base-sleep-time-ms: 1_000

Параметры настроек

  • connect-string - Подключение к Zookeeper DS, например ZOOKEEPER_DS_ADDRESS:localhost;

  • connection-timeout-ms - Zookeeper DS таймаут подключения, например ZOOKEEPER_DS_CONNECTION_TIMEOUT_MS:30000;

  • session-timeout-ms - Zookeeper DS таймаут сессии, например ZOOKEEPER_DS_SESSION_TIMEOUT_MS:40000;

  • retry-count - количество попыток подключения, например 3.

2.2.6.2.8. Секция persistence-mode

В секции persistence-mode указывается настройка хранения данных: или в Prostore или в Zookeeper. в случае выбора Prostore автоматически создаются необходимые таблицы.

Например:

persistence-mode: ${PERSISTENCE_MODE:prostore} # prostore | zookeeper

Параметры настроек

  • persistence-mode - настройка хранения данных, например PERSISTENCE_MODE:prostore.

2.2.6.2.9. Секция prostore-rest-client

В секции prostore-rest-client реализован блок параметров конфигурирования взаимодействия с Prostore.

Например:

prostore-rest-client: # требуется синхронно менять в приложениях rest-uploader и data-uploader !!!
  persistence-datamart: ${PERSISTENCE_DATAMART:persistence}
  datasource: ${PERSISTENCE_DATASOURCE:} # по умолчанию пусто, тогда берется единственный датасорс из настроек Простора
  table-conditions: ${PERSISTENCE_TABLE_CONDITIONS:rest_uploader_conditions}
  table-ids: ${PERSISTENCE_TABLE_IDS:rest_uploader_ids}
  # Таблица активных экземляров сервиса rest-uploader (используется при persistence-mode: prostore)
  table-rest-uploader-health-check: ${PERSISTENCE_TABLE_HEALTH_CHECK:rest_uploader_health_check}
  # Таблица групп файлов (используется при persistence-mode: prostore)
  table-group-info: ${PERSISTENCE_TABLE_GROUP_INFO:group_info}
  # Таблица данных о файлах в группе (используется при persistence-mode: prostore)
  table-group-content: ${PERSISTENCE_TABLE_GROUP_CONTENT:group_content}
  # Таблица уникальных значений полей в группе (используется при persistence-mode: prostore)
  table-group-uniq: ${PERSISTENCE_TABLE_GROUP_UNIQ:group_uniq}
  # Таблица очереди файлов на ФЛК (используется при persistence-mode: prostore)
  table-validation-queue: ${PERSISTENCE_TABLE_VALIDATION_QUEUE:validation_queue}
  # Таблица очереди файлов на загрузку (используется при persistence-mode: prostore)
  table-validation-complete: ${PERSISTENCE_TABLE_VALIDATION_COMPLETE:validation_complete}
  # Таблица статусов запросов (используется при persistence-mode: prostore)
  table-requests-status: ${PERSISTENCE_TABLE_STATUS:status}
  # Таблица с файлами (используется при persistence-mode: prostore)
  table-files: ${PERSISTENCE_TABLE_FILES:files}
  host: ${PS_HOST:localhost}
  port: ${PS_PORT:9090}
  http:
    max-pool-size: ${PS_MAX_POOL_SIZE:8}

Параметры настроек

  • persistence-datamart - датамарт, где будут располагаться таблицы хранения данных, например PERSISTENCE_DATAMART:persistence. Используется при persistence-mode = prostore.

  • datasource - по умолчанию пусто, в таком случае берется единственный датасорс из настроек Prostore;

  • table-conditions - условия таблиц, например PERSISTENCE_TABLE_CONDITIONS:rest_uploader_conditions;

  • table-ids - настройки идентификаторов таблиц, например PERSISTENCE_TABLE_IDS:rest_uploader_ids;

  • table-rest-uploader-health-check - таблица с heath-check, например PERSISTENCE_TABLE_HEALTH_CHECK:rest_uploader_health_check;

  • table-group-info - таблица групп файлов, например PERSISTENCE_TABLE_GROUP_INFO:group_info;

  • table-group-content - таблица данных о файлах в группе, например PERSISTENCE_TABLE_GROUP_CONTENT:group_content;

  • table-group-uniq - таблица уникальных значений полей в группе, например PERSISTENCE_TABLE_GROUP_UNIQ:group_uniq;

  • table-validation-queue - таблица очереди файлов на ФЛК, например PERSISTENCE_TABLE_VALIDATION_QUEUE:validation_queue;

  • table-validation-complete - таблица очереди файлов на загрузку, например PERSISTENCE_TABLE_VALIDATION_COMPLETE:validation_complete;

  • table-requests-status - таблица хранения статусов запросов. например PERSISTENCE_STATUS_TABLE:status;

  • table-files - таблица хранения данных файлов, например PERSISTENCE_FILES_TABLE:files;

  • host - адрес Prostore, например PS_HOST:t5-prostore-01.ru-central1.internal;

  • port - порт Prostore, например PS_PORT:9195;

  • max-pool-size - максимальное число подключений к Prostore, например PS_MAX_POOL_SIZE:8.

2.2.6.2.10. Секция response

В секции response указывается период хранения информации о статусе запроса.

Например:

response:
  time-to-live: ${RESPONSE_TTL:10h}

Параметры настроек

  • time-to-live - период хранения информации о статусе запроса, например ESPONSE_TTL:10h.

2.2.6.2.11. Секция control

Секция control определяет возможности управления дельтами от клиента. Управление дельтами от клиента допускается только при настройках delta-> creating-delta-on-upload-request=disable у модулей DATA-Uploader и podd-adapter-mppw.

Например:

control:
  delta:
    enable: ${CONTROL_DELTA_ENABLE:true}

Параметры настроек

  • enable - подключение возможности управления дельтами от клиента, например CONTROL_DELTA_ENABLE:true.

2.2.6.2.12. Секция redis

Секция redis определяет настройки подключения к Redis.

Например:

redis:
  type: ${REDIS_TYPE:STANDALONE}
  connection-string: ${REDIS_CONNECTION_STRING:redis://localhost:6379}
  password: ${REDIS_PASSWORD:eYVX7EwVmmxKPCDmwMtyKVge8oLd2t81}
  max-pool-size: ${REDIS_MAX_POOL_SIZE:6}
  max-pool-waiting: ${REDIS_MAX_POOL_WAITING:24}
  max-waiting-handlers: ${REDIS_MAX_WAITING_HANDLERS:32}
  net-client-options:
    tcp-user-timeout: 30
    idle-timeout: 30

Параметры настроек

  • type - тип подключения к Redis (STANDALONE/CLUSTER);

  • connection-string - указывается список серверов для подключения (перечисление через запятую);

  • password - пароль для подключения;

  • max-pool-size - устанавливается максимальный размер пула;

  • max-pool-waiting - устанавливается максимальный размер пула ожидающих команд;

  • max-waiting-handlers - устанавливается максимальный размер ожидающих обработчиков;

  • net-client-options - параметры Redis клиента:

  • tcp-user-timeout - таймаут на соединение;

  • idle-timeout - таймаут ожидания ответа от редиса.

2.2.6.2.13. Секция auth

Секция auth служит для хранения секрета валидации токена.

Например:

auth:
  secret: ${AUTH_SECRET:gPHaT%ACXGQaQ30%1id%K7@C}
  enabled: ${AUTH_ENABLED:true}
  access-list-path: rest-uploader/ids

Параметры настроек

  • secret - cекрет для валидации токенов, например AUTH_SECRET:gPHaT%ACXGQaQ30%1id%K7@C;

  • enabled - включение/отключение аутентификации, например AUTH_ENABLED:true;

  • access-list-path - путь к списку доступов, например rest-uploader/ids.

2.2.6.2.14. Секция metrics

Секция metrics предназначена для настройки параметров метрик.

Например:

metrics:
  port: ${METRICS_PORT:9837}

Параметры конфигурации

  • port - Порт для метрик, например METRICS_PORT:9837.

2.2.6.2.15. Секция csv-parser

Внимание

При загрузке файлов с форматно-логическим контролем, важно, чтобы настройки секции csv-parser были одинаковы в модулях CSV-Uploader(если используется его UI),REST-Uploader и DATA-Uploader.

Секция csv-parser - настройка парсинга CSV.

Например:

csv-parser:
  # Символ разделителя значений
  separator: ${CSV_PARSER_SEPARATOR:;}
  # Символ кавычки
  quote-char: ${CSV_PARSER_QUOTE_CHAR:"}
  # Символ экранирования значений
  escape-char: ${CSV_PARSER_ESCAPE_CHAR:'}
  # Настройка интерпретации значений как null. Допустимые значения:
  #  - EMPTY_SEPARATORS - пустое значение между двумя разделителями, например ;;
  #  - EMPTY_QUOTES - пустые кавычки, например ;"";
  #  - BOTH - оба варианта
  #  - NEITHER - никогда. Пустая строка всегда определяется как пустая строка
  field-as-null: ${CSV_PARSER_FIELD_AS_NULL:EMPTY_SEPARATORS}

Параметры конфигурации

  • separator - Символ разделителя значений, например CSV_PARSER_SEPARATOR:;;

  • quote-char - символ кавычки, например CSV_PARSER_QUOTE_CHAR:";

  • escape-char - Символ экранирования значений, например CSV_PARSER_ESCAPE_CHAR:';

    Настройка интерпретации значений как null. Допустимые значения:

    • EMPTY_SEPARATORS - пустое значение между двумя разделителями, например ;;

    • EMPTY_QUOTES - пустые кавычки, например ;»»;

    • BOTH - оба варианта

    • NEITHER - никогда. Пустая строка всегда определяется как пустая строка

  • field-as-null - способ определения null поля, например CSV_PARSER_FIELD_AS_NULL:EMPTY_SEPARATORS;

  • multiline-limit - параметры парсинга мультистроковых значений.

Внимание

Парсер может зависать если в данных встречаются вложенные неэкранированные кавычки.

  1. Параметр CSV_PARSER_ESCAPE_CHAR работает следующим образом: если символ экранирования и символ кавычки равны ", то будет использован RFC4180Parser, который считывает все символы между двумя двойными кавычками, при этом двойная кавычка в тексте поля должна быть экранирована двойной кавычкой (Например "поле, ""содержащее двойную кавычку""" будет считано как поле, "содержащее двойную кавычку"). В противном случае будет использован CSVParser, использующий символ экранирования для обозначения «непечатаемых символов».

  2. Параметр CSV_PARSER_FIELD_AS_NULL может принимать следующие значения:

    • EMPTY_SEPARATORS - два разделителя полей (см. csv-parser/separator) подряд считаются null. Например: строка [aaa,,ccc] содержит значения [«aaa», null, «bbb»], а строка [aaa,»»,ccc] содержит значения [«aaa», «», «bbb»].

    • EMPTY_QUOTES - два «ограничителя строки» (см. csv-parser/escape-char) подряд считаются null. Например: строка [aaa,»»,ccc] содержит значения [«aaa», null, «bbb»], а строка [aaa,,ccc] содержит значения [«aaa», «», «bbb»].

    • BOTH - оба варианта (см. EMPTY_SEPARATORS и EMPTY_QUOTES) считаются null. Например: обе строки [aaa,»»,ccc] и [aaa,,bbb] содержат одинаковое значение [«aaa», null, «bbb»].

    • NEITHER - ни один из вариантов (см. EMPTY_SEPARATORS и EMPTY_QUOTES) не считается null. Например: обе строки [aaa,»»,ccc] и [aaa,,bbb] содержат одинаковое значение [«aaa», «», «bbb»].

2.2.6.2.16. Секция backup

Секция backup предназначена для настроек бекапирования модуля.

Например:

backup:
  mode: ${BACKUP_MODE:rest} # kafka | rest
  rest:
    uri: ${BACKUP_URI:/backup}
  backupTopic: ${BACKUP_TOPIC:adapter.backup}
  statusTopic: ${STATUS_TOPIC:adapter.status}
  kafka:
    consumer:
      property:
        bootstrap.servers: ${KAFKA_BOOTSTRAP_SERVERS:localhost}
        group.id: ${CSV_UPLOADER_BACKUP_GROUP_ID:csv_uploader_adapter_command}
        auto.offset.reset: latest
    producer:
      property:
        bootstrap.servers: ${KAFKA_BOOTSTRAP_SERVERS:localhost}

Параметры настроек

  • mode - режим бекапирования, например BACKUP_MODE:rest;

  • uri - путь к файлу бекапирования в случае выбора REST-сервисов для режима бэкапирования;

  • backupTopic - топик для отправки сохраненных данных, например: {BACKUP_TOPIC:adapter.backup};

  • statusTopic - топик для отправки статусов бэкапирования, например: {STATUS_TOPIC:adapter.status}.

2.2.6.2.17. Секция component-info

В секции component-info указываются настройки модуля сбора информации о компонентах витрины.

Например:

component-info:
  enabled: true
  datasource: ''
  datamart: component_info
  table-name: component_info
  create-table-period: 60s
  publish-period: 60s
  timeout-active: 300s
  secrets:
    - redis.password

Параметры настроек

  • datasource - датасорс из настроек Prostore;

  • datamart - схема Prostore;

  • table-name - имя таблицы для записи информации о компоненте;

  • create-table-period - период попыток создания схемы, в случае не успешного создания;

  • publish-period - период публикации health-check;

  • timeout-active - период, после которого компонент считается неактивным при отсутствии health-check;

  • secrets - список элементов конфига маскируемых при отправке, если указан узловой элемент, то маскируются все вложенные в него элементы.

2.2.6.3. Проверка форматно-логического контроля

Проверка форматно-логического контроля включает в себя:

  • обязательные проверки, выполняющиеся вне зависимости от настроек модуля в синхронном режиме;

  • необязательные проверки, индивидуальные для каждой таблицы, которыми управляет администратор Системы, выполняющиеся в асинхронном режиме.

Таблица 2.12 Список реализованных проверок

Наименование проверки

Код ошибки

Кирилическое описание

Проверка уникальности

dublicate

Дубликат файла/группы

Проверка парсинга файла

parsingErr

Ошибка парсинга: текст ошибки

Проверка кодирования

encodingErr

Кодировка файла не соответствует кодировке UTF-8

Проверка превышения предельного размера файла (больше 512 Мб)

tooLargeFile

Слишком большой файл

Проверка наличия данных в файле

emptyFile

Пустой файл

Проверка соответствия заголовков инфосхеме

wrongMetadata

Структура файла не соответствует схеме

Проверка соответствия числа столбцов в строке

wrongFieldsCount

Некорректное число столбцов в строке

Проверка соответствия типам полей

wrongFieldType

Значение не соответствует типу требуемый тип

Проверка уникальности полей

nonUniq

Значение не отвечает требованиям уникальности

Проверка регулярных выражений

nonMatchRegex

Значение не соответствует регулярному выражению регулярное выражение

Проверка соответствия условию

nonMatchConstant

Значение не соответствует условию условие

Таймаут валидации

validationTimeout

Истек таймаут валидации файла

2.2.6.3.1. Синхронная проверка ФЛК

Примечание

  • синхронные проверки выполняются вне зависимости от настроек модуля REST-Uploader;

  • синхронные проверки являются блокирующими;

  • ошибки синхронных проверок возвращаются в теле ответа по REST-API.

К синхронным проверкам относятся:

  • проверка соответствия инфосхеме:

    • проверка соответствия имен и количества полей в заголовках;

    • проверка типа данных;

    • проверка экранирования данных: проверка соответствия числа столбцов по каждой строке;

  • проверка соответствия файла кодировке UTF-8 , отсутствие BOM (при наличии BOM при загрузке удаляются начальные байты ef bb bf);

  • проверка размера файла и наличия данных:

    • проверка предельного размера загружаемого файла 512Мб;

    • проверка наличия данных в файле.

2.2.6.3.2. Асинхронная проверка

Примечание

  • асинхронные проверки выполняются в зависимости от настроек модуля;

  • проверки не являются блокирующими (поведение при их наличии определяется конфигурацией модуля);

  • список проверок уникален для каждой таблицы и хранится в Zookeeper в виде отдельного YAML файла.

К асинхронным проверкам относятся:

  • проверка уникальности полей:

    • по сочетанию атрибутов (для комплексных ключей);

    • по заданному атрибуту;

  • сравнение значения с константой;

  • соответствие регулярному выражению.

Для одного поля возможно создать не более одной проверки одного типа, при этом у каждого поля может быть несколько проверок разных типов.

2.2.6.3.2.1. Проверка уникальности по одному или по сочетанию полей

Проверка уникальности проводится:

  • в рамках группы файлов, если заданы headers - для проверки в рамках группы обязательно заполнения всех полей:

    • group_id;

    • group_file_num;

    • group_file_count.

  • при проверке в рамках группы значения ключей для проверки уникальности в рамках группы хранится в Redis:

    • по всем файлам в рамках группы при наличии групповых атрибутов

    • по одному файлу, при отсутствии групповых атрибутов

Пример запроса для проверки уникальности по группе файлов:

--проверка по сочетанию полей
fields:
  id:
    uniq: true
    uniq-with: [type,region]
--проверка уникальности по одному полю
  snils:
    match: "/^[-\s\d]{11}$/"
    uniq: true
2.2.6.3.2.2. Проверка соответствия заданному значению
  • проверка соответствия заданному значению проводится для каждого файла вне зависимости от наличия group_id;

  • проверка осуществляется для значений каждого поля в соответствии с заданным правилом;

  • проверка соответствия заданному значению включает в себя:

2.2.6.3.2.3. Поведение в случае таймаута валидации

Период выполнения асинхронных проверок определяется конфигурационным параметром validation-timeout и по умолчанию составляет 60 минут.

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

В случае возникновения подобной ошибки рекомендуется:

  • проверить регулярные выражения, по которым происходит проверка, так как неверно заданное регулярное выражение кратно увеличивает скорость проверки;

  • увеличить значение validation-timeout и повторить загрузку данных.

2.2.6.4. Статусная модель

Статус запроса к модулю REST-Uploder можно получить, выполнив запрос с передачей идентификатора запроса GET '/v2/requests/:requestId/status'

В ответ возвращается три поля:

  • code - код статуса;

  • errorMessage - сообщение об ошибке, заполняется лишь в случае ошибочного статуса;

  • description - описание ошибки, заполняется лишь в случае ошибочного статуса.

Пример ответа на запрос статуса

{"code":2,"description":null,"errorMessage":null}
{"code":3,"description":"Успешно обработан","errorMessage":null}
{"code":4,"description":"Ошибка обработки запроса","errorMessage":"ru.itone.dtm.data.uploader.upload.UploadException: ru.itone.dtm.prostore.rest.api.ProstoreRestException: Error executing query [insert into univer.slots select resource_id,slot_id,tag_type,tag_age,available_date,duration,slot_create_ts,slot_update_ts,slot_status,sys_op from univer.slots_upload_ext]: All of the connectors are failed\n\tat"}
{"code":5,"description":"Идентификатор запроса не обнаружен","errorMessage":null}
{"code":7,"description":"Ошибки ФЛК","errorMessage":null}

В свою очередь, идентификатор запроса ранее был получен в ответ от REST-Uploader:

  • POST“/v2/datamarts/{datamart_name}/tables/{table_name}/upload;

  • POST“/v2/datamarts/{datamart_name}/tables/{table_name}/delete.

Таблица 2.13 Статусная модель

Код статуса

Описание статуса

Действия при получении данного статуса

-1

Загрузка данных в буффер

Данный статус клиентскому приложению не возвращается, ответ вернется после того как загружаемые данные будут сохранены приложением REST-Uploader для дальнейшей загрузки.

0

Запрос буфферизирован

Выполнить повторный запрос статуса с некоторой задержкой. Рекомендуемая задержка 30сек.

1

Ожидает открытия дельты

Выполнить повторный запрос статуса с некоторой задержкой. Рекомендуемая задержка 30сек.

2

В обработке (модулем DATA-Uploader)

Выполнить повторный запрос статуса с некоторой задержкой. Рекомендуемая задержка 30сек.

3

Успешно обработан

Дополнительных действий не требуется

4

Ошибка обработки запроса

Необходимо:

  • изучить содержимое вернувшегося поля description

  • если суть проблемы не ясна из предыдущего пункта, изучить содержимое логов приложений на предмет наличия ошибок:

    • REST-Uploader

    • DATA-Uploader

    • используемого коннектора (kafka-postgres-writer или kafka-jet-writer)

5

Идентификатор запроса не обнаружен

Использовать действующий идентификатор запроса

6

Форматно-логический контроль

Выполнить повторный запрос статуса с некоторой задержкой. Рекомендуемая задержка 30сек.

7

Ошибки ФЛК

В процессе ФЛК выявлены ошибки, необходимо запросить отчет ФЛК, обратившись к REST-Uploader c запросом GET '/v2/requests/{request_id}/report/'

Далее проанализировать и устранить выявленные недочеты в загружаемых данных или скорректировать проверки ФЛК.

2.2.6.5. Спецификация модуля асинхронной загрузки данных из сторонних источников

Данная спецификация описывает возможность загрузки данных в витрину, получение статуса запроса, удаление данных из витрины.

Метод

URL

Назначение

POST

v2/datamarts/{datamart_name}/tables/{table_name}/upload

Загрузка данных в витрину с учетом реализации ФЛК

GET

v2/requests/{request_id}/status

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

DELETE

v2/datamarts/{datamart_name}/tables/{table_name}/delete

Логическое удаление данных из витрины

POST

v2/conditions/{datamart}/{table}

Запрос для загрузки списка правил для таблицы, для сохранения в Zookeeper

PUT

v2/conditions/{datamart}/{table}

Запрос для добавления правил для таблицы, для сохранения в Zookeeper

GET

v2/conditions/{datamart}/{table}

Запрос для получения списка проверок для таблицы, хранящийся в Zookeer

DELETE

v2/conditions/{datamart}/{table}

Запрос для удаления всего списка проверок по таблице

GET

v2/requests/{request_id}/report

Возвращает отчет по форматно логическом контроле загружаемых данных в формате .csv

GET

v2/group/{group_id}/report

Запрос возвращает отчет по комплектности группы загружаемых файлов в формате .csv

POST

/v2/datamarts/{datamart_name}/tables/{table_name}/truncate

Физическое удаления и/или очистка исторических данных

openapi: 3.0.1
info:
  title: Rest-uploader
  description: This is a rest-uploader service for datamart filling
  version: 2.0.0
paths:
  /v2/datamarts/{datamart_name}/tables/{table_name}/upload:
    post:
      summary: Add a new data to the datamart
      operationId: v2-datamarts-datamart_name-tables-table_name-upload
      description: Загрузка данных из внешних источников. К телу прикладывается файл csv
      tags:
        - data
      parameters:
        - $ref: '#/components/parameters/datamartName'
        - $ref: '#/components/parameters/tableName'
        - $ref: '#/components/parameters/groupId'
        - $ref: '#/components/parameters/groupFileNum'
        - $ref: '#/components/parameters/groupFileCount'
      requestBody:
        $ref: '#/components/requestBodies/uploadData'
      responses:
        '200':
          description: OK
          headers:
            requestId:
              schema:
                $ref: '#/components/schemas/requestId'
          content:
            text/plain:
              schema:
                $ref: '#/components/schemas/requestId'
        '400':
          $ref: '#/components/responses/badRequest'
        '401':
          $ref: '#/components/responses/unauthorized'
        '500':
          $ref: '#/components/responses/internalServerError'
      security:
        - bearerAuth: []
  /v2/requests/{request_id}/status:
    get:
      summary: Return request status
      description: Возвращение статуса запроса
      operationId: get-v2-request-request_id-status
      tags:
        - data
      parameters:
        - $ref: '#/components/parameters/requestId'
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                type: object
                required:
                  - code
                  - description
                  - errorMessage
                properties:
                  code:
                    type: integer
                    description: Код статуса
                  description:
                    type: string
                    description: Описание статуса
                  errorMessage:
                    type: string
                    description: Описание ошибки
        '401':
          $ref: '#/components/responses/unauthorized'
        '500':
          $ref: '#/components/responses/internalServerError'
      security:
        - bearerAuth: []
  /v2/requests/{request_id}/reportFLK:
    get:
      summary: Return report FLK check
      description: Возвращает отчет по формато логическом контроле загружаемых данных
      operationId: get-v2-request-request_id-reportFLK
      tags:
        - report
      parameters:
        - $ref: '#/components/parameters/requestId'
      responses:
        '200':
          description: OK
          content:
            text/csv:
              schema:
                type: array
                items:
                  type: array
                  items:
                    type: string
        '401':
          $ref: '#/components/responses/unauthorized'
        '500':
          $ref: '#/components/responses/internalServerError'
      security:
        - bearerAuth: []
  /v2/group/{groupId}/report:
    get:
      summary: Return report group
      description: Возвращает отчет по комплектности группы загружаемых файлов
      operationId: get-v2-group-groupId-report
      tags:
        - report
      parameters:
        - name: groupId
          in: path
          description: Identifier of group
          required: true
          schema:
            type: string
      responses:
        '200':
          description: OK
          content:
            text/csv:
              schema:
                type: array
                items:
                  type: array
                  items:
                    type: string
        '401':
          $ref: '#/components/responses/unauthorized'
        '500':
          $ref: '#/components/responses/internalServerError'
      security:
        - bearerAuth: []
  /v2/datamarts/{datamart_name}/beginDelta:
    post:
      summary: begin delta
      operationId: post-v2-datamart_name-begin_delta
      tags:
        - delta
      parameters:
        - $ref: '#/components/parameters/datamartName'
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                type: object
                properties:
                  deltaNum:
                    type: integer
        '400':
          description: Bad Request
        '401':
          $ref: '#/components/responses/unauthorized'
        '500':
          $ref: '#/components/responses/internalServerError'
      description: открытие дельты
      security:
        - bearerAuth: []
  /v2/datamarts/{datamart_name}/commitDelta:
    post:
      summary: commit delta
      operationId: post-v2-datamart_name-commit_delta
      tags:
        - delta
      parameters:
        - $ref: '#/components/parameters/datamartName'
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                type: object
                properties:
                  deltaNum:
                    type: integer
                  deltaDate:
                    type: string
                  cnFrom:
                    type: integer
        '400':
          description: Bad Request
        '401':
          $ref: '#/components/responses/unauthorized'
        '500':
          $ref: '#/components/responses/internalServerError'
      description: применение дельты
      security:
        - bearerAuth: []
  /v2/datamarts/{datamart_name}/rollbackDelta:
    post:
      summary: rollback delta
      operationId: post-v2-datamart_name-rollback_delta
      tags:
        - delta
      parameters:
        - $ref: '#/components/parameters/datamartName'
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                type: object
                properties:
                  deltaNum:
                    type: integer
        '400':
          description: Bad Request
        '401':
          $ref: '#/components/responses/unauthorized'
        '500':
          $ref: '#/components/responses/internalServerError'
      description: отмена дельты
      security:
        - bearerAuth: []
  /v2/datamarts/{datamart_name}/getDeltaOk:
    get:
      summary: get delta ok
      operationId: get-v2-datamart_name-get_delta_ok
      tags:
        - delta
      parameters:
        - $ref: '#/components/parameters/datamartName'
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                type: object
                properties:
                  deltaNum:
                    type: integer
                  deltaDate:
                    type: string
                  cnFrom:
                    type: integer
        '400':
          description: Bad Request
        '401':
          $ref: '#/components/responses/unauthorized'
        '500':
          $ref: '#/components/responses/internalServerError'
      description: получение примененной дельты
      security:
        - bearerAuth: []
  /v2/datamarts/{datamart_name}/getDeltaHot:
    get:
      summary: get delta hot
      operationId: get-v2-datamart_name-get_delta_hot
      tags:
        - delta
      parameters:
        - $ref: '#/components/parameters/datamartName'
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                type: object
                properties:
                  deltaNum:
                    type: integer
                  cnFrom:
                    type: integer
                  cnMax:
                    type: integer
                  isRollingBack:
                    type: boolean
                  writeOpFinished:
                    type: string
        '400':
          description: Bad Request
        '401':
          $ref: '#/components/responses/unauthorized'
        '500':
          $ref: '#/components/responses/internalServerError'
      description: получение открытой дельты
      security:
        - bearerAuth: []
  /v2/LengthFlkQueue:
    get:
      summary: get length flk queue
      operationId: get-v2-get_length_flk_queue
      tags:
        - data
      responses:
        '200':
          description: OK
          content:
            text/plain:
              schema:
                type: integer
        '401':
          $ref: '#/components/responses/unauthorized'
        '500':
          $ref: '#/components/responses/internalServerError'
      description: |-
        получение длины очереди ФЛК
      security:
        - bearerAuth: []
  /v2/datamarts/{datamart_name}/LengthUploadQueue:
    get:
      summary: get length upload queue
      operationId: get-v2-get_length_upload_queue
      tags:
        - data
      parameters:
        - $ref: '#/components/parameters/datamartName'
      responses:
        '200':
          description: OK
          content:
            text/plain:
              schema:
                type: integer
        '400':
          description: Bad Request
        '401':
          $ref: '#/components/responses/unauthorized'
        '500':
          $ref: '#/components/responses/internalServerError'
      description: получение длины очереди загрузки данных в датамарт
      security:
        - bearerAuth: []
  /v2/datamarts/{datamart_name}/tables/{table_name}/delete:
    post:
      summary: Delete data by primary key array
      operationId: post-v2-datamart_name-tables-table_name-delete
      tags:
        - data
      parameters:
        - $ref: '#/components/parameters/datamartName'
        - $ref: '#/components/parameters/tableName'
      responses:
        '200':
          description: OK
          headers:
            requestId:
              schema:
                $ref: '#/components/schemas/requestId'
          content:
            text/plain:
              schema:
                $ref: '#/components/schemas/requestId'
        '400':
          $ref: '#/components/responses/badRequest'
        '401':
          $ref: '#/components/responses/unauthorized'
        '500':
          $ref: '#/components/responses/internalServerError'
      description: Удаление данных по массиву первичных ключей
      security:
        - bearerAuth: []
      requestBody:
        $ref: '#/components/requestBodies/deleteData'
  /v2/datamarts/{datamart_name}/tables/{table_name}/truncate:
    post:
      summary: Delete historical data by primary key array
      operationId: post-v2-datamart_name-tables-table_name-truncate
      tags:
        - data
      parameters:
        - $ref: '#/components/parameters/datamartName'
        - $ref: '#/components/parameters/tableName'
        - $ref: '#/components/parameters/forSystemTime'
      responses:
        '200':
          description: OK
          headers:
            requestId:
              schema:
                $ref: '#/components/schemas/requestId'
          content:
            text/plain:
              schema:
                $ref: '#/components/schemas/requestId'
        '400':
          $ref: '#/components/responses/badRequest'
        '401':
          $ref: '#/components/responses/unauthorized'
        '500':
          $ref: '#/components/responses/internalServerError'
      description: Удаление исторических данных по массиву первичных ключей
      security:
        - bearerAuth: [ ]
      requestBody:
        $ref: '#/components/requestBodies/deleteData'
  /v2/conditions/{datamart}/{table}:
    parameters:
      - $ref: '#/components/parameters/datamartName'
      - $ref: '#/components/parameters/tableName'
    post:
      summary: Create verification conditions
      description: Формирование правил проверки для датамарта/таблицы
      operationId: post-v2-conditions
      tags:
        - conditions
      requestBody:
        content:
          application/x-yaml: {}
      responses:
        '200':
          description: OK
        '401':
          $ref: '#/components/responses/unauthorized'
        '500':
          $ref: '#/components/responses/internalServerError'
      security:
        - bearerAuth: []
    put:
      summary: Update verification conditions
      description: Обновление правил проверки для датамарта/таблицы
      operationId: put-v2-conditions
      tags:
        - conditions
      requestBody:
        content:
          application/x-yaml: {}
      responses:
        '200':
          description: OK
        '401':
          $ref: '#/components/responses/unauthorized'
        '500':
          $ref: '#/components/responses/internalServerError'
      security:
        - bearerAuth: []
    get:
      summary: Return verification conditions
      description: Возвращение правил проверки для датамарта/таблицы
      operationId: get-v2-conditions
      tags:
        - conditions
      responses:
        '200':
          description: OK
          content:
            text/yaml: {}
        '401':
          $ref: '#/components/responses/unauthorized'
        '500':
          $ref: '#/components/responses/internalServerError'
      security:
        - bearerAuth: []
    delete:
      summary: Delete verification conditions
      description: Удаление правил проверки для датамарта/таблицы
      operationId: delete-v2-conditions
      tags:
        - conditions
      responses:
        '200':
          description: OK
        '401':
          $ref: '#/components/responses/unauthorized'
        '500':
          $ref: '#/components/responses/internalServerError'
      security:
        - bearerAuth: []
components:
  requestBodies:
    uploadData:
      description: "загружаемые данные"
      required: true
      content:
        text/csv:
          schema:
            type: array
            items:
              type: array
              items:
                type: string
        multipart/form-data:
          schema:
            required:
              - uploadData
            properties:
              uploadData:
                type: string
                description: Data for uploading
                format: binary
    deleteData:
      description: "Удаляемые данные, важны лишь ключевые поля, остальные могут отсутствовать или будут проигнорированы"
      required: true
      content:
        application/json:
          schema:
            type: object
            properties:
              primaryKeys:
                type: array
                description: Массив первичных ключей
                items:
                  type: array
                  items:
                    type: string
        text/csv:
          schema:
            type: array
            items:
              type: array
              items:
                type: string
        multipart/form-data:
          schema:
            required:
              - uploadData
            properties:
              uploadData:
                type: string
                description: Data for uploading
                format: binary
  securitySchemes:
    bearerAuth:
      type: http
      scheme: bearer
      bearerFormat: JWT
  schemas:
    requestId:
      type: string
      description: Идентификатор запроса
      example: e5091d55-a0c8-4cc0-ba70-b89d03dde1a6
  parameters:
    datamartName:
      name: datamart_name
      in: path
      description: 'Мнемоника витрины данных'
      required: true
      schema:
        type: string
    tableName:
      name: table_name
      in: path
      description: 'Наименование таблицы'
      required: true
      schema:
        type: string
    groupId:
      name: group_id
      in: header
      description: 'Идентификатор группы'
      required: false
      schema:
        type: string
    groupFileNum:
      name: group_file_num
      in: header
      description: 'Номер файла в группе'
      required: false
      schema:
        type: integer
    groupFileCount:
      name: group_file_count
      in: header
      description: 'Число файлов в группе'
      required: false
      schema:
        type: integer
    requestId:
      name: request_id
      in: path
      description: Идентификатор запроса
      required: true
      schema:
        $ref: '#/components/schemas/requestId'
    forSystemTime:
      name: for_system_time
      in: header
      description: Метка времени для удаления истории операций
      required: false
      schema:
        type: string

  responses:
    badRequest:
      description: Bad request
      content:
        text/plain:
          schema:
            type: string
            description: Сообщение об ошибке
            example: Отсутствует целевая таблица passenger в модели данных univer
    internalServerError:
      description: Internal server error
      content:
        text/plain:
          schema:
            type: string
            description: Сообщение об ошибке
            example: Internal server error

    unauthorized:
      description: Unauthorized
      content:
        text/plain:
          schema:
            type: string
            description: Сообщение об ошибке
            example: Unauthorized
  examples: {}
security:
  - bearerAuth: []
tags:
  - name: data
    description: Загрузка и удаление данных из Витрины, получение статуса запроса
  - name: conditions
    description: Управление правилами проверок для таблицы
  - name: report
    description: Получение отчетов
  - name: delta
    description: Управление дельтами

2.2.7. Настройка BLOB-адаптера

2.2.7.1. Конфигурация BLOB-адаптера (application.yml)

Файл application.yml – основной конфигурационный файл BLOB-адаптер, в котором задана логика и порядок работы модуля:

  • получение и обработка входящих запросов;

  • настройка подключения к СМЭВ3-адаптеру, СМЭВ4-адаптеру и Хранилищу BLOB-объектов, и другие настройки необходимые для корректной работы модуля.

2.2.7.1.1. Пример файла application.yml

В конфигурационном файле следует задавать только те настройки, которые необходимы для решения текущих бизнес-задач.

http-server:
  enabled: ${SERVER_ENABLED:true}
  port: ${SERVER_PORT:8081}

executor:
  reader-pool-size: ${EXECUTOR_READER_POOL_SIZE:20}

vertx:
  web-client:
    max-pool-size: 100

kafka:
  agent.topic.prefix: ${AGENT_TOPIC_PREFIX:}
  max-concurrent-handle: ${KAFKA_MAX_CONCURRENT_HANDLE:100}
  commit-interval: ${KAFKA_COMMIT_INTERVAL:5s}
  external:
    bootstrap.servers: ${KAFKA_BOOTSTRAP_SERVERS:localhost:9092}
    topic.prefix: ${EXTERNAL_TOPIC_PREFIX:${kafka.agent.topic.prefix}}
  enabled: ${KAFKA_ENABLED:true}
  consumer:
    blob-request: ${kafka.external.topic.prefix}blob.rq
    # максимальное количество обработчиков входящих запросов
    max-concurrent-handle: ${kafka.max-concurrent-handle}
    # периодичность фиксации оффсета обработанных сообщений
    commit-interval: ${kafka.commit-interval}
    property:
      bootstrap.servers: ${kafka.external.bootstrap.servers}
      group.id: ${AGENT_TOPIC_PREFIX:}blob-consumer
      auto.offset.reset: earliest
      enable.auto.commit: false
  producer:
    blob-result: ${kafka.external.topic.prefix}blob.rs
    blob-error: ${kafka.external.topic.prefix}blob.err
    property:
      bootstrap.servers: ${kafka.external.bootstrap.servers}

blob:
  chunk-size: ${CHUNK_SIZE:524288}
  default-request-timeout: 60s
  storage:
    client: vertx # vertx/awssdk
    protocol: ${BLOB_STORAGE_PROTOCOL:http} # use only for client vertx
    host: ${BLOB_STORAGE_HOST:localhost}
    port: ${BLOB_STORAGE_PORT:8888}
    path-prefix: ${BLOB_STORAGE_PATH_PREFIX:}
    path-postfix: ${BLOB_STORAGE_PATH_POSTFIX:}
    bucket: ${BUCKET:} # use only for client awssdk
    auth:
      type: ${BLOB_STORAGE_AUTH_TYPE:NONE}  # BASIC/TOKEN/AUTH/NONE/AWSBASICCREDENTIALS
      user: ${BLOB_STORAGE_AUTH_USER:user}  # use only for auth.type BASIC
      password: ${BLOB_STORAGE_AUTH_PASSWORD:pass} # use only for auth.type BASIC
      access-token: ${ACCESS_TOKEN:}  # use only for auth.type AWSBASICCREDENTIALS
      secret-token: ${SECRET_TOKEN:}  # use only for auth.type AWSBASICCREDENTIALS
      token: ${BLOB_STORAGE_AUTH_TOKEN:token}  # use only for auth.type TOKEN
      authorization-server:   # use only for auth.type AUTH
        protocol: ${AUTH_SERVER_PROTOCOL:http}
        host: ${AUTH_SERVER_HOST:localhost}
        port: ${AUTH_SERVER_PORT:80}
        path: ${AUTH_SERVER_PATH:oauth2/token}
        client-id: ${AUTH_SERVER_CLIENT_ID:}
        client-secret: ${AUTH_SERVER_CLIENT_SECRET:}

logging:
  request-response:
    blob-request: ${BLOB_REQUEST_LOG_ENABLED:false}
    blob-response: ${BLOB_RESPONSE_LOG_ENABLED:false}

prostore-rest-client:
  host: ${PS_HOST:localhost}
  port: ${PS_PORT:9095}
  http:
    max-pool-size: ${PS_MAX_POOL_SIZE:8}

# Настройки модуля сбора информации о компонентах витрины
component-info:
  enabled: true
  # DataSource Prostore
  datasource: ''
  # Схема Prostore
  datamart: component_info
  # Имя таблицы для записи информации о компоненте
  table-name: component_info
  # Период попыток создания схемы, при неуспехе
  create-table-period: 60s
  # Период публикации health-check
  publish-period: 60s
  # Период после которого компонент считается неактивным при отсутствии health-check
  timeout-active: 300s
  # Список элементов конфига маскируемых при отправке,
  #  если указан узловой элемент, то маскируются все вложенные в него элементы
  secrets:
    - blob.storage.auth.user
    - blob.storage.auth.password
    - blob.storage.auth.token
    - blob.storage.auth.authorization-server.client-secret


metrics:
  port: ${METRICS_PORT:9837}

2.2.7.2. Параметры конфигурации

Настройка конфигурации BLOB-адаптера осуществляется путем редактирования параметров настроек в файле application.yml, где настраиваются секции:

  • http-server - указывается порт сервера;

  • executor - настраивается размер пула для запросов;

  • vertx - настраиваются значения вертиклов;

  • kafka - настраиваются параметры подключения к шине данных Apache Kafka;

  • blob - настраивается подключение к Хранилищу BLOB-объектов;

  • logging - настраивается логирование работы модуля;

  • prostore-rest-client - блок параметров конфигурирования взаимодействия с ProStore;

  • component-info- настройки модуля сбора информации о компонентах витрины;

  • metrics - настраивается получение метрик.

2.2.7.2.1. Секция http-server

Секция http-server позволяет настраивать взаимодействие с BLOB-объектами через модуль СМЭВ3-адаптер по протоколу http/https и задавать порт, на котором будет открыт доступ к серверу.

Например:

http-server:
  enabled: ${SERVER_ENABLED:true}
  port: ${SERVER_PORT:8081}
  • enabled - флаг активации работы с сервером;

  • port - порт, на котором будет открыт доступ к серверу.

2.2.7.2.2. Секция executor

Секция executor предназначена для масштабирования нагрузки (увеличения / уменьшения) на модуль.

Например:

executor:
  reader-pool-size: ${EXECUTOR_READER_POOL_SIZE:20}

Параметры настроек

  • reader-pool-size - размер пула для чтения Kafka, например EXECUTOR_READER_POOL_SIZE:20.

2.2.7.2.3. Секция vertx

Секция vertx определяет настройки количества вертиклов. Например:

vertx:
  web-client:
    max-pool-size: 20

Параметры настроек

  • max-pool-size - максимальное значение для веб-клиента.

2.2.7.2.4. Секция kafka

Секция kafka предназначена для настройки параметров подключения к шине данных Apache Kafka (используется для взаимодействия с СМЭВ4-адаптером).

Например:

kafka:
  agent.topic.prefix: ${AGENT_TOPIC_PREFIX:}
  max-concurrent-handle: ${KAFKA_MAX_CONCURRENT_HANDLE:1000}
  commit-interval: ${KAFKA_COMMIT_INTERVAL:5s}
  external:
    bootstrap.servers: ${KAFKA_BOOTSTRAP_SERVERS:localhost:9092}
    topic.prefix: ${EXTERNAL_TOPIC_PREFIX:${agent.topic.prefix}}
  enabled: ${KAFKA_ENABLED:true}
  consumer:
    blob-request: ${kafka.external.topic.prefix}blob.rq
    # максимальное количество обработчиков входящих запросов
    max-concurrent-handle: ${kafka.max-concurrent-handle}
    # периодичность фиксации оффсета обработанных сообщений
    commit-interval: ${kafka.commit-interval}
    property:
      bootstrap.servers: ${kafka.external.bootstrap.servers}
      group.id: ${AGENT_TOPIC_PREFIX:}blob-consumer
      auto.offset.reset: earliest
      enable.auto.commit: false
  producer:
    blob-result: ${kafka.external.topic.prefix}blob.rs
    blob-error: ${kafka.external.topic.prefix}blob.err
    property:
      bootstrap.servers: ${kafka.external.bootstrap.servers}

Параметры конфигурации

  • enabled - флаг включения чтения из Kafka, например KAFKA_ENABLED:true;

  • blob-request - максимальное количество обработчиков входящих запросов, например ${kafka.external.topic.prefix}blob.rq;

  • max-concurrent-handle - периодичность фиксации оффсета обработанных сообщений, например ${kafka.max-concurrent-handle}

blob.rq, blob.rs, blob.err - топики взаимодействия с Агентом СМЭВ4.

2.2.7.2.5. Секция blob

Секция blob предназначена для настройки:

  • размера выгружаемого чанка BLOB;

  • пути к Хранилищу BLOB-объектов (GET-запрос);

  • метода аутентификации для модуля BLOB-адаптера;

  • получения токена;

  • повторной аутентификаций при истечении времени жизни токена.

Например:

blob:
  chunk-size: ${CHUNK_SIZE:524288}
  default-request-timeout: 60s
  storage:
    client: vertx # vertx/awssdk
    protocol: ${BLOB_STORAGE_PROTOCOL:http} # use only for client vertx
    host: ${BLOB_STORAGE_HOST:localhost}
    port: ${BLOB_STORAGE_PORT:8888}
    path-prefix: ${BLOB_STORAGE_PATH_PREFIX:}
    path-postfix: ${BLOB_STORAGE_PATH_POSTFIX:}
    bucket: ${BUCKET:} # use only for client awssdk
    auth:
      type: ${BLOB_STORAGE_AUTH_TYPE:NONE}  # BASIC/TOKEN/AUTH/NONE/AWSBASICCREDENTIALS
      user: ${BLOB_STORAGE_AUTH_USER:user}  # use only for auth.type BASIC
      password: ${BLOB_STORAGE_AUTH_PASSWORD:pass} # use only for auth.type BASIC
      access-token: ${ACCESS_TOKEN:}  # use only for auth.type AWSBASICCREDENTIALS
      secret-token: ${SECRET_TOKEN:}  # use only for auth.type AWSBASICCREDENTIALS
      token: ${BLOB_STORAGE_AUTH_TOKEN:token}  # use only for auth.type TOKEN
      authorization-server:   # use only for auth.type AUTH
        protocol: ${AUTH_SERVER_PROTOCOL:http}
        host: ${AUTH_SERVER_HOST:localhost}
        port: ${AUTH_SERVER_PORT:80}
        path: ${AUTH_SERVER_PATH:oauth2/token}
        client-id: ${AUTH_SERVER_CLIENT_ID:}
        client-secret: ${AUTH_SERVER_CLIENT_SECRET:}

Параметры конфигурации

  • chunk-size - размер выгружаемого чанка BLOB, например ${CHUNK_SIZE:524288};

  • default-request-timeout - значение в секундах таймаута запроса;

  • protocol - протокол обмена с сервером хранилища BLOB-объектов (одно из значений http или https), например BLOB_STORAGE_PROTOCOL:http;

  • host - имя сервера хранилища BLOB-объектов, например BLOB_STORAGE_HOST:localhost;

  • port - порт сервера хранилища BLOB-объектов, если отсутствует, то следует использовать следующие порты 80 для HTTP, 443 для HTTPS, например BLOB_STORAGE_PORT:8888;

  • path-prefix - путь до места хранилища BLOB-объектов, путь до места хранения BLOB-объекта на сервере хранилища BLOB-объектов, например BLOB_STORAGE_PATH_POSTFIX:;

  • path-postfix - окончание пути, начало списка параметров, например BLOB_STORAGE_PATH_PREFIX:;

  • bucket - наименование хранилища, только для клиентов AWSSDK;

  • auth - параметры аутентификации BLOB-адаптера;

  • type -тип аутентификации (NONE - нет, BASIC - по имени/паролю, TOKEN - по токену, AUTH - через сервер аутентификации), например BLOB_STORAGE_AUTH_TYPE:NONE;

  • user - имя пользователя (для аутентификации BASIC), например BLOB_STORAGE_AUTH_USER:user;

  • password - пароль (для аутентификации BASIC), например BLOB_STORAGE_AUTH_PASSWORD:pass;

  • token - токен (для аутентификации TOKEN), например BLOB_STORAGE_AUTH_TOKEN:token;

  • protocol - имя протокола HTTP или HTTPS (для аутентификации AUTH), например AUTH_SERVER_PROTOCOL:http;

  • host - строка с IP или FQDN сервера авторизации (для аутентификации AUTH), например AUTH_SERVER_HOST:localhost;

  • port - TCP-порт (для аутентификации AUTH), например AUTH_SERVER_PORT:80;

  • path - путь на сервере (для аутентификации AUTH), например AUTH_SERVER_PATH:oauth2/token;

  • client-id - идентификатор клиента, присвоенный BLOB-адаптеру в сервере авторизации (для аутентификации AUTH), например AUTH_SERVER_CLIENT_ID:;

  • client-secret - секретный код клиента, присвоенный BLOB-адаптеру в сервере авторизации (для аутентификации AUTH), например AUTH_SERVER_CLIENT_SECRET:.

Пример cURL-запроса к серверу аутентификации

cURL (windows)

curl -X POST http://t5-avanpost-01.ru-central1.internal/oauth2/token ^
  -H "Accept: application/json"^
  -H "Content-type: application/x-www-form-urlencoded"^
  --data "grant_type=client_credentials&client_id=b0fd0f28-4b99-40d7-8dd3-e663a6cc77d1&client_secret=Zaq1sd!sa2" ^
  -o result.txt ^
  --trace-ascii result.log

cURL (linux)

curl --request POST \
  --url http://t5-avanpost-01.ru-central1.internal/oauth2/token \
  --header 'Accept: application/json' \
  --header 'Content-type: application/x-www-form-urlencoded' \
  --data 'grant_type=client_credentials&client_id=b0fd0f28-4b99-40d7-8dd3-e663a6cc77d1&client_secret=Zaq1sd!sa2' \
  -o result.txt

Пример cURL-запроса к Хранилищу BLOB-объектов

cURL (windows)

curl -X GET http://vmserv1.internal.example.com:8080/datamart/data/v1/blobs/1234567 ^
  -H "Authorization: bearer eyJhbGciOiJSUzI1NiIsImtpZCI6IjEifQ.eyJqdGkiOiI5YmQ3MzdjZi05MDNmLTQxZTktYjI5Mi1mZmUwM2QzNDhkNWIiLCJleHAiOjE2NTQxMDI5NDgsImlhdCI6MTY1NDEwMTE0OCwiaXNzIjoiY2VydC5pc3N1ZXIuaG9zdCIsImF1ZCI6IiIsImV4cGlyZXNfaW4iOjE4MDAsImNsaWVudF9pZCI6ImIwZmQwZjI4LTRiOTktNDBkNy04ZGQzLWU2NjNhNmNjNzdkMSJ9.qi8JKlQAdMsK3fTq4H88Z5-FppaUP95OH-rmPtCxEMmlPnyhNCRJe34aKMR5mXVldEzY1clV87-qjWCyPLH_Zkqji1C7aQz7fMbgZixhY2wrQnXAXRfslkRe5Ph3GYYd26GvWOG1xl99AHvfDWIfI1SGcJyd0z_iOl1GbghLvSV38MquZ8ugBdKaDjV-Ww3U_sWlJVO-oF8xjUMYuhOSsCNxhxMng1oVwUdAUbbgoB5ldyoGTbqmbQMYvBmKBT0eZqOR6RnJEAjmfOC9YeWwADKwovFybvGOaQZsjlaoJ2XxpmS79U7UO_6KXK1cnHfshVuB5_yUwubrRh6tRxt0CA"^
  -o result.bin ^
  --trace-ascii result.log

Пример настройки динамической ссылки на файлы с содержимым BLOB-полей

Пример 1

Если в Витрине поле с типом LINK содержит текст 12345678 и для получения содержимого BLOB надо использовать строку вызова:

http://aa.bb.cc:8080/api/v1/blobs/12345678

Настройки файла application.yml должны иметь следующий вид:

blob-storage:
  protocol: http
  host: aa.bb.cc
  port: 8080
  path-prefix: api/v1/blobs/

Пример 2

Если в Витрине поле с типом LINK содержит текст 12345678 и для получения содержимого BLOB надо использовать строку вызова:

https://aa.bb.cc/api/v1/blobs/12345678/data?format=jpg&size=low&backgraund=#000000,

Настройки файла application.yml должны иметь следующий вид:

blob-storage:
  protocol: https
  host: aa.bb.cc
  path-prefix: api/v1/blobs/
  path-postfix: /data
  params:
    format: jpg
    size: low
    backgraund: "#000000"

Пример 3

Если в Витрине поле с типом LINK содержит текст 12345678 и для получения содержимого BLOB надо использовать строку вызова:

http://aa.bb.cc:8080/api/v1/blobs/12345678

Настройки файла application.yml должны иметь следующий вид:

blob-storage:
  protocol: ${PROT:http}
  host: ${HOST:aa.bb.cc}
  port: ${PORT:80}
  path-prefix: ${PREFIX:api/v1/blobs/}

Пример 4

Если требуется получить строку вида:

https://aa.bb.cc:8080/app/{link}/download?requester_id={value}&user=fdsfs&zip=true

Необходимо настроить:

  1. В Витрине данных поле с типом LINK должно содержать текст:

12345678/download?requester_id=ABCDEFGH
  1. В файл application.yml добавить следующие настройки:

blob-storage:
  protocol: https
  host: aa.bb.cc
  port: 8080
  path-prefix: api/
  params:
    user: fdsfs
    zip: true

Указание дополнительных параметров к Хранилищу BLOB-объектов

Например

blob-storage:
  params:
    name1: value1
    name2: value2

Пример запроса

/files/test?name1=value1&name2=value2
2.2.7.2.6. Секция logging

В секции logging настраивается логирование работы модуля.

Например:

logging:
  request-response:
    blob-request: ${BLOB_REQUEST_LOG_ENABLED:false}
    blob-response: ${BLOB_RESPONSE_LOG_ENABLED:false}

Параметры настроек

  • blob-request - журналировать запросы, например BLOB_REQUEST_LOG_ENABLED:false;

  • blob-request - журналировать ответы, например BLOB_RESPONSE_LOG_ENABLED:false.

2.2.7.2.7. Секция prostore-rest-client

В секции prostore-rest-client реализован блок параметров конфигурирования взаимодействия с ProStore.

Например:

prostore-rest-client:
  host: ${PS_HOST:localhost}
  port: ${PS_PORT:9095}
  http:
    max-pool-size: ${PS_MAX_POOL_SIZE:8}

Параметры настроек

  • host - адрес ProStore, например PS_HOST:localhost;

  • port - порт ProStore, например PS_PORT:9195;

  • max-pool-size - максимальное число подключений к ProStore, например PS_MAX_POOL_SIZE:8;

2.2.7.2.8. Секция component-info

В секции component-info хранятся настройки компонента сбора информации о компонентах витрины.

Например:

component-info:
  enabled: true
  datasource: ''
  datamart: component_info
  table-name: component_info
  create-table-period: 60s
  publish-period: 60s
  timeout-active: 300s
  secrets:
    - keys

Параметры настроек

  • enabled - статус подключения компонента, указывается булево значение;

  • datasource - датасорс Prostore;

  • datamart - схема Prostore;

  • table-name - имя таблицы для записи информации о компоненте;

  • create-table-period - период попыток создания схемы, при неуспехе, указывается в секундах;

  • publish-period - период публикации health-check, указывается в секундах;

  • timeout-active - период после которого компонент считается неактивным при отсутствии health-check, указывается в секундах;

  • secrets - список элементов конфига маскируемых при отправке, если указан узловой элемент, то маскируются все вложенные в него элементы.

2.2.7.2.9. Секция metrics

Секция metrics предназначена для настройки параметров метрик.

Например:

metrics:
  port: ${METRICS_PORT:9837}

Параметры конфигурации

  • port - Порт для метрик, например METRICS_PORT:9837.

2.2.8. Настройка Сервиса формирования документов

2.2.8.1. Конфигурация Сервиса Формирования документов (application.yml)

Файл application.yml – основной конфигурационный файл Сервиса Формирования документов, в котором задана логика и порядок работы сервиса:

  • настройка и обработка документов;

  • путь к pebble-шаблонам документов (секция printable-forms);

  • настройка сервиса формирования подписи (sign-service);

  • настройка подключения к базе данных (секция: datasource);

  • настройка проверки состояния БД (секция health) и другие настройки необходимые для корректной работы сервиса.

2.2.8.1.1. Пример файла application.yml

В конфигурационном файле следует задавать только те настройки, которые необходимы для решения текущих бизнес-задач.

http-server:
  port: ${HTTP_PORT:8080}

executor:
  reader-pool-size: ${EXECUTOR_READER_POOL_SIZE:20}

prostore-rest-client:
  host: ${PS_HOST:localhost}
  port: ${PS_PORT:9195}
  http:
    max-pool-size: ${PS_MAX_POOL_SIZE:8}

metrics:
  port: ${METRICS_PORT:9837}

vertx:
  web-client:
    max-pool-size: 20

counter-service:
  host: ${COUNTER_SERVICE_HOST:localhost}
  port: ${COUNTER_SERVICE_PORT:9000}
  serviceName: ${COUNTER_SERVICE_NAME:printableform}
  timeout: ${COUNTER_SERVICE_TIMEOUT:30}


sign-service:
  url: ${SIGN_SERVICE_URL:http://localhost:8192}
  timeout: ${SIGN_SERVICE_TIMEOUT:30}
  pool-size: ${SIGN_SERVICE_POOL_SIZE:5}

notarius:
  host: ${NOTARUIS_HOST:localhost}
  port: ${NOTARUIS_PORT:8192}
  enabled: ${NOTARIUS_ENABLED:FALSE}
  props:
    maxContentLength: ${NOTARUIS_MAX_CONTENT_LENGTH:104857600}
    signatureURI: ${NOTARUIS_SIGNATURE_URI:urn:ietf:params:xml:ns:cpxmlsec:algorithms:gostr34102012-gostr34112012-256}
    digestMethod: ${NOTARUIS_DIGEST_METHOD:http://www.w3.org/2001/04/xmldsig-more#gostr3411}

printable-forms:
  reports:
    # имя документа
    - report: document_1
      # настройки по извлечению данных
      extract:
        # путь pebble шаблона, который будет извлекать данные
        template: extract_static.peb
      # настройки по формированию xml документа
      xml:
        # путь pebble шаблона, который будет формировать xml документ
        template: generate_xml_1.peb
        # Id подписываемого элемента, если не указано, то подписывается весь xml
        elementId: elementToSign
        # имя элемента, куда добавлять ЭП, если не указано, то в корень
        elementName: signature
        # имя файла, если не указано, то <Id_ПФ + ".xml">
        fileName: document_1.xml
      # настройки по формированию xml документа с открепленной подписью
      xml_detached_sig:
        # имя файла, если не указано, то <Id_ПФ + ".xml">
        fileName: document_1.xml
        # имя файла p7s, если не указано, то <Id_ПФ + ".p7s">
        fileSign: xmlSign.p7s
      # настройки по формированию pdf документа
      pdf:
        # путь pebble шаблона, который будет формировать pdf документ
        template: generate_pdf_1.peb
        # имя файла, если не указано, то <Id_ПФ + ".pdf">
        fileName: pdfFileName.pdf
      # настройки по формированию pdf документа с открепленной подписью
      pdf_sig:
        # путь pebble шаблона, который будет формировать подписываемый pdf документ, задается в .pdf.template
        #  (для генерации "pdf без ЭП" и "pdf с ЭП" используется единый pebble-шаблон)
        # имя файла, если не указано, то <Id_ПФ + ".pdf">
        fileName: pdfFileName.pdf
        # имя файла p7s, если не указано, то <Id_ПФ + ".p7s">
        fileSign: pdfSign.p7s

# Настройки модуля сбора информации о компонентах витрины
component-info:
  enabled: true
  # DataSource Prostore
  datasource: ''
  # Схема Prostore
  datamart: component_info
  # Имя таблицы для записи информации о компоненте
  table-name: component_info
  # Период попыток создания схемы, при неуспехе
  create-table-period: 60s
  # Период публикации health-check
  publish-period: 60s
  # Период после которого компонент считается неактивным при отсутствии health-check
  timeout-active: 300s
  # Список элементов конфига маскируемых при отправке,
  #  если указан узловой элемент, то маскируются все вложенные в него элементы
  secrets:
    - keys

2.2.8.2. Параметры конфигурации

Настройка конфигурации Сервиса Формирования документов осуществляется путем редактирования параметров настроек в файле application.yml, где настраиваются секции:

  • http-server - указывается порт веб-сервера;

  • executor - предназначена для указания размера пула для запросов;

  • prostore-rest-client - настраивается блок параметров взаимодействия с Prostore;

  • metrics - указывается порт для получения метрик;

  • counter-service - указываются настройки подключения к сервису генерации номера;

  • sign-service - указываются настройки подключения к сервису подписания документа;

  • notarius - указываются настройки сервиса подписания и проверки подписи «Нотариус»;

  • printable-forms - указываются настройки сервиса формирования документов;

  • component-info - настройки модуля сбора информации о компонентах витрины.

2.2.8.2.1. Секция http-server

В секции http-server указывается порт веб-сервера.

Например:

http-server:
  port: ${HTTP_PORT:8080}

Параметры настроек

  • port - порт веб-сервера, например: HTTP_PORT:8080.

2.2.8.2.2. Секция executor

В секции executor указывается размер пула для запросов.

Например:

executor:
  reader-pool-size: ${EXECUTOR_READER_POOL_SIZE:20}

Параметры настроек

  • reader-pool-size - Размер пула для чтения запросов, например EXECUTOR_READER_POOL_SIZE:20

2.2.8.2.3. Секция prostore-rest-client

В секции prostore-rest-client настраивается блок параметров взаимодействия с Prostore.

Например:

prostore-rest-client:
  host: ${PS_HOST:localhost}
  port: ${PS_PORT:9195}
  http:
    max-pool-size: ${PS_MAX_POOL_SIZE:8}

Параметры настроек

  • host - адрес Prostore, например PS_HOST:localhost;

  • port - порт Prostore, например PS_PORT:9195;

  • max-pool-size - максимальное число подключений к Prostore, например PS_MAX_POOL_SIZE:8.

2.2.8.2.4. Секция metrics

В секции metrics указывается порт для получения метрик.

Например:

metrics:
  port: ${METRICS_PORT:9837}

Параметры настроек

  • port - порт для получения метрик, например METRICS_PORT:9837

2.2.8.2.5. Секция counter-service

В секции counter-service настраивается подключение к сервису генерации номера.

Например:

counter-service:
  host: ${COUNTER_SERVICE_HOST:localhost}
  port: ${COUNTER_SERVICE_PORT:9000}
  serviceName: ${COUNTER_SERVICE_NAME:printableform}
  timeout: ${COUNTER_SERVICE_TIMEOUT:30}

Параметры настроек

  • host - адрес сервиса генерации номера, например COUNTER_SERVICE_HOST:t5-printable-form-01.ru-central1.internal;

  • port - порт сервиса генерации номера, например COUNTER_SERVICE_PORT:9000;

  • serviceName - значение имени сервиса, например COUNTER_SERVICE_NAME:printableform;

  • timeout - таймаут на генерации номера, например COUNTER_SERVICE_TIMEOUT:30.

2.2.8.2.6. Секция sign-service

В секции sign-service настраивается подключение к сервису подписания документа.

Например:

sign-service:
  url: ${SIGN_SERVICE_URL:http://dev-dtm-poddagent01.ru-central1.internal:8192}
  timeout: ${SIGN_SERVICE_TIMEOUT:30}
  pool-size: ${SIGN_SERVICE_POOL_SIZE:5}

Параметры настроек

  • url - URL сервиса подписания документа, например SIGN_SERVICE_URL:http://dev-dtm-poddagent01.ru-central1.internal:8192;

  • timeout - таймаут на подписание документа (сек), например SIGN_SERVICE_TIMEOUT:30;

  • pool-size - размер пула для сервиса подписания, например SIGN_SERVICE_POOL_SIZE:5.

2.2.8.2.7. Секция notarius

В секции notarius указываются настройки сервиса Нотариус.

Например:

notarius:
  host: ${NOTARUIS_HOST:dev-dtm-poddagent01.ru-central1.internal}
  port: ${NOTARUIS_PORT:8192}
  enabled: ${NOTARIUS_ENABLED:FALSE}
  props:
    maxContentLength: ${NOTARUIS_MAX_CONTENT_LENGTH:104857600}
    signatureURI: ${NOTARUIS_SIGNATURE_URI:urn:ietf:params:xml:ns:cpxmlsec:algorithms:gostr34102012-gostr34112012-256}
    digestMethod: ${NOTARUIS_DIGEST_METHOD:http://www.w3.org/2001/04/xmldsig-more#gostr3411}

Параметры настроек

  • host - адрес сервиса Нотариус, например NOTARUIS_HOST:dev-dtm-poddagent01.ru-central1.internal;

  • port - порт сервиса Нотариус, например NOTARUIS_PORT:8192;

  • enabled - выбор сервиса подписания между schloussler и notarius, например NOTARIUS_ENABLED:FALSE;

  • maxContentLength - максимальный размер отправляемого объекта, например NOTARUIS_MAX_CONTENT_LENGTH:1048576005;

  • signatureURI - URI алгоритма хэширования, например NOTARUIS_SIGNATURE_URI:urn:ietf:params:xml:ns:cpxmlsec:algorithms:gostr34102012-gostr34112012-256;

  • digestMethod - алгоритм хэширования, например NOTARUIS_DIGEST_METHOD:http://www.w3.org/2001/04/xmldsig-more#gostr3411.

2.2.8.2.8. Секция printable-forms

В секции printable-forms настраивается сервис формирования документов.

Например:

printable-forms:
  reports:
    # имя документа
    - report: document_1
      # настройки по извлечению данных
      extract:
        # путь pebble шаблона, который будет извлекать данные
        template: ./src/main/resources/extract_static.peb
      # настройки по формированию xml документа
      xml:
        # путь pebble шаблона, который будет формировать xml документ
        template: ./src/main/resources/generate_xml_1.peb
        # Id подписываемого элемента, если не указано, то подписывается весь xml
        elementId: elementToSign
        # имя элемента, куда добавлять ЭП, если не указано, то в корень
        elementName: signature
        # имя файла, если не указано, то <Id_ПФ + ".xml">
        fileName: document_1.xml
      # настройки по формированию pdf документа
      pdf:
        # путь pebble шаблона, который будет формировать pdf документ
        template: ./src/main/resources/generate_pdf_1.peb
        # имя файла, если не указано, то <Id_ПФ + ".pdf">
        fileName: pdfFileName.pdf
      # настройки по формированию pdf документа с открепленной подписью
      pdf_sig:
        # путь pebble шаблона, который будет формировать подписываемый pdf документ, задается в .pdf.template
        #  (для генерации "pdf без ЭП" и "pdf с ЭП" используется единый pebble-шаблон)

        # имя файла, если не указано, то <Id_ПФ + ".pdf">
        fileName: pdfFileName.pdf
        # имя файла p7s, если не указано, то <Id_ПФ + ".p7s">
        fileSign: pdfSign.p7s

Внимание

В конфигурационном файле application.yml пути к файлам pebble-шаблонов должны быть либо: относительно директории запуска, либо абсолютные пути.

2.2.8.2.9. Секция component-info

В секции component-info хранятся настройки компонента сбора информации о компонентах витрины.

Например:

component-info:
  enabled: true
  datasource: ''
  datamart: component_info
  table-name: component_info
  create-table-period: 60s
  publish-period: 60s
  timeout-active: 300s
  secrets:
    - keys

Параметры настроек

  • enabled - статус подключения компонента, указывается булево значение;

  • datasource - датасорс Prostore;

  • datamart - схема Prostore;

  • table-name - имя таблицы для записи информации о компоненте;

  • create-table-period - период попыток создания схемы, при неуспехе, указывается в секундах;

  • publish-period - период публикации health-check, указывается в секундах;

  • timeout-active - период после которого компонент считается неактивным при отсутствии health-check, указывается в секундах;

  • secrets - список элементов конфига маскируемых при отправке, если указан узловой элемент, то маскируются все вложенные в него элементы.

2.2.8.3. Примеры pebble-шаблонов для Сервиса Формирования документов

2.2.8.3.1. Возможность вызова REST-сервисов из шаблона Сервиса Формирования документов

Для вызова REST-сервисов из шаблона Сервиса Формирования документов используется функция callRest.

Пример вызова функции из pebble-шаблона:

{% set host = "smevql-dtm-smevqlserver01.ru-central1.internal" %}
{% set port = "8080" %}
{% set route = "data" %}
    {% set rq = "${jsonRequest.replace("\"", "\\\"")}" %}

{% set varName = callRest(
        method = "POST",
        url = "http://#\{host}:#{port}/#{route}",
        headers = "Content-Type=application/json",
        body = rq,
        responseType = "JSON"
      )
%}

{{ varName["response"]["ticket"][0]["id"]}}

Для асинхронного вызова (без ожидания ответа), необходимо выставить параметр async=true.

2.2.8.3.2. Pebble-шаблон для обработки поступившего запроса и формирования json-файла
{# формируем sql запрос в переменную passengersquery#}
{% var passengersquery %}
    {% if params[0] is empty %}
        select * from smart.all_types limit 10
    {% else %}
        select * from smart.all_types limit {{ params[0] }}
    {% endif %}
{% endvar %}
{# выполняем sql запрос и помещаем результат выполнения в переменную rows.searchpassenger #}
{{ sql("searchpassenger", passengersquery) }}

{% var json_data %}
{
    "passengers": [
    {% for p in rows.searchpassenger %}
    {#  формируем json динамически  #}
        {% if loop.first %}
        {% else %}
            ,
        {% endif %}
        {
            "id": "{{ p.id }}",
            "firstname": "{{ p.firstname }}",
            "middlename": "{{ p.middlename }}",
            "lastname": "{{ p.lastname }}",
            "birthday": "{{ p.birthday }}"
        }
    {% endfor %}
    ]
}
{% endvar %}

{#выведем полученный json в неэкранированной форме#}
{{ json_data | raw }}
2.2.8.3.3. Pebble-шаблон для формирования xml-документа
<root>
    <passengers Id="elementToSign">
    {% for p in data.passengers %}
        <passenger id="{{ p.id }}">
            <firstname>{{ p.firstname }}</firstname>
            <middlename>{{ p.middlename }}</middlename>
            <lastname>{{ p.lastname }}</lastname>
            <birthday>{{ p.birthday }}</birthday>
        </passenger>
        <cert>
            <organization>{{ certification_info.subjectDN.commonName }}</organization>
            <serial>{{ dec_to_hex(certification_info.serialNumber) }}</serial>
            <issuer>{{ certification_info.issuerDN.commonName }}</issuer>
            <valid-from>{{ certification_info.notBefore | date("dd.MM.yyyy") }}</valid-from>
            <valid-until>{{ certification_info.notAfter | date("dd.MM.yyyy") }}</valid-until>
        </cert>
    {% endfor %}
    </passengers>
    <signature/>
</root>
2.2.8.3.4. Pebble-шаблон для формирования pdf-документа
<html>
    <head>
        <style>
            table, th, td {
            border: 1px solid black;
            }
        </style>
    </head>
    <body>
    <h3>Certificate</h3>
    <table>
        <tr>
            <th>Организация</th>
            <th>Сертификат</th>
            <th>Издатель</th>
            <th>Действителен с</th>
            <th>Действителен по</th>
        </tr>
        <tr>
            <td>{{ certification_info.subjectDN.commonName }}</td>
            <td>{{ certification_info.serialNumber }}</td>
            <td>{{ certification_info.issuerDN.commonName }}</td>
            <td>{{ certification_info.notBefore }}</td>
            <td>{{ certification_info.notAfter }}</td>
        </tr>
    </table>
    <h3>Passengers</h3>
    <table>
        <tr>
            <th>id</th>
            <th>firstname</th>
            <th>middlename</th>
            <th>lastname</th>
            <th>birthday</th>
        </tr>
        {% for p in data.passengers %}
        <tr>
            <td>{{ p.id }}</td>
            <td>{{ p.firstname }}</td>
            <td>{{ p.middlename }}</td>
            <td>{{ p.lastname }}</td>
            <td>{{ p.birthday }}</td>
        </tr>
        {% endfor %}
    </table>
    </body>
</html>

2.2.9. Настройка Counter-provider - Сервиса генерации уникального номера

2.2.9.1. Конфигурация модуля Counter-Provider (application.yml)

Файл application.yml – основной конфигурационный файл модуля, в котором задана его логика и порядок работы сервиса:

  • среда разработки;

  • настройка счетчика;

  • настройка подключения к Zookeeper, а также другие настройки необходимые для корректной работы сервиса.

2.2.9.2. Пример файла application.yml

В конфигурационном файле следует задавать только те настройки, которые необходимы для решения текущих бизнес-задач.

environment:
  name: ${ENVIRONMENT_NAME:test}

http-server:
  port: ${HTTP_PORT:9000}

counter:
  start-number: ${COUNTER_START_NUMBER:1}
  retry-after-failure: ${COUNTER_RETRY_AFTER_FAILURE:3}
  update-timeout: ${COUNTER_UPDATE_TIMEOUT:}
  reset-period: ${COUNTER_RESET_PERIOD:}
  increment-gap: ${INCREMENT_GAP:1}

zookeeper:
  connection-string: ${ZOOKEEPER_DS_ADDRESS:localhost}
  connection-timeout-ms: ${ZOOKEEPER_DS_CONNECTION_TIMEOUT_MS:30000}
  session-timeout-ms: ${ZOOKEEPER_DS_SESSION_TIMEOUT_MS:86400000}
  chroot: ${ZOOKEEPER_DS_CHROOT:/adapter}

persistence-mode: ${PERSISTENCE_MODE:prostore} # prostore | zookeeper

prostore-rest-client:
  host: ${PS_HOST:localhost}
  port: ${PS_PORT:9195}
  http:
    max-pool-size: ${PS_MAX_POOL_SIZE:5}
  persistence-datamart: ${PERSISTENCE_DATAMART:persistence}
  datasource: ${PERSISTENCE_DATASOURCE:} # по умолчанию пусто, тогда берется единственный датасорс из настроек Простора
  counter-prefix: ${COUNTER_PREFIX:counter_}


migration:
  enabled: ${MIGRATION_ENABLE:false}
  old-connection-string: ${OLD_ZOOKEEPER_DS_ADDRESS:localhost}

backup:
  mode: ${BACKUP_MODE:rest} # kafka | rest
  rest:
    uri: ${BACKUP_URI:/backup}
  backupTopic: ${BACKUP_TOPIC:adapter.backup}
  statusTopic: ${STATUS_TOPIC:adapter.status}
  kafka:
    consumer:
      property:
        bootstrap.servers: ${KAFKA_BOOTSTRAP_SERVERS:localhost:9092}
        group.id: ${COUNTER_BACKUP_GROUP_ID:counter_provider_adapter_command}
        auto.offset.reset: latest
    producer:
      property:
        bootstrap.servers: ${KAFKA_BOOTSTRAP_SERVERS:localhost:9092}

# Настройки модуля сбора информации о компонентах витрины
component-info:
  enabled: true
  # DataSource Prostore
  datasource: ''
  # Схема Prostore
  datamart: component_info
  # Имя таблицы для записи информации о компоненте
  table-name: component_info
  # Период попыток создания схемы, при неуспехе
  create-table-period: 60s
  # Период публикации health-check
  publish-period: 60s
  # Период после которого компонент считается неактивным при отсутствии health-check
  timeout-active: 300s
  # Список элементов конфига маскируемых при отправке,
  #  если указан узловой элемент, то маскируются все вложенные в него элементы
  secrets:
    - keys


metrics:
  port: ${METRICS_PORT:9837}

2.2.9.3. Параметры конфигурации

Настройка конфигурации Сервиса генерации уникального номера осуществляется путем редактирования параметров настроек в файле application.yml, где настраиваются секции:

  • environment - указывается среда разработки;

  • http-server - указывается порт веб-сервера;

  • counter - указываются настройки счетчика;

  • zookeeper - определяет настройки подключения к Zookeeper;

  • persistence-mode - настройки хранения данных;

  • prostore-rest-client - блок параметров конфигурирования взаимодействия с ProStore;

  • migration - настройки миграции;

  • backup - настройки бекапирования;

  • component-info - настройки модуля сбора информации о компонентах витрины;

  • metrics - настройка порта для получения метрик.

2.2.9.3.1. Секция environment

В секции environment указывается среда разработки (dev, test, stable, prod)

Например:

environment:
  name: ${ENVIRONMENT_NAME:test}

Параметры настроек

  • name - среда разработки, например ENVIRONMENT_NAME:test.

2.2.9.3.2. Секция http-server

В секции http указывается порт веб-сервера.

Например:

http-server:
  port: ${HTTP_PORT:9000}

Параметры настроек

  • port - порт веб-сервера, например: HTTP_PORT:9000.

2.2.9.3.3. Секция counter

В секции counter можно настраивать начальный номер счетчика, а также количество попыток записи счетчика после ошибки обновления.

Например:

counter:
  start-number: ${COUNTER_START_NUMBER:1}
  retry-after-failure: ${COUNTER_RETRY_AFTER_FAILURE:3}
  update-timeout: ${COUNTER_UPDATE_TIMEOUT:}
  reset-period: ${COUNTER_RESET_PERIOD:}
  increment-gap: ${INCREMENT_GAP:1}

Параметры настроек

  • start-number - начальный номер счетчика, например COUNTER_START_NUMBER:1;

  • retry-after-failure- количество попыток записи счетчика после ошибки обновления, например COUNTER_RETRY_AFTER_FAILURE:3;

  • update-timeout - таймаут обновления счетчика, например COUNTER_UPDATE_TIMEOUT:;

  • reset-period - период сброса счетчика, например COUNTER_RESET_PERIOD:;

  • increment-gap - шаг инкремента, например INCREMENT_GAP:1.

2.2.9.3.4. Секция zookeeper

В секции zookeeper настраиваются параметры подключения к Zookeeper.

Например:

zookeeper:
  connection-string: ${ZOOKEEPER_DS_ADDRESS:t5-adsp-01.ru-central1.internal}
  connection-timeout-ms: ${ZOOKEEPER_DS_CONNECTION_TIMEOUT_MS:30000}
  session-timeout-ms: ${ZOOKEEPER_DS_SESSION_TIMEOUT_MS:86400000}
  chroot: ${ZOOKEEPER_DS_CHROOT:/adapter}

Параметры настроек

  • connection-string - Подключение к Zookeeper DS, например ZOOKEEPER_DS_ADDRESS:t5-adsp-01.ru-central1.internal;

  • connection-timeout-ms - Zookeeper DS таймаут подключения, например ZOOKEEPER_DS_CONNECTION_TIMEOUT_MS:30000;

  • session-timeout-ms - Zookeeper DS таймаут сессии, например ZOOKEEPER_DS_SESSION_TIMEOUT_MS:86400000;

  • chroot - Zookeeper DS chroot path, например ZOOKEEPER_DS_CHROOT:/adapter.

2.2.9.3.5. Секция persistence-mode

В секции persistence-mode указывается настройка хранения данных: или в Prostore или в Zookeeper. В случае выбора Prostore автоматически создаются необходимые таблицы.

Например:

persistence-mode: ${PERSISTENCE_MODE:prostore} # prostore | zookeeper

Параметры настроек

  • persistence-mode - настройка хранения данных, например PERSISTENCE_MODE:prostore.

2.2.9.3.6. Секция prostore-rest-client

В секции prostore-rest-client реализован блок параметров конфигурирования взаимодействия с ProStore.

Например:

prostore-rest-client:
  host: ${PS_HOST:localhost}
  port: ${PS_PORT:9195}
  http:
    max-pool-size: ${PS_MAX_POOL_SIZE:5}
  persistence-datamart: ${PERSISTENCE_DATAMART:persistence}
  datasource: ${PERSISTENCE_DATASOURCE:}
  counter-prefix: ${COUNTER_PREFIX:counter_}

Параметры настроек

  • host - адрес ProStore, например PS_HOST:localhost;

  • port - порт ProStore, например PS_PORT:9195;

  • max-pool-size - максимальное число подключений к ProStore, например PS_MAX_POOL_SIZE:8;

  • persistence-datamart - настройка хранения данных, например {PERSISTENCE_DATAMART:persistence};

  • datasource - источник данных, например PERSISTENCE_DATASOURCE:, по умолчанию пусто, в этом случае берется единственный датасорс из настроек Простора.

2.2.9.3.7. Секция migration

В секции migration настраиваются миграции Zookeeper для задачи бекапирования.

Например:

migration:
  enabled: ${MIGRATION_ENABLE:false}
  old-connection-string: ${OLD_ZOOKEEPER_DS_ADDRESS:localhost}

Параметры настроек

  • enabled - подключение миграции, например {MIGRATION_ENABLE:false};

  • old-connection-string - адрес Zookeeper, например {OLD_ZOOKEEPER_DS_ADDRESS:localhost}.

2.2.9.3.8. Секция backup

В секции backup настраивается бекапирования модуля.

Например:

backup:
  mode: ${BACKUP_MODE:rest} # kafka | rest
  rest:
    uri: ${BACKUP_URI:/backup}
  backupTopic: ${BACKUP_TOPIC:adapter.backup}
  statusTopic: ${STATUS_TOPIC:adapter.status}
  kafka:
    consumer:
      property:
        bootstrap.servers: ${KAFKA_BOOTSTRAP_SERVERS:localhost:9092}
        group.id: ${COUNTER_BACKUP_GROUP_ID:counter_provider_adapter_command}
        auto.offset.reset: latest
    producer:
      property:
        bootstrap.servers: ${KAFKA_BOOTSTRAP_SERVERS:localhost:9092}

Параметры настроек

  • mode - режим бекапирования, например BACKUP_MODE:rest;

  • uri - путь к файлу бекапирования в случае выбора REST-сервисов для режима бэкапирования;

  • backupTopic - топик для отправки сохраненных данных, например: {BACKUP_TOPIC:adapter.backup};

  • statusTopic - топик для отправки статусов бэкапирования, например: {STATUS_TOPIC:adapter.status}.

2.2.9.3.9. Секция component-info

В секции component-info хранятся настройки компонента сбора информации о компонентах витрины.

Например:

component-info:
  enabled: true
  datasource: ''
  datamart: component_info
  table-name: component_info
  create-table-period: 60s
  publish-period: 60s
  timeout-active: 300s
  secrets:
    - keys

Параметры настроек

  • enabled - статус подключения компонента, указывается булево значение;

  • datasource - датасорс Prostore;

  • datamart - схема Prostore;

  • table-name - имя таблицы для записи информации о компоненте;

  • create-table-period - период попыток создания схемы, при неуспехе, указывается в секундах;

  • publish-period - период публикации health-check, указывается в секундах;

  • timeout-active - период после которого компонент считается неактивным при отсутствии health-check, указывается в секундах;

  • secrets - список элементов конфига маскируемых при отправке, если указан узловой элемент, то маскируются все вложенные в него элементы.

2.2.9.3.10. Секция metrics

В секции metrics настраивается порт получения метрик.

Например:

metrics:
  port: ${METRICS_PORT:9837}

Параметры настроек

  • port - Порт для получения метрик, например {METRICS_PORT:9837}.

2.2.10. Настройка Arenadata Cluster Manager (ADCM)

Подробная инструкция по настройке Arenadata Cluster Manager (ADCM) приведена в официальной документации разработчика на странице https://docs.arenadata.io/adcm/.

2.2.11. Настройка сервиса журналирования

Сервис журналирования позволяет работать с логами прикладных модулей запущенных в средах WildFly и Kubernetes/OpenShift.

Настройка сервиса журналирования должна быть применена к каждому модулю.

Ниже приведены шаги по настройке сервиса журналирования.

  1. Добавьте зависимости в проект:

<parent>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-parent</artifactId>
   <version>2.3.4.RELEASE</version>
   <relativePath/> <!-- lookup parent from repository -->
</parent>
<modelVersion>4.0.0</modelVersion>

<artifactId>logger-test</artifactId>

<properties>
   <java.version>11</java.version>
   <spring-cloud.version>Hoxton.SR5</spring-cloud.version>
</properties>

<dependencies>
   <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-web</artifactId>
   </dependency>
   <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-validation</artifactId>
   </dependency>

   <dependency>
      <groupId>ch.qos.logback</groupId>
      <artifactId>logback-classic</artifactId>
      <version>1.2.3</version>
   </dependency>

   <dependency>
      <groupId>ch.qos.logback.contrib</groupId>
      <artifactId>logback-json-classic</artifactId>
      <version>0.1.5</version>
   </dependency>

   <dependency>
      <groupId>ch.qos.logback.contrib</groupId>
      <artifactId>logback-jackson</artifactId>
      <version>0.1.5</version>
   </dependency>
   <dependency>
      <groupId>net.logstash.logback</groupId>
      <artifactId>logstash-logback-encoder</artifactId>
      <version>6.3</version>
   </dependency>
   <dependency>
      <groupId>org.projectlombok</groupId>
      <artifactId>lombok</artifactId>
      <version>1.18.12</version>
      <scope>provided</scope>
   </dependency>
   <dependency>
      <groupId>io.springfox</groupId>
      <artifactId>springfox-boot-starter</artifactId>
      <version>3.0.0</version>
   </dependency>
   <dependency>
      <groupId>org.codehaus.janino</groupId>
      <artifactId>janino</artifactId>
      <version>3.0.6</version>
   </dependency>
   <dependency>
      <groupId>org.springframework.cloud</groupId>
      <artifactId>spring-cloud-starter-sleuth</artifactId>
   </dependency>
   <dependency>
      <groupId>org.springframework.kafka</groupId>
      <artifactId>spring-kafka</artifactId>
      <version>2.5.9.RELEASE</version>
   </dependency>

</dependencies>
<dependencyManagement>
   <dependencies>
      <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-dependencies</artifactId>
            <version>${spring-cloud.version}</version>
            <type>pom</type>
            <scope>import</scope>
      </dependency>
   </dependencies>
</dependencyManagement>
  1. Подключите FluentBit к приложению как отдельный контейнер в OpenShift:

containers:
 - name: fluent-bit
   image: fluent/fluent-bit:latest
   volumeMounts: #перенос конфигураций, и лог файла из проекта в контейнер
     - name: logger
       mountPath: /fluent-bit/logger/
     - name: fluent-bit-config
       mountPath: /fluent-bit/etc/
   terminationMessagePolicy: File
   envFrom:
     - configMapRef:
         name: logger-fluent-bit-config-env
  1. Создайте файл logback.xml для логирования приложения ( подробнее см. документацию):

Внимание

Обязательно в appender FILE_FLUENT прописать путь до конфигураций FluentBit, иначе в контейнер логи не подтянутся. Например, <file>name-project/docker/fluentbit/conf/log.log</file>.

<configuration debug="true">
   <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
      <layout class="ch.qos.logback.classic.PatternLayout">
            <pattern>
               <Pattern>
                  %d{yyyy-MM-dd HH:mm:ss}%-5level %logger{36} - %msg%n
               </Pattern>
            </pattern>
      </layout>
   </appender>

   <appender name="FILE_FLUENT" class="ch.qos.logback.core.FileAppender">
      <file>docker/fluentbit/conf/log.log</file>
      <append>false</append>
      <layout class="ch.qos.logback.classic.PatternLayout">
            <pattern>
               <Pattern>
                  x-b3-traceid=%X{X-B3-TraceId:-} x-b3-spanid=%X{X-B3-SpanId:-} x-b3-parentspanid=%X{X-B3-ParentSpanId:-} x-b3-sampled=%X{X-B3-Sampled:-} x-b3-flags=%X{X-B3-Flags:-} caller_file_name=%file serverEventDatetime="%d" logLevel=%level threadName=%thread  message="%replace(%replace(%m){'\n','\u2028'}){'\"','\''}" exception="%replace(%replace(%ex){'\"','\u2028'}){'\n','\u2028'}%nopex" callerLine=%L callerMethod="%replace(%caller){'\n','\u2028'}" loggerName="%10.10logger" callerClass=%logger{40} levelStr="%level" levelInt="%level" mdc= \n
               </Pattern>
            </pattern>
      </layout>
   </appender>

   <root level="debug" additivity="false">
      <appender-ref ref="STDOUT"/>
      <appender-ref ref="FILE_FLUENT"/>
   </root>
</configuration>
  1. Добавьте описание конфигурации для FluentBit (подробнее см документацию ):

[SERVICE]
      Flush         1
      Log_Level     info
      Daemon        off
      Parsers_File /fluent-bit/etc/parsers.conf
[INPUT]
      Name   tail
      Path        /fluent-bit/logger/log.log
      Tag    kafka-efs
      Buffer_Chunk_Size 400k
      Buffer_Max_Size 6MB
      Mem_Buf_Limit 6MB
      Parser logfmt
      Refresh_Interval 20

[FILTER]
      Name record_modifier
      Match       kafka-efs
      Record      subsystem ${SUBSYSTEM}
      Record      distribVersion ${DISTRIBVERSION}
      Record      deploymentUnit ${DEPLOYMENTUNIT}
      Record      hostName ${HOSTNAME}
      Record      ipAddress ${IPADDRESS}

[FILTER]
      Name        modify
      Match       kafka-efs
      Hard_copy callerClass className

[FILTER]
      Name        record_modifier
      Match       kafka-efs
      Whitelist_key serverEventDatetime
      Whitelist_key subsystem
      Whitelist_key distribVersion
      Whitelist_key deploymentUnit
      Whitelist_key hostName
      Whitelist_key ipAddress
      Whitelist_key logLevel
      Whitelist_key className
      Whitelist_key threadName
      Whitelist_key message
      Whitelist_key x-b3-traceid
      Whitelist_key x-b3-spanid
[FILTER]
      Name    lua
      Match   kafka-efs
      script  convert_date.lua
      call    convert_date_efs

[OUTPUT]
      Name  stdout
      Match kafka-efs
      Format json
      json_date_key time

[OUTPUT]
      Name  http
      Match kafka-efs
      Host logstash-service-gt-tatarstan-test-efs.apps.ocp-public.sbercloud.ru
      Port 80
      Format json
      json_date_key time

Для правильной работы подключите parsers.conf.

[PARSER]
      Name        logfmt
      Format      logfmt
  1. Настройте форматирование даты:

function convert_date_efs(tag, timestamp, record)
  local pattern = "(%d+)-(%d+)-(%d+) (%d+):(%d+):(%d+),(%d+)"
  dt_str = record["serverEventDatetime"]
  local year, month, day, hour, minute, seconds, milliseconds = dt_str:match(pattern)
  ts = os.time{year = year, month = month, day = day, hour = hour, min = minute, sec = seconds }
  ts = (ts * 1000) + milliseconds
  record["serverEventDatetime"] = ts
  return 2, timestamp, record
end

function convert_date_pprb(tag, timestamp, record)
  local pattern = "(%d+)-(%d+)-(%d+) (%d+):(%d+):(%d+),(%d+)"
  dt_str = record["serverEventDatetime"]
  local year, month, day, hour, minute, seconds, milliseconds = dt_str:match(pattern)
  ts = os.time{year = year, month = month, day = day, hour = hour, min = minute, sec = seconds }
  ts = (ts * 1000) + milliseconds
  record["timestamp"] = ts
  return 2, timestamp, record
end

function convert_date_logstash(tag, timestamp, record)
  local pattern = "(%d+)-(%d+)-(%d+) (%d+):(%d+):(%d+),(%d+)"
  dt_str = record["serverEventDatetime"]
  local year, month, day, hour, minute, seconds, milliseconds = dt_str:match(pattern)
  ts = os.time{year = year, month = month, day = day, hour = hour, min = minute, sec = seconds }
  ts = (ts * 1000) + milliseconds
  record["time"] = ts
  return 2, timestamp, record
end
  1. Добавьте параметры модуля:

kind: ConfigMap
apiVersion: v1
metadata:
  name: logger-fluent-bit-config-env
data:
  MODULEID: 1.0.0
  MODULEVERSION: 1.0.0
  NODEID: 12345
  HOSTADDRESS: 0.0.0.0
  SUBSYSTEM: LOGGER-TEST
  DISTRIBVERSION: 1.0.0
  DEPLOYMENTUNIT: TEST-UNIT
  IPADDRESS: 0.0.0.1
  1. Настройте конфигурацию для OpenShift. Для того, чтобы Prometheus мог идентифицировать сервис и собирать с него информацию, создайте Service и укажите путь, на котором располагаются метрики приложения.

apiVersion: v1
kind: Service
metadata:
name: monitoring-rest
annotations:
   description: 'Exposes Prometheus App by CLuster Ip'
   prometheus.io.scrape: 'true'
   prometheus.io.path: '/monitoring-rest/actuator/prometheus'
   prometheus.io.port: '8081'
labels:
   app: monitoring-rest
spec:
type: LoadBalancer
ports:
   - name: http
      port: 9837
      targetPort: 9837
selector:
   app: monitoring-rest

2.2.12. Установка компонента сбора данных запросов и ответов Витрины данных

Компонент сбора данных запросов и ответов Витрины данных реализован с целью проведения бизнес-мониторинга ИЭП процессов обработки запросов типовым ПО витрины данных, как в целом, так и в части функционирования отдельных витрин для последующей передачи данных в СЦЛ.

2.2.12.1. Процесс установки

Общий процесс установки состоит из следующих действий:

  1. Настройка логирования модулей.

  2. Установка и настройка Vector.

  3. Установка и настройка HaProxy.

  4. Установка и настройка fluentbit.

2.2.12.1.1. Настройка логирования модулей

Необходимо настроить формирование логов в формате JSON на стороне модулей:

  • BLOB-адаптер;

  • Сервис формирования документов.

Для этого в файле logback.xml включите параметр net.logstash.logback.encoder.LogstashEncoder.

Пример logback.xml:

<?xml version="1.0" encoding="UTF-8"?>
    <configuration>
    <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>logs/application.log</file>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!-- daily rollover -->
            <fileNamePattern>logs/application.%d{yyyy-MM-dd}.log</fileNamePattern>
            <!-- keep 30 days' worth of history capped at 3GB total size -->
            <maxHistory>30</maxHistory>
            <totalSizeCap>3GB</totalSizeCap>
        </rollingPolicy>
        <encoder class="net.logstash.logback.encoder.LogstashEncoder" />
    </appender>

    <root level="INFO">
        <appender-ref ref="FILE" />
    </root>
</configuration>

Подробная информация об encoder: https://github.com/logfellow/logstash-logback-encoder

Чтобы включить генерацию СЦЛ в секции logging файлa настроек application.yaml установите значения true.

2.2.12.1.2. Установка и настройка Vector

Установка производится по официальной документации: https://vector.dev/docs/setup/installation/

Пример настройки source:

json_source:
    type: fluent
    address: 0.0.0.0:24226

Пример фильтрации сообщений, имеющих флаг scl:

scl_tags_filter:
type: filter
inputs:
  - json_source
condition:
  type: "vrl"
  source: |-
    exists(.tags) && includes(array!(.tags), "TYPE_SCL")

Пример парсинга scl-сообщений:

scl_message_remap:
    type: remap
    inputs:
    - scl_tags_filter
    source: |-
    . = parse_json!(.message)

Пример отправки scl-сообщений в Kafka:

podd_agent_sink:
    type: kafka
    inputs:
      - scl_message_remap
    bootstrap_servers: kafka:9092
    topic: "<префикс>.scl.signal"
    acknowledgements: true
    compression: "gzip"
    encoding:
      codec: json
    healthcheck: true
2.2.12.1.3. Установка и настройка HaProxy

Установка производится по официальной документации: http://docs.haproxy.org/

Для настройки HaProxy в секции backend перечислите список установленных инстансов Vector.

Пример файла haproxy.cfg:

global
    log 127.0.0.1 local2

    chroot /var/lib/haproxy
    pidfile /var/run/haproxy.pid
    maxconn 4000
    user haproxy
    group haproxy
    daemon

    stats socket /var/lib/haproxy/stats

defaults
    mode tcp
    log global
    retries 3

    maxconn 3000

listen stats
    bind                 0.0.0.0:1936
    mode                 http
    stats                enable
    stats                uri /

frontend services
    bind 0.0.0.0:24226
    default_backend services
    mode tcp

backend services
    balance roundrobin
    mode tcp
    server vector01 vector-01:24226
    server vector02 vector-02:24226
2.2.12.1.4. Установка и настройка Fluent bit

Установка производится по официальной документации: (https://docs.fluentbit.io/manual/installation/getting-started-with-fluent-bit).

Fluent bit должен быть настроен на чтение файлов логов приложений.

Пример файла конфигурации fluent-bit.conf:

[SERVICE]
    flush        5
    daemon       off
    log_level    info
    parsers_file parsers.conf
[INPUT]
    name tail
    path <путь до лог файла приложения>
    tag *
    parser json
[OUTPUT]
    name forward
    match *
    host haproxy
    port 24226

Пример файла parsers.conf:

[PARSER]
    Name        json
    Format      json

На этом настройка fluentbit завершена.

2.2.12.1.5. Работа с БД ClickHouse

В рамках технического решения по хранению протоколируемых запросов и ответов с возможностью извлечение данных по уникальному идентификатору реализовано использование колоночной аналитической базы данных ClickHouse.

Ключевые функциональные особенности базы данных ClickHouse:

  • движок базы данных: по умолчанию ClickHouse использует движок Atomic;

  • движок таблиц: MergeTree;

  • версия ClickHouse: LTS;

  • запрос на создание таблицы хранения логов в ClickHouse: CREATE TABLE.

Пример создания таблицы:

CREATE TABLE {Название БД}.logs
(
   logger String,
   timestamp DateTime,
   level String,
   requestId String,
   message String,
   messageType String,
   customerId String,
   customerOgrn String,
   queryMnemonic String
)
ENGINE = MergeTree()
PARTITION BY timestamp
ORDER BY timestamp
SETTINGS index_granularity = 8192;

Пример задания конфигурационных настроек:

clickhouse_default_config:
clickhouse:
   logger:
      level: trace
      log: /var/log/clickhouse-server/clickhouse-server.log
      errorlog: /var/log/clickhouse-server/clickhouse-server.err.log
      size: 1000M
      count: 10
   http_port: 8123
   tcp_port: 9000
   listen_host: 0.0.0.0
   max_connections: 4096
   keep_alive_timeout: 3
   user_directories:
      users_xml:
      path: users.xml
      local_directory:
      path: "{{ clickhouse_root_data_folder }}/access/"
   path: "{{ clickhouse_root_data_folder | add_slash }}"
2.2.12.1.6. Включение / выключение отправки сообщений в СЦЛ

Отправка логов в СЦЛ осуществляется автоматически после корректной настройки компонента.

Для выключения отправки логов закомментируйте блок отправки сообщений podd_agent_sink в Kafka в настройках Vector.

2.2.13. Настройка Агента СМЭВ4

Порядок установки и описание настроек Агента СМЭВ4 см. в документе: «Руководство администратора СМЭВ4».

Описание формата взаимодействия между Агентом СМЭВ4 и СМЭВ4-адаптером (название топиков, формат сообщений, схема взаимодействия) описан в разделе Спецификация Модуля исполнения запросов.

2.2.13.1. Настройка взаимодействия программы с Агентом СМЭВ4

После установки программы и Агента СМЭВ4 настройте их взаимодействие между собой. Для этого:

  1. Настройте Агента СМЭВ4 и СМЭВ4-адаптер на работу с одним и тем же брокером сообщения Kafka:

  • Если вместе с Агентом СМЭВ4 устанавливается брокер сообщений Kafka, а Агент СМЭВ4 преднастроен на работу именно с этим экземпляром брокера сообщений, то укажите адрес этого брокера сообщений в конфигурационном файле СМЭВ4-адаптера (application.yml), параметр kafkaUrl.

  • Если вместе с Агентом СМЭВ4 не устанавливается брокер сообщений Kafka, то в Агенте СМЭВ4 согласно его документации настройте работу с брокером сообщений Kafka, установленным с программой. Для этого используйте адрес сервера Kafka из конфигурационного файла СМЭВ4-адаптера (application.yml), параметр kafkaUrl.

  1. Настройте названия топиков (см. Таблица 2.14) для обмена сообщениями в конфигурационном файле СМЭВ4-адаптера (application.yml).

Таблица 2.14 Название топиков для обмена сообщениями между СМЭВ4-адаптером и Агентом СМЭВ4

Назначение

Настройка

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

1

Получение запросов

client.kafka.query.consumer.rqTopicName

query.rq

2

Ответы на запросы

client.kafka.query.producer.rsTopicName

query.rs

3

Ошибки запросов

client.kafka.query.producer.errTopicName

query.err

4

Результат запроса оценки

client.kafka.query.estimateTopicName

query.query.estimation.rs

Формат обмена электронными сообщениями с СМЭВ4-адаптером описан в разделе Спецификация Модуля исполнения запросов.

2.3. Настройка сервиса мониторинга

Для мониторинга состояния работы Типового ПО «Витрина данных» используется связка Grafana + Prometheus.

Prometheus — система мониторинга, обладающая возможностями тонкой настройки метрик. Prometheus используется для отслеживания состояния работы компонентов системы на низком уровне.

Grafana — инструмент с открытым исходным кодом для визуализации данных из различных систем сбора статистики. Grafana используется для представления в графическом виде временных рядов и текстовых данных.

Примечание

Описание установки системы мониторинга приведено в разделе Установка системы мониторинга документа «Руководство по установке Типового ПО «Витрина данных»».

2.3.1. Предоставление источника данных

Существует два способа предоставления источника данных:

  • с помощью конфигурационного файла;

  • с помощью интерфейса Grafana.

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

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

Ниже приведен пример настройки источника данных TestData , который можно использовать для информационных панелей.

  1. В директории provisioning/datasources/ создайте файл dtm.yml со следующим содержимым:

apiVersion: 1

datasources:
  - name: Prometheus
    type: prometheus
    access: proxy
    url: <ip:port>
    jsonData:
      httpMethod: POST
      manageAlerts: false
      prometheusType: Prometheus
  1. Перезапустите Grafana, чтобы загрузить новые изменения.

  2. На боковой панели наведите курсор на значок « Конфигурация» (шестеренка) и нажмите «Источники данных». TestData появится в списке источников данных.

    Примечание

    Папка provisioning/datasources/ находится в /etc/grafana/.

Для работы Prometheus с Grafana необходимо добавить Prometheus в качестве источника получения данных в Grafana.

  1. Откройте Grafana — Configuration — Data sources, нажмите Add data source и выберите Prometheus.

Выбор Prometheus в качестве источника получения данных

Рисунок - 2.9 Выбор Prometheus в качестве источника получения данных

  1. В поле URL введите адрес и порт, по которому доступен Prometheus.

Ввод URL Prometheus

Рисунок - 2.10 Ввод URL Prometheus

  1. Внизу страницы нажмите кнопку Save & test

Применение настроек

Рисунок - 2.11 Применение настроек

После успешной проверки Prometheus будет добавлен в Grafana.

2.3.2. Предоставление информационной панели

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

  • с помощью конфигурационного файла;

  • с помощью интерфейса Grafana.

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

Поставщик информационной панели сообщает Grafana, где найти и где разместить определения информационной панели.

Grafana регулярно проверяет изменения в определениях панели мониторинга (по умолчанию каждые 10 секунд).

В директории provisioning/dashboards/ создайте файл dtm.yml со следующим содержимым:

apiVersion: 1

providers:
  - name: 'DTM Metrics' # Уникальное идентифицируемое имя поставщика
     folder: 'dtm-metrics' # Папка, в которую помещаются дашборды
     type: file
     disableDeletion: false
     updateIntervalSeconds: 10
     allowUiUpdates: false
     options:
       path: <path to dashboard definitions>
       foldersFromFilesStructure: false

Примечание

Папка provisioning/dashboards/ находится в /etc/grafana/.

  1. Нажмите на иконку + и выберите «Import dashboard».

Меню импорта Панели

Рисунок - 2.12 Меню импорта Панели

  1. В открывшемся окне нажмите на плашку «Upload dashboard JSON file» и загрузите файл нужной панели.

Загрузка файла панели

Рисунок - 2.13 Загрузка файла панели

2.3.2.1. Настройка конфигурационного файла Prometheus

Пример конфигурационного файла prometheus.yml:

global:
  scrape_timeout:      5s
  scrape_interval:     5s

scrape_configs:
  - job_name: 'smevql-server'
    static_configs:
      - targets: ['ip:8080']

  - job_name: 'blob-adapter'
    static_configs:
      # изменить стандартный порт в application.yml сервиса на кастомный, так как он совпадает с другими сервисами
      - targets: ['ip:9837']

  - job_name: 'counter-provider'
    static_configs:
      # изменить стандартный порт в application.yml сервиса на кастомный, так как он совпадает с другими сервисами
      - targets: ['ip:9837']

  - job_name: 'csv-uploader'
    static_configs:
      # изменить стандартный порт в application.yml сервиса на кастомный, так как он совпадает с другими сервисами
      - targets: ['ip:9837']

  - job_name: 'data-uploader'
    static_configs:
      # изменить стандартный порт в application.yml сервиса на кастомный, так как он совпадает с другими сервисами
      - targets: ['ip:9837']

  - job_name: 'podd-adapter-group-repl'
    static_configs:
      # изменить стандартный порт в application.yml сервиса на кастомный, так как он совпадает с другими сервисами
      - targets: ['ip:9837']

  - job_name: 'podd-adapter-group-tp'
    static_configs:
      # изменить стандартный порт в application.yml сервиса на кастомный, так как он совпадает с другими сервисами
      - targets: ['ip:9843']

  - job_name: 'podd-adapter-import-tp'
    static_configs:
      - targets: ['ip:19843']

  - job_name: 'podd-adapter-mppr'
    static_configs:
      # изменить стандартный порт в application.yml сервиса на кастомный, так как он совпадает с другими сервисами
      - targets: ['ip:9843']

  - job_name: 'podd-adapter-mppw'
    static_configs:
      # изменить стандартный порт в application.yml сервиса на кастомный, так как он совпадает с другими сервисами
      - targets: ['ip:9843']

  - job_name: 'podd-adapter-query'
    static_configs:
      # изменить стандартный порт в application.yml сервиса на кастомный, так как он совпадает с другими сервисами
      - targets: ['ip:9837']

  - job_name: 'podd-adapter-replicator'
    static_configs:
      # изменить стандартный порт в application.yml сервиса на кастомный, так как он совпадает с другими сервисами
      - targets: ['ip:9837']

  - job_name: 'podd-avro-defragmentator'
    static_configs:
      # изменить стандартный порт в application.yml сервиса на кастомный, так как он совпадает с другими сервисами
      - targets: ['ip:9837']

  - job_name: 'printable-form-service'
    static_configs:
      # изменить стандартный порт в application.yml сервиса на кастомный, так как он совпадает с другими сервисами
      - targets: ['ip:9837']

  - job_name: 'rest-uploader'
    static_configs:
      # изменить стандартный порт в application.yml сервиса на кастомный, так как он совпадает с другими сервисами
      - targets: ['ip:9837']

  - job_name: 'smev3-adapter'
    static_configs:
      # изменить стандартный порт в application.yml сервиса на кастомный, так как он совпадает с другими сервисами
      - targets: ['ip:9033']

2.3.2.2. Health check

В данной концепции приведены health check по СМЭВ3, ПОДД, REST, BLOB и печатным формам. Health check по ETL реализуется штатными способами Spark, Airflow, Hadoop, Tarantool, так же как и health check по Kafka и Zookeeper.

Каждый сервис, из перечисленных выше, дорабатывается таким образом, чтобы возвращать информацию liveness и readiness в виде метрик Prometheus. Дополнительно, по каждому сервису реализуется соответствующие REST запросы: ../api/v1/liveness и ..api/v1/readiness, показывающим liveness и readyness проверки соответственно. Обращение к каждому конкретному сервису из представленных ниже по REST, обусловлено передачей хоста и порта в URL, соответствующих сервису согласно схеме развертывания.

liveness возвращает информацию о работоспособности сервиса.

readiness сообщает о готовности сервиса к работе.

Готовность сервиса к работе характеризуется доступностью окружающих его сервисов, с которыми ведется прямое взаимодействие.

Когда liveness проверка не проходит, то это сигнализирует о том что сервис мертв и должен быть как минимум перезагружен.

Когда readiness проверка не проходит, то это говорит о том, что проверяемый сервис не готов к принятию входящего сетевого трафика.

В будущем это приложение может прийти в готовность, но сейчас оно не должно принимать трафик.

Liveness и readiness проверки проходят успешно только в том случае, если все входящие в них проверки (свои для каждого сервиса) прошли успешно.

Внимание

Для управления всеми типами health check наружу выставляются рычаги/конфиги, позволяющие включать/отключать проверки а также устанавливать частоту вызова и таймауты по каждой проверке. Readiness и Liveness проверки проходят в realtime. Таймауты для данных проверок должны быть выставлены с учетом того, что проверка сможет пройти в данный срок.

Liveness

Для liveness проверок вертиклов принимается следующее ограничение:

Если, например, для работы вертикла требуется Kafka, и она в данный момент времени недоступна - то, при условии что вертикл задеплоен, проверка liveness вернет положительный ответ. Отловить подобную ситуацию можно будет только на проверке Readiness.

2.3.2.2.1. BLOB-Adapter

Liveness

Проверяется состояние вертиклов. В рамках проверки осуществляется корректность деплоя вертиклов. Берется список всех вертиклов по сервису, и выполняется проверка, что они есть в списке задеплоеных вертиклов. В случае если все вертиклы задеплоены - проверка проходит успешно.

Readiness

Хранилище (внешнее или внутренне). Получение адреса хранилища. Проверка, существует ли хранилище по конкретному адресу. Порт доступен, открыт и доступен для подключения.

2.3.2.2.2. Сервис печатных форм

Liveness

Проверяется состояние вертиклов. В рамках проверки осуществляется корректность деплоя вертиклов. Берется список всех вертиклов по сервису, и выполняется проверка, что они есть в списке задеплоеных вертиклов. В случае если все вертиклы задеплоены - проверка проходит успешно.

Readiness

  • ProStore: получения адреса, подключение по JDBC и проверка выполнения запроса «CHECK_VERSIONS()».

  • Kafka агента ПОДД: получение строк подключения. Проверка, что Kafka существует по конкретному адресу, порт доступен, открыт и доступен для подключения.

2.3.2.2.3. СМЭВ3 адаптер

Liveness

Проверяется состояние вертиклов. В рамках проверки осуществляется корректность деплоя вертиклов. Берется список всех вертиклов по сервису, и выполняется проверка, что они есть в списке задеплоеных вертиклов. В случае если все вертиклы задеплоены - проверка проходит успешно.

Readiness

  • ProStore: получения адреса, подключение по JDBC и проверка выполнения запроса «CHECK_VERSIONS()».

  • VipNet SignerCP: Если в файле конфигурации указан доступ к VipNet, то по указанной строке подключения проверяется доступность VipNet.

  • Postgress: Получения строки подключения, подключение по JDBC и проверка выполнения запроса «select 1».

  • СМЭВ3: Проверить telnet порт СМЭВ3 на доступность командой

Опционально, проверить зафиксированные результаты обращений вертикла ресивера в СМЭВ3.