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

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

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

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

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

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

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

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

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

Файл application.yml – основной конфигурационный файл, в котором задана логика и порядок работы Сервиса исполнения запросов (query-execution). Для первоначальной установки используйте значения «по умолчанию».

Пример файла application.yml со всеми конфигурируемыми атрибутами, приведен ниже:

logging:
  level:
    io.arenadata.dtm.query.execution: ${WRITER_LOG_LEVEL:INFO}
    org.apache.kafka.clients: ERROR

management:
  server:
    port: ${DTM_METRICS_PORT:8080}
  endpoints:
    enabled-by-default: true
    web:
      exposure:
        include: info, health, requests

core:
  plugins:
    active: ${CORE_PLUGINS_ACTIVE:ADG, ADB, ADQM, ADP}

  http:
    port: ${DTM_CORE_HTTP_PORT:9090}
    tcpNoDelay: ${DTM_CORE_HTTP_TCP_NO_DELAY:true}
    tcpFastOpen: ${DTM_CORE_HTTP_TCP_FAST_OPEN:true}
    tcpQuickAck: ${DTM_CORE_HTTP_TCP_QUICK_ACK:true}

  env:
    name: ${DTM_NAME:test}

  settings:
    timeZone: ${CORE_TIME_ZONE:UTC}

  metrics:
    isEnabled: ${DTM_CORE_METRICS_ENABLED:true}

  datasource:
    edml:
      sourceType: ${EDML_DATASOURCE:ADG}
      defaultChunkSize: ${EDML_DEFAULT_CHUNK_SIZE:1000}
      pluginStatusCheckPeriodMs: ${EDML_STATUS_CHECK_PERIOD_MS:3000}
      firstOffsetTimeoutMs: ${EDML_FIRST_OFFSET_TIMEOUT_MS:15000}
      changeOffsetTimeoutMs: ${EDML_CHANGE_OFFSET_TIMEOUT_MS:10000}
    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:/adtm}

  kafka:
    producer:
      property:
        key.serializer: org.apache.kafka.common.serialization.StringSerializer
        value.serializer: org.apache.kafka.common.serialization.StringSerializer
    cluster:
      zookeeper:
        connection-string: ${ZOOKEEPER_KAFKA_ADDRESS:localhost}
        connection-timeout-ms: ${ZOOKEEPER_KAFKA_CONNECTION_TIMEOUT_MS:30000}
        session-timeout-ms: ${ZOOKEEPER_KAFKA_SESSION_TIMEOUT_MS:86400000}
        chroot: ${ZOOKEEPER_KAFKA_CHROOT:}
    admin:
      inputStreamTimeoutMs: ${KAFKA_INPUT_STREAM_TIMEOUT_MS:2000}
    status.event.publish:
      enabled: true
      topic: status.event
    statusMonitorUrl: ${STATUS_MONITOR_URL:http://localhost:9095/status}

  cache:
    initialCapacity: ${CACHE_INITIAL_CAPACITY:100000}
    maximumSize: ${CACHE_MAXIMUM_SIZE:100000}
    expireAfterAccessMinutes: ${CACHE_EXPIRE_AFTER_ACCESS_MINUTES:99960}

adb:
  datasource:
    user: ${ADB_USERNAME:gpadmin}
    password: ${ADB_PASS:gpadmin}
    host: ${ADB_HOST:localhost}
    port: ${ADB_PORT:5432}
    maxSize: 20
    fetchSize: ${ADB_FETCH_SIZE:1000}

  mppw:
    consumerGroup: ${ADB_LOAD_GROUP:adb-emulator-load-adb}
    poolSize: ${ADB_MPPW_POOL_SIZE:2}
    stopTimeoutMs: ${ADB_MPPW_STOP_TIMEOUT_MS:86400000}
    defaultMessageLimit: ${ADB_MPPW_DEFAULT_MESSAGE_LIMIT:100}
    fdwTimeoutMs: ${ADB_MPPW_FDW_TIMEOUT_MS:1000}

adg:
  tarantool:
    db:
      host: ${TARANTOOL_DB_HOST:localhost}
      port: ${TARANTOOL_DB_PORT:3301}
      user: ${TARANTOOL_DB_USER:admin}
      password: ${TARANTOOL_DB_PASS:memstorage-cluster-cookie}
      operationTimeout: ${TARANTOOL_DB_OPER_TIMEOUT:60000}
      engine: ${TARANTOOL_DEFAULT_ENGINE:MEMTX}
    cartridge:
      url: ${TARANTOOL_CATRIDGE_URL:http://localhost:8081}

  mppw:
    consumerGroup: ${ADG_CONSUMER_GROUP:tarantool-group-csv}
    kafka:
      maxNumberOfMessagesPerPartition: 200
      callbackFunctionSecIdle: 100

  rollback:
    eraseOperationBatchSize: 300

  circuitbreaker:
    maxFailures: 5
    timeout: 30000
    fallbackOnFailure: false
    resetTimeout: 10000

  web-client:
    max-pool-size: ${ADG_WEB_CLIENT_MAX_POOL_SIZE:100}

adqm:
  datasource:
    database: ${ADQM_DB_NAME:test1}
    user: ${ADQM_USERNAME:default}
    password: ${ADQM_PASS:}
    hosts: ${ADQM_HOSTS:localhost:8123}
    socketTimeout: ${ADQM_SOCKET_TIMEOUT:30000}
    dataTransferTimeout: ${ADQM_DATA_TRANSFER_TIMEOUT:10000}

  ddl:
    cluster: ${ADQM_CLUSTER:cluster}
    ttlSec: ${ADQM_TTL_SEC:3600}
    archiveDisk: ${ADQM_ARCHIVE_DISK:default}

  mppr:
    host: ${ADQM_MPPR_CONNECTOR_HOST:localhost}
    port: ${ADQM_MPPR_CONNECTOR_PORT:8086}
    url: ${ADQM_MPPR_CONNECTOR_URL:/query}

  mppw:
    consumerGroup: ${ADQM_CONSUMER_GROUP:adqm}
    kafkaBrokers: ${ADQM_BROKERS:localhost:9092}
    loadType: ${ADQM_MPPW_LOAD_TYPE:REST}
    restStartLoadUrl: ${ADQM_REST_START_LOAD_URL:http://localhost:8090/newdata/start}
    restStopLoadUrl: ${ADQM_REST_STOP_LOAD_URL:http://localhost:8090/newdata/stop}
    restLoadConsumerGroup: ${ADQM_REST_LOAD_GROUP:adb-emulator-load-adqm}

  web-client:
    max-pool-size: ${ADQM_WEB_CLIENT_MAX_POOL_SIZE:100}
  1. Настройка ProStore:

  • DTM_CORE_PLUGINS_ANALYTICAL - настройка профилей приоритетности СУБД для запросов аналитики;

  • DTM_CORE_PLUGINS_DICTIONARY - настройка профилей приоритетности СУБД для запросов ключ-значение;

  • DTM_CORE_PLUGINS_UNDEFINED - настройка профилей приоритетности СУБД для не указанной категории запросов;

  • DTM_CORE_HTTP_PORT - номер порта, на который Сервис исполнения запросов ожидает входящие запросы от JDBC-драйвера;

  • DTM_NAME - имя среды для формирования полного наименования датамартов;

  • CORE_TIME_ZONE - настройки временной зоны;

  • DTM_CORE_METRICS_ENABLED - настройки генерации метрики Сервиса исполнения запросов;

  • DTM_CORE_TASK_POOL_SIZE - максимальный объем пула задач в Cервисе исполнения запросов;

  • DTM_CORE_TASK_TIMEOUT - интервал времени завершения задачи, выполняемой в Сервисе исполнения запросов.

  1. Оптимизация работы сокета TCP_NODELAY:

  • DTM_CORE_HTTP_TCP_NODELAY - настройка режима оптимизации работы сокета TCP_NODELAY;

  • DTM_CORE_HTTP_TCP_FAST_OPEN - настройка режима TCP FAST_OPEN;

  • DTM_CORE_HTTP_TCP_QUICK_ACK - настройка режима оптимизации работы сокета TCP_QUICKACK.

  1. Настройки для EDML операторов:

  • EDML_DATASOURCE - тип СУБД-источника;

  • EDML_DEFAULT_CHUNK_SIZE – размер chunk по умолчанию;

  • EDML_STATUS_CHECK_PERIOD_MS - период проверки статуса плагина в миллисекундах;

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

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

  1. Настройка Zookeeper-серверов:

  • ZOOKEEPER_DS_ADDRESS - сетевой адрес хоста Zookeeper для служебной БД;

  • ZOOKEEPER_DS_CONNECTION_TIMEOUT_MS - интервал времени ожидания (в миллисекундах) соединения с хостом Zookeeper для служебной БД до достижения таймаута;

  • ZOOKEEPER_DS_SESSION_TIMEOUT_MS - интервал времени бездействия (в миллисекундах) соединения с хостом Zookeeper для служебной БД до достижения таймаута;

  • ZOOKEEPER_DS_CHROOT - корневой путь к хосту Zookeeper для служебной БД;

  • ZOOKEEPER_KAFKA_ADDRESS - сетевой адрес хоста Zookeeper для брокера сообщений Kafka;

  • ZOOKEEPER_KAFKA_CONNECTION_TIMEOUT_MS - интервал времени ожидания (в миллисекундах) соединения с хостом Zookeeper для брокера сообщений Kafka до достижения таймаута;

  • ZOOKEEPER_KAFKA_SESSION_TIMEOUT_MS - интервал времени бездействия (в миллисекундах) соединения с хостом Zookeeper для брокера сообщений Kafka до достижения таймаута;

  • ZOOKEEPER_KAFKA_CHROOT - корневой путь к хосту Zookeeper для брокера сообщений Kafka.

  1. Настройка Kafka-серверов:

  • KAFKA_INPUT_STREAM_TIMEOUT_MS – интервал времени ожидания (в миллисекундах) входного потока данных для брокера сообщений Kafka до достижения таймаута;

  • KAFKA_STATUS_EVENT_ENABLED - разрешение на публикацию событий;

  • KAFKA_STATUS_EVENT_TOPIC - наименование топика Kafka, в который публикуются события;

  • STATUS_MONITOR_URL - сетевой адрес, порт и путь к Сервису мониторинга статусов Kafka.

  1. Настройки кэширования запросов:

  • CACHE_INITIAL_CAPACITY - первоначальный размер кэша;

  • CACHE_MAXIMUM_SIZE - максимальный размер кэша;

  • CACHE_EXPIRE_AFTER_ACCESS_MINUTES - время (в минутах) устаревания кэша после последнего обращения к нему.

2.2.1.2. Настройка Сервиса мониторинга Kafka (status-monitor)

Настройка Сервиса мониторинга статусов Kafka осуществляется путём указания в соответствующем конфигурационном yml-файле параметров отслеживания файлов-топиков брокера сообщений Kafka, таких как:

  • смещение consumer;

  • содержание последнего сообщения;

  • время появления последнего сообщения.

Ниже, представлен пример application.yml для status-monitor с конфигурируемыми атрибутами.

2.2.1.2.1. Пример файла application.yml для status-monitor
monitor:
  brokersList: ${STATUS_MONITOR_BROKERS:localhost:9092}
  consumersCount: ${STATUS_MONITOR_CONSUMERS:8}
  prometheus:
    enabled: ${PROMETHEUS_ENABLED:true}

где,

  • STATUS_MONITOR_BROKERS - сетевые адреса и порты брокеров сообщений Kafka, которые отслеживает Сервис мониторинга статусов Kafka.

  • STATUS_MONITOR_CONSUMERS - количество потребителей (consumer) Сервиса мониторинга статусов Kafka.

2.2.1.3. Настройка kafka-clickhouse-reader

kafka-clickhouse-reader - поддерживает часть функций процесса MPPR (чтение данных из Clickhouse и запись в Kafka).

Настройка kafka-clickhouse-reader осуществляется путём редактирования файла application.yml, в котором задана логика и порядок работы компонента.

2.2.1.3.1. Пример файла application.yml для kafka-clickhouse-reader
vertx:
  clustered:true

logging:
  level:
    io.arenadata.kafka.clickhouse.reader: ${LOG_LEVEL:DEBUG}

verticle:
  worker:
    task-worker:
      poolSize: ${TASK_WORKER_POOL_SIZE:12}
      poolName: ${TASK_WORKER_POOL_NAME:task-worker}
      responseTimeoutMs: ${TASK_WORKER_RESPONSE_TIMEOUT_MS:86400000}

http:
  port: ${SERVER_PORT:8086}

datasource:
  clickhouse:
    database: ${CLICKHOUSE_DB_NAME:test1}
    user: ${CLICKHOUSE_USERNAME:default}
    password: ${CLICKHOUSE_PASS:}
    hosts: ${CLICKHOUSE_HOSTS:clickhouse.host:8123}
    fetchSize: ${CLICKHOUSE_FETCH_SIZE:1000}

kafka:
  clickhouse:
    producer:
      property:
        key.serializer: org.apache.kafka.common.serialization.ByteArraySerializer
        value.serializer: org.apache.kafka.common.serialization.ByteArraySerializer
    cluster:
      zookeeperHosts: ${ZOOKEEPER_HOSTS:zk-1.dtm.local}
      rootPath: ${KAFKA_CLUSTER_ROOTPATH:arenadata/cluster/21}

где,

  • CLICKHOUSE_DB_NAME – наименование базы данных в ADQM;

  • CLICKHOUSE_HOSTS – имя одно их хостов ADQM;

  • CLICKHOUSE_PASS – пароль пользователя для доступа к ADQM;

  • CLICKHOUSE_USERNAME – имя пользователя для доступа к ADQM;

  • ZOOKEEPER_HOSTS - подключение к Zookeeper ProStore;

  • KAFKA_CLUSTER_ROOTPATH - путь хранения информации о Kafka ProStore в Zookeeper.

2.2.1.4. Настройка kafka-clickhouse-writer

kafka-clickhouse-writer - коннектор, который поддерживает часть функциональности процесса MPP-W (чтение из Kafka и запись данных в базу данных Clickhouse).

Настройка kafka-clickhouse-writer осуществляется путём редактирования файла application.yml, в котором задана логика и порядок работы компонента.

2.2.1.4.1. Пример файла application.yml для kafka-clickhouse-writer
client:
  kafka:
    consumer:
      timeout-checking-period: 1000
      response-timeout: 1000
      property:
        group.id: test_datamart.consumer
        auto.offset.reset: earliest
        enable.auto.commit: false
env:
  name: ${ENV:local}
datamart:
  hot-delta-field-name: sys_from
datasource:
  clickhouse:
    database: ${CLICKHOUSE_DB_NAME:test}
    user: ${CLICKHOUSE_USERNAME:}
    password: ${CLICKHOUSE_PASS:}
    hosts: ${CLICKHOUSE_HOSTS:localhost:8123}
verticle:
  worker:
    new-data-worker:
      poolSize: 20
      pool-name: new-data-worker

logging:
  level:
    io.arenadata.dtm: DEBUG
    org.apache.kafka: INFO

где,

  • CLICKHOUSE_DB_NAME – наименование базы данных в ADQM;

  • CLICKHOUSE_HOSTS – имя одно их хостов ADQM;

  • CLICKHOUSE_PASS – пароль пользователя для доступа к ADQM;

  • CLICKHOUSE_USERNAME – имя пользователя для доступа к ADQM;

  • KAFKA_BOOTSTRAP_SERVERS - подключение к ProStore Kafka.

  • ENV - название окружения.

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

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

СМЭВ QL сервер содержит два конфигурационных файла:

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

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

Состав настроек credentials.yaml:

version: 1.0.0
system:
    mnemonic: smev_ql_mnemonic
    instance: smev_ql_instance

2.2.2.2. Язык и синтаксис

2.2.2.2.1. Моделирование

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

2.2.2.2.2. Запросы и ответы

Для написания запросов, а также в качестве сериализатора ответов, спецификация определяет использование JSON.

2.2.2.3. Типизация

Фактические типы данных наследуют типы данных JSON (включая NULL):

  • string;

  • number;

  • object;

  • array;

  • boolean;

  • null.

2.2.2.3.1. Типы данных в модели и приведение типов

В описании модели допускается указание фактического типа данных атрибута ресурса вторым элементом массива type. Указание является опциональным, по умолчанию подразумевается неограниченный STRING.

Пример из описания модели:

fields:
  id:
    name: Идентификатор записи
    type:
      - number
      - SHORT
    length: 20
    nullable: not NULL
    key: PRIMARY

В качестве второго уточняющего типа следует применять типы НСУД:

  • STRING;

  • DOUBLE;

  • FLOAT;

  • BOOLEAN;

  • BYTE (не поддерживается на витрине);

  • BINARY;

  • BIG_DECIMAL (не поддерживается на витрине);

  • LONG;

  • INTEGER;

  • SHORT;

  • DATE;

  • TIME;

  • TIMESTAMP.

2.2.2.4. Моделирование данных

Модели данных описываются в формате YAML в папке проекта models согласно спецификации СМЭВ QL.

2.2.2.4.1. Структура базовой модели

Базовая модель должна ставиться впереди общего файла моделей, так как от ее алиасов наследуется элементы пользовательских моделей. Описание базовой модели данных в формате YAML имеет следующую структуру:

default_string: &ds
name: Строка
type:
    - string
    - STRING
length: 0
nullable: NULL
key: NONE
source: NONE

default_number: &dn
name: Число
type:
    - integer
    - INTEGER
length: 0
nullable: NULL
key: NONE
source: NONE

primary_key: &pk
name: Ключ
type:
    - string
    - STRING
length: 0
nullable: NULL
key: PRIMAY
source: NONE

base_model: &base_model
default_fields: &default_fields
2.2.2.4.2. Структура модели данных

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

Первый блок модели определяет ее мета-данные и атрибутивный состав.

Мета-данные и поля модели

resources:
# slots — техническое название модели, по нему производятся все связи
- slots: *base_model
# значение name — название модели на русском языке
    name: Слоты
# fields — список полей модели
    fields:
# список полей может включать перечень полей из default_fields
    <<: *default_fields
# поля по-умолчанию наследуются от ds (default_string) из базовой модели
    id: *ds
    resource_id: *ds
# у поля может быть переопределен source (по-умолчанию у каждого поля источник всей модели)
    type: *ds
        source:
        field: tag_type
    age: *ds
        source:
        field: tag_age
    visitTime: *ds
    duration: *ds
    status: *ds
    create_ts: *ds
    update_ts: *ds
    update_ts: *ds

Второй блок модели описывает связи моделей друг с другом через ключи primary_key и foreign_key.

Ключи могут быть составными (описывается массивом), ключи не обязательно должны быть ключами из БД.

Связи имеют два типа:

  1. belongs_to

  2. has_many (один ко многим)

Связи модели

# Блок connections описывает связи модели (по названию) через явно указываемых два ключа
    connections:
    belongs_to:
        - resource:
            primary_key: [ id ]
            foreign_key: [ resource_id ]
    has_many:
        - book:
            primary_key: [ id ]
            foreign_key: [ slot_id ]
        - unaccessible_period:
            primary_key: [ resource_id, type ]
            foreign_key: [ resource_id, type ]

Блок ограничений и разрешений использования условий поиска.

Связи модели

# Блок conditions описывает ограничения и разрешения на использование условий поиска
    conditions:
    allowed: [id, name] # если заполнено, то поиск разрешен только по этим полям и полям с ключами
    denied: [snils] # если заполнено, то поиск запрещен по этим ключам
    always: # наличие условий в блоке always должно ко всем запросам ресурса добавлять эти условия, если указаны в запросе, то перетирать
        - region: ["=", "77"]
        - blocked: ["=", true]

Блок — extract, описывает названия source из которого нужно извлекать модель и ее таблицу.

Источники модели

extract:
source:
- name: prostore
    table: misdm.slots

Источники по условиям

В блоке c указанием источника в модели допускается указание условий его выбора через блок conditions. Блок conditions содержит массив условий применения источника на основании значений полученных в запросе атрибутов:

extract:
  source:
    - name: prostore1
      table: misdm.slots
      conditions:
        # попадание в промежуток
        - range:
            field: age
            from: 0
            to: 2
        - eq:
            field: color
            not: "blue"
    - name: prostore2
      table: misdm.39slots
      conditions:
        # ограничения по (не)равенству
        - eq:
            field: resource_id
            is: 1
    - name: prostore3
      table: misdm.39slots
      conditions:
        # ограничения по наличию в источнике
        - eq:
            field: snils
            extract:
            source: redis
            table: default_table
            key: resource_hashed_id
            algorithm: md5
            # select count(*) > 0 from offices.offices where resource_hashed_id = ?
            # параметр: md5(snils)
            is: true
    - name: prostore_default
      table: misdm.39slots
      conditions:
        - fallback: true
2.2.2.4.3. Загрузка

Модели данных считываются, валидируются и загружаются в память из папки models при запуске СМЭВ QL сервера.

По-умолчанию используется версия model, на которую ссылается symlink current, при его отсутствии по-умолчанию считается старшая версия.

Примечание

Модели и версии, начинающиеся с подчеркивания (_) НЕ загружаются, они находятся в стадии проектирования.

2.2.2.4.4. Guard-атрибуты

Для ограничения возможности получения некоторых атрибутов без предварительного предоставления их же (или дополнительных) значения, извлекающим необходимо определить атрибуты-ограничители в блоке guard.

Пример:

fields:
    <<: *default_fields
    first_name: *ds
    last_name:
        <<: *ds
        guard: [last_name]
    snils:
        <<: *ds
        guard: [last_name first_name snils]

В примере извлечение first_name не ограничивается. Для получения last_name фамилия должна быть передана в блоке conditions, а для получения snils в conditions должны присутствовать фамилия, имя и сам СНИЛС.

2.2.2.5. Запросы

Запросы к серверу выполняют методом POST и содержат в теле JSON-объект, состоящий из обязательных блоков:

  • Блок Credentials;

  • Блок Query;

Также пространстве методов server находятся методы, помогающие эксплуатации корректно конфигурировать хранилища данных относительно модели СМЭВ QL.

2.2.2.5.1. Блок Credentials
"credentials":{
    "system":{
        "mnemonic":"117bed7f-1c07-4079-a446-1161588db4e5",
        "instance_id":"ccb4a88f-f44b-43e7-8a97-3e45c8345e90",
        "user_id":"5ed38461-0907-486a-930a-7b443482932c"
    },
    "request":{
        "id":"df5a0073-c6be-4d8c-8eb2-9b2f4188a429",
        "sub_id":"0cdb59ce-224b-4118-8da1-c5ea08a5d955",
        "name":"driver_data",
        "purpose_id":"ed1170f1-3caa-4985-aa38-c9c5a190b770",
        "audit":"false",
        "audit_id":"fc1048fe-323d-4eeb-92df-5710b3d1d100",
        "audit_token":"39e47aac-45d2-44c1-8c26-2d9b28b1703b"
    },
    "signature":{
        "digest": null,
        "signature": null
    }
}
2.2.2.5.2. Блок Query
{
    "query": {
        "office": {
            "conditions": {
                "phone": "(347) 246-53-00"
            },
            "attributes": [
                "id",
                "phone",
                "name"
            ],
            "cabinet": {
                "conditions": {
                    "available": true
                },
                "attributes": [
                    "number",
                    "name",
                    "seats"
                ],
                "online_room": {
                    "conditions": {
                        "public": true,
                        "software": "zoom"
                    },
                    "attributes": [
                        "url"
                    ]
                },
                "parking": {
                    "conditions": {
                        "free": true,
                        "available": true
                    },
                    "attributes": [
                        "number",
                        "floor"
                    ]
                }
            }
        }
    }
}
2.2.2.5.2.1. Условия фильтрации Conditions

Объединение условий только по and (MVP)

Операции сравнения (op):

  • = (по умолчанию)

  • >

  • >=

  • <

  • <=

  • in

  • like (на перспективу)

Условия сравнения применимы к численным типам, датам, временам и таймштампам.

Варианты определения условий фильрации:

По равенству

{
    "query": {
        "office": {
            "conditions": {
                "phone": "(347) 246-53-00"
            }
        }
    }
}

На основе сравнения, краткая запись

{
    "query": {
        "office": {
            "conditions": {
                "area": [">","130"]
            }
        }
    }
}

На основе сравнения, полная запись

{
    "query": {
        "office": {
            "conditions": {
                "area": {
                    "op": ">",
                    "value": "130"
                }
            }
        }
    }
}

Комплексное условие

{
    "query": {
        "office": {
            "conditions": {
                "area": [">","130"],
                "floor": ["in", [1, 2]]
            }
        }
    }
}

OR (ИЛИ) в условиях

В conditions СМЭВ QL запроса поддерживается возможность указывать логический ИЛИ через зарезервированное слово or.

В блок or необходимо передать массив объектов, содержащих условия в свою очередь объединённые логическим И (AND).

Все условия, находящиеся на одном уровне с or группируются через логическое И (AND), как при обычном СМЭВ QL Запросе.

Пример:

"conditions": {
"lastname": "П",
"middlename": "И",
"birthdate": "2021-11-29 00:00:00",
"or": [
    {
        "vin": "в1"
    },
    {
        "vin2": "в2",
        "model": "bmw"
    }
],
"fetch": {
    "order": [["id", "ASC"], ["number", "DESC"]], // ASC default
    "page": [2, 10] // limit 10 offset 10
}
}

Условия описанного выше запроса (без учета fetch) соберутся в следующую конструкцию:

...
WHERE
        (lastname = 'П' AND middlename = 'И' AND birthdate = '2021-11-29 00:00:00')
    OR
        (vin ='в1')
    OR
        (vin2='в2' AND model = 'bmw')
...
2.2.2.5.2.2. Сортировка и пагинация

В блоке conditions опционально можно добавить блок fetch, в котором указывать условия сортировки и выбора страниц.

Пример блока:

"conditions": {
"lastname": "П",
"middlename": "И",
"birthdate": "2021-11-29 00:00:00",
"fetch": {
    "order": [["id", "ASC"], ["number", "DESC"]], // ASC default
    "page": [2, 10] // limit 10 offset 10
}
}

Если порядок сортировки не указан, то применяется ASC.

Если не указаны страницы, то по умолчанию всегда устанавливается первая страница с лимитом, равными параметру default блока pagination в файле конфигураций application.yaml.

Если запрашивается элементов на страницу больше, чем значение max, то должно использоваться дефолтное значение.

pagination:
    default: 100 //количество элементов на странице по умолчанию
    max: 1000 //максимальное количество элементов на странице
2.2.2.5.3. Эксплуатационные запросы

В пространстве методов server находятся методы, помогающие эксплуатации корректно конфигурировать хранилища данных относительно модели СМЭВ QL.

Метод возврата списка обязательных для создания индексов: GET server/indexes/required

В ответе должен возвращаться JSON с полями, используемыми в связях моделей (connections) и блоке conditions.allowed моделей, если они определены (conditions)

{
    "server": {
        "mnemonic": "#mnemonic",
        "instance": "#instance"
    },
    "indexes": {
        "connections": [{
                "source": "#source_name2",
                "table": "#table_name2",
                "fields": ["#field_name1", "#field_name2"]
            },
            {
                "source": "#source_name2",
                "table": "#table_name2",
                "fields": ["#field_name1", "#field_name2"]
            }
        ],
        "conditions": [{
                "source": "#source_name2",
                "table": "#table_name2",
                "fields": ["#field_name1", "#field_name2"]
            },
            {
                "source": "#source_name2",
                "table": "#table_name2",
                "fields": ["#field_name1", "#field_name2"]
            }
        ]
    }
}

2.2.2.6. Обработка запросов

2.2.2.6.1. Логирование мета-данных

У каждого запроса логируются данные из блока credentials в info и выше.

Формат строчки лога:

{
    "level": "info",
    "time": "2000-01-01T01:01:01.111Z",
    "name": "#{smevql_server_name}.request",
    "system": {
        "mnemonic": "117bed7f-1c07-4079-a446-1161588db4e5",
        "instance_id": "ccb4a88f-f44b-43e7-8a97-3e45c8345e90",
        "user_id": "5ed38461-0907-486a-930a-7b443482932c"
    },
    "request": {
        "id": "df5a0073-c6be-4d8c-8eb2-9b2f4188a429",
        "sub_id": "0cdb59ce-224b-4118-8da1-c5ea08a5d955",
        "name": "driver_data",
        "purpose_id": "ed1170f1-3caa-4985-aa38-c9c5a190b770",
        "audit": "false",
        "audit_id": "fc1048fe-323d-4eeb-92df-5710b3d1d100",
        "audit_token": "39e47aac-45d2-44c1-8c26-2d9b28b1703b"
    }
}

Для каждого входящего запроса логируется каждый отправленный запрос к источнику:

{
    "level": "info",
    "time": "2000-01-01T01:01:01.111Z",
    "name": "#{smevql_server_name}.request",
    "system": {
        "mnemonic": "117bed7f-1c07-4079-a446-1161588db4e5",
        "instance_id": "ccb4a88f-f44b-43e7-8a97-3e45c8345e90",
        "user_id": "5ed38461-0907-486a-930a-7b443482932c"
    },
    "request": {
        "id": "df5a0073-c6be-4d8c-8eb2-9b2f4188a429",
        "sub_id": "0cdb59ce-224b-4118-8da1-c5ea08a5d955",
        "name": "driver_data",
        "purpose_id": "ed1170f1-3caa-4985-aa38-c9c5a190b770",
        "audit": "false",
        "audit_id": "fc1048fe-323d-4eeb-92df-5710b3d1d100",
        "audit_token": "39e47aac-45d2-44c1-8c26-2d9b28b1703b"
    },
    "source_request": {
        "id": "1cdb59ce-224b-4118-8da1-c5ea08a5d955",
        "source": "#{source_name}"
    }
}

Передача идентификаторов:

  1. source_request.id передается в queryId тела запроса в Простор.

  2. В x-request-id передается склейка {request.id};{request.sub_id};{source_request.id}

Логирование ответа

{
    "level": "info",
    "time": "2000-01-01T01:01:01.111Z",
    "name": "#{smevql_server_name}.response",
    "system": {
        "mnemonic": "117bed7f-1c07-4079-a446-1161588db4e5",
        "instance_id": "ccb4a88f-f44b-43e7-8a97-3e45c8345e90",
        "user_id": "5ed38461-0907-486a-930a-7b443482932c"
    },
    "request": {
        "id": "df5a0073-c6be-4d8c-8eb2-9b2f4188a429",
        "sub_id": "0cdb59ce-224b-4118-8da1-c5ea08a5d955",
        "name": "driver_data",
        "purpose_id": "ed1170f1-3caa-4985-aa38-c9c5a190b770",
        "audit": "false",
        "audit_id": "fc1048fe-323d-4eeb-92df-5710b3d1d100",
        "audit_token": "39e47aac-45d2-44c1-8c26-2d9b28b1703b"
    },
    "source_request": {
        "id": "1cdb59ce-224b-4118-8da1-c5ea08a5d955",
        "source": "#{source_name}"
    },
    "response": {
        "duration": "1ms",
        "code": 200,
        "result": "ok"
    }
}
2.2.2.6.2. Построение плана

Входные данные:

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

  • запрос поступивший к серверу.

Необходимо определить набор запросов и порядок их исполнения SMQEVQL сервером, обеспечить параллельное исполнение независимых запросов.

Вид плана запроса:

plan:
level: 1
    - source: prostore1
    query: SELECT id, phone, name FROM office WHERE phone = '(347) 246-53-00';
    pk: id
    alias: offices
level: 2
    - source: prostore2
    query: SELECT id, number, name, seats FROM cabinet WHERE office_id in (@offices) AND available = 'true';
    pk: id
    alias: cabinets
    - source: prostore1
    query: SELECT id, number, floor FROM parking WHERE office_id in (@offices) free = 'true' AND available = 'true';
    pk: number, flor
    alias: parkings
level: 3
    - source: vostok7
    query: SELECT url FROM online_room WHERE cabinet_id in (@cabinets) AND public = 'true' AND software = 'zoom';
    pk: null
    alias: online_rooms

Сначала параллельно выполняются запросы первого уровня, затем запрос второго уровня на основе данных полученных на первом уровне.

Фомирование плана запроса основывается на внешнем объединении данных в сторону основной сущности.

Порядок формирования плана запроса:

  • на основе query определяется основная запрашиваемая сущность;

  • на основе query определяются вспомогательные сущности;

  • на основе query определяются conditions к основной сущности;

  • на основе query определяются conditions к вспомогательным сущностям;

  • на первом уровне плана формируется запрос к основной сущности на основе: - запрошенных атрибутов; - данных модели; - условий фильтрации.

Отмечаются поля, составляющие PK.

Первичные ключи, даже отсутствующие в атрибутах запроса к серверу должны быть в запросе к источнику.

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

Первичные ключи, даже отсутствующие в атрибутах запроса к серверу должны быть в запросе к источнику, за исключением терминальных запросов.

План запроса

План запроса соответсвует иерархии построенной от основной сущности на основе связей (modelconnections).

Граф план

2.2.2.7. Ответы

Ответы СМЭВ QL сервера представляют из себя объект JSON, схема которого определяется составом запроса.

Например для запроса:

{
"query":{
    "people":{
        "conditions":{
            "age":"<35"
        },
        "attributes":[
            "name",
            "phone",
            "vsu_code"
        ],
        "military_office":{
            "attributes":[
            "address"
            ]
        }
    }
},
"credentials":{

}
}

Ответ будет следующим:

{
"response":{
    "people":[
        {
            "name":"Иван",
            "phone":"+79011001010",
            "vsu_code":"1025",
            "military_office":[
            {
                "address":"г.Москва, ул.Угрешко"
            }
            ]
        },
        {
            "name":"Пётр",
            "phone":"+79022002020",
            "vsu_code":"1026",
            "military_office":[
            {
                "address":"г.Москва, Хилков переулок"
            }
            ]
        }
    ]
},
"credentials":{

}
}

2.2.2.8. Стейт-машина СМЭВ QL

СМЭВ QL содержит встроенную машину состояний для изменения объектов модели внутри витрин данных. Одновременно с этим Стейт машина может, в качестве подтверждения перехода состояния, использовать внешний источник (например ИС Электронной очереди).

Карта состояний и переходов описывается в виде YAML-файла state.yaml располагаемого в папке states/<имя-модели>/<х.х версия модели> инстанса СМЭВ QL Сервера.

Описание формата и правил карты состояний:

model: slot # имя модели
states: # массив состояний объекта
- state: available # название состояния available
    attributes: # массив атрибутов, описывающих состояние
    - name: status # состояние определятся значением атрибута status
        value: AVAILABLE # значение атрибута для описываемого состояния
    initial: true
- state: booked
    attributes:
    - name: status
        value: RECORDED
- state: reserved
    attributes:
    - name: status
        value: RESERVED
- state: cancelled
    attributes:
    - name: status
        value: CANCELED
- state: blocked
    attributes:
    - name: status
        value: BLOCKED
events: # список событий изменения состояний, из них создаются методы API
- event: book # создает метод POST /states/slot/book
    from: # массив состояний из которых возможен вызов события
    - available
    - reserved
    to: booked # в какое состояние переводится объект после события
    hooks: # массив связанных событий
    - model: book # после перевода надо вызвать событие init для модели book
        event: init
    confirm:
        source: rmis_rest # названия источника
        endpoint: /booking/book
        method: post
        body: payload # что включать в тело запроса (full|state|conditions|payload|credentials)
        accept: # условие принятия
            jsonpath: $.status.statusCode
            eq: 0 # ожидаем, что statusCode будет равен 0
- event: reserve
    from: available
    to: reserved
- event: block
    from: available
    to: blocked
- event: cancel
    from:
    - available
    - reserved
    - booked
    - blocked
    to: cancelled
    hooks:
    - model: book
        event: cancel

При наличии заполненных состояний машины СМЭВ QL Сервер генерирует API c набором HTTP-методов, отвечающих за изменение и просмотр состояний объектов:

  1. GET /states — получить карту переходов

  2. GET /states/<model-name> — получить карту переходов конкретной модели

  3. POST /states/<model-name>/<event-name> — выполнить переход состояний для модели

Запрос выполнения перехода:

POST /states/slot/book
{
    "state": {
        "conditions": {
            "id": "d9e70331-b4c0-4e96-96b6-322ac75e5188" # slot_id
        },
        "payload": {
            "bookId":"82dcac12-0a29-4fff-b9a7-8dfc84f7853d",
            "patient_Id":"23453456",
            "booking_type":"APPOINTMENT",
            "caseNumber":"73367196",
            "preliminaryReservation": false,
            "email":"email@gmail.com",
            "mobilePhone":"89150000102",
            "referral_id":"102111",
            "cards_id":"102"
        }
    },
    "credentials": {
        "system": {
            "mnemonic": "117bed7f-1c07-4079-a446-1161588db4e5",
            "instance_id": "ccb4a88f-f44b-43e7-8a97-3e45c8345e90",
            "user_id": "5ed38461-0907-486a-930a-7b443482932c"
        },
        "request": {
            "id": "df5a0073-c6be-4d8c-8eb2-9b2f4188a429",
            "sub_id": "0cdb59ce-224b-4118-8da1-c5ea08a5d955",
            "name": "request_name",
            "purpose_id": "ed1170f1-3caa-4985-aa38-c9c5a190b770",
            "audit": false,
            "audit_id": "fc1048fe-323d-4eeb-92df-5710b3d1d100",
            "audit_token": false
        }
    }
}
2.2.2.8.1. Спецификация интерфейса Стейт-машины
openapi: 3.0.0
x-stoplight:
id: 5i2oag6m5eq3v
info:
title: SmevQLStateMachine
version: '1.0'
description: ''
servers:
- url: 'http://localhost:3000'
paths:
/states:
    parameters: []
    get:
    summary: Get models
    tags: []
    responses:
        '200':
        description: ''
        content:
            application/x-yaml:
            schema:
                $ref: '#/components/schemas/Models'
            examples: {}
            application/xml:
            schema:
                type: object
                properties: {}
            multipart/form-data:
            schema:
                type: object
                properties: {}
            text/html:
            schema:
                type: object
                properties: {}
    operationId: get-models
    description: Retrieve the information of models
'/states/{model}':
    parameters:
    - schema:
        type: string
        name: model
        in: path
        required: true
    get:
    summary: Get model
    tags: []
    responses:
        '200':
        description: Model Found
        content:
            application/x-yaml:
            schema:
                $ref: '#/components/schemas/Model'
            examples: {}
        '400':
        description: Bad Request
        '404':
        description: Model Not Found
    operationId: get-model
    description: Retrieve the information of model
    parameters: []
'/states/{model}/{event}':
    post:
    summary: State change
    operationId: post-state
    responses:
        '200':
        description: State Updated
        content:
            plain/text:
            schema:
                type: string
            examples: {}
        '400':
        description: Bad request
        '404':
        description: Not Found
    requestBody:
        content:
        application/json:
            schema:
            $ref: '#/components/schemas/StateUpdate'
            examples: {}
        description: Post the necessary fields for the API to create a new user.
    description: Update state
    parameters: []
    parameters:
    - schema:
        type: string
        name: model
        in: path
        required: true
    - schema:
        type: string
        name: event
        in: path
        required: true
components:
schemas:
    State:
    type: object
    x-stoplight:
        id: 89f55561cae04
    properties:
        state:
        type: string
        attributes:
        type: array
        minItems: 1
        items:
            $ref: '#/components/schemas/Attribute'
        initial:
        type: boolean
    Model:
    type: object
    x-stoplight:
        id: b96a73db1e1b2
    properties:
        model:
        type: string
        states:
        type: array
        minItems: 1
        items:
            $ref: '#/components/schemas/State'
        events:
        type: array
        items:
            $ref: '#/components/schemas/Event'
    Events:
    title: Events
    x-stoplight:
        id: qdvbkmgs9xkli
    type: array
    items:
        $ref: '#/components/schemas/Event'
    States:
    $ref: '#/components/schemas/State'
    x-stoplight:
        id: wab1w6ro30nrl
    Event:
    title: Event
    x-stoplight:
        id: sr024y2v7khum
    type: object
    properties:
        event:
        type: string
        from:
        type: string
        to:
        type: string
    Models:
    title: ModelSet
    x-stoplight:
        id: e7de590d788a7
    type: array
    items:
        $ref: '#/components/schemas/ModelInstance'
    ModelInstance:
    type: object
    properties:
        model:
        type: string
        states:
        $ref: '#/components/schemas/States'
        events:
        $ref: '#/components/schemas/Events'
    ModelSet:
    type: array
    items:
        $ref: '#/components/schemas/Model'
    Attribute:
    title: Attribute
    x-stoplight:
        id: 3kiqu047734tc
    type: object
    properties:
        name:
        type: string
        value:
        type: string
    description: ''
    StateUpdate:
    title: StateUpdate
    x-stoplight:
        id: 2iyfifo0q1dt2
    type: object
    properties:
        state:
        type: object
        properties:
            conditions:
            type: object
            payload:
            type: object
        credentials:
        type: object
        properties:
            system:
            type: object
            properties:
                mnemonic:
                type: string
                instance_id:
                type: string
                user_id:
                type: string
            request:
            type: object
            properties:
                id:
                type: string
                format: uuid
                sub_id:
                type: string
                format: uuid
                name:
                type: string
                purpose_id:
                type: string
                format: uuid
                audit:
                type: boolean
                audit_id:
                type: string
                format: uuid
                audit_token:
                type: string

Пример реализации: Спецификация интерфейса Стейт-машины РМИС (OpenAPI)

openapi: 3.0.0
x-stoplight:
id: 5i2oag6m5eq3v
info:
title: SmevQLStateMachine
version: '1.0'
description: ''
servers:
- url: 'http://localhost:3000'
paths:
/states:
    parameters: []
    get:
    summary: Get models
    tags: []
    responses:
        '200':
        description: ''
        content:
            application/x-yaml:
            schema:
                $ref: '#/components/schemas/Models'
            examples: {}
            application/xml:
            schema:
                type: object
                properties: {}
            multipart/form-data:
            schema:
                type: object
                properties: {}
            text/html:
            schema:
                type: object
                properties: {}
    operationId: get-models
    description: Retrieve the information of models
'/states/{model}':
    parameters:
    - schema:
        type: string
        name: model
        in: path
        required: true
    get:
    summary: Get model
    tags: []
    responses:
        '200':
        description: Model Found
        content:
            application/x-yaml:
            schema:
                $ref: '#/components/schemas/Model'
            examples: {}
        '400':
        description: Bad Request
        '404':
        description: Model Not Found
    operationId: get-model
    description: Retrieve the information of model
    parameters: []
'/states/{model}/{event}':
    post:
    summary: State change
    operationId: post-state
    responses:
        '200':
        description: State Updated
        content:
            plain/text:
            schema:
                type: string
            examples: {}
        '400':
        description: Bad request
        '404':
        description: Not Found
    requestBody:
        content:
        application/json:
            schema:
            $ref: '#/components/schemas/StateUpdate'
            examples: {}
        description: Post the necessary fields for the API to create a new user.
    description: Update state
    parameters: []
    parameters:
    - schema:
        type: string
        name: model
        in: path
        required: true
    - schema:
        type: string
        name: event
        in: path
        required: true
components:
schemas:
    State:
    type: object
    x-stoplight:
        id: 89f55561cae04
    properties:
        state:
        type: string
        attributes:
        type: array
        minItems: 1
        items:
            $ref: '#/components/schemas/Attribute'
        initial:
        type: boolean
    Model:
    type: object
    x-stoplight:
        id: b96a73db1e1b2
    properties:
        model:
        type: string
        states:
        type: array
        minItems: 1
        items:
            $ref: '#/components/schemas/State'
        events:
        type: array
        items:
            $ref: '#/components/schemas/Event'
    Events:
    title: Events
    x-stoplight:
        id: qdvbkmgs9xkli
    type: array
    items:
        $ref: '#/components/schemas/Event'
    States:
    $ref: '#/components/schemas/State'
    x-stoplight:
        id: wab1w6ro30nrl
    Event:
    title: Event
    x-stoplight:
        id: sr024y2v7khum
    type: object
    properties:
        event:
        type: string
        from:
        type: string
        to:
        type: string
    Models:
    title: ModelSet
    x-stoplight:
        id: e7de590d788a7
    type: array
    items:
        $ref: '#/components/schemas/ModelInstance'
    ModelInstance:
    type: object
    properties:
        model:
        type: string
        states:
        $ref: '#/components/schemas/States'
        events:
        $ref: '#/components/schemas/Events'
    ModelSet:
    type: array
    items:
        $ref: '#/components/schemas/Model'
    Attribute:
    title: Attribute
    x-stoplight:
        id: 3kiqu047734tc
    type: object
    properties:
        name:
        type: string
        value:
        type: string
    description: ''
    StateUpdate:
    title: StateUpdate
    x-stoplight:
        id: 2iyfifo0q1dt2
    type: object
    properties:
        state:
        type: object
        properties:
            conditions:
            type: object
            properties:
                id:
                type: string
                format: uuid
            payload:
            type: object
            properties:
                book_id:
                type: string
                format: uuid
                patient_id:
                type: string
                booking_type:
                type: string
                case_number:
                type: string
                preliminary_reservation:
                type: boolean
                email:
                type: string
                mobile_phone:
                type: string
                referral_id:
                type: string
                cards_id:
                type: string
        credentials:
        type: object
        properties:
            system:
            type: object
            properties:
                mnemonic:
                type: string
                instance_id:
                type: string
                user_id:
                type: string
            request:
            type: object
            properties:
                id:
                type: string
                format: uuid
                sub_id:
                type: string
                format: uuid
                name:
                type: string
                purpose_id:
                type: string
                format: uuid
                audit:
                type: boolean
                audit_id:
                type: string
                format: uuid
                audit_token:
                type: string
2.2.2.8.1.1. Выполнение операций обновления данных в витрине

Инсерты в витрину выполняются в порядке поступления запросов.

Каждый экземпляр СМЭВ QL сервера ведет нарастающий счетчик инсертов.

Каждый экземпляр СМЭВ QL сервера создает один поток управления дельтами, который выполняет:

  1. Периодически (период конфигурируемая величина, по умолчанию 60 сек) проверяет значение счетчика числа инсертов, если значение счетчика более 0

  • Выполняет открытие и закрытие дельты с флагом immediate, ошибки открытия и закрытия дельты игнорируются. Попытка закрытия дельты выполняется независимо от успешности открытия дельты.

  • Обнуляет значение счетчика.

  1. Периодически (период конфигурируемая величина, по умолчанию 30 мин)

  • Выполняет открытие и закрытие дельты с флагом immediate, ошибки открытия и закрытия дельты игнорируются. Попытка закрытия дельты выполняется независимо от успешности открытия дельты.

Чтение данных сервером СМЭВQL выполняется с применением AS OF <maxLong>.

2.2.2.8.1.2. Обновление объектов через Стейт-машину

Через Стейт-машину можно обновлять записи в витрине. Для этого при конфигурировании карты состояний необходимо задать значение у event updatable: true.

При этом если требуется дать возможность обновлять только часть атрибутов, то ограничить этот список можно перечислив атрибуты в массиве updatable_attributes.

- event: reserve
  from: available
  to: reserved
  updatable: true // по умолчанию false для всех, кроме init, возможность изменять запись при переводе статуса
  updatable_attributes: [] // массив атрибутов, которые можно обновлять, пустой — можно все

Данные для обновления будут браться из блока payload запроса на смену состояния.

Для события init такое конфигурирование не требуется - по умолчанию обновления разрешены для всех атрибутов из payload.

2.2.2.9. Ошибки

Ошибки выводятся в блоке response:

{
"response": {
    "errors": [
    {
        "error": "Запрещен вывод атрибутов без переданного guard",
        "code": "401"
    }
    ]
},
"credentials": {

}
}
2.2.2.9.1. Базовые ошибки СМЭВ Ql

1ХХ Ошибки разбора запроса

  • 101 Запрос не должен называться „errors“ — Неправильное название запроса „errors“

2ХХ Ошибки модели

  • 201 Неизвестный атрибут — У ресурса не найден атрибут с соотв. именем

  • 202 Неизвестный ресурс — Ресурс с соотв. именем не зарегистрирован в модели данных

  • 203 Неизвестная связь — Не найдена связь между двумя ресурсами

  • 204 Неправильная связь — Размеры ключей не соответствуют для соединения одного ресурса с другим

3ХХ Ошибки источников

  • 301 Неизвестный источник — Не найдено описание источника данных с соотв. именем

  • 302 Неизвестный адаптер — Не найден адаптер с соотв. именем

4ХХ Ошибки доступов и ограничений

  • 401 Запрещен вывод атрибутов без переданного guard — Среди запрашиваемых атрибутов есть атрибут с невыполненными ограничениями в блоке guard (не переданы в запросе атрибуты из guard)

  • 402 Недостаточно атрибутов для выбора источника — Среди атрибутов фильтрации нет атрибутов, необходимых для выбора источника

  • 403 Запрещенные атрибуты для поиска — Среди атрибутов фильтрации есть атрибуты, указанные в блоке denied модели

  • 404 Атрибуты для поиска не разрешены — Среди атрибутов фильтрации есть атрибуты, которые не указаны в разрешающем блоке allowed модели

  • 405 Попытка переопределения фиксированных условий поиска — Среди атрибутов фильтрации есть атрибуты, которые пытаются переопределить фиксированные ограничения поиска в блоке always модели

9ХХ Прочие ошибки

  • 901 Непредвиденная ошибка — Непредвиденная ошибка

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

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

Файл application.yml – основной конфигурационный файл CМЭВ3-адаптера, в котором задана логика и порядок работы адаптера: получение входящих запросов, их обработка, а также настройка подключения к СМЭВ и FTP-серверу СМЭВ3, к Prostore через JDBC-драйвер, BLOB-адаптер, настройка алгоритма формирования и проверки электронной подписи(ЭП) и т.д.

2.2.3.2. Пример файла 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:
  liquibase:
    enabled: false
  main:
    allow-bean-definition-overriding: true

smev:
  #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:
  # количество вертиклов
  instances: 1
  receiver-property:
    -
      #селектор из смэв
      selector:
        namespace: a
        root-element-name: b
      #пебл шаблон, который будет обрабатываться для определенного selector
      template: smev3-adapter/templates/smev.xml.peb
      #задержка между запросами, в случае если очередб пуста
      idle-delay: PT1m
      # файл, который будет отправлен в случае ошибки
      fallback-response: smev3-adapter/templates/fallback.xml
    -
      idle-delay: PT1m
      selector:
        namespace: urn://x-artefacts-testperson/1.0
        root-element-name: TestPersonRequest
      template: smev3-adapter/templates/smev.xml.peb

prostore-rest-client:
  # Признак использования rest-api для взаимодействия с простором. Если false - будет использоваться jdbc драйвер
  enabled: ${PS_REST_CLIENT_ENABLED:true}
  host: ${PS_HOST:localhost}
  port: ${PS_PORT:9195}
  http:
    max-pool-size: ${PS_MAX_POOL_SIZE:8}
  default-schema: demo_view

datasource:
  pebble-db:
    # url базы данных простора
    jdbcUrl: 'jdbc:prostore://t5-prostore-01.ru-central1.internal:9195/demo_view'
    driverClassName: 'ru.datamart.prostore.jdbc.Driver'

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'

deltastorage:
  base-path: '/smev/deltastorage'

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

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

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

#рассылка смев
scheduler:
  #вкл/выкл
  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

backup:
  zk-path: ${SMEV3_BACKUP_ZK_PATH:/${environment.name}/smev3-adapter}
  commandTopic: ${BACKUP_COMMAND_TOPIC:adapter.command}
  adapterCommandBroadcast: ${S3A_ADAPTER_COMMAND_BROADCAST_TOPIC:adapter.command.broadcast}
  backupTopic: ${BACKUP_TOPIC:adapter.backup}
  statusTopic: ${STATUS_TOPIC:adapter.status}
  timeout: ${BACKUP_TIMEOUT:PT180s}
  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: {}

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

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

Пример конфигурации файла application.yml для 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 (используется для разработки);

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

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

  • prostore-api-client - блок параметров конфигурирования взаимодействия с ProStore. Если false - будет использоваться JDBC-драйвер;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

2.2.3.3.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.3.2. Секция spring

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

Например:

spring:
  liquibase:
    enabled: false
  main:
    allow-bean-definition-overriding: true
2.2.3.3.3. Секция 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.3.4. Секция receiver

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

Например:

receiver:
  receiver-property:
    -
      selector:
        namespace: a
        root-element-name: b
      template: templates/smev.xml.peb
      idle-delay: PT1m
      fallback-response: templates/fallback.xml
    -
      selector:
        namespace: urn://x-artefacts-testperson/1.0
        root-element-name: TestPersonRequest
      template: templates/smev.xml.peb
      idle-delay: PT1s

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

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

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

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

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

  • mtom-xop-postfix - включение бинарных данных посредством ссылки xop, например:

<xop:Include xmlns:xop="http://www.w3.org/2004/08/xop/include" ref="cid:320038b2-0485-4658-89cc-980b7c8b5193@smev_client"/>

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

Пример файла fallback.xml

Ответ при ошибке обработки запроса.

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

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

Например:

prostore-rest-client:
  # Признак использования rest-api для взаимодействия с простором. Если false - будет использоваться jdbc драйвер
  enabled: true
  host: ${PS_HOST:t5-prostore-01.ru-central1.internal}
  port: ${PS_PORT:9195}
  http:
    max-pool-size: ${PS_MAX_POOL_SIZE:8}

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

  • 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.3.6. Секция datasource

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

Например:

datasource:
  pebble-db:
    # url базы данных простора
    jdbcUrl: 'jdbc:prostore://t5-prostore-01.ru-central1.internal:9195/demo_view'
    driverClassName: 'ru.datamart.prostore.jdbc.Driver'

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

  • jdbcUrl – строка подключения к сервисной БД СМЭВ3-адаптера по JDBC в формате: jdbcUrl: jdbc:postgresql://127.0.0.1:5432/smev3_connector;

2.2.3.3.7. Секция environment

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

Например:

environment:
  name: ${ENVIRONMENT_NAME:test}

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

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

2.2.3.3.8. Секция 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.3.9. Секция migration

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

Например:

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

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

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

2.2.3.3.10. Секция paramstorage

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

Например:

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

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

Например:

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

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

Например:

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

2.2.3.3.13. Секция blob

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

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

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

Например:

blob:
  # настройки подключения к BLOB адаптеру
  blob-source:
    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.3.14. Секция rest

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

Например:

rest:
  #вкл/выкл
  enabled: false
  #порт на котором будет запущена рестовая ручка
  port: 8080
  # путь get запроса
  get: /le
  #путь post запроса
  post: /le
  #обрабатываемый шаблон
  template: smev3-adapter/templates/smev.xml.peb
2.2.3.3.15. Секция scheduler

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

Например:

scheduler:
  enabled: true
  interval: PT30s
  template: templates/pfr-delta.peb

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

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

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

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

2.2.3.3.16. Секция pool

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

Например:

pool:
  reader-executor: 20
  schedule-executor: 1
  restExecutor: 1
  logExecutor: 20
2.2.3.3.17. Секция logging

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

Например:

logging:
  request-response:
    smev-request: false
    smev-response: false

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

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

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

2.2.3.3.18. Секция backup

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

Например:

backup:
  zk-path: ${SMEV3_BACKUP_ZK_PATH:/${environment.name}/smev3-adapter}
  commandTopic: ${BACKUP_COMMAND_TOPIC:adapter.command}
  adapterCommandBroadcast: ${S3A_ADAPTER_COMMAND_BROADCAST_TOPIC:adapter.command.broadcast}
  backupTopic: ${BACKUP_TOPIC:adapter.backup}
  statusTopic: ${STATUS_TOPIC:adapter.status}
  timeout: ${BACKUP_TIMEOUT:PT180s}
  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}

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

  • zk-path - путь к корневой ноде zookeeper для бэкапирования, например {COUNTER_BACKUP_ZK_PATH:/${environment.name}/counter-provider/counters};

  • commandTopic - топик команд бэкапирования, например: {BACKUP_COMMAND_TOPIC:adapter.command};

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

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

2.2.3.3.19. Секция spf

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

Например:

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

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

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

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

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

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

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

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

2.2.4.1.1. Пример файла application.yml
# Kafka Prostore
        .kafkaUrl: &kafkaUrl ${KAFKA_BOOTSTRAP_SERVERS:localhost:9092}

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

send:
        # Размер отправляемой порции данных
        chunk-row-count: ${CHUNK_ROW_COUNT:1000}
        # Размер буфера на чтение файла
        file-buffer-size: ${FILE_BUFFER_SIZE:1048576}
        # Количество Job на чтение
        read-job-count: ${READ_JOB_COUNT:4}
        # Размер Channel для сериализации
        serialize-channel-size: ${SERIALIZE_CHANNEL_SIZE:20}
        # Количество Job на сериализацию
        serialize-job-count: ${SERIALIZE_JOB_COUNT:4}
        # Размер Job на отправку
        send-channel-size: ${SEND_CHANNEL_SIZE:20}
        # Количество Job на отправку
        send-job-count: ${SEND_JOB_COUNT:4}
        # Ограничение на размер оправляемого файла (мегабайты)
        file-size-restriction: ${SEND_FILE_SIZE_RESTRICTION:1024}

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

environment:
        # Название окружения
        name: ${ENVIRONMENT_NAME:test}
        # Папка для ошибочных файлов
        error-folder: ${ENVIRONMENT_ERROR_FOLDER:error}

zookeeper:
        # Адрес сервера zookeeper
        connection-string: ${ZK_CONNECTION:localhost}
        # Таймаут сессии
        session-timeout-ms: ${ZK_SESSION_TIMEOUT_MS:30000}
        # Таймаут подключения
        connection-timeout-ms: ${ZK_CONNECTION_TIMEOUT_MS:86400000}
        chroot: ${ZOOKEEPER_DS_CHROOT:/adapter}

migration:
        enabled: ${MIGRATION_ENABLE:false}

prostore-rest-client:
        # Признак использования rest-api для взаимодействия с простором. Если false - будет использоваться jdbc драйвер
        enabled: ${PS_REST_CLIENT_ENABLED:true}
        host: ${PS_HOST:localhost}
        port: ${PS_PORT:9195}
        http:
                max-pool-size: ${PS_MAX_POOL_SIZE:8}

prostore:
        # subprotocol для jdbc
        subprotocol: ${PS_SUBPROTOCOL:prostore}
        # Драйвер для подключения к простору
        driver: ${PS_DRIVER:ru.datamart.prostore.jdbc.Driver}
        # Подключение к Prostore
        host: ${PS_HOST:localhost}
        # Prostore порт
        port: ${PS_PORT:9195}
        # Prostore начальный размер пула ру
        initialPoolSize: ${PS_INITIAL_POOL_SIZE:5}
        # Prostore максимальный размер пула
        maxPoolSize: ${PS_MAX_POOL_SIZE:8}
        additional-props:
                key: value
        zookeeper:
                # Адрес сервера zookeeper для загрузки данных в простор
                connection-string: ${ZK_PROSTORE_CONNECTION:locahost:2181}

validation:
        enable: ${VALIDATION_ENABLE:true}
        rest-uploader-url: ${REST_UPLOADER_URL:http://localhost:8081}
        # обязательность использования ФЛК
        mandator: ${VALIDATION_MANDATOR:false}

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

kafka:
        create-topic:
                # Количество партиций на загрузку через EDML
                num-partitions: ${EDML_UPLOAD_NUM_PARTITIONS:1}
                # Фактор репликации при создании топика
                replication-factor: ${EDML_UPLOAD_REPLICATION_FACTOR:1}
        topic:
                # Топик для журналирования
                journal-log: journal.log
                flk-log: flk.log
        consumer:
                # Количество партиций на выгрузку через EDML
                num-partitions: ${EDML_DOWNLOAD_NUM_PARTITIONS:1}
                property:
                bootstrap.servers: *kafkaUrl
                group.id: csv-uploader
                auto.offset.reset: earliest
                enable.auto.commit: true
        producer:
                property:
                        bootstrap.servers: *kafkaUrl

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}

metrics:
        port: ${METRICS_PORT:9837}

backup:
        zk-path: ${CSV_UPLOADER_BACKUP_ZK_PATH:/${environment.name}/csv-uploader/config}
        commandTopic: ${BACKUP_COMMAND_TOPIC:adapter.command}
        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}

jet-connector:
        use: ${JET_CONNECTOR_USE:false}
        kafka-consumer-group-name: ${JET_CONNECTOR_GROUP_NAME:csv-uploader}
        kafka-poll-duration-ms: ${JET_POLL_DURATION:200}
        kafka-poll-buffer-size: ${JET_POLL_BUFFER:2000}
        db-records-buffer-size: ${JET_DB_RECORDS_BUFFER:2000}

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

Настройка конфигурации CSV-uploader осуществляется путем редактирования параметров настроек в файле application.yml. Некоторые настройки доступны для редактирования через пользовательский интерфейс модуля, например, Настройка отображения количества записей в Журнале операций и Запуск по расписанию.

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

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

  • kafkaUrl - URL для доступа к Kafka;

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

  • send - настройка отправки файлов;

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

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

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

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

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

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

  • validation - включение/выключение механизма валидации загрузки с помощью rest-uploader сервиса;

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

  • kafka - настройка подключения к шине данных Apache Kafka;

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

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

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

  • jet-connector - подготовлен для оптимизации задержек записи.

2.2.4.2.1. Секция kafkaUrl

В секция kafkaUrl указывается URL-адрес для доступа к Apache Kafka (ProStore).

Например:

.kafkaUrl: &kafkaUrl ${KAFKA_BOOTSTRAP_SERVERS:dev-dtm-one05.ru-central1.internal:9092}

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

KAFKA_BOOTSTRAP_SERVERS - URL-адрес для доступа к Apache Kafka (ProStore).

2.2.4.2.2. Секция http

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

Например:

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

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

  • port - порт для старта веб-сервера;

  • enabled - статус включения/отключения веб-сервера.

2.2.4.2.3. Секция query-executor

Секция query-executor определяет настройки настройка получения входящих запросов.

Например:

query-executor:
        reader-pool-size: ${READER_POOL_SIZE:20}
        rest-pool-size: ${REST_POOL_SIZE:5}
        writer-pool-size: ${WRITER_POOL_SIZE:1}
        kafka-pool-size: ${KAFKA_POOL_SIZE:20}

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

  • reader-pool-size - размер пула на чтение, например: READER_POOL_SIZE:20;

  • rest-pool-size - размер пула на REST, например: REST_POOL_SIZE:5;

  • writer-pool-size - размер пула на запись, например: WRITER_POOL_SIZE:1;

  • kafka-pool-size - размер kafka пула на отправку, например KAFKA_POOL_SIZE:20.

2.2.4.2.4. Секция send

Секция send определяет настройки отправки файлов.

Например:

send:
        chunk-row-count: ${CHUNK_ROW_COUNT:1000}
        file-buffer-size: ${FILE_BUFFER_SIZE:1048576}
        read-job-count: ${READ_JOB_COUNT:4}
        serialize-channel-size: ${SERIALIZE_CHANNEL_SIZE:20}
        serialize-job-count: ${SERIALIZE_JOB_COUNT:4}
        send-channel-size: ${SEND_CHANNEL_SIZE:20}
        send-job-count: ${SEND_JOB_COUNT:4}
        file-size-restriction: ${SEND_FILE_SIZE_RESTRICTION:1024}

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

  • chunk-row-count - размер отправляемой порции данных, например CHUNK_ROW_COUNT:100;

  • file-buffer-size - размер буфера на чтение файла, например FILE_BUFFER_SIZE:1048576;

  • read-job-count - количество Job на чтение, например READ_JOB_COUNT:4;

  • serialize-channel-size - размер Channel для сериализации, например SERIALIZE_CHANNEL_SIZE:20;

  • serialize-job-count - количество задач на сериализацию, например SERIALIZE_JOB_COUNT:4;

  • send-channel-size - размер задач на отправку, например SEND_CHANNEL_SIZE:20;

  • send-job-count - количество задач на отправку, например SEND_JOB_COUNT:4;

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

2.2.4.2.5. Секция logging.level

Секция logging.level определяет настройки записи логирования.

Например:

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

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

Например:

environment:
        name: ${ENVIRONMENT_NAME:test}
        error-folder: ${ENVIRONMENT_ERROR_FOLDER:error}

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

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

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

2.2.4.2.7. Секция zookeeper

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

Например:

zookeeper:
        connection-string: ${ZK_CONNECTION:t5-ads-02.ru-central1.internal}
        session-timeout-ms: ${ZK_SESSION_TIMEOUT_MS:30000}
        connection-timeout-ms: ${ZK_CONNECTION_TIMEOUT_MS:86400000}

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

  • connection-string - адрес сервера Zookeeper, например ZK_CONNECTION:t5-ads-02.ru-central1.internal;

  • session-timeout-ms - таймаут сессии, например ZK_SESSION_TIMEOUT_MS:30000;

  • connection-timeout-ms - таймаут подключения, например ZK_CONNECTION_TIMEOUT_MS:86400000.

2.2.4.2.8. Секция migration

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

Например:

migration:
        enabled: ${MIGRATION_ENABLE:false}

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

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

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

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

Например:

prostore-rest-client:
        enabled: ${PS_REST_CLIENT_ENABLED:true}
        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.4.2.10. Секция prostore

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

Например:

prostore:
        subprotocol: ${PS_SUBPROTOCOL:prostore}
        driver: ${PS_DRIVER:ru.datamart.prostore.jdbc.Driver}
        host: ${PS_HOST:dev-dtm-one05.ru-central1.internal}
        port: ${PS_PORT:9090}
        initialPoolSize: ${PS_INITIAL_POOL_SIZE:5}
        maxPoolSize: ${PS_MAX_POOL_SIZE:8}
        additional-props:
        key: value
        zookeeper:
                connection-string: ${ZK_PROSTORE_CONNECTION:dev-dtm-one05.ru-central1.internal:2181}

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

  • subprotocol - subprotocol для jdbc, например PS_SUBPROTOCOL:prostore;

  • driver - драйвер для подключения к Prostore, например PS_DRIVER:ru.datamart.prostore.jdbc.Driver;

  • host - подключение к Prostore, например PS_HOST:dev-dtm-one05.ru-central1.internal;

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

  • initialPoolSize - начальное число подключений к Prostore, например PS_INITIAL_POOL_SIZE:5;

  • maxPoolSize - максимальное число подключений к Prostore, например, например PS_MAX_POOL_SIZE:8;

  • connection-string - адрес сервера zookeeper для загрузки данных в Prostore, например ZK_PROSTORE_CONNECTION:dev-dtm-one05.ru-central1.internal:2181.

2.2.4.2.11. Секция validation

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

Например:

enable: ${VALIDATION_ENABLE:true}
rest-uploader-url: ${REST_UPLOADER_URL:http://localhost:8081}
mandator: ${VALIDATION_MANDATOR:false}

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

  • enable - валидация включена (по умолчанию), например {VALIDATION_ENABLE:true};

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

  • mandator - обязательность использования ФЛК, например {VALIDATION_MANDATOR:false}.

2.2.4.2.12. Секция upload

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

Например:

upload:
        jwt-auth: ${JWT_AUTH:false}

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

  • jwt-auth - требование токена для аутентификации на REST-Uploader, например {JWT_AUTH:false}.

2.2.4.2.13. Секция kafka

Секция kafka предназначена для настройки параметров подключения к шине данных Apache Kafka.

Например:

kafka:
        create-topic:
                num-partitions: ${EDML_UPLOAD_NUM_PARTITIONS:1}
                replication-factor: ${EDML_UPLOAD_REPLICATION_FACTOR:1}
        topic:
                journal-log: journal.log
        consumer:
                num-partitions: ${EDML_DOWNLOAD_NUM_PARTITIONS:1}
                property:
                        bootstrap.servers: *kafkaUrl
                        group.id: csv-uploader
                        auto.offset.reset: earliest
                        enable.auto.commit: true
        producer:
                property:
                        bootstrap.servers: *kafkaUrl

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

  • num-partitions - количество партиций на загрузку через EDML, например EDML_UPLOAD_NUM_PARTITIONS:1;

  • replication-factor - фактор репликации при создании топика, например EDML_UPLOAD_REPLICATION_FACTOR:1.

2.2.4.2.14. Секция 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}

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

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

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

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

  • 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.15. Секция metrics

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

Например:

metrics:
  port: ${METRICS_PORT:9837}

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

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

2.2.4.2.16. Секция backup

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

Например:

backup:
  zk-path: ${COUNTER_BACKUP_ZK_PATH:/${environment.name}/counter-provider/counters}
  commandTopic: ${BACKUP_COMMAND_TOPIC:adapter.command}
  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}

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

  • zk-path - путь к корневой ноде zookeeper для бэкапирования, например {COUNTER_BACKUP_ZK_PATH:/${environment.name}/counter-provider/counters};

  • commandTopic - топик команд бэкапирования, например: {BACKUP_COMMAND_TOPIC:adapter.command};

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

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

2.2.4.2.17. Секция jet-connector

Секция jet-connector предназначена для оптимизации задержек записи данных.

Например:

jet-connector:
use: ${JET_CONNECTOR_USE:false}
kafka-consumer-group-name: ${JET_CONNECTOR_GROUP_NAME:csv-uploader}
kafka-poll-duration-ms: ${JET_POLL_DURATION:200}
kafka-poll-buffer-size: ${JET_POLL_BUFFER:2000}
db-records-buffer-size: ${JET_DB_RECORDS_BUFFER:2000}

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

  • use - флаг активации jet connector’а, например {JET_CONNECTOR_USE:false};

  • kafka-consumer-group-name - имя консьюмер-группы, загружающей данные, например: {JET_CONNECTOR_GROUP_NAME:csv-uploader};

  • kafka-poll-duration-ms - максимальное время одного прохода вычитки из топика в мс, например: {JET_POLL_DURATION:200};

  • kafka-poll-buffer-size - максимальный размер буфера прочитанных, но еще не загруженных сообщений, например: {JET_POLL_BUFFER:2000};

  • db-records-buffer-size - максимальное количество строк, загружаемых в таблицу за один проход, например: {JET_DB_RECORDS_BUFFER:2000}.

2.2.5. Настройка ПОДД-адаптера - Модуль исполнения запросов

2.2.5.1. Конфигурация ПОДД-адаптера - Модуль исполнения запросов (application.yml)

Файл application.yml – основной конфигурационный файл ПОДД-адаптера - Модуль исполнения запросов, в котором задана логика и порядок работы адаптера: получение входящих запросов, их обработка, подключение к Сервису формирования документов (секция: printable-forms-service), настройки логирования (секция: logging), а также другие настройки необходимые для корректной работы адаптера. Хинт пагинации FORCE_LLR определен в переменных среды.

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

Приведем типовую структуру файла и возможные настройки ПОДД-адаптера - Модуль исполнения запросов. Следует учитывать, что в конфигурационном файле следует задавать только те настройки, которые необходимы для решения текущих бизнес-задач.

http-server:
  port: ${HTTP_PORT:8090}

environment:
  name: ${ENVIRONMENT_NAME:test}

executor:
  reader-pool-size: ${EXECUTOR_READER_POOL_SIZE:20}
  max-execute-time: ${EXECUTOR_MAX_EXECUTE_TIME:600}
  log-pool-size: ${EXECUTOR_LOG_POOL_SIZE:20}

send:
  channel-size: ${SEND_CHANNEL_SIZE:1}
  compress: ${SEND_COMPRESS:none}
  max-message-size: ${SEND_MAX_MESSAGE_SIZE:800000}

query:
  data-source-type: ${DATA_SOURCE_TYPE:ADB}
  force-llr-for-order: ${FORCE_LLR_FOR_ORDER:true}
  force-llr-for-all: ${FORCE_LLR_FOR_ALL:false}
  llr-rows-limit: ${LLR_ROWS_LIMIT:200}
  fetch-size: ${FETCH_SIZE:1000}

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}

prostore-rest-client:
  # Признак использования rest-api для взаимодействия с простором. Если false - будет использоваться jdbc драйвер
  enabled: ${PS_REST_CLIENT_ENABLED:true}
  host: ${PS_HOST:localhost}
  port: ${PS_PORT:9195}
  http:
    max-pool-size: ${PS_MAX_POOL_SIZE:8}

prostore:
  datasource:
    subprotocol: ${PS_SUBPROTOCOL:prostore}
    driver: ${PS_DRIVER:ru.datamart.prostore.jdbc.Driver}
    host: ${PS_HOST:localhost}
    port: ${PS_PORT:9195}
    initialPoolSize: ${PS_INITIAL_POOL_SIZE:5}
    maxPoolSize: ${PS_MAX_POOL_SIZE:8}
    additional-props:
      key: value

printable-forms-service:
  host: ${PFS_HOST:localhost}
  port: ${PFS_PORT:8080}
  pool-size: ${PFS_POOL_SIZE:10}
  timeout: ${PFS_TIMEOUT:30}

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}}
  internal:
    bootstrap.servers: ${PS_KAFKA:localhost:9092}
    topic.prefix: ${INTERNAL_TOPIC_PREFIX:${agent.topic.prefix}}
  consumer:
    query-request:
      topic: ${kafka.external.topic.prefix}query.rq
      max-concurrent-handle: ${kafka.max-concurrent-handle}
      commit-interval: ${kafka.commit-interval}
      property:
        bootstrap.servers: ${kafka.external.bootstrap.servers}
        group.id: ${kafka.external.topic.prefix}query.consumer
        auto.offset.reset: earliest
        enable.auto.commit: false
    query-cancel-request:
      topic: ${kafka.external.topic.prefix}cancel.rq
      commit-interval: ${kafka.commit-interval}
      property:
        bootstrap.servers: ${kafka.external.bootstrap.servers}
        group.id: ${kafka.external.topic.prefix}cancel.query.consumer
        auto.offset.reset: earliest
        enable.auto.commit: false
    metadata-request:
      topic: ${kafka.external.topic.prefix}metadata.rq
      commit-interval: ${kafka.commit-interval}
      property:
        bootstrap.servers: ${kafka.external.bootstrap.servers}
        group.id: ${kafka.external.topic.prefix}metadata.consumer
        auto.offset.reset: earliest
        enable.auto.commit: false
    metadata-new-data-request:
      topic: ${kafka.external.topic.prefix}metadata.newdata.rq
      commit-interval: ${kafka.commit-interval}
      property:
        bootstrap.servers: ${kafka.external.bootstrap.servers}
        group.id: ${kafka.external.topic.prefix}metadata.newdata.consumer
        auto.offset.reset: earliest
        enable.auto.commit: false
    statistics-request:
      topic: ${kafka.external.topic.prefix}statistics.rq
      commit-interval: ${kafka.commit-interval}
      property:
        bootstrap.servers: ${kafka.external.bootstrap.servers}
        group.id: ${kafka.external.topic.prefix}statistics.rq.consumer
        auto.offset.reset: earliest
        enable.auto.commit: false
    report-request:
      topic: ${kafka.external.topic.prefix}procedure.query.rq
      max-concurrent-handle: ${kafka.max-concurrent-handle}
      commit-interval: ${kafka.commit-interval}
      property:
        bootstrap.servers: ${kafka.external.bootstrap.servers}
        group.id: ${kafka.external.topic.prefix}report.rq.consumer
        auto.offset.reset: earliest
        enable.auto.commit: false
  producer:
    query-result: ${kafka.external.topic.prefix}query.rs
    query-error: ${kafka.external.topic.prefix}query.err
    query-estimation-result: ${kafka.external.topic.prefix}query.estimation.rs
    query-cancel-result: ${kafka.external.topic.prefix}cancel.rs
    query-cancel-error: ${kafka.external.topic.prefix}cancel.err
    metadata-result: ${kafka.external.topic.prefix}metadata.rs
    metadata-error: ${kafka.external.topic.prefix}metadata.err
    metadata-newdata-result: ${kafka.external.topic.prefix}metadata.newdata.rs
    metadata-newdata-error: ${kafka.external.topic.prefix}metadata.newdata.err
    statistics-result: ${kafka.external.topic.prefix}statistics.rs
    statistics-error: ${kafka.external.topic.prefix}statistics.err
    report-result: ${kafka.external.topic.prefix}query.rs
    report-error: ${kafka.external.topic.prefix}query.err
    property:
      bootstrap.servers: ${kafka.external.bootstrap.servers}
    internal:
      mppr-query-request: ${kafka.internal.topic.prefix}mppr.delegate.rq
      tp-delete-tmp: ${kafka.internal.topic.prefix}tp.delete.tmp
      property:
        bootstrap.servers: ${kafka.internal.bootstrap.servers}

statistics:
  enabled: ${STATISTICS_ENABLED:false}
  timeout-min: ${STATISTICS_TIMEOUT_MIN:60}
  datamarts:
    - name: demo_dev
      tables:
        - name: all_types
          columns:
            - varchar_c
            - char_c
            - bigint_c

logging:
  request-response:
    query-request: ${QUERY_REQUEST_LOG_ENABLED:false}
    query-response: ${QUERY_RESPONSE_LOG_ENABLED:false}
    pf-request: ${PF_REQUEST_LOG_ENABLED:false}
    pf-response: ${PF_RESPONSE_LOG_ENABLED:false}

metrics:
  port: ${METRICS_PORT:9837}

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

Настройка конфигурации ПОДД-адаптера - Модуль исполнения запросов осуществляется путем редактирования параметров настроек в файле application.yml.

Пример конфигурации файла application.yml для ПОДД-адаптера - Модуль исполнения запросов см. в разделе Пример файла application.yml Руководства администратора.

В файле конфигурации ПОДД-адаптера - Модуль исполнения запросов могут быть настроены следующие секции:

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

  • environment - указывается название окружения (test, prod и т.д.);

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

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

  • query - настройка выполнения запросов;

  • zookeeper - подключения в Zookeeper;

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

  • prostore- указываются настройки подключения к ProStore;

  • printable-forms-service - настройки подключения к Сервис формирования документов;

  • kafka - настройки параметров подключения к шине данных Apache Kafka;

  • statistics - управление статистикой;

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

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

2.2.5.3.1. Секция http-server

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

Например:

http:
  port: ${HTTP_PORT:8090}

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

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

2.2.5.3.2. Секция environment

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

Например:

environment:
  name: ${ENVIRONMENT_NAME:test}

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

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

2.2.5.3.3. Секция executor

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

Например:

executor:
  reader-pool-size: ${EXECUTOR_READER_POOL_SIZE:20}
  max-execute-time: ${EXECUTOR_MAX_EXECUTE_TIME:600}
  log-pool-size: ${EXECUTOR_LOG_POOL_SIZE:20}

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

  • reader-pool-size - размер пула для чтения Kafka, например EXECUTOR_READER_POOL_SIZE:20;

  • max-execute-time - максимальное время выполнения задачи (сек), например EXECUTOR_MAX_EXECUTE_TIME:600;

  • log-pool-size - Размер используемого пула для журналирования запросов и ответов, например EXECUTOR_LOG_POOL_SIZE:20.

2.2.5.3.4. Секция send

В секции send настраиваются ограничения на размер загружаемого файла.

Например:

send:
  channel-size: ${SEND_CHANNEL_SIZE:1}
  compress: ${SEND_COMPRESS:none}
  max-message-size: ${SEND_MAX_MESSAGE_SIZE:800000}

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

  • channel-size - размер канала на отправку сообщения, например SEND_CHANNEL_SIZE:10;

  • compress - сжатие выгружаемых сообщений (none или zstd), например SEND_COMPRESS:none;

  • max-message-size - максимальный размер отправляемого сообщения, например SEND_MAX_MESSAGE_SIZE:800000.

2.2.5.3.5. Секция query

В секции query выполняется настройка выполнения запросов.

Например:

query:
  data-source-type: ${DATA_SOURCE_TYPE:ADB}
  force-llr-for-order: ${FORCE_LLR_FOR_ORDER:true}
  force-llr-for-all: ${FORCE_LLR_FOR_ALL:false}
  llr-rows-limit: ${LLR_ROWS_LIMIT:200}
  fetch-size: ${FETCH_SIZE:1000}

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

  • data-source-type - выполнение запроса с LISTAGG на (ADB/ADP), например DATA_SOURCE_TYPE:ADB;

  • force-llr-for-order - выполнение ORDER BY запроса c использованием пагинации, например FORCE_LLR_FOR_ORDER:true;

  • llr-rows-limit - ограничение выгрузки через LIMIT, FETCH, например LLR_ROWS_LIMIT:200;

  • fetch-size - размер выгрузки через JDBC, например FETCH_SIZE:1000.

2.2.5.3.6. Секция zookeeper

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

Например:

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.5.3.7. Секция prostore-rest-client

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

Например:

prostore-rest-client:
  enabled: true
  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.5.3.8. Секция prostore

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

Например:

prostore:
  datasource:
    subprotocol: ${PS_SUBPROTOCOL:prostore}
    driver: ${PS_DRIVER:ru.datamart.prostore.jdbc.Driver}
    host: ${PS_HOST:localhost}
    port: ${PS_PORT:9195}
    initialPoolSize: ${PS_INITIAL_POOL_SIZE:5}
    maxPoolSize: ${PS_MAX_POOL_SIZE:8}
    additional-props:
      key: value

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

  • subprotocol - Subprotocol для JDBC, например PS_SUBPROTOCOL:prostore;

  • driver - имя класса JDBC драйвера, например PS_DRIVER:ru.datamart.prostore.jdbc.Driver;

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

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

  • initialPoolSize - начальное число подключений к Prostore, например PS_INITIAL_POOL_SIZE:5;

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

2.2.5.3.9. Секция printable-forms-service

Секция printable-forms-service определяет настройки подключения к Сервис формирования документов.

Например:

printable-forms-service:
  host: ${PFS_HOST:localhost}
  port: ${PFS_PORT:8080}
  pool-size: ${PFS_POOL_SIZE:10}
  timeout: ${PFS_TIMEOUT:30}

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

  • host - адрес сервера формирования документов, например PFS_HOST:localhost;

  • port - порт сервера формирования документов, например PFS_PORT:8080;

  • pool-size - размер пула соединений для ПФ, например PFS_POOL_SIZE:10;

  • timeout - таймаут переподключения к сервису формирования документов (секунды), например PFS_TIMEOUT:30.

2.2.5.3.10. Секция kafka

В секции kafka собраны настройки параметров подключения к шине данных Apache Kafka.

Например:

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}}
  internal:
    bootstrap.servers: ${PS_KAFKA:localhost:9092}
    topic.prefix: ${INTERNAL_TOPIC_PREFIX:${agent.topic.prefix}}
  consumer:
    query-request:
      topic: ${kafka.external.topic.prefix}query.rq
      max-concurrent-handle: ${kafka.max-concurrent-handle}
      commit-interval: ${kafka.commit-interval}
      property:
        bootstrap.servers: ${kafka.external.bootstrap.servers}
        group.id: ${kafka.external.topic.prefix}query.consumer
        auto.offset.reset: earliest
        enable.auto.commit: false
    query-cancel-request:
      topic: ${kafka.external.topic.prefix}cancel.rq
      commit-interval: ${kafka.commit-interval}
      property:
        bootstrap.servers: ${kafka.external.bootstrap.servers}
        group.id: ${kafka.external.topic.prefix}cancel.query.consumer
        auto.offset.reset: earliest
        enable.auto.commit: false
    metadata-request:
      topic: ${kafka.external.topic.prefix}metadata.rq
      commit-interval: ${kafka.commit-interval}
      property:
        bootstrap.servers: ${kafka.external.bootstrap.servers}
        group.id: ${kafka.external.topic.prefix}metadata.consumer
        auto.offset.reset: earliest
        enable.auto.commit: false
    metadata-new-data-request:
      topic: ${kafka.external.topic.prefix}metadata.newdata.rq
      commit-interval: ${kafka.commit-interval}
      property:
        bootstrap.servers: ${kafka.external.bootstrap.servers}
        group.id: ${kafka.external.topic.prefix}metadata.newdata.consumer
        auto.offset.reset: earliest
        enable.auto.commit: false
    statistics-request:
      topic: ${kafka.external.topic.prefix}statistics.rq
      commit-interval: ${kafka.commit-interval}
      property:
        bootstrap.servers: ${kafka.external.bootstrap.servers}
        group.id: ${kafka.external.topic.prefix}statistics.rq.consumer
        auto.offset.reset: earliest
        enable.auto.commit: false
    report-request:
      topic: ${kafka.external.topic.prefix}procedure.query.rq
      max-concurrent-handle: ${kafka.max-concurrent-handle}
      commit-interval: ${kafka.commit-interval}
      property:
        bootstrap.servers: ${kafka.external.bootstrap.servers}
        group.id: ${kafka.external.topic.prefix}report.rq.consumer
        auto.offset.reset: earliest
        enable.auto.commit: false
  producer:
    query-result: ${kafka.external.topic.prefix}query.rs
    query-error: ${kafka.external.topic.prefix}query.err
    query-estimation-result: ${kafka.external.topic.prefix}}query.estimation.rs
    query-cancel-result: ${kafka.external.topic.prefix}cancel.rs
    query-cancel-error: ${kafka.external.topic.prefix}cancel.err
    metadata-result: ${kafka.external.topic.prefix}metadata.rs
    metadata-error: ${kafka.external.topic.prefix}metadata.err
    metadata-newdata-result: ${kafka.external.topic.prefix}metadata.newdata.rs
    metadata-newdata-error: ${kafka.external.topic.prefix}metadata.newdata.err
    statistics-result: ${kafka.external.topic.prefix}statistics.rs
    statistics-error: ${kafka.external.topic.prefix}statistics.err
    report-result: ${kafka.external.topic.prefix}query.rs
    report-error: ${kafka.external.topic.prefix}query.err
    property:
      bootstrap.servers: ${kafka.external.bootstrap.servers}
    internal:
      mppr-query-request: ${kafka.internal.topic.prefix}mppr.delegate.rq
      tp-delete-tmp: ${kafka.internal.topic.prefix}tp.delete.tmp
      property:
        bootstrap.servers: ${kafka.internal.bootstrap.servers}

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

  • topic - префикс для топиков агента ПОДД, например AGENT_TOPIC_PREFIX.

2.2.5.3.11. Секция statistics

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

Например:

statistics:
  enabled: ${STATISTICS_ENABLED:false}
  timeout-min: ${STATISTICS_TIMEOUT_MIN:60}
  datamarts:
    - name: demo_dev
      tables:
        - name: all_types
          columns:
            - varchar_c
            - char_c
            - bigint_c

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

  • enabled - включение (true)/ выключение (false) расчета статистики, например STATISTICS_ENABLED:false;

  • timeout-min - время обновления статистики (минуты), например STATISTICS_TIMEOUT_MIN:60.

2.2.5.3.12. Секция logging

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

Например:

logging:
  request-response:
    query-request: ${QUERY_REQUEST_LOG_ENABLED:false}
    query-response: ${QUERY_RESPONSE_LOG_ENABLED:false}
    pf-request: ${PF_REQUEST_LOG_ENABLED:false}
    pf-response: ${PF_RESPONSE_LOG_ENABLED:false}

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

  • query-request - журналирование query запросов, например QUERY_REQUEST_LOG_ENABLED:false;

  • query-response - журналирование query ответов, например QUERY_RESPONSE_LOG_ENABLED:false;

  • pf-request - журналирование запросов на сервис формирования документов, например PF_REQUEST_LOG_ENABLED:false;

  • pf-response - журналирование ответов от сервиса формирования документов, например PF_RESPONSE_LOG_ENABLED:false.

2.2.5.3.13. Секция metrics

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

Например:

metrics:
  port: ${METRICS_PORT:9837}

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

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

2.2.6. Настройка ПОДД-адаптер – Модуль MPPR

2.2.6.1. Конфигурация ПОДД-адаптера - Модуль MPPR (application.yml)

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

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

Приведем типовую структуру файла и возможные настройки ПОДД-адаптера - Модуль MPPR. Следует учитывать, что в конфигурационном файле следует задавать только те настройки, которые необходимы для решения текущих бизнес-задач.

http:
  port: ${HTTP_PORT:8085}

environment:
  name: ${ENVIRONMENT_NAME:test}

executor:
  reader-pool-size: ${EXECUTOR_READER_POOL_SIZE:20}
  max-execute-time: ${EXECUTOR_MAX_EXECUTE_TIME:600}
  log-pool-size: ${EXECUTOR_LOG_POOL_SIZE:20}

send:
  channel-size: ${SEND_CHANNEL_SIZE:1}
  timeout: ${SEND_TIMEOUT:30}
  delete-topic: ${SEND_DELETE_TOPIC:true}
  compress: ${SEND_COMPRESS:none}

prostore-rest-client:
  # Признак использования rest-api для взаимодействия с простором. Если false - будет использоваться jdbc драйвер
  enabled: ${PS_REST_CLIENT_ENABLED:true}
  host: ${PS_HOST:localhost}
  port: ${PS_PORT:9195}
  http:
    max-pool-size: ${PS_MAX_POOL_SIZE:8}

prostore:
  datasource:
    subprotocol: ${PS_SUBPROTOCOL:prostore}
    driver: ${PS_DRIVER:ru.datamart.prostore.jdbc.Driver}
    host: ${PS_HOST:localhost}
    port: ${PS_PORT:9195}
    initialPoolSize: ${PS_INITIAL_POOL_SIZE:5}
    maxPoolSize: ${PS_MAX_POOL_SIZE:8}
    additional-props:
      key: value

  kafka:
    message-limit: ${PS_MESSAGE_LIMIT:1000}
    zk-url: ${PS_ZK_KAFKA_URL:localhost:2181}
    statusEventTopic:
      topic: ${PS_STATUS_EVENT_TOPIC:status.event}
      commit-interval: ${kafka.commit-interval}
      property:
        bootstrap.servers: ${kafka.internal.bootstrap.servers}
        group.id: ${kafka.internal.topic.prefix}podd-adapter-mppr-status-event
        auto.offset.reset: earliest
        enable.auto.commit: false

kafka:
  agent.topic.prefix: ${AGENT_TOPIC_PREFIX:}
  max-concurrent-handle: ${KAFKA_MAX_CONCURRENT_HANDLE:10}
  commit-interval: ${KAFKA_COMMIT_INTERVAL:5s}
  external:
    bootstrap.servers: ${KAFKA_BOOTSTRAP_SERVERS:localhost:9092}
    topic.prefix: ${EXTERNAL_TOPIC_PREFIX:${kafka.agent.topic.prefix}}
  internal:
    bootstrap.servers: ${PS_KAFKA:localhost:9092}
    topic.prefix: ${INTERNAL_TOPIC_PREFIX:${kafka.agent.topic.prefix}}
  consumer:
    query-request:
      topic: ${kafka.internal.topic.prefix}mppr.delegate.rq
      max-concurrent-handle: ${kafka.max-concurrent-handle}
      commit-interval: ${kafka.commit-interval}
      property:
        bootstrap.servers: ${kafka.internal.bootstrap.servers}
        group.id: ${kafka.internal.topic.prefix}mppr.query.consumer
        auto.offset.reset: earliest
        enable.auto.commit: false
        max.poll.records: 1
        max.poll.interval.ms: 600000
    delta-request:
      topic: ${kafka.internal.topic.prefix}mppr.delta.rq
      max-concurrent-handle: ${kafka.max-concurrent-handle}
      commit-interval: ${kafka.commit-interval}
      property:
        bootstrap.servers: ${kafka.internal.bootstrap.servers}
        group.id: ${kafka.internal.topic.prefix}mppr.delta.consumer
        auto.offset.reset: earliest
        enable.auto.commit: false
        max.poll.records: 1
        max.poll.interval.ms: 600000
    download-data:
      property:
        bootstrap.servers: ${kafka.internal.bootstrap.servers}
        group.id: ${kafka.internal.topic.prefix}mppr.x.query.consumer
        auto.offset.reset: earliest
        enable.auto.commit: false
        max.poll.records: 1
  producer:
    query-result: ${kafka.external.topic.prefix}query.rs
    query-error: ${kafka.external.topic.prefix}query.err
    delta-result: ${kafka.external.topic.prefix}delta.rs
    delta-error: ${kafka.external.topic.prefix}delta.err
    property:
      bootstrap.servers: ${kafka.external.bootstrap.servers}
    internal:
      tp-delete-tmp: ${kafka.internal.topic.prefix}tp.delete.tmp
      property:
        bootstrap.servers: ${kafka.internal.bootstrap.servers}

metrics:
  port: ${METRICS_PORT:9843}

logging:
  scl.delta:
    enabled: ${SCL_DELTA_ENABLED:false}
  request-response:
    delta-request: ${DELTA_REQUEST_LOG_ENABLED:false}
    delta-response: ${DELTA_RESPONSE_LOG_ENABLED:false}
    query-request: ${QUERY_REQUEST_LOG_ENABLED:false}
    query-response: ${QUERY_RESPONSE_LOG_ENABLED:false}

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

Настройка конфигурации ПОДД-адаптера - Модуль MPPR осуществляется путем редактирования параметров настроек в файле application.yml.

Пример файла application.yml для ПОДД-адаптера - Модуль MPPR можно найти в разделе «2.2. Настройка на состав программных средств» Руководства администратора.

В файле конфигурации ПОДД-адаптера - Модуль MPPR могут быть настроены следующие секции:

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

  • environment - название окружения (test, prod и т.д.);

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

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

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

  • prostore - настройка подключения к серверу и базе данных ProStore;

  • kafka - настройки параметров подключения к шине данных Apache Kafka;

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

  • logging - настройки журналирования запросов и ответов;

2.2.6.3.1. Секция http

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

Например:

http:
  port: ${HTTP_PORT:8085}

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

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

2.2.6.3.2. Секция environment

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

Например:

environment:
  name: ${ENVIRONMENT_NAME:test}

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

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

2.2.6.3.3. Секция executor

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

Например:

executor:
  reader-pool-size: ${EXECUTOR_READER_POOL_SIZE:20}
  max-execute-time: ${EXECUTOR_MAX_EXECUTE_TIME:600}
  log-pool-size: ${EXECUTOR_LOG_POOL_SIZE:20}

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

  • reader-pool-size - размер пула для чтения Kafka, например EXECUTOR_READER_POOL_SIZE:20;

  • max-execute-time - максимальное время выполнения задачи (сек), например EXECUTOR_MAX_EXECUTE_TIME:600;

  • log-pool-size - размер пула используемого для журналирования запросов и ответов, например EXECUTOR_LOG_POOL_SIZE:20.

2.2.6.3.4. Секция send

В секции send настраиваются ограничения на размер загружаемого файла.

Например:

send:
  channel-size: ${SEND_CHANNEL_SIZE:1}
  timeout: ${SEND_TIMEOUT:30}
  delete-topic: ${SEND_DELETE_TOPIC:true}
  compress: ${SEND_COMPRESS:none}

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

  • channel-size - размер канала на отправку сообщения, например SEND_CHANNEL_SIZE:10;

  • timeout - таймаут вычитывания данных из топика (сек), например SEND_TIMEOUT:30

  • delete-topic - удаление внешнего топика после выгрузки, например SEND_DELETE_TOPIC:true;

  • compress - сжатие выгружаемых сообщений (none или zstd), например SEND_COMPRESS:none.

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

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

Например:

prostore-rest-client:
  # Признак использования rest-api для взаимодействия с простором. Если false - будет использоваться jdbc драйвер
  enabled: ${PS_REST_CLIENT_ENABLED:true}
  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.6.3.6. Секция prostore

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

Например:

prostore:
  datasource:
    subprotocol: ${PS_SUBPROTOCOL:prostore}
    driver: ${PS_DRIVER:ru.datamart.prostore.jdbc.Driver}
    host: ${PS_HOST:localhost}
    port: ${PS_PORT:9195}
    initialPoolSize: ${PS_INITIAL_POOL_SIZE:5}
    maxPoolSize: ${PS_MAX_POOL_SIZE:8}
    additional-props:
      key: value

  kafka:
    message-limit: ${PS_MESSAGE_LIMIT:1000}
    zk-url: ${PS_ZK_KAFKA_URL:localhost:2181}
    statusEventTopic:
      topic: ${PS_STATUS_EVENT_TOPIC:status.event}
      commit-interval: ${kafka.commit-interval}
      property:
        bootstrap.servers: ${kafka.internal.bootstrap.servers}
        group.id: ${kafka.internal.topic.prefix}podd-adapter-mppr-status-event
        auto.offset.reset: earliest
        enable.auto.commit: false

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

  • subprotocol - Subprotocol для JDBC, например: PS_SUBPROTOCOL:prostore;

  • driver - имя класса JDBC драйвера, например: PS_DRIVER:ru.datamart.prostore.jdbc.Driver;

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

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

  • initialPoolSize - начальное число подключений к Prostore, например: S_INITIAL_POOL_SIZE:5;

  • maxPoolSize - максимальное число подключений к Prostore, например: PS_MAX_POOL_SIZE:8;

  • message-limit - MESSAGE LIMIT, который будет указан при создании EXTERNAL TABLE, например: PS_MESSAGE_LIMIT:1000;

  • zk-url - подключение к Zookeeper Prostore, например: PS_ZK_KAFKA_URL:t5-ads-01.ru-central1.internal:2181;

  • topic - статусный топик Prostore, например: PS_STATUS_EVENT_TOPIC:status.event;

  • group.id - префикс для топиков агента ПОДД, например: {AGENT_TOPIC_PREFIX:}podd-adapter-mppr-status-event.

2.2.6.3.7. Секция kafka

Секция kafka определяет настройки взаимодействия через ПОДД-адаптер между Поставщиком данных (producer) и Получателем данных (consumer).

В секции kafka собраны настройки параметров подключения к шине данных Apache Kafka.

Например:

kafka:
  agent.topic.prefix: ${AGENT_TOPIC_PREFIX:}
  max-concurrent-handle: ${KAFKA_MAX_CONCURRENT_HANDLE:10}
  commit-interval: ${KAFKA_COMMIT_INTERVAL:5s}
  external:
    bootstrap.servers: ${KAFKA_BOOTSTRAP_SERVERS:localhost:9092}
    topic.prefix: ${EXTERNAL_TOPIC_PREFIX:${agent.topic.prefix}}
  internal:
    bootstrap.servers: ${PS_KAFKA:localhost:9092}
    topic.prefix: ${INTERNAL_TOPIC_PREFIX:${agent.topic.prefix}}
  consumer:
    query-request:
      topic: ${kafka.internal.topic.prefix}mppr.delegate.rq
      max-concurrent-handle: ${kafka.max-concurrent-handle}
      commit-interval: ${kafka.commit-interval}
      property:
        bootstrap.servers: ${kafka.internal.bootstrap.servers}
        group.id: ${kafka.internal.topic.prefix}mppr.query.consumer
        auto.offset.reset: earliest
        enable.auto.commit: false
        max.poll.records: 1
        max.poll.interval.ms: 600000
    delta-request:
      topic: ${kafka.internal.topic.prefix}mppr.delta.rq
      max-concurrent-handle: ${kafka.max-concurrent-handle}
      commit-interval: ${kafka.commit-interval}
      property:
        bootstrap.servers: ${kafka.internal.bootstrap.servers}
        group.id: ${kafka.internal.topic.prefix}mppr.delta.consumer
        auto.offset.reset: earliest
        enable.auto.commit: false
        max.poll.records: 1
        max.poll.interval.ms: 600000
    download-data:
      property:
        bootstrap.servers: ${kafka.internal.bootstrap.servers}
        group.id: ${kafka.internal.topic.prefix}mppr.x.query.consumer
        auto.offset.reset: earliest
        enable.auto.commit: false
        max.poll.records: 1
  producer:
    query-result: ${kafka.external.topic.prefix}query.rs
    query-error: ${kafka.external.topic.prefix}query.err
    delta-result: ${kafka.external.topic.prefix}delta.rs
    delta-error: ${kafka.external.topic.prefix}delta.err
    property:
      bootstrap.servers: ${kafka.external.bootstrap.servers}
    internal:
      tp-delete-tmp: ${kafka.internal.topic.prefix}tp.delete.tmp
      property:
        bootstrap.servers: ${kafka.internal.bootstrap.servers}

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

  • topic - префикс для топиков агента ПОДД, например AGENT_TOPIC_PREFIX.

2.2.6.3.8. Секция metrics

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

Например:

metrics:
  port: ${METRICS_PORT:9843}

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

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

2.2.6.3.9. Секция logging

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

Например:

logging:
  scl.delta:
    enabled: ${SCL_DELTA_ENABLED:false}
  request-response:
    delta-request: ${DELTA_REQUEST_LOG_ENABLED:false}
    delta-response: ${DELTA_RESPONSE_LOG_ENABLED:false}
    query-request: ${QUERY_REQUEST_LOG_ENABLED:false}
    query-response: ${QUERY_RESPONSE_LOG_ENABLED:false}

LOG_FORMAT - Логирование в формате (JSON/TEXT) - указывается в logback.xml

2.2.7. Настройка ПОДД-адаптер-Модуль MPPW

2.2.7.1. Конфигурация модуля ПОДД-адаптер - Модуль MPPW (application.yml)

Файл application.yml – основной конфигурационный файл модуля, в котором задана его логика и порядок работы модуля: подключение к Агенту ПОДД, Брокеру сообщений Kafka, Zookeeper, а также настройка подключения к Prostore (секция: prostore), настройка метрик (секция: metrics) и другие настройки необходимые для корректной работы адаптера.

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

Приведем типовую структуру файла и возможные настройки ПОДД-адаптера - Модуль MPPW. Следует учитывать, что в конфигурационном файле следует задавать только те настройки, которые необходимы для решения текущих бизнес-задач.

tp:
  data-topic-prefix: ${DATA_TOPIC_PREFIX:tp.data}
  upload-topic-prefix: ${UPLOAD_TOPIC_PREFIX:tmp.w}

upload:
  data-topic-prefix: ${AGENT_TOPIC_PREFIX:}

http:
  port: ${HTTP_PORT:8090}

environment:
  name: ${ENVIRONMENT_NAME:test}

executor:
  reader-pool-size: ${EXECUTOR_READER_POOL_SIZE:20}
  max-execute-time: ${EXECUTOR_MAX_EXECUTE_TIME:600}

scheduler:
  delta-apply-request-timeout: ${DELTA_APPLY_REQUEST_TIMEOUT:60}

delta:
  # параметр ожидания перед повторной попыткой открытия дельты в случае ошибки
  open-delay: ${DELTA_OPEN_DELAY:${scheduler.delta-apply-request-timeout}}s


send:
  channel-size: ${SEND_CHANNEL_SIZE:10}
  timeout: ${SEND_TIMEOUT:60}

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}

prostore-rest-client:
  # Признак использования rest-api для взаимодействия с простором. Если false - будет использоваться jdbc драйвер
  enabled: ${PS_REST_CLIENT_ENABLED:true}
  host: ${PS_HOST:localhost}
  port: ${PS_PORT:9195}
  http:
    max-pool-size: ${PS_MAX_POOL_SIZE:8}

prostore:
  datasource:
    subprotocol: ${PS_SUBPROTOCOL:prostore}
    driver: ${PS_DRIVER:ru.datamart.prostore.jdbc.Driver}
    host: ${PS_HOST:localhost}
    port: ${PS_PORT:9195}
    initialPoolSize: ${PS_INITIAL_POOL_SIZE:5}
    maxPoolSize: ${PS_MAX_POOL_SIZE:8}
    additional-props:
      key: value
  key:
    primary: ${PRIMARY_KEY_NAME:tmp_id}
    type: ${PRIMARY_KEY_TYPE:BIGINT}
  kafka:
    message-limit: ${PS_MESSAGE_LIMIT:1000}
    zk-url: ${PS_ZK_KAFKA_URL:localhost:2181}
    properties:
      bootstrap.servers: ${PS_KAFKA:localhost:9092}

kafka:
  agent.topic.prefix: ${AGENT_TOPIC_PREFIX:}
  max-concurrent-handle: ${KAFKA_MAX_CONCURRENT_HANDLE:10}
  commit-interval: ${KAFKA_COMMIT_INTERVAL:5s}
  internal:
    bootstrap.servers: ${PS_KAFKA:localhost:9092}
    topic.prefix: ${INTERNAL_TOPIC_PREFIX:${kafka.agent.topic.prefix}}
  consumer:
    tp-request:
      topic: ${kafka.internal.topic.prefix}mppw.tp
      max-concurrent-handle: ${kafka.max-concurrent-handle}
      commit-interval: ${kafka.commit-interval}
      property:
        bootstrap.servers: ${kafka.internal.bootstrap.servers}
        group.id: ${kafka.internal.topic.prefix}podd-adapter-mppw-tp
        auto.offset.reset: earliest
        enable.auto.commit: false
    upload-request:
      topic: ${kafka.internal.topic.prefix}mppw.upload.rq
      commit-interval: ${kafka.commit-interval}
      property:
        bootstrap.servers: ${kafka.internal.bootstrap.servers}
        group.id: ${kafka.internal.topic.prefix}podd-adapter-mppw-upload
        auto.offset.reset: earliest
        enable.auto.commit: false
    delta-apply-request:
      topic: ${kafka.internal.topic.prefix}mppw.delta.in.rq
      commit-interval: ${kafka.commit-interval}
      property:
        bootstrap.servers: ${kafka.internal.bootstrap.servers}
        group.id: ${kafka.internal.topic.prefix}podd-adapter-mppw-delta
        auto.offset.reset: earliest
        enable.auto.commit: false
    upload-data:
      property:
        bootstrap.servers: ${kafka.internal.bootstrap.servers}
        group.id: ${kafka.internal.topic.prefix}podd-adapter-mppw-data
        auto.offset.reset: earliest
        enable.auto.commit: false
  producer:
    tp-result: ${kafka.internal.topic.prefix}mppw.rs
    upload-result: ${kafka.internal.topic.prefix}mppw.upload.rs
    delta-apply-result: ${kafka.internal.topic.prefix}mppw.delta.in.rs
    property:
      bootstrap.servers: ${kafka.internal.bootstrap.servers}

metrics:
  port: ${METRICS_PORT:9843}

jet-connector:
  use: ${JET_CONNECTOR_USE:false}
  kafka-consumer-group-name: ${JET_CONNECTOR_GROUP_NAME:mpww}
  kafka-poll-duration-ms: ${JET_POLL_DURATION:200}
  kafka-poll-buffer-size: ${JET_POLL_BUFFER:2000}
  db-records-buffer-size: ${JET_DB_RECORDS_BUFFER:2000}

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

Настройка конфигурации ПОДД-адаптера - Модуль MPPW осуществляется путем редактирования параметров настроек в файле application.yml.

Пример файла application.yml для ПОДД-адаптера - Модуль MPPW можно найти в разделе «2.2. Настройка на состав программных средств» Руководства администратора.

В файле конфигурации ПОДД-адаптера - Модуль MPPW могут быть настроены следующие секции:

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

  • upload - настройки загрузки через DATA-Uploader;

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

  • environment - указывается название окружения (test, prod и т.д.);

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

  • scheduler - настройки планировщика отложенных заданий;

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

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

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

  • prostore - указываются настройки подключения к ProStore;

  • kafka - настройки параметров подключения к шине данных Apache Kafka;

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

  • jet-connector - подготовлен для оптимизации задержек записи.

2.2.7.3.1. Секция tp

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

Например:

tp:
  data-topic-prefix: ${DATA_TOPIC_PREFIX:tp.data}
  upload-topic-prefix: ${UPLOAD_TOPIC_PREFIX:tmp.w}

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

  • data-topic-prefix - префикс топика, откуда будут вычитываться данные, например DATA_TOPIC_PREFIX:tp.data;

  • upload-topic-prefix - префикс топика, куда будут загружаться данные для их последующей загрузки в витрину, например UPLOAD_TOPIC_PREFIX:tmp.w.

2.2.7.3.2. Секция upload

В секции upload - указываются настройки загрузки через DATA-Uploader

Например:

upload:
  data-topic-prefix: ${AGENT_TOPIC_PREFIX:}

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

  • AGENT_TOPIC_PREFIX: - значение префикса для топиков. Топики взаимодействия с ПОДД-адаптером - Модуль исполнения запросов (см. раздел «Спецификация модуля ПОДД-адаптер-Модуль исполнения запросов»);

2.2.7.3.3. Секция http

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

Например:

http:
  port: ${HTTP_PORT:8090}

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

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

2.2.7.3.4. Секция environment

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

Например:

environment:
  name: ${ENVIRONMENT_NAME:test}

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

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

2.2.7.3.5. Секция executor

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

Например:

executor:
  reader-pool-size: ${EXECUTOR_READER_POOL_SIZE:20}
  max-execute-time: ${EXECUTOR_MAX_EXECUTE_TIME:600}

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

  • reader-pool-size - размер пула для чтения Kafka, например EXECUTOR_READER_POOL_SIZE:20;

  • max-execute-time - максимальное время выполнения задачи (сек), например EXECUTOR_MAX_EXECUTE_TIME:600.

2.2.7.3.6. Секция scheduler

Секция scheduler предназначена для настроек планировщика отложенных заданий.

Например:

scheduler:
  delta-apply-request-timeout: ${DELTA_APPLY_REQUEST_TIMEOUT:60}

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

  • delta-apply-request-timeout - таймаут применения отложенной дельты, например DELTA_APPLY_REQUEST_TIMEOUT:60;

2.2.7.3.7. Секция delta

В секции delta настраивается параметр ожидания перед повторной попыткой открытия дельты в случае ошибки

Например:

delta:
  # параметр ожидания перед повторной попыткой открытия дельты в случае ошибки
  open-delay: ${DELTA_OPEN_DELAY:${scheduler.delta-apply-request-timeout}}s

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

  • open-delay - количество секунд ожидания перед повторной попыткой открытия дельты в случае ошибки, например DELTA_OPEN_DELAY:${scheduler.delta-apply-request-timeout};

2.2.7.3.8. Секция send

В секции send настраиваются ограничения на размер загружаемого файла.

Например:

send:
  channel-size: ${SEND_CHANNEL_SIZE:10}
  timeout: ${SEND_TIMEOUT:60}

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

  • channel-size - размер канала на отправку сообщения, например SEND_CHANNEL_SIZE:10;

  • timeout - таймаут вычитывания данных из топика (сек), например SEND_TIMEOUT:60.

2.2.7.3.9. Секция 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.7.3.10. Секция prostore-rest-client

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

Например:

prostore-rest-client:
  enabled: true
  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.7.3.11. Секция prostore

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

Например:

prostore:
  datasource:
    subprotocol: ${PS_SUBPROTOCOL:prostore}
    driver: ${PS_DRIVER:ru.datamart.prostore.jdbc.Driver}
    host: ${PS_HOST:localhost}
    port: ${PS_PORT:9195}
    initialPoolSize: ${PS_INITIAL_POOL_SIZE:5}
    maxPoolSize: ${PS_MAX_POOL_SIZE:8}
    additional-props:
      key: value
  key:
    primary: ${PRIMARY_KEY_NAME:tmp_id}
    type: ${PRIMARY_KEY_TYPE:BIGINT}
  kafka:
    message-limit: ${PS_MESSAGE_LIMIT:1000}
    zk-url: ${PS_ZK_KAFKA_URL:localhost:2181}
    properties:
      bootstrap.servers: ${PS_KAFKA:localhost:9092}

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

  • subprotocol - Subprotocol для JDBC, например PS_SUBPROTOCOL:prostore;

  • driver - имя класса JDBC драйвера, например PS_DRIVER:ru.datamart.prostore.jdbc.Driver;

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

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

  • initialPoolSize - начальное число подключений к Prostore, например PS_INITIAL_POOL_SIZE:5;

  • maxPoolSize - максимальное число подключений к Prostore, например PS_MAX_POOL_SIZE:8;

  • primary - имя первичного ключа, например PRIMARY_KEY_NAME:tmp_id;

  • type - тип первичного ключа, например PRIMARY_KEY_TYPE:BIGINT;

  • message-limit - MESSAGE LIMIT, который будет указан при создании EXTERNAL UPLOAD TABLE, например PS_MESSAGE_LIMIT:1000;

  • zk-url - подключение к Zookeeper Prostore, например PS_ZK_KAFKA_URL:t5-ads-01.ru-central1.internal:2181;

  • bootstrap.servers - подключение к Kafka Prostore, например PS_KAFKA:t5-ads-01.ru-central1.internal:9092.

2.2.7.3.12. Секция kafka

В секции kafka собраны настройки параметров подключения к шине данных Apache Kafka.

Например:

kafka:
  agent.topic.prefix: ${AGENT_TOPIC_PREFIX:}
  max-concurrent-handle: ${KAFKA_MAX_CONCURRENT_HANDLE:10}
  commit-interval: ${KAFKA_COMMIT_INTERVAL:5s}
  internal:
    bootstrap.servers: ${PS_KAFKA:localhost:9092}
    topic.prefix: ${INTERNAL_TOPIC_PREFIX:${agent.topic.prefix}}
  consumer:
    tp-request:
      topic: ${kafka.internal.topic.prefix}mppw.tp
      max-concurrent-handle: ${kafka.max-concurrent-handle}
      commit-interval: ${kafka.commit-interval}
      property:
        bootstrap.servers: ${kafka.internal.bootstrap.servers}
        group.id: ${kafka.internal.topic.prefix}podd-adapter-mppw-tp
        auto.offset.reset: earliest
        enable.auto.commit: false
    upload-request:
      topic: ${kafka.internal.topic.prefix}mppw.upload.rq
      commit-interval: ${kafka.commit-interval}
      property:
        bootstrap.servers: ${kafka.internal.bootstrap.servers}
        group.id: ${kafka.internal.topic.prefix}podd-adapter-mppw-upload
        auto.offset.reset: earliest
        enable.auto.commit: false
    delta-apply-request:
      topic: ${kafka.internal.topic.prefix}mppw.delta.in.rq
      commit-interval: ${kafka.commit-interval}
      property:
        bootstrap.servers: ${kafka.internal.bootstrap.servers}
        group.id: ${kafka.internal.topic.prefix}podd-adapter-mppw-delta
        auto.offset.reset: earliest
        enable.auto.commit: false
    upload-data:
      property:
        bootstrap.servers: ${kafka.internal.bootstrap.servers}
        group.id: ${kafka.internal.topic.prefix}podd-adapter-mppw-data
        auto.offset.reset: earliest
        enable.auto.commit: false
  producer:
    tp-result: ${kafka.internal.topic.prefix}mppw.rs
    upload-result: ${kafka.internal.topic.prefix}mppw.upload.rs
    delta-apply-result: ${kafka.internal.topic.prefix}mppw.delta.in.rs
    property:
      bootstrap.servers: ${kafka.internal.bootstrap.servers}

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

  • AGENT_TOPIC_PREFIX - префикс для топиков агента ПОДД, например.

2.2.7.3.13. Секция metrics

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

Например:

metrics:
  port: ${METRICS_PORT:9843}

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

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

2.2.7.3.14. Секция jet-connector

Секция jet-connector предназначена для оптимизации задержек записи данных.

Например:

jet-connector:
use: ${JET_CONNECTOR_USE:false}
kafka-consumer-group-name: ${JET_CONNECTOR_GROUP_NAME:mpww}
kafka-poll-duration-ms: ${JET_POLL_DURATION:200}
kafka-poll-buffer-size: ${JET_POLL_BUFFER:2000}
db-records-buffer-size: ${JET_DB_RECORDS_BUFFER:2000}

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

  • use - флаг активации jet connector’а, например {JET_CONNECTOR_USE:false};

  • kafka-consumer-group-name - имя консьюмер-группы, загружающей данные, например: {JET_CONNECTOR_GROUP_NAME:mpww};

  • kafka-poll-duration-ms - максимальное время одного прохода вычитки из топика в мс, например: {JET_POLL_DURATION:200};

  • kafka-poll-buffer-size - максимальный размер буфера прочитанных, но еще не загруженных сообщений, например: {JET_POLL_BUFFER:2000};

  • db-records-buffer-size - максимальное количество строк, загружаемых в таблицу за один проход, например: {JET_DB_RECORDS_BUFFER:2000}.

2.2.8. Настройка ПОДД-адаптер – Модуль импорта данных табличных параметров

2.2.8.1. Конфигурация модуля ПОДД-адаптер - Модуль импорта данных табличных параметров (application.yml)

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

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

Приведем типовую структуру файла и возможные настройки ПОДД-адаптера - Модуль импорта данных табличных параметров. Следует учитывать, что в конфигурационном файле следует задавать только те настройки, которые необходимы для решения текущих бизнес-задач.

http-server:
  port: ${HTTP_PORT:8091}

environment:
  name: ${ENVIRONMENT_NAME:test}

zookeeper:
  # Подключение к зукипер
  connection-string: ${ZOOKEEPER:localhost:2181}

prostore-rest-client:
  # Признак использования rest-api для взаимодействия с простором. Если false - будет использоваться jdbc драйвер
  enabled: ${PS_REST_CLIENT_ENABLED:true}
  host: ${PS_HOST:localhost}
  port: ${PS_PORT:9195}
  http:
    max-pool-size: ${PS_MAX_POOL_SIZE:8}

prostore:
  key:
    primary: tmp_id
    type: BIGINT
  datasource:
    # subprotocol для jdbc
    subprotocol: ${PS_SUBPROTOCOL:prostore}
    # Драйвер для подключения к простору
    driver: ${PS_DRIVER:ru.datamart.prostore.jdbc.Driver}
    # Подключение к Prostore
    host: ${PS_HOST:localhost}
    # Prostore порт
    port: ${PS_PORT:9195}
    # Prostore начальный размер пула
    initialPoolSize: ${PS_INITIAL_POOL_SIZE:5}
    # Prostore максимальный размер пула
    maxPoolSize: ${PS_MAX_POOL_SIZE:8}
  standalone:
    source: ${PS_STANDALONE_SOURCE:ADB}

# общие настройки подключения к кафке
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:${kafka.agent.topic.prefix}}
  internal:
    bootstrap.servers: ${PS_KAFKA:localhost:9092}
    topic.prefix: ${INTERNAL_TOPIC_PREFIX:${kafka.agent.topic.prefix}}
  # параметры консьюмера сообщений
  consumer:
    bootstrap.servers: ${kafka.internal.bootstrap.servers}
    # Смещение при первом запуске приложения
    auto.offset.reset: earliest
  # параметры продъюсера сообщений
  producer:
    bootstrap.servers: ${kafka.internal.bootstrap.servers}
  # параметры клиента администратора для удаления временных топиков
  admin:
    bootstrap.servers: ${kafka.internal.bootstrap.servers}

# блок настроек импорта данных табличных параметров
query:
  data-topic-prefix: ${DATA_TOPIC_PREFIX:tp.data}
  # топик запросов
  request-topic: ${kafka.internal.topic.prefix}tp.upload.query
  # топик запросов на исполнение после загрузки данных
  response-topic: ${kafka.external.topic.prefix}query.rq
  # топик с ошибками
  error-topic: ${kafka.external.topic.prefix}query.err
  # блок настроек отмены запросов
  cancel:
    # топик запросов на отмену исполнения
    request-topic: ${kafka.external.topic.prefix}cancel.rq
    # настройки кеша отмененных запросов
    cache:
      # начальный размер кеша
      initial-capacity: 10000
      # время вытеснения из кеша
      expire-after-access: 60m
  # максимальное количество обработчиков входящих запросов
  max-concurrent-handle: ${kafka.max-concurrent-handle}
  # периодичность фиксации оффсета обработанных сообщений
  commit-interval: ${kafka.commit-interval}
  # дополнительные параметры консьюмера запросов
  consumer-properties:
    group.id: ${kafka.internal.topic.prefix}import.tp.query.consumer
  # дополнительные параметры продъюсера ответов
  producer-properties:
    bootstrap.servers: ${kafka.external.bootstrap.servers}
  # дополнительные параметры администрирования кафки
  admin-properties: [ ]

# блок настроек сервиса загрузки данных mppw
mppw:
  # топик запросов к сервису mppw
  request-topic: ${kafka.internal.topic.prefix}mppw.tp
  # топик ответов от сервиса mppw
  response-topic: ${kafka.internal.topic.prefix}mppw.rs
  # максимальное количество обработчиков входящих запросов
  max-concurrent-handle: ${kafka.max-concurrent-handle}
  # периодичность фиксации оффсета обработанных сообщений
  commit-interval: ${kafka.commit-interval}
  # дополнительные параметры консьюмера запросов
  consumer-properties:
    group.id: ${kafka.internal.topic.prefix}import.tp.response.consumer
    # Смещение при первом запуске приложения
    auto.offset.reset: earliest
  # дополнительные параметры продъюсера ответов
  producer-properties: [ ]

# блок настроек механизма очистки
delete:
  # входящий топик запросов удаления ресурсов
  request-topic: ${kafka.internal.topic.prefix}tp.delete.tmp
  # максимальное количество обработчиков входящих запросов
  max-concurrent-handle: ${kafka.max-concurrent-handle}
  # периодичность фиксации оффсета обработанных сообщений
  commit-interval: ${kafka.commit-interval}
  # дополнительные параметры консьюмера запросов
  consumer-properties:
    group.id: ${kafka.internal.topic.prefix}import.tp.delete.consumer

# блок настроек дельт
delta:
  # префикс топиков с данными
  data-topic-prefix: ${DATA_TOPIC_PREFIX:tp.data}
  # признак необходимости удаления топиков
  delete-topics: ${IMPORT_DELTA_DELETE_TOPICS:true}
  # дополнительные параметры администрирования кафки
  admin-properties: [ ]
  # блок параметров поставщика данных
  provider:
    # топик запросов
    request-topic: ${kafka.internal.topic.prefix}tp.upload.delta
    # топик ответов
    response-topic: ${kafka.internal.topic.prefix}delta.rq
    # топик ошибок
    error-topic: ${kafka.internal.topic.prefix}tp.upload.err
    # максимальное количество обработчиков входящих запросов
    max-concurrent-handle: ${kafka.max-concurrent-handle}
    # периодичность фиксации оффсета обработанных сообщений
    commit-interval: ${kafka.commit-interval}
    # дополнительные параметры консьюмера запросов
    consumer-properties:
      group.id: ${kafka.internal.topic.prefix}import.tp.delta.consumer
    # дополнительные параметры продъюсера ответов
    producer-properties: [ ]
  # блок параметров получателя данных
  recipient:
    # топик запросов
    request-topic: ${kafka.internal.topic.prefix}tp.upload.delta.in
    # топик ответов
    response-topic: ${kafka.internal.topic.prefix}delta.in
    # топик ошибок
    error-topic: ${kafka.internal.topic.prefix}tp.upload.in.err
    # максимальное количество обработчиков входящих запросов
    max-concurrent-handle: ${kafka.max-concurrent-handle}
    # периодичность фиксации оффсета обработанных сообщений
    commit-interval: ${kafka.commit-interval}
    # дополнительные параметры консьюмера запросов
    consumer-properties:
      group.id: ${kafka.internal.topic.prefix}import.tp.delta.in.consumer
    # дополнительные параметры продъюсера ответов
    producer-properties: [ ]

metrics:
  # Порт сервера для получения метрик
  port: ${METRICS_PORT:19843}
  kafkaAdminClientName: kafkaAdminClient

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

Настройка конфигурации ПОДД-адаптера - Модуль импорта данных табличных параметров осуществляется путем редактирования параметров настроек в файле application.yml.

Пример конфигурации файла application.yml для ПОДД-адаптера - Модуль импорта данных табличных параметров см. в разделе Пример файла application.yml Руководства администратора.

В файле конфигурации ПОДД-адаптера - Модуль импорта данных табличных параметров могут быть настроены следующие секции:

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

  • environment - название окружения (test, prod и т.д.);

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

  • prostore-api-client - блок параметров конфигурирования взаимодействия с ProStore. Если false - будет использоваться JDBC-драйвер;

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

  • kafka - общие настройки подключения к Kafka;

  • query - блок настроек импорта данных табличных параметров;

  • mppw - блок настроек сервиса загрузки данных mppw;

  • delete - блок настроек механизма очистки;

  • delta - настройка работы с импортом дельт;

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

2.2.8.3.1. Секция http-server

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

Например:

http:
  port: ${HTTP_PORT:8091}

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

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

2.2.8.3.2. Секция environment

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

Например:

environment:
  name: ${ENVIRONMENT_NAME:test}

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

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

2.2.8.3.3. Секция zookeeper

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

Например:

zookeeper:
  # Подключение к зукипер
  connection-string: ${ZOOKEEPER:t5-adsp-01.ru-central1.internal:2181}

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

  • connection-string - подключение к Zookeeper DS, например ZOOKEEPER:t5-adsp-01.ru-central1.internal:2181.

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

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

Например:

prostore-rest-client:
  enabled: true
  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.3.5. Секция prostore

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

Например:

prostore:
  key:
    primary: tmp_id
    type: BIGINT
  datasource:
    # subprotocol для jdbc
    subprotocol: ${PS_SUBPROTOCOL:prostore}
    # Драйвер для подключения к простору
    driver: ${PS_DRIVER:ru.datamart.prostore.jdbc.Driver}
    # Подключение к Prostore
    host: ${PS_HOST:localhost}
    # Prostore порт
    port: ${PS_PORT:9195}
    # Prostore начальный размер пула
    initialPoolSize: ${PS_INITIAL_POOL_SIZE:5}
    # Prostore максимальный размер пула
    maxPoolSize: ${PS_MAX_POOL_SIZE:8}
  standalone:
    source: ${PS_STANDALONE_SOURCE:ADB}

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

  • subprotocol - subprotocol для jdbc, например PS_SUBPROTOCOL:prostore;

  • driver - драйвер для подключения к простору, например PS_DRIVER:ru.datamart.prostore.jdbc.Driver;

  • host - подключение к ядру ProStore, например: DTMDB_HOST:t5-prostore-01.ru-central1.internal;

  • port - порт ядра ProStore, например: PROSTOREDB_PORT:9197;

  • initialPoolSize - Prostore начальный размер пула, например PS_INITIAL_POOL_SIZE:5;

  • maxPoolSize - размер пула JDBC подключения, например: maxPoolSize: 5;

  • source - источник для standalone таблицы (ADB/ADP), например PS_STANDALONE_SOURCE:ADB.

2.2.8.3.6. Секция kafka

Секция kafka хранит общие настройки подключения к Kafka.

Например:

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}}
  internal:
    bootstrap.servers: ${PS_KAFKA:localhost:9092}
    topic.prefix: ${INTERNAL_TOPIC_PREFIX:${agent.topic.prefix}}
  # параметры консьюмера сообщений
  consumer:
    bootstrap.servers: ${kafka.internal.bootstrap.servers}
    # Смещение при первом запуске приложения
    auto.offset.reset: earliest
  # параметры продьюсера сообщений
  producer:
    bootstrap.servers: ${kafka.internal.bootstrap.servers}
  # параметры клиента администратора для удаления временных топиков
  admin:
    bootstrap.servers: ${kafka.internal.bootstrap.servers}

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

  • max-concurrent-handle - максимальное количество обработчиков входящих запросов;

  • commit-interval - периодичность фиксации оффсета обработанных сообщений;

  • group.id - GroupId для подписчика;

  • auto.offset.reset - смещение при первом запуске приложения;

  • enable.auto.commit- Вкл/выкл автоматический коммит;

  • consumer - параметры консьюмера сообщений;

  • producer – параметры продьюсера сообщений.

2.2.8.3.7. Секция query

Секция query хранит блок настроек импорта данных табличных параметров.

Например:

query:
  data-topic-prefix: ${DATA_TOPIC_PREFIX:tp.data}
  # топик запросов
  request-topic: ${kafka.internal.topic.prefix}tp.upload.query
  # топик запросов на исполнение после загрузки данных
  response-topic: ${kafka.external.topic.prefix}query.rq
  # топик с ошибками
  error-topic: ${kafka.external.topic.prefix}query.err
  # блок настроек отмены запросов
  cancel:
    # топик запросов на отмену исполнения
    request-topic: ${kafka.external.topic.prefix}cancel.rq
    # настройки кеша отмененных запросов
    cache:
      # начальный размер кеша
      initial-capacity: 10000
      # время вытеснения из кеша
      expire-after-access: 60m
  # максимальное количество обработчиков входящих запросов
  max-concurrent-handle: ${kafka.max-concurrent-handle}
  # периодичность фиксации оффсета обработанных сообщений
  commit-interval: ${kafka.commit-interval}
  # дополнительные параметры консьюмера запросов
  consumer-properties:
    group.id: ${kafka.internal.topic.prefix}import.tp.query.consumer
  # дополнительные параметры продюсера ответов
  producer-properties:
    bootstrap.servers: ${kafka.external.bootstrap.servers}
  # дополнительные параметры администрирования кафки
  admin-properties: [ ]

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

  • request-topic - топик запросов;

  • response-topic - топик запросов на исполнение после загрузки данных;

  • error-topic - топик с ошибками;

  • cancel- блок настроек отмены запросов;

  • initial-capacity - начальный размер кеша;

  • expire-after-access - время вытеснения из кеша;

  • max-concurrent-handle - максимальное количество обработчиков входящих запросов;

  • commit-interval - периодичность фиксации оффсета обработанных сообщений;

  • consumer-properties - дополнительные параметры консьюмера запросов;

  • producer-properties - дополнительные параметры продюсера ответов;

  • admin-properties - дополнительные параметры администрирования кафки.

2.2.8.3.8. Секция mppw

Секция mppw хранит блок настроек сервиса загрузки данных mppw.

mppw:
  # топик запросов к сервису mppw
  request-topic: ${kafka.internal.topic.prefix}mppw.tp
  # топик ответов от сервиса mppw
  response-topic: ${kafka.internal.topic.prefix}mppw.rs
  # максимальное количество обработчиков входящих запросов
  max-concurrent-handle: ${kafka.max-concurrent-handle}
  # периодичность фиксации оффсета обработанных сообщений
  commit-interval: ${kafka.commit-interval}
  # дополнительные параметры консьюмера запросов
  consumer-properties:
    group.id: ${kafka.internal.topic.prefix}import.tp.response.consumer
    # Смещение при первом запуске приложения
    auto.offset.reset: earliest
  # дополнительные параметры продюсера ответов
  producer-properties: [ ]

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

  • request-topic - топик запросов к сервису mppw;

  • response-topic - топик ответов от сервиса mppw;

  • max-concurrent-handle - максимальное количество обработчиков входящих запросов;

  • commit-interval- периодичность фиксации оффсета обработанных сообщений;

  • consumer-properties - дополнительные параметры консьюмера запросов;

  • producer-properties - дополнительные параметры продюсера ответов.

2.2.8.3.9. Секция delete

Секция delete хранит блок настроек механизма очистки.

Например:

delete:
  # входящий топик запросов удаления ресурсов
  request-topic: ${kafka.internal.topic.prefix}tp.delete.tmp
  # максимальное количество обработчиков входящих запросов
  max-concurrent-handle: ${kafka.max-concurrent-handle}
  # периодичность фиксации оффсета обработанных сообщений
  commit-interval: ${kafka.commit-interval}
  # дополнительные параметры консьюмера запросов
  consumer-properties:
    group.id: ${kafka.internal.topic.prefix}import.tp.delete.consumer

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

  • request-topic - топик запросов к сервису mppw;

  • response-topic - топик ответов от сервиса mppw;

  • max-concurrent-handle - максимальное количество обработчиков входящих запросов;

  • commit-interval- периодичность фиксации оффсета обработанных сообщений;

  • consumer-properties - дополнительные параметры консьюмера запросов.

2.2.8.3.10. Секция delta

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

Например:

delta:
  # префикс топиков с данными
  data-topic-prefix: ${DATA_TOPIC_PREFIX:tp.data}
  # признак необходимости удаления топиков
  delete-topics: ${IMPORT_DELTA_DELETE_TOPICS:true}
  # дополнительные параметры администрирования кафки
  admin-properties: [ ]
  # блок параметров поставщика данных
  provider:
    # топик запросов
    request-topic: ${kafka.internal.topic.prefix}tp.upload.delta
    # топик ответов
    response-topic: ${kafka.internal.topic.prefix}delta.rq
    # топик ошибок
    error-topic: ${kafka.internal.topic.prefix}tp.upload.err
    # максимальное количество обработчиков входящих запросов
    max-concurrent-handle: ${kafka.max-concurrent-handle}
    # периодичность фиксации оффсета обработанных сообщений
    commit-interval: ${kafka.commit-interval}
    # дополнительные параметры консьюмера запросов
    consumer-properties:
      group.id: ${kafka.internal.topic.prefix}import.tp.delta.consumer
    # дополнительные параметры продъюсера ответов
    producer-properties: [ ]
  # блок параметров получателя данных
  recipient:
    # топик запросов
    request-topic: ${kafka.internal.topic.prefix}tp.upload.delta.in
    # топик ответов
    response-topic: ${kafka.internal.topic.prefix}delta.in
    # топик ошибок
    error-topic: ${kafka.internal.topic.prefix}tp.upload.in.err
    # максимальное количество обработчиков входящих запросов
    max-concurrent-handle: ${kafka.max-concurrent-handle}
    # периодичность фиксации оффсета обработанных сообщений
    commit-interval: ${kafka.commit-interval}
    # дополнительные параметры консьюмера запросов
    consumer-properties:
      group.id: ${kafka.internal.topic.prefix}import.tp.delta.in.consumer
    # дополнительные параметры продъюсера ответов
    producer-properties: [ ]

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

  • data-topic-prefix - префикс топиков с данными;

  • delete-topics - признак необходимости удаления топиков;

  • admin-properties - дополнительные параметры администрирования кафки;

  • provider - блок параметров поставщика данных;

  • recipient - блок параметров получателя данных;

  • request-topic - топик запросов;

  • response-topic - топик запросов на исполнение после загрузки данных;

  • error-topic - топик с ошибками;

  • max-concurrent-handle - максимальное количество обработчиков входящих запросов;

  • commit-interval - периодичность фиксации оффсета обработанных сообщений;

  • consumer-properties - дополнительные параметры консьюмера запросов;

  • producer-properties - дополнительные параметры продюсера ответов.

2.2.8.3.11. Секция metrics

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

Например:

metrics:
  # Порт сервера для получения метрик
  port: ${METRICS_PORT:9843}
  kafkaAdminClientName: kafkaAdminClient

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

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

2.2.9. Настройка ПОДД-адаптер – Модуль группировки данных табличных параметров

2.2.9.1. Конфигурация модуля ПОДД-адаптер - Модуль импорта данных табличных параметров (application.yml)

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

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

Приведем типовую структуру файла и возможные настройки ПОДД-адаптера - Модуль импорта данных табличных параметров. Следует учитывать, что в конфигурационном файле следует задавать только те настройки, которые необходимы для решения текущих бизнес-задач.

http-server:
  port: ${HTTP_PORT:8091}

environment:
  name: ${ENVIRONMENT_NAME:test}

zookeeper:
  # Подключение к зукипер
  connection-string: ${ZOOKEEPER:localhost:2181}

prostore-rest-client:
  # Признак использования rest-api для взаимодействия с простором. Если false - будет использоваться jdbc драйвер
  enabled: ${PS_REST_CLIENT_ENABLED:true}
  host: ${PS_HOST:localhost}
  port: ${PS_PORT:9195}
  http:
    max-pool-size: ${PS_MAX_POOL_SIZE:8}

prostore:
  key:
    primary: tmp_id
    type: BIGINT
  datasource:
    # subprotocol для jdbc
    subprotocol: ${PS_SUBPROTOCOL:prostore}
    # Драйвер для подключения к простору
    driver: ${PS_DRIVER:ru.datamart.prostore.jdbc.Driver}
    # Подключение к Prostore
    host: ${PS_HOST:localhost}
    # Prostore порт
    port: ${PS_PORT:9195}
    # Prostore начальный размер пула
    initialPoolSize: ${PS_INITIAL_POOL_SIZE:5}
    # Prostore максимальный размер пула
    maxPoolSize: ${PS_MAX_POOL_SIZE:8}
  standalone:
    source: ${PS_STANDALONE_SOURCE:ADB}

# общие настройки подключения к кафке
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:${kafka.agent.topic.prefix}}
  internal:
    bootstrap.servers: ${PS_KAFKA:localhost:9092}
    topic.prefix: ${INTERNAL_TOPIC_PREFIX:${kafka.agent.topic.prefix}}
  # параметры консьюмера сообщений
  consumer:
    bootstrap.servers: ${kafka.internal.bootstrap.servers}
    # Смещение при первом запуске приложения
    auto.offset.reset: earliest
  # параметры продъюсера сообщений
  producer:
    bootstrap.servers: ${kafka.internal.bootstrap.servers}
  # параметры клиента администратора для удаления временных топиков
  admin:
    bootstrap.servers: ${kafka.internal.bootstrap.servers}

# блок настроек импорта данных табличных параметров
query:
  data-topic-prefix: ${DATA_TOPIC_PREFIX:tp.data}
  # топик запросов
  request-topic: ${kafka.internal.topic.prefix}tp.upload.query
  # топик запросов на исполнение после загрузки данных
  response-topic: ${kafka.external.topic.prefix}query.rq
  # топик с ошибками
  error-topic: ${kafka.external.topic.prefix}query.err
  # блок настроек отмены запросов
  cancel:
    # топик запросов на отмену исполнения
    request-topic: ${kafka.external.topic.prefix}cancel.rq
    # настройки кеша отмененных запросов
    cache:
      # начальный размер кеша
      initial-capacity: 10000
      # время вытеснения из кеша
      expire-after-access: 60m
  # максимальное количество обработчиков входящих запросов
  max-concurrent-handle: ${kafka.max-concurrent-handle}
  # периодичность фиксации оффсета обработанных сообщений
  commit-interval: ${kafka.commit-interval}
  # дополнительные параметры консьюмера запросов
  consumer-properties:
    group.id: ${kafka.internal.topic.prefix}import.tp.query.consumer
  # дополнительные параметры продъюсера ответов
  producer-properties:
    bootstrap.servers: ${kafka.external.bootstrap.servers}
  # дополнительные параметры администрирования кафки
  admin-properties: [ ]

# блок настроек сервиса загрузки данных mppw
mppw:
  # топик запросов к сервису mppw
  request-topic: ${kafka.internal.topic.prefix}mppw.tp
  # топик ответов от сервиса mppw
  response-topic: ${kafka.internal.topic.prefix}mppw.rs
  # максимальное количество обработчиков входящих запросов
  max-concurrent-handle: ${kafka.max-concurrent-handle}
  # периодичность фиксации оффсета обработанных сообщений
  commit-interval: ${kafka.commit-interval}
  # дополнительные параметры консьюмера запросов
  consumer-properties:
    group.id: ${kafka.internal.topic.prefix}import.tp.response.consumer
    # Смещение при первом запуске приложения
    auto.offset.reset: earliest
  # дополнительные параметры продъюсера ответов
  producer-properties: [ ]

# блок настроек механизма очистки
delete:
  # входящий топик запросов удаления ресурсов
  request-topic: ${kafka.internal.topic.prefix}tp.delete.tmp
  # максимальное количество обработчиков входящих запросов
  max-concurrent-handle: ${kafka.max-concurrent-handle}
  # периодичность фиксации оффсета обработанных сообщений
  commit-interval: ${kafka.commit-interval}
  # дополнительные параметры консьюмера запросов
  consumer-properties:
    group.id: ${kafka.internal.topic.prefix}import.tp.delete.consumer

# блок настроек дельт
delta:
  # префикс топиков с данными
  data-topic-prefix: ${DATA_TOPIC_PREFIX:tp.data}
  # признак необходимости удаления топиков
  delete-topics: ${IMPORT_DELTA_DELETE_TOPICS:true}
  # дополнительные параметры администрирования кафки
  admin-properties: [ ]
  # блок параметров поставщика данных
  provider:
    # топик запросов
    request-topic: ${kafka.internal.topic.prefix}tp.upload.delta
    # топик ответов
    response-topic: ${kafka.internal.topic.prefix}delta.rq
    # топик ошибок
    error-topic: ${kafka.internal.topic.prefix}tp.upload.err
    # максимальное количество обработчиков входящих запросов
    max-concurrent-handle: ${kafka.max-concurrent-handle}
    # периодичность фиксации оффсета обработанных сообщений
    commit-interval: ${kafka.commit-interval}
    # дополнительные параметры консьюмера запросов
    consumer-properties:
      group.id: ${kafka.internal.topic.prefix}import.tp.delta.consumer
    # дополнительные параметры продъюсера ответов
    producer-properties: [ ]
  # блок параметров получателя данных
  recipient:
    # топик запросов
    request-topic: ${kafka.internal.topic.prefix}tp.upload.delta.in
    # топик ответов
    response-topic: ${kafka.internal.topic.prefix}delta.in
    # топик ошибок
    error-topic: ${kafka.internal.topic.prefix}tp.upload.in.err
    # максимальное количество обработчиков входящих запросов
    max-concurrent-handle: ${kafka.max-concurrent-handle}
    # периодичность фиксации оффсета обработанных сообщений
    commit-interval: ${kafka.commit-interval}
    # дополнительные параметры консьюмера запросов
    consumer-properties:
      group.id: ${kafka.internal.topic.prefix}import.tp.delta.in.consumer
    # дополнительные параметры продъюсера ответов
    producer-properties: [ ]

metrics:
  # Порт сервера для получения метрик
  port: ${METRICS_PORT:19843}
  kafkaAdminClientName: kafkaAdminClient

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

Настройка конфигурации ПОДД-адаптера - Модуль импорта данных табличных параметров осуществляется путем редактирования параметров настроек в файле application.yml.

Пример конфигурации файла application.yml для ПОДД-адаптера - Модуль импорта данных табличных параметров см. в разделе Пример файла application.yml Руководства администратора.

В файле конфигурации ПОДД-адаптера - Модуль импорта данных табличных параметров могут быть настроены следующие секции:

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

  • environment - название окружения (test, prod и т.д.);

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

  • prostore-api-client - блок параметров конфигурирования взаимодействия с ProStore. Если false - будет использоваться JDBC-драйвер;

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

  • kafka - общие настройки подключения к Kafka;

  • query - блок настроек импорта данных табличных параметров;

  • mppw - блок настроек сервиса загрузки данных mppw;

  • delete - блок настроек механизма очистки;

  • delta - настройка работы с импортом дельт;

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

2.2.9.3.1. Секция http-server

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

Например:

http:
  port: ${HTTP_PORT:8091}

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

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

2.2.9.3.2. Секция environment

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

Например:

environment:
  name: ${ENVIRONMENT_NAME:test}

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

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

2.2.9.3.3. Секция zookeeper

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

Например:

zookeeper:
  # Подключение к зукипер
  connection-string: ${ZOOKEEPER:t5-adsp-01.ru-central1.internal:2181}

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

  • connection-string - подключение к Zookeeper DS, например ZOOKEEPER:t5-adsp-01.ru-central1.internal:2181.

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

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

Например:

prostore-rest-client:
  enabled: true
  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.9.3.5. Секция prostore

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

Например:

prostore:
  key:
    primary: tmp_id
    type: BIGINT
  datasource:
    # subprotocol для jdbc
    subprotocol: ${PS_SUBPROTOCOL:prostore}
    # Драйвер для подключения к простору
    driver: ${PS_DRIVER:ru.datamart.prostore.jdbc.Driver}
    # Подключение к Prostore
    host: ${PS_HOST:localhost}
    # Prostore порт
    port: ${PS_PORT:9195}
    # Prostore начальный размер пула
    initialPoolSize: ${PS_INITIAL_POOL_SIZE:5}
    # Prostore максимальный размер пула
    maxPoolSize: ${PS_MAX_POOL_SIZE:8}
  standalone:
    source: ${PS_STANDALONE_SOURCE:ADB}

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

  • subprotocol - subprotocol для jdbc, например PS_SUBPROTOCOL:prostore;

  • driver - драйвер для подключения к простору, например PS_DRIVER:ru.datamart.prostore.jdbc.Driver;

  • host - подключение к ядру ProStore, например: DTMDB_HOST:t5-prostore-01.ru-central1.internal;

  • port - порт ядра ProStore, например: PROSTOREDB_PORT:9197;

  • initialPoolSize - Prostore начальный размер пула, например PS_INITIAL_POOL_SIZE:5;

  • maxPoolSize - размер пула JDBC подключения, например: maxPoolSize: 5;

  • source - источник для standalone таблицы (ADB/ADP), например PS_STANDALONE_SOURCE:ADB.

2.2.9.3.6. Секция kafka

Секция kafka хранит общие настройки подключения к Kafka.

Например:

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}}
  internal:
    bootstrap.servers: ${PS_KAFKA:localhost:9092}
    topic.prefix: ${INTERNAL_TOPIC_PREFIX:${agent.topic.prefix}}
  # параметры консьюмера сообщений
  consumer:
    bootstrap.servers: ${kafka.internal.bootstrap.servers}
    # Смещение при первом запуске приложения
    auto.offset.reset: earliest
  # параметры продьюсера сообщений
  producer:
    bootstrap.servers: ${kafka.internal.bootstrap.servers}
  # параметры клиента администратора для удаления временных топиков
  admin:
    bootstrap.servers: ${kafka.internal.bootstrap.servers}

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

  • max-concurrent-handle - максимальное количество обработчиков входящих запросов;

  • commit-interval - периодичность фиксации оффсета обработанных сообщений;

  • group.id - GroupId для подписчика;

  • auto.offset.reset - смещение при первом запуске приложения;

  • enable.auto.commit- Вкл/выкл автоматический коммит;

  • consumer - параметры консьюмера сообщений;

  • producer – параметры продьюсера сообщений.

2.2.9.3.7. Секция query

Секция query хранит блок настроек импорта данных табличных параметров.

Например:

query:
  data-topic-prefix: ${DATA_TOPIC_PREFIX:tp.data}
  # топик запросов
  request-topic: ${kafka.internal.topic.prefix}tp.upload.query
  # топик запросов на исполнение после загрузки данных
  response-topic: ${kafka.external.topic.prefix}query.rq
  # топик с ошибками
  error-topic: ${kafka.external.topic.prefix}query.err
  # блок настроек отмены запросов
  cancel:
    # топик запросов на отмену исполнения
    request-topic: ${kafka.external.topic.prefix}cancel.rq
    # настройки кеша отмененных запросов
    cache:
      # начальный размер кеша
      initial-capacity: 10000
      # время вытеснения из кеша
      expire-after-access: 60m
  # максимальное количество обработчиков входящих запросов
  max-concurrent-handle: ${kafka.max-concurrent-handle}
  # периодичность фиксации оффсета обработанных сообщений
  commit-interval: ${kafka.commit-interval}
  # дополнительные параметры консьюмера запросов
  consumer-properties:
    group.id: ${kafka.internal.topic.prefix}import.tp.query.consumer
  # дополнительные параметры продюсера ответов
  producer-properties:
    bootstrap.servers: ${kafka.external.bootstrap.servers}
  # дополнительные параметры администрирования кафки
  admin-properties: [ ]

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

  • request-topic - топик запросов;

  • response-topic - топик запросов на исполнение после загрузки данных;

  • error-topic - топик с ошибками;

  • cancel- блок настроек отмены запросов;

  • initial-capacity - начальный размер кеша;

  • expire-after-access - время вытеснения из кеша;

  • max-concurrent-handle - максимальное количество обработчиков входящих запросов;

  • commit-interval - периодичность фиксации оффсета обработанных сообщений;

  • consumer-properties - дополнительные параметры консьюмера запросов;

  • producer-properties - дополнительные параметры продюсера ответов;

  • admin-properties - дополнительные параметры администрирования кафки.

2.2.9.3.8. Секция mppw

Секция mppw хранит блок настроек сервиса загрузки данных mppw.

mppw:
  # топик запросов к сервису mppw
  request-topic: ${kafka.internal.topic.prefix}mppw.tp
  # топик ответов от сервиса mppw
  response-topic: ${kafka.internal.topic.prefix}mppw.rs
  # максимальное количество обработчиков входящих запросов
  max-concurrent-handle: ${kafka.max-concurrent-handle}
  # периодичность фиксации оффсета обработанных сообщений
  commit-interval: ${kafka.commit-interval}
  # дополнительные параметры консьюмера запросов
  consumer-properties:
    group.id: ${kafka.internal.topic.prefix}import.tp.response.consumer
    # Смещение при первом запуске приложения
    auto.offset.reset: earliest
  # дополнительные параметры продюсера ответов
  producer-properties: [ ]

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

  • request-topic - топик запросов к сервису mppw;

  • response-topic - топик ответов от сервиса mppw;

  • max-concurrent-handle - максимальное количество обработчиков входящих запросов;

  • commit-interval- периодичность фиксации оффсета обработанных сообщений;

  • consumer-properties - дополнительные параметры консьюмера запросов;

  • producer-properties - дополнительные параметры продюсера ответов.

2.2.9.3.9. Секция delete

Секция delete хранит блок настроек механизма очистки.

Например:

delete:
  # входящий топик запросов удаления ресурсов
  request-topic: ${kafka.internal.topic.prefix}tp.delete.tmp
  # максимальное количество обработчиков входящих запросов
  max-concurrent-handle: ${kafka.max-concurrent-handle}
  # периодичность фиксации оффсета обработанных сообщений
  commit-interval: ${kafka.commit-interval}
  # дополнительные параметры консьюмера запросов
  consumer-properties:
    group.id: ${kafka.internal.topic.prefix}import.tp.delete.consumer

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

  • request-topic - топик запросов к сервису mppw;

  • response-topic - топик ответов от сервиса mppw;

  • max-concurrent-handle - максимальное количество обработчиков входящих запросов;

  • commit-interval- периодичность фиксации оффсета обработанных сообщений;

  • consumer-properties - дополнительные параметры консьюмера запросов.

2.2.9.3.10. Секция delta

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

Например:

delta:
  # префикс топиков с данными
  data-topic-prefix: ${DATA_TOPIC_PREFIX:tp.data}
  # признак необходимости удаления топиков
  delete-topics: ${IMPORT_DELTA_DELETE_TOPICS:true}
  # дополнительные параметры администрирования кафки
  admin-properties: [ ]
  # блок параметров поставщика данных
  provider:
    # топик запросов
    request-topic: ${kafka.internal.topic.prefix}tp.upload.delta
    # топик ответов
    response-topic: ${kafka.internal.topic.prefix}delta.rq
    # топик ошибок
    error-topic: ${kafka.internal.topic.prefix}tp.upload.err
    # максимальное количество обработчиков входящих запросов
    max-concurrent-handle: ${kafka.max-concurrent-handle}
    # периодичность фиксации оффсета обработанных сообщений
    commit-interval: ${kafka.commit-interval}
    # дополнительные параметры консьюмера запросов
    consumer-properties:
      group.id: ${kafka.internal.topic.prefix}import.tp.delta.consumer
    # дополнительные параметры продъюсера ответов
    producer-properties: [ ]
  # блок параметров получателя данных
  recipient:
    # топик запросов
    request-topic: ${kafka.internal.topic.prefix}tp.upload.delta.in
    # топик ответов
    response-topic: ${kafka.internal.topic.prefix}delta.in
    # топик ошибок
    error-topic: ${kafka.internal.topic.prefix}tp.upload.in.err
    # максимальное количество обработчиков входящих запросов
    max-concurrent-handle: ${kafka.max-concurrent-handle}
    # периодичность фиксации оффсета обработанных сообщений
    commit-interval: ${kafka.commit-interval}
    # дополнительные параметры консьюмера запросов
    consumer-properties:
      group.id: ${kafka.internal.topic.prefix}import.tp.delta.in.consumer
    # дополнительные параметры продъюсера ответов
    producer-properties: [ ]

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

  • data-topic-prefix - префикс топиков с данными;

  • delete-topics - признак необходимости удаления топиков;

  • admin-properties - дополнительные параметры администрирования кафки;

  • provider - блок параметров поставщика данных;

  • recipient - блок параметров получателя данных;

  • request-topic - топик запросов;

  • response-topic - топик запросов на исполнение после загрузки данных;

  • error-topic - топик с ошибками;

  • max-concurrent-handle - максимальное количество обработчиков входящих запросов;

  • commit-interval - периодичность фиксации оффсета обработанных сообщений;

  • consumer-properties - дополнительные параметры консьюмера запросов;

  • producer-properties - дополнительные параметры продюсера ответов.

2.2.9.3.11. Секция metrics

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

Например:

metrics:
  # Порт сервера для получения метрик
  port: ${METRICS_PORT:9843}
  kafkaAdminClientName: kafkaAdminClient

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

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

2.2.10. Настройка ПОДД-адаптер – ПОДД-адаптер – Wrapper

2.2.10.1. Конфигурация модуля ПОДД-адаптер - Wrapper (application.yml)

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

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

Приведем типовую структуру файла и возможные настройки ПОДД-адаптера - Wrapper. Следует учитывать, что в конфигурационном файле следует задавать только те настройки, которые необходимы для решения текущих бизнес-задач.

application:
  path: ${APPLICATION_PATH:/var/lib/podd-avro-defragmentator}
  source_topic: ${kafka.external.topic.prefix}query.tp.bin
  destination_topic: ${kafka.external.topic.prefix}query.tp
  source_partition_count: 1
  destination_chunk_max_size: 1000
  destination_chunk_max_record_count: ${APPLICATION_DESTINATION_CHUNK_MAX_RECORD_COUNT:500}
  request_life_time: 24
  garbage_period: 24
  zookeeper:
    connectionString: ${APPLICATION_ZOOKEEPER_CONNECTIONSTRING:localhost}
    sessionTimeoutMs: ${APPLICATION_ZOOKEEPER_SESSIONTIMEOUTMS:30000}
    connectionTimeoutMs: ${APPLICATION_ZOOKEEPER_CONNECTIONTIMEOUTMS:86400000}
    chroot: ${APPLICATION_ZOOKEEPER_CHROOT:/adapter}

environment:
  name: ${ENVIRONMENT_NAME:test}

kafka:
  agent.topic.prefix: ${AGENT_TOPIC_PREFIX:}
  external:
    bootstrap.servers: ${KAFKA_BOOTSTRAP_SERVERS:localhost:9092}
    topic.prefix: ${EXTERNAL_TOPIC_PREFIX:${kafka.agent.topic.prefix}}
  consumer:
    bootstrap-servers: ${kafka.external.bootstrap.servers}
    group-id: ${KAFKA_CONSUMER_GROUPID:defragmentator-consumer}
  producer:
    bootstrap-servers: ${kafka.external.bootstrap.servers}

logging:
  level:
    ru.itone.datamart: ${LOGGING_LEVEL_RUITONEDATAMART:debug}

metrics:
  port: ${METRICS_PORT:9837}

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

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

Пример конфигурации файла application.yml для ПОДД-адаптера - Wrapper см. в разделе Пример файла application.yml Руководства администратора.

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

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

  • environment - указывается название окружения (test, prod и т.д.);

  • kafka - настройка подключения к серверу Kafka для Поставщика и Получателя данных;

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

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

2.2.10.3.1. Секция application

Секция application предназначена для настройки модуля ПОДД-адаптера - Wrapper в части указания топиков взаимодействия и размера обрабатываемых данных.

Например:

application:
  path: ${APPLICATION_PATH:/var/lib/podd-avro-defragmentator}
  source_topic: ${kafka.external.topic.prefix}query.tp.bin
  destination_topic: ${kafka.external.topic.prefix}query.tp
  source_partition_count: 1
  destination_chunk_max_size: 1000
  destination_chunk_max_record_count: ${APPLICATION_DESTINATION_CHUNK_MAX_RECORD_COUNT:500}
  request_life_time: 24
  garbage_period: 24
  zookeeper:
    connectionString: ${APPLICATION_ZOOKEEPER_CONNECTIONSTRING:localhost}
    sessionTimeoutMs: ${APPLICATION_ZOOKEEPER_SESSIONTIMEOUTMS:30000}
    connectionTimeoutMs: ${APPLICATION_ZOOKEEPER_CONNECTIONTIMEOUTMS:86400000}
    chroot: ${APPLICATION_ZOOKEEPER_CHROOT:/adapter}

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

  • path – рабочая папка на локальном диске, в которой будут создаваться подпапки для сохранения чанков, например APPLICATION_PATH:/var/lib/podd-avro-defragmentator;

  • source_topic – топик Kafka query.tp.bin, являющийся источником данных;

  • destination_topic - топик Kafka query.tp, в который будут собираться данные;

  • source_partition_count - количество партиций в исходном топике source_topic;

  • destination_chunk_max_size - максимальный размер фрагмента данных chunk при записи в топик destination_topic для сбора данных;

  • destination_chunk_max_record_count - максимальное количество строк в сообщении для destination_topic, например APPLICATION_DESTINATION_CHUNK_MAX_RECORD_COUNT:500;

  • request_life_time - время жизни запроса, пока идет сборка;

  • garbage_period - время жизни отдельных, несобранных порций данных;

  • connectionString - строка подключения к zookeeper, например APPLICATION_ZOOKEEPER_CONNECTIONSTRING:localhost;

  • sessionTimeoutMs - таймаут сессии, например APPLICATION_ZOOKEEPER_SESSIONTIMEOUTMS:30000;

  • connectionTimeoutMs - таймаут подключения, например APPLICATION_ZOOKEEPER_CONNECTIONTIMEOUTMS:86400000;

  • chroot - путь до каталога сохранения в ZK, например APPLICATION_ZOOKEEPER_CHROOT:/test.

2.2.10.3.2. Секция environment

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

Например:

environment:
  name: ${ENVIRONMENT_NAME:test}

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

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

2.2.10.3.3. Секция kafka

Секция kafka предназначена для настройки модуля в части указания адреса сервера Kafka для Поставщика данных (producer) и Получателя данных (consumer).

kafka:
  agent.topic.prefix: ${AGENT_TOPIC_PREFIX:}
  external:
    bootstrap.servers: ${KAFKA_BOOTSTRAP_SERVERS:localhost:9092}
    topic.prefix: ${EXTERNAL_TOPIC_PREFIX:${agent.topic.prefix}}
  consumer:
    bootstrap-servers: ${kafka.external.bootstrap.servers}
    group-id: ${KAFKA_CONSUMER_GROUPID:defragmentator-consumer}
  producer:
    bootstrap-servers: ${kafka.external.bootstrap.servers}

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

  • consumer - настройка адреса сервера Kafka для Получателя данных;

  • bootstrap-servers - адрес кафки для консьюмеров, например KAFKA_CONSUMER_BOOTSTRAPSERVERS:localhost:9092;

  • group-id - группа для консьюмеров

  • producer - настройка адреса сервера Kafka для Поставщика данных;

  • bootstrap-servers - адрес кафки для продюсеров, например KAFKA_PRODUCER_BOOTSTRAPSERVERS:localhost:9092.

2.2.10.3.4. Секция logging

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

Например:

logging:
  level:
    ru.itone.datamart: ${LOGGING_LEVEL_RUITONEDATAMART:debug}
2.2.10.3.5. Секция metrics

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

Например:

metrics:
  port: ${METRICS_PORT:9837}

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

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

2.2.11. Настройка Модуля группировки чанков

2.2.11.1. Конфигурация Модуля группировки чанков репликации (application.yml)

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

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

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

http:
port: ${HTTP_PORT:8084}

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

kafka:
agent.topic.prefix: ${AGENT_TOPIC_PREFIX:}
external:
    bootstrap.servers: ${KAFKA_BOOTSTRAP_SERVERS:localhost:9092}
    topic.prefix: ${EXTERNAL_TOPIC_PREFIX:${kafka.agent.topic.prefix}}
internal:
    bootstrap.servers: ${PS_KAFKA:localhost:9092}
    topic.prefix: ${INTERNAL_TOPIC_PREFIX:${kafka.agent.topic.prefix}}
consumer:
    delta-apply-request: ${kafka.external.topic.prefix}delta.in.rq
    property:
    bootstrap.servers: ${kafka.external.bootstrap.servers}
    group.id: ${kafka.external.topic.prefix}podd-adapter-group-repl
    auto.offset.reset: earliest
    enable.auto.commit: false
producer:
    delta-apply-notification: ${kafka.internal.topic.prefix}subscription.in
    property:
    bootstrap.servers: ${kafka.internal.bootstrap.servers}

logging:
scl.delta:
    enabled: ${SCL_DELTA_ENABLED:false}

metrics:
port: ${METRICS_PORT:9837}

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

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

Пример файла application.yml для Модуля группировки чанков репликации можно найти в разделе «2.2. Настройка на состав программных средств» Руководства администратора.

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

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

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

  • kafka - настройки параметров подключения к шине данных Apache Kafka;

  • logging - настройки журналирования запросов и ответов;

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

2.2.11.3.1. Секция http

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

Например:

http:
  port: ${HTTP_PORT:8084}

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

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

2.2.11.3.2. Секция executor

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

Например:

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

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

  • reader-pool-size - размер пула для чтения Kafka, например EXECUTOR_READER_POOL_SIZE:20.

2.2.11.3.3. Секция kafka

Секция kafka определяет настройки взаимодействия через ПОДД-адаптер между Поставщиком данных (producer) и Получателем данных (consumer).

В секции kafka собраны настройки параметров подключения к шине данных Apache Kafka.

Например:

kafka:
agent.topic.prefix: ${AGENT_TOPIC_PREFIX:}
external:
    bootstrap.servers: ${KAFKA_BOOTSTRAP_SERVERS:localhost:9092}
    topic.prefix: ${EXTERNAL_TOPIC_PREFIX:${agent.topic.prefix}}
internal:
    bootstrap.servers: ${PS_KAFKA:localhost:9092}
    topic.prefix: ${INTERNAL_TOPIC_PREFIX:${agent.topic.prefix}}
consumer:
    delta-apply-request: ${kafka.external.topic.prefix}delta.in.rq
    property:
    bootstrap.servers: ${kafka.external.bootstrap.servers}
    group.id: ${kafka.external.topic.prefix}podd-adapter-group-repl
    auto.offset.reset: earliest
    enable.auto.commit: false
producer:
    delta-apply-notification: ${kafka.internal.topic.prefix}subscription.in
    property:
    bootstrap.servers: ${kafka.internal.bootstrap.servers}

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

  • topic - префикс для топиков агента ПОДД, например AGENT_TOPIC_PREFIX.

2.2.11.3.4. Секция logging

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

Например:

logging:
scl.delta:
    enabled: ${SCL_DELTA_ENABLED:false}

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

  • enabled - Журналировать события SCL delta, например: SCL_DELTA_ENABLED:false.

LOG_FORMAT - Логирование в формате (JSON/TEXT) - указывается в logback.xml.

2.2.11.3.5. Секция metrics

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

Например:

metrics:
  port: ${METRICS_PORT:9837}

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

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

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

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

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

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

Приведем типовую структуру файла и возможные настройки DATA-Uploader. Следует учитывать, что в конфигурационном файле следует задавать только те настройки, которые необходимы для решения текущих бизнес-задач.

server:
  port: ${SERVER_PORT:8082}

prostore-rest-client:
  # Признак использования rest-api для взаимодействия с простором. Если false - будет использоваться jdbc драйвер
  enabled: ${PS_REST_CLIENT_ENABLED:true}
  host: ${PS_HOST:localhost}
  port: ${PS_PORT:9195}
  http:
    max-pool-size: ${PS_MAX_POOL_SIZE:8}

prostore:
  subprotocol: ${PS_SUBPROTOCOL:prostore}
  driver: ${PS_DRIVER:ru.datamart.prostore.jdbc.Driver}
  host: ${PS_HOST:localhost}
  port: ${PS_PORT:9195}
  initialPoolSize: ${PS_INITIAL_POOL_SIZE:3}
  maxPoolSize: ${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}

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:1000}
  chunk-data-max-size: ${DELTA_CHUNK_DATA_SIZE:1048576}

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

kafka:
  agent.topic.prefix: ${AGENT_TOPIC_PREFIX:}
  internal:
    bootstrap.servers: ${PS_KAFKA:localhost:9092}
    topic.prefix: ${INTERNAL_TOPIC_PREFIX:${kafka.agent.topic.prefix}}
  mppw-consumer:
    property:
      bootstrap.servers: ${kafka.internal.bootstrap.servers}
      group.id: data.uploader.group
      auto.offset.reset: earliest
      enable.auto.commit: true
  mppw-producer:
    property:
      bootstrap.servers: ${kafka.internal.bootstrap.servers}
  data-producer:
    property:
      bootstrap.servers: ${kafka.internal.bootstrap.servers}
  data-topic-prefix: ${kafka.internal.topic.prefix}mppw.upload.data
  mppw-upload-rq-topic: ${kafka.internal.topic.prefix}mppw.upload.rq
  mppw-upload-rs-topic: ${kafka.internal.topic.prefix}mppw.upload.rs

metrics:
  port: ${METRICS_PORT:9837}

scheduler:
  redis-check-request-timeout: ${REDIS_CHECK_REQUEST_TIMEOUT:60}

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

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

Пример конфигурации файла application.yml для DATA-Uploader см. в разделе Пример файла application.yml Руководства администратора.

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

  • poddKafkaUrl - адрес сервера Kafka PODD для DATA-Uploader;

  • prostoreKafkaUrl - адрес сервера Kafka для ядра витрины ProStore;

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

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

  • prostore - настройка подключения к серверу и базе данных ProStore;

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

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

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

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

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

  • kafka - настройка распределений отправки топиков;

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

  • scheduler - настройки планировщика отложенных заданий.

2.2.12.3.1. Секция server

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

Например:

server:
  port: ${SERVER_PORT:8081}

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

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

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

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

Например:

prostore-rest-client:
  enabled: true
  host: ${PS_HOST:t5-prostore-01.ru-central1.internal}
  port: ${PS_PORT:9195}
  http:
    max-pool-size: ${PS_MAX_POOL_SIZE:8}

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

  • 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.12.3.3. Секция prostore

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

Например:

prostore:
  subprotocol: ${PS_SUBPROTOCOL:prostore}
  driver: ${PS_DRIVER:ru.datamart.prostore.jdbc.Driver}
  host: ${PS_HOST:t5-prostore-01.ru-central1.internal}
  port: ${PS_PORT:9195}
  initialPoolSize: ${PS_INITIAL_POOL_SIZE:3}
  maxPoolSize: ${PS_MAX_POOL_SIZE:8}

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

  • subprotocol - Subprotocol для JDBC, например PS_SUBPROTOCOL:prostore;

  • driver - драйвер для подключения к простору, например PS_DRIVER:ru.datamart.prostore.jdbc.Driver;

  • host - подключение к ядру ProStore, например: PS_HOST:t5-prostore-01.ru-central1.internal;

  • port - порт ProStore, например: PROSTOREDB_PORT:9197;

  • initialPoolSize - Prostore начальный размер пула, например PS_INITIAL_POOL_SIZE:3;

  • maxPoolSize - размер пула JDBC подключения, например: maxPoolSize: 8.

2.2.12.3.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}

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

  • 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.

2.2.12.3.5. Секция 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}

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

  • separator - указывается символ разделителя полей;

  • quote-char - указывается символ кавычки;

  • escape-char - указывается символ экранирования. Если символ экранирования и символ кавычки равны «, то будет использован RFC4180Parser, который считывает все символы между двумя двойными кавычками, при этом двойная кавычка в тексте поля должна быть экранирована двойной кавычкой (Например «поле, «»содержащее двойную кавычку»»» будет считано как поле, «содержащее двойную кавычку»). В противном случае будет использован CSVParser, использующий символ экранирования для обозначения «непечатаемых символов».

  • field-as-null - указывается способ определения поля, например: CSV_PARSER_FIELD_AS_NULL:EMPTY_SEPARATORS.

2.2.12.3.6. Секция active

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

Например:

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

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

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

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

2.2.12.3.7. Секция delta

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

Например:

delta:
  timeout: ${DELTA_TIMEOUT:300}
  row-max-count: ${DELTA_MAX_ROWS:500000}
  chunk-row-max-count: ${DELTA_CHUNK_ROWS:1000}
  chunk-data-max-size: ${DELTA_CHUNK_DATA_SIZE:1048576}

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

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

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

  • chunk-row-max-count - количество сообщений в одном чанке;

  • chunk-data-max-size - максимальный размер чанка.

2.2.12.3.8. Секция response

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

Например:

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

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

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

2.2.12.3.9. Секция kafka

Секция kafka позволяет настраивать отправку топиков в заданные модули.

Например:

kafka:
  mppw-consumer:
    property:
      bootstrap.servers: *poddKafkaUrl
      group.id: data.uploader.group
      auto.offset.reset: earliest
      enable.auto.commit: true
  mppw-producer:
    property:
      bootstrap.servers: *poddKafkaUrl
  data-producer:
    property:
      bootstrap.servers: *prostoreKafkaUrl
  data-topic-prefix: ${AGENT_TOPIC_PREFIX:}mppw.upload.data
  mppw-upload-rq-topic: ${AGENT_TOPIC_PREFIX:}mppw.upload.rq
  mppw-upload-rs-topic: ${AGENT_TOPIC_PREFIX:}mppw.upload.rs

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

  • data-topic-prefix - префикс топика, куда будут отправляться данные;

  • mppw-upload-rq-topic - топик для отправки заданий на MPPW модуль;

  • mppw-upload-rq-topic - топик, в который будут приходить результаты исполнения заданий MPPW модуля.

2.2.12.3.10. Секция metrics

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

Например:

metrics:
  port: ${METRICS_PORT:9837}

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

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

2.2.12.3.11. Секция scheduler

Секция scheduler предназначена для настроек планировщика отложенных заданий.

Например:

scheduler:
  redis-check-request-timeout: ${REDIS_CHECK_REQUEST_TIMEOUT:60}

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

  • redis-check-request-timeout -таймаут отправки запроса в Redis, например DELTA_APPLY_REQUEST_TIMEOUT:60;

2.2.12.3.12. Дополнительное описание параметров
  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.13. Настройка REST-Uploader – Модуль асинхронной загрузки данных из сторонних источников

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

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

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

Приведем типовую структуру файла и возможные настройки REST-uploader. Следует учитывать, что в конфигурационном файле следует задавать только те настройки, которые необходимы для решения текущих бизнес-задач.

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

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

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

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

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

prostore-rest-client:
  # Признак использования rest-api для взаимодействия с простором. Если false - будет использоваться jdbc драйвер
  enabled: ${PS_REST_CLIENT_ENABLED:true}
  host: ${PS_HOST:t5-prostore-01.ru-central1.internal}
  port: ${PS_PORT:9195}
  http:
    max-pool-size: ${PS_MAX_POOL_SIZE:8}

prostore:
  subprotocol: ${PS_SUBPROTOCOL:prostore}
  driver: ${PS_DRIVER:ru.datamart.prostore.jdbc.Driver}
  host: ${PS_HOST:t5-prostore-01.ru-central1.internal}
  port: ${PS_PORT:9195}
  initialPoolSize: ${PS_INITIAL_POOL_SIZE:3}
  maxPoolSize: ${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}

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

metrics:
  port: ${METRICS_PORT:9837}

scheduler:
  redis-check-request-timeout: ${REDIS_CHECK_REQUEST_TIMEOUT:60}

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}

backup:
  zk-path: ${REST_UPLOADER_BACKUP_ZK_PATH:/${environment.name}/rest-uploader}
  commandTopic: ${BACKUP_COMMAND_TOPIC:adapter.command}
  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}

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

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

Пример конфигурации файла application.yml для REST-uploader см. в разделе Пример файла application.yml Руководства администратора.

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

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

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

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

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

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

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

  • prostore-api-client - блок параметров конфигурирования взаимодействия с ProStore. Если false - будет использоваться JDBC-драйвер;

  • prostore - настройка подключения к серверу и базе данных ProStore;

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

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

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

  • scheduler - настройка таймаута отправки запроса в Redis;

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

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

2.2.13.3.1. Секция http-server

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

Например:

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

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

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

2.2.13.3.2. Секция executor

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

Например:

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

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

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

2.2.13.3.3. Секция send

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

Например:

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

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

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

2.2.13.3.4. Секция environment

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

Например:

environment:
  name: ${ENVIRONMENT_NAME:test}

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

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

2.2.13.3.5. Секция 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;

2.2.13.3.6. Секция 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.13.3.7. Секция prostore-rest-client

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

Например:

prostore-rest-client:
  # Признак использования rest-api для взаимодействия с простором. Если false - будет использоваться jdbc драйвер
  enabled: true
  host: ${PS_HOST:t5-prostore-01.ru-central1.internal}
  port: ${PS_PORT:9195}
  http:
    max-pool-size: ${PS_MAX_POOL_SIZE:8}

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

  • 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.13.3.8. Секция prostore

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

Например:

prostore:
  subprotocol: ${PS_SUBPROTOCOL:prostore}
  driver: ${PS_DRIVER:ru.datamart.prostore.jdbc.Driver}
  host: ${PS_HOST:t5-prostore-01.ru-central1.internal}
  port: ${PS_PORT:9195}
  initialPoolSize: ${PS_INITIAL_POOL_SIZE:3}
  maxPoolSize: ${PS_MAX_POOL_SIZE:8}

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

  • subprotocol - subprotocol для JDBC, например PS_SUBPROTOCOL:prostore;

  • driver - драйвер для подключения к Prostore, например PS_DRIVER:ru.datamart.prostore.jdbc.Driver;

  • host - подключение к ядру ProStore, например: PS_HOST:t5-prostore-01.ru-central1.internal;

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

  • initialPoolSize - начальный размер пула ядра ProStore, например PS_INITIAL_POOL_SIZE:3;

  • maxPoolSize - максимальный размер пула ядра ProStore, например: PS_MAX_POOL_SIZE:8.

2.2.13.3.9. Секция 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}

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

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

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

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

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

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

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

2.2.13.3.10. Секция auth

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

Например:

auth:
  secret: ${AUTH_SECRET:gPHaT%ACXGQaQ30%1id%K7@C}
  enabled: ${AUTH_ENABLED:true}

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

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

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

2.2.13.3.11. Секция metrics

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

Например:

metrics:
  port: ${METRICS_PORT:9837}

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

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

2.2.13.3.12. Секция scheduler

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

Например:

scheduler:
  redis-check-request-timeout: ${REDIS_CHECK_REQUEST_TIMEOUT:60}

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

  • redis-check-request-timeout - таймаут отправки запроса в Redis, например REDIS_CHECK_REQUEST_TIMEOUT:60.

2.2.13.3.13. Секция 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}

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

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

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

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

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

2.2.13.3.14. Дополнительное описание параметров
  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.13.3.15. Секция backup

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

Например:

backup:
  zk-path: ${COUNTER_BACKUP_ZK_PATH:/${environment.name}/counter-provider/counters}
  commandTopic: ${BACKUP_COMMAND_TOPIC:adapter.command}
  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}

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

  • zk-path - путь к корневой ноде zookeeper для бэкапирования, например {COUNTER_BACKUP_ZK_PATH:/${environment.name}/counter-provider/counters};

  • commandTopic - топик команд бэкапирования, например: {BACKUP_COMMAND_TOPIC:adapter.command};

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

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

2.2.13.4. Проверка форматно-логического контроля

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

Таблица 2.11 Список реализованных проверок

Наименование проверки

Код ошибки

Кирилическое описание

проверка уникальности

dublicate

дубликат файла/группы

Проверка парсинга файла

parsingErr

ошибка парсинга: текст ошибки

проверка кодирования

encodingErr

кодировка файла не соответствует кодировке UTF-8

Проверка превышения предельного размера файла (больше 512 Мб)|

tooLargeFile

слишком большой файл

Проверка наличия данных в файле

emptyFile

пустой файл

проверка соответствия заголовков инфосхеме

wrongMetadata

структура файла не соответствует схеме

проверка соответствия числа столбцов в строке

wrongFieldsCount

некорректное число столбцов в строке

проверка соответствия типам полей

wrongFieldType

значение не соответствует типу требуемый тип

проверка уникальности полей

nonUniq

значение не отвечает требованиям уникальности

проверка регулярных выражений

nonMatchRegex

значение не соответствует регулярному выражению регулярное выражение

проверка соответствия условию

nonMatchConstant

значение не соответствует условию условие

Таймаут валидации

validationTimeout

истек таймаут валидации файла

2.2.13.4.1. Синхронная проверка ФЛК

Примечание

  • выполняются вне зависимости от настроек модуля REST-Uploader;

  • являются блокирующими;

  • ошибки синхронных проверок возвращаются в теле ответа по REST-API.

К синхронным проверкам относятся:

  • проверка соответствия инфосхеме:

    • проверка соответствия имен и количества полей в заголовках;

    • проверка типа данных;

    • проверка экранирования данных: проверка соответствия числа столбцов по каждой строке;

  • проверка соответствия файла кодировке UTF-8 , отсутствие BOM (при наличии BOM отрезаем при загрузке начальные байты ef bb bf);

  • проверка размера файла и наличия данных:

    • проверка предельного размера загружаемого файла 512Мб;

    • проверка наличия данных в файле.

2.2.13.4.2. Асинхронная проверка

Примечание

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

  • проверки не являются блокирующими (поведение при их наличии определяется конфигурацией модуля);

  • список проверок уникален для каждой таблицы и хранится в Zookeeper в виде отдельного YAML файла.

К асинхронным проверкам относятся:

  • проверка уникальности полей:

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

    • по заданному атрибуту;

  • сравнение значения с константой;

  • соответствие регулярному выражению.

Для одного поля возможно создать не более одной проверки одного типа, при этом у каждого поля может быть несколько проверок разных типов.

2.2.13.4.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.13.4.2.2. Проверка соответствия заданному значению
  • Проверка соответствия заданному значению проводится для каждого файла вне зависимости от наличия group_id

  • Проверка осуществляется для значений каждого поля в соответствии с заданным правилом

  • Проверка соответствия заданному значению включает в себя:
2.2.13.4.2.3. Поведение в случае таймаута валидации

Период выполнения асинхронных проверок определяется конфигурационным параметром validation-timeout и по умолчанию составляет 60 минут.

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

В случае возникновения подобной ошибки рекомендуется:

  • проверить регулярные выражения, по которым происходит проверка, так как неверно заданное регулярное выражение кратно увеличивает скорость проверки;

  • увеличить значение validation-timeout и повторить загрузку данных.

2.2.13.4.3. Статусная модель
Таблица 2.12 Статусная модель

Статус

Описание

-1

Загрузка данных в буффер

0

Запрос буфферизирован

1

Ожидает открытия дельты

2

В обработке (модулем DATA-Uploader)

3

Успешно обработан

4

Ошибка обработки запроса

5

Идентификатор запроса не обнаружен

6

Форматно-логический контроль

7

Ошибки ФЛК

2.2.13.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

openapi: 3.0.1
x-stoplight:
  id: yhkpcls7yqrkm
info:
  title: Rest-uploader
  description: This is a rest-uploader service for datamart filling
  contact:
    email: okononov@it-one.ru
  version: 2.0.0
servers:
  - url: 'http://localhost:8081'
paths:
  '/v2/datamarts/{datamart_name}/tables/{table_name}/upload':
    post:
      summary: Add a new data to the datamart
      operationId: v1-datamarts-datamart_name-tables-table_name-upload
      parameters:
        - name: datamart_name
          in: path
          required: true
          schema:
            type: string
        - name: table_name
          in: path
          required: true
          schema:
            type: string
        - name: groupId
          in: header
          description: 'идентификатор группы'
          required: false
          schema:
            type: string            
        - name: groupFileNum
          in: header
          description: 'номер файла в группе'
          required: false
          schema:
            type: integer            
        - name: groupFileCount
          in: header
          description: 'число файлов в группе'
          required: false
          schema:
            type: integer            
      requestBody:
        $ref: '#/components/requestBodies/uploadData'
      responses:
        '200':
          description: successful operation
          headers:
            requestId:
              schema:
                type: string
          content: 
            text/plain:
              schema:
                type: string
        '400':
          description: Bad request
          headers:
            requestId:
              schema:
                type: string
          content: 
            text/csv:
              schema:
                type: array
                items:
                  type: array
                  items:
                    type: string
        '401':
          description: Invalid token
          content: {}
        '403':
          description: Invalid idetifier
          content: {}
        '500':
          description: Invalid idetifier
          content: {}
      security:
        - bearerAuth: []
      tags:
        - rest-uploader
      description: |-
        Загрузка данных из внешних источников
        curl -vvv -X POST -F upload=@/home/centos/file1.csv   http://localhost:8081/v1/datamarts/EDUEJD_SANDBOX_SGK_TEST_REST_UPLOADER/tables/TEST_NULL_TABLE2/upload
    parameters:
      - schema:
          type: string
        name: datamart_name
        in: path
        required: true
      - schema:
          type: string
        name: table_name
        in: path
        required: true
  '/v2/requests/{request_id}/status':
    get:
      summary: Return request status
      description: Возвращение статуса запроса
      operationId: get-v1-request-request_id-dtatus
      parameters:
        - name: request_id
          in: path
          description: Identifier of request
          required: true
          schema:
            type: string
      responses:
        '200':
          description: successful operation
          content:
            plain/text:
              schema:
                type: string
        '401':
          description: Invalid token
          content: {}
        '403':
          description: Invalid idetifier
          content: {}
        '500':
          description: Invalid idetifier
          content: {}          
      security:
        - bearerAuth: []
      tags:
        - rest-uploader
    parameters:
      - schema:
          type: string
        name: request_id
        in: path
        required: true
  '/v2/requests/{request_id}/reportFLK':
    get:
      summary: Return report FLK check
      description: Возвращает отчет по формато логическом контроле загружаемых данных
      operationId: get-v1-request-request_id-reportFLK
      parameters:
        - name: request_id
          in: path
          description: Identifier of request
          required: true
          schema:
            type: string
      responses:
        '200':
          description: successful operation
          content:
            text/csv:
              schema:
                type: array
                items:
                    type: array
                    items:
                      type: string
        '401':
          description: Invalid token
          content: {}
        '403':
          description: Invalid idetifier
          content: {}
        '500':
          description: Invalid idetifier
          content: {}          
      security:
        - bearerAuth: []
      tags:
        - rest-uploader
  '/v2/group/{groupId}/report':
    get:
      summary: Return report group
      description: Возвращает отчет по комплектности группы загружаемых файлов
      operationId: get-v1-group-groupId-report
      parameters:
        - name: groupId
          in: path
          description: Identifier of group
          required: true
          schema:
            type: string
      responses:
        '200':
          description: successful operation
          content:
            text/csv:
              schema:
                type: array
                items:
                    type: array
                    items:
                      type: string
        '401':
          description: Invalid token
          content: {}
        '403':
          description: Invalid idetifier
          content: {}
        '500':
          description: Invalid idetifier
          content: {}          
      security:
        - bearerAuth: []
      tags:
        - rest-uploader
        
  '/v2/{datamart_name}/tables/{table_name}/delete':
    parameters:
      - schema:
          type: string
        name: datamart_name
        in: path
        required: true
      - schema:
          type: string
        name: table_name
        in: path
        required: true
      - name: groupId
        in: header
        description: 'идентификатор группы'
        required: false
        schema:
          type: string            
      - name: groupFileNum
        in: header
        description: 'номер файла в группе'
        required: false
        schema:
          type: integer            
      - name: groupFileCount
        in: header
        description: 'число файлов в группе'
        required: false
        schema:
         type: integer
    post:
      summary: Delete data by primary key array
      operationId: post-v1-datamart_name-tables-table_name-delete
      responses:
        '200':
          description: OK
        '400':
          description: Bad Request
        '401':
          description: Invalid token
        '403':
          description: Invalid identifier
        '500':
          description: Invalid idetifier
          content: {}          
      tags:
        - rest-uploader
      description: |-
        Удаление данных по массиву первичных ключей

        curl -vvv -X POST -d "
        {\"primaryKeys\": [[\"1\"]]}
        http://localhost:8081/v1/datamarts/EDUEJD_SANDBOX_SGK_TEST_REST_UPLOADER/tables/TEST_NULL_TABLE2/delete

        curl -vvv -X POST -F del={путь к файлу}.csv http://хост:порт/v1/datamarts/{datamart_name}/tables/{table_name}/delete
      security:
        - bearerAuth: []
      requestBody:
        $ref: '#/components/requestBodies/deleteData'
  '/v2/conditions/{datamart}/{table}':
    post:
      summary: Create verification conditions
      description: Формирование правил проверки для датамарта/таблицы
      operationId: post-v1-conditions
      parameters:
        - name: datamart
          in: path
          description: Name of datamart
          required: true
          schema:
            type: string
        - name: table
          in: path
          description: Name of table
          required: true
          schema:
            type: string
      requestBody:
        content:
          application/x-yaml: {}
      responses:
        '200':
          description: successful operation
        '401':
          description: Invalid token
          content: {}
        '403':
          description: Invalid idetifier
          content: {}
        '500':
          description: Invalid idetifier
          content: {} 
      security:
        - bearerAuth: []
      tags:
        - rest-uploader        
    put:
      summary: Update verification conditions
      description: Обновление правил проверки для датамарта/таблицы
      operationId: put-v1-conditions
      parameters:
        - name: datamart
          in: path
          description: Name of datamart
          required: true
          schema:
            type: string
        - name: table
          in: path
          description: Name of table
          required: true
          schema:
            type: string
      requestBody:
        content:
          application/x-yaml: {}
      responses:
        '200':
          description: successful operation
        '401':
          description: Invalid token
          content: {}
        '403':
          description: Invalid idetifier
          content: {}
        '500':
          description: Invalid idetifier
          content: {} 
      security:
        - bearerAuth: []
      tags:
        - rest-uploader        
    get:
      summary: Return verification conditions
      description: Возвращение правил проверки для датамарта/таблицы
      operationId: get-v1-conditions
      parameters:
        - name: datamart
          in: path
          description: Name of datamart
          required: true
          schema:
            type: string
        - name: table
          in: path
          description: Name of table
          required: true
          schema:
            type: string
      responses:
        '200':
          description: successful operation
          content:
            application/x-yaml: {}
        '401':
          description: Invalid token
          content: {}
        '403':
          description: Invalid idetifier
          content: {}
        '500':
          description: Invalid idetifier
          content: {}          
      security:
        - bearerAuth: []
      tags:
        - rest-uploader        
    delete:
      summary: Delete verification conditions
      description: Удаление правил проверки для датамарта/таблицы
      operationId: delete-v1-conditions
      parameters:
        - name: datamart
          in: path
          description: Name of datamart
          required: true
          schema:
            type: string
        - name: table
          in: path
          description: Name of table
          required: true
          schema:
            type: string
      responses:
        '200':
          description: successful operation
        '401':
          description: Invalid token
          content: {}
        '403':
          description: Invalid idetifier
          content: {}
        '500':
          description: Invalid idetifier
          content: {}          
      security:
        - bearerAuth: []
      tags:
        - rest-uploader                
components:
  requestBodies:
    uploadData:
      description: "загружаемые данные"
      required: true
      content:
#        application/json:
#          schema:
#            type: array
#            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
    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
  examples: {}
security:
  - bearerAuth: []
tags:
  - name: rest-uploader

2.2.14. Настройка ПОДД-адаптер – Модуль подписки

2.2.14.1. Конфигурация модуля ПОДД-адаптер - Модуль подписок (application.yml)

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

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

Приведем типовую структуру файла и возможные настройки ПОДД-адаптера - Модуль подписок. Следует учитывать, что в конфигурационном файле следует задавать только те настройки, которые необходимы для решения текущих бизнес-задач.

environment:
  name: ${ENVIRONMENT_NAME:test}

http-server:
  port: ${HTTP_PORT:8085}

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

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}

migration:
  enabled: ${MIGRATION_ENABLE:false}
  old-connection-string: ${OLD_ZOOKEEPER_DS_ADDRESS:localhost}

table-metadata:
  cache:
    enabled: false

prostore-rest-client:
  # Признак использования rest-api для взаимодействия с простором. Если false - будет использоваться jdbc драйвер
  enabled: ${PS_REST_CLIENT_ENABLED:true}
  host: ${PS_HOST:localhost}
  port: ${PS_PORT:9195}
  http:
    max-pool-size: ${PS_MAX_POOL_SIZE:8}

prostore:
  subprotocol: ${PS_SUBPROTOCOL:prostore}
  driver: ${PS_DRIVER:ru.datamart.prostore.jdbc.Driver}
  host: ${PS_HOST:localhost}
  port: ${PS_PORT:9195}
  initialPoolSize: ${PS_INITIAL_POOL_SIZE:3}
  maxPoolSize: ${PS_MAX_POOL_SIZE:8}
  statusEventTopic:
    topic: ${PS_STATUS_EVENT_TOPIC:status.event}
    property:
      bootstrap.servers: ${kafka.internal.bootstrap.servers}
      group.id: ${kafka.external.topic.prefix}replicator-status-event
      auto.offset.reset: earliest
      enable.auto.commit: false

subscription:
  consumer:
    # режим отмены подписки на потребителе. Возможные значения rename, drop, none
    cancel-mode: none

# Массив описания standalone таблиц, участвующих в репликации
#standalone-tables: []
# Пример описания
#standalone-tables:
#  - table: "misdm05.readable_book"
#    anchor: "update_at"
#    soft-delete: "delete_at"


kafka:
  agent.topic.prefix: ${AGENT_TOPIC_PREFIX:}
  max-concurrent-handle: ${KAFKA_MAX_CONCURRENT_HANDLE:10}
  commit-interval: ${KAFKA_COMMIT_INTERVAL:5s}
  external:
    bootstrap.servers: ${KAFKA_BOOTSTRAP_SERVERS:localhost:9092}
    topic.prefix: ${EXTERNAL_TOPIC_PREFIX:${kafka.agent.topic.prefix}}
  internal:
    bootstrap.servers: ${PS_KAFKA:localhost:9092}
    topic.prefix: ${INTERNAL_TOPIC_PREFIX:${kafka.agent.topic.prefix}}
  consumer:
    subscription-request:
      topic: ${kafka.external.topic.prefix}replication.rq
      max-concurrent-handle: ${kafka.max-concurrent-handle}
      commit-interval: ${kafka.commit-interval}
      property:
        bootstrap.servers: ${kafka.external.bootstrap.servers}
        group.id: ${kafka.external.topic.prefix}replicator-subscription-request
        auto.offset.reset: earliest
        enable.auto.commit: false
    subscription-cancel-request:
      topic: ${kafka.external.topic.prefix}replication.cancel.rq
      max-concurrent-handle: ${kafka.max-concurrent-handle}
      commit-interval: ${kafka.commit-interval}
      property:
        bootstrap.servers: ${kafka.external.bootstrap.servers}
        group.id: ${kafka.external.topic.prefix}replicator-subscription-cancel-request
        auto.offset.reset: earliest
        enable.auto.commit: false
    subscription-consumer-cancel-request:
      topic: ${kafka.external.topic.prefix}replication.cancel.in.rq
      max-concurrent-handle: ${kafka.max-concurrent-handle}
      commit-interval: ${kafka.commit-interval}
      property:
        bootstrap.servers: ${kafka.external.bootstrap.servers}
        group.id: ${kafka.external.topic.prefix}}replicator-subscription-consumer-cancel-request
        auto.offset.reset: earliest
        enable.auto.commit: false
    subscription-storage-request:
      topic: ${kafka.external.topic.prefix}replication.in.rq
      max-concurrent-handle: ${kafka.max-concurrent-handle}
      commit-interval: ${kafka.commit-interval}
      property:
        bootstrap.servers: ${kafka.external.bootstrap.servers}
        group.id: ${kafka.external.topic.prefix}replicator-subscription-storage-request
        auto.offset.reset: earliest
        enable.auto.commit: false
    delta-request:
      topic: ${kafka.external.topic.prefix}delta.rq
      max-concurrent-handle: ${kafka.max-concurrent-handle}
      commit-interval: ${kafka.commit-interval}
      property:
        bootstrap.servers: ${kafka.external.bootstrap.servers}
        group.id: ${kafka.external.topic.prefix}replicator-delta-request
        auto.offset.reset: earliest
        enable.auto.commit: false
    delta-apply-notification:
      topic: ${kafka.internal.topic.prefix}subscription.in
      max-concurrent-handle: ${kafka.max-concurrent-handle}
      commit-interval: ${kafka.commit-interval}
      property:
        bootstrap.servers: ${kafka.internal.bootstrap.servers}
        group.id: ${kafka.internal.topic.prefix}replicator-delta-apply-notification
        auto.offset.reset: earliest
        enable.auto.commit: false
    mppw-delta-apply-result:
      topic: ${kafka.internal.topic.prefix}mppw.delta.in.rs
      max-concurrent-handle: ${kafka.max-concurrent-handle}
      commit-interval: ${kafka.commit-interval}
      property:
        bootstrap.servers: ${kafka.internal.bootstrap.servers}
        group.id: ${kafka.internal.topic.prefix}replicator-delta-apply-result
        auto.offset.reset: earliest
        enable.auto.commit: false

  producer:
    subscription-result: ${kafka.external.topic.prefix}replication.rs
    subscription-error: ${kafka.external.topic.prefix}replication.err
    subscription-cancel-error: ${kafka.external.topic.prefix}replication.cancel.rs
    subscription-cancel-result: ${kafka.external.topic.prefix}replication.cancel.rs
    subscription-consumer-cancel-result: ${kafka.external.topic.prefix}replication.cancel.in.rs
    subscription-storage-result: ${kafka.external.topic.prefix}replication.in.rs
    subscription-storage-error: ${kafka.external.topic.prefix}replication.in.err
    delta-error: ${kafka.external.topic.prefix}delta.err
    delta-apply-error: ${kafka.external.topic.prefix}delta.in.err
    delta-apply-result: ${kafka.external.topic.prefix}delta.in.rs
    delta-notification: ${kafka.external.topic.prefix}delta.notification
    property:
      bootstrap.servers: ${kafka.external.bootstrap.servers}
    internal:
      mppr-delta-request: ${kafka.internal.topic.prefix}mppr.delta.rq
      mppw-delta-apply-request: ${kafka.internal.topic.prefix}mppw.delta.in.rq
      property:
        bootstrap.servers: ${kafka.internal.bootstrap.servers}

metrics:
  port: ${METRICS_PORT:9837}

log:
  replRequest: ${REPL_REQUEST_LOG_ENABLED:false}
  replResponse: ${REPL_RESPONSE_LOG_ENABLED:false}

backup:
  zk-path: ${REPLICATOR_BACKUP_ZK_PATH:/${environment.name}/podd-adapter-replicator}
  commandTopic: ${BACKUP_COMMAND_TOPIC:adapter.command}
  adapterCommandBroadcast: ${REPLICATOR_COMMAND_BROADCAST_TOPIC:adapter.command.broadcast}
  backupTopic: ${BACKUP_TOPIC:adapter.backup}
  statusTopic: ${STATUS_TOPIC:adapter.status}
  timeout: ${BACKUP_TIMEOUT:PT180s}
  idleDelay: ${BACKUP_DELAY:500}
  kafka:
    consumer:
      property:
        bootstrap.servers: ${kafka.internal.bootstrap.servers}
        group.id: ${REPLICATOR_BACKUP_GROUP_ID:podd_adapter_replicator_adapter_command}
        auto.offset.reset: latest
    producer:
      property:
        bootstrap.servers: ${kafka.internal.bootstrap.servers}

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

Настройка конфигурации ПОДД-адаптера - Модуль подписок осуществляется путем редактирования параметров настроек в файле application.yml.

Пример конфигурации файла application.yml для ПОДД-адаптера - Модуль подписок см. в разделе Пример файла application.yml Руководства администратора.

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

  • environment - указывается название окружения (test, prod и т.д.);

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

  • executor - масштабирования нагрузки на модуль;

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

  • migration - настройки миграции;

  • prostore-api-client - блок параметров конфигурирования взаимодействия с ProStore. Если false - будет использоваться JDBC-драйвер;

  • prostore - адрес сервера Брокера сообщений Kafka компонента ProStore;

  • subscription - настройки подписки;

  • kafka - настройки параметров подключения к шине данных Apache Kafka;

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

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

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

2.2.14.3.1. Секция environment

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

Например:

environment:
  name: ${ENVIRONMENT_NAME:test}

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

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

2.2.14.3.2. Секция http-server

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

Например:

http-server:
  port: ${HTTP_PORT:8085}

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

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

2.2.14.3.3. Секция executor

Секция executor предназначена для масштабирования нагрузки на модуль. Увеличить или уменьшить нагрузку можно с помощью указания размера пула (reader-pool-size) чтения из Kafka.

Например:

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

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

  • reader-pool-size - размер пула для чтения Kafka, например EXECUTOR_READER_POOL_SIZE:20.

2.2.14.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}

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

  • ZOOKEEPER_DS_ADDRESS - адрес сервера Zookeeper DS;

  • ZOOKEEPER_DS_SESSION_TIMEOUT_MS - таймаут подключения к Zookeeper DS,максимальное время ожидания для выявления сбоев потребителей, указывается в миллисекундах (MS.);

  • ZOOKEEPER_DS_SESSION_TIMEOUT_MS - таймаут сессии, максимальное время ожидания подключения к Zookeeper. Если ответ не получен до истечения установленного значения, клиент повторно отправляет запрос при необходимости. Указывается в миллисекундах (MS.);

  • ZOOKEEPER_DS_CHROOT - Zookeeper DS chroot path.

2.2.14.3.5. Секция migration

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

Например:

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.14.3.6. Секция prostore-rest-client

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

Например:

prostore-rest-client:
  enabled: true
  host: ${PS_HOST:t5-prostore-01.ru-central1.internal}
  port: ${PS_PORT:9195}
  http:
    max-pool-size: ${PS_MAX_POOL_SIZE:8}

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

  • 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.14.3.7. Секция prostore

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

Например:

prostore:
  subprotocol: ${PS_SUBPROTOCOL:prostore}
  driver: ${PS_DRIVER:ru.datamart.prostore.jdbc.Driver}
  host: ${PS_HOST:t5-prostore-01.ru-central1.internal}
  port: ${PS_PORT:9195}
  initialPoolSize: ${PS_INITIAL_POOL_SIZE:3}
  maxPoolSize: ${PS_MAX_POOL_SIZE:8}
  statusEventTopic:
    topic: ${PS_STATUS_EVENT_TOPIC:status.event}
    property:
      bootstrap.servers: *prostoreKafkaUrl
      group.id: ${AGENT_TOPIC_PREFIX:}replicator-status-event
      auto.offset.reset: earliest
      enable.auto.commit: false

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

  • subprotocol - Subprotocol для JDBC, например PS_SUBPROTOCOL:prostore;

  • driver - jdbc-драйвер для подключения к Prostore, например PS_DRIVER:ru.datamart.prostore.jdbc.Driver;

  • host - подключение к ядру ProStore, например: PS_HOST:t5-prostore-01.ru-central1.internal;

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

  • initialPoolSize - Prostore начальный размер пула, например PS_INITIAL_POOL_SIZE:3;

  • maxPoolSize - размер пула JDBC подключения, например: maxPoolSize:8;

  • topic - статусный топик Prostore, например PS_STATUS_EVENT_TOPIC:status.event;

  • AGENT_TOPIC_PREFIX - префикс для топиков агента ПОДД.

2.2.14.3.8. Секция subscription

Секция subscription предназначена для настройки подписки на потребителе.

Например

subscription:
  consumer:
    # режим отмены подписки на потребителе. Возможные значения rename, drop, none
    cancel-mode: none

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

  • cancel-mode - режим отмены подписки на потребителе. Возможные значения rename, drop, none.

2.2.14.3.9. Секция kafka

Секция kafka предназначена для настройки параметров подключения к шине данных Apache Kafka (используется для взаимодействия с ПОДД-адаптером) и настройки взаимодействия через топики модуля ПОДД-адаптер - Модуль исполнения запросов.

Модуль взаимодействует через следующие топики:

  • Запрос создания подписки (Поставщик данных): replication.rq/rs/err;

  • Запрос отмены подписки (Поставщик данных): replication.cancel.rq/rs/err;

  • Запрос дельты (Поставщик данных): delta.rq/mppr.delta.rq;

  • Запрос создания структуры по подписке (Получатель данных): replication.in.rq/rs/err;

  • Запрос применения дельты (Получатель данных): subscription.in/delta.in.rs/delta.in.err;

  • Статусы с Prostore (Поставщик данных): status.event/delta.notification.

Например:

kafka:
  agent.topic.prefix: ${AGENT_TOPIC_PREFIX:}
  max-concurrent-handle: ${KAFKA_MAX_CONCURRENT_HANDLE:10}
  commit-interval: ${KAFKA_COMMIT_INTERVAL:5s}
  external:
    bootstrap.servers: ${KAFKA_BOOTSTRAP_SERVERS:localhost:9092}
    topic.prefix: ${EXTERNAL_TOPIC_PREFIX:${kafka.agent.topic.prefix}}
  internal:
    bootstrap.servers: ${PS_KAFKA:localhost:9092}
    topic.prefix: ${INTERNAL_TOPIC_PREFIX:${kafka.agent.topic.prefix}}
  consumer:
    subscription-request:
      topic: ${kafka.external.topic.prefix}replication.rq
      max-concurrent-handle: ${kafka.max-concurrent-handle}
      commit-interval: ${kafka.commit-interval}
      property:
        bootstrap.servers: ${kafka.external.bootstrap.servers}
        group.id: ${kafka.external.topic.prefix}replicator-subscription-request
        auto.offset.reset: earliest
        enable.auto.commit: false
    subscription-cancel-request:
      topic: ${kafka.external.topic.prefix}replication.cancel.rq
      max-concurrent-handle: ${kafka.max-concurrent-handle}
      commit-interval: ${kafka.commit-interval}
      property:
        bootstrap.servers: ${kafka.external.bootstrap.servers}
        group.id: ${kafka.external.topic.prefix}replicator-subscription-cancel-request
        auto.offset.reset: earliest
        enable.auto.commit: false
    subscription-consumer-cancel-request:
      topic: ${kafka.external.topic.prefix}replication.cancel.in.rq
      max-concurrent-handle: ${kafka.max-concurrent-handle}
      commit-interval: ${kafka.commit-interval}
      property:
        bootstrap.servers: ${kafka.external.bootstrap.servers}
        group.id: ${kafka.external.topic.prefix}}replicator-subscription-consumer-cancel-request
        auto.offset.reset: earliest
        enable.auto.commit: false
    subscription-storage-request:
      topic: ${kafka.external.topic.prefix}replication.in.rq
      max-concurrent-handle: ${kafka.max-concurrent-handle}
      commit-interval: ${kafka.commit-interval}
      property:
        bootstrap.servers: ${kafka.external.bootstrap.servers}
        group.id: ${kafka.external.topic.prefix}replicator-subscription-storage-request
        auto.offset.reset: earliest
        enable.auto.commit: false
    delta-request:
      topic: ${kafka.external.topic.prefix}delta.rq
      max-concurrent-handle: ${kafka.max-concurrent-handle}
      commit-interval: ${kafka.commit-interval}
      property:
        bootstrap.servers: ${kafka.external.bootstrap.servers}
        group.id: ${kafka.external.topic.prefix}replicator-delta-request
        auto.offset.reset: earliest
        enable.auto.commit: false
    delta-apply-notification:
      topic: ${kafka.internal.topic.prefix}subscription.in
      max-concurrent-handle: ${kafka.max-concurrent-handle}
      commit-interval: ${kafka.commit-interval}
      property:
        bootstrap.servers: ${kafka.internal.bootstrap.servers}
        group.id: ${kafka.internal.topic.prefix}replicator-delta-apply-notification
        auto.offset.reset: earliest
        enable.auto.commit: false
    mppw-delta-apply-result:
      topic: ${kafka.internal.topic.prefix}mppw.delta.in.rs
      max-concurrent-handle: ${kafka.max-concurrent-handle}
      commit-interval: ${kafka.commit-interval}
      property:
        bootstrap.servers: ${kafka.internal.bootstrap.servers}
        group.id: ${kafka.internal.topic.prefix}replicator-delta-apply-result
        auto.offset.reset: earliest
        enable.auto.commit: false

  producer:
    subscription-result: ${kafka.external.topic.prefix}replication.rs
    subscription-error: ${kafka.external.topic.prefix}replication.err
    subscription-cancel-error: ${kafka.external.topic.prefix}replication.cancel.rs
    subscription-cancel-result: ${kafka.external.topic.prefix}replication.cancel.rs
    subscription-consumer-cancel-result: ${kafka.external.topic.prefix}replication.cancel.in.rs
    subscription-storage-result: ${kafka.external.topic.prefix}replication.in.rs
    subscription-storage-error: ${kafka.external.topic.prefix}replication.in.err
    delta-error: ${kafka.external.topic.prefix}delta.err
    delta-apply-error: ${kafka.external.topic.prefix}delta.in.err
    delta-apply-result: ${kafka.external.topic.prefix}delta.in.rs
    delta-notification: ${kafka.external.topic.prefix}delta.notification
    property:
      bootstrap.servers: ${kafka.external.bootstrap.servers}
    internal:
      mppr-delta-request: ${kafka.internal.topic.prefix}mppr.delta.rq
      mppw-delta-apply-request: ${kafka.internal.topic.prefix}mppw.delta.in.rq
      property:
        bootstrap.servers: ${kafka.internal.bootstrap.servers}

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

  • AGENT_TOPIC_PREFIX - значение префикса для топиков. Топики взаимодействия с ПОДД-адаптером - Модуль исполнения запросов (см. раздел «Спецификация модуля ПОДД-адаптер-Модуль исполнения запросов»).

2.2.14.3.10. Секция log

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

Например:

log:
  replRequest: ${REPL_REQUEST_LOG_ENABLED:false}
  replResponse: ${REPL_RESPONSE_LOG_ENABLED:false}

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

  • repl-request - журналировать запросы к модулю подписок, например REPL_REQUEST_LOG_ENABLED:false;

  • repl-response - журналировать ответы модуля подписок, например REPL_RESPONSE_LOG_ENABLED:false.

2.2.14.3.11. Секция metrics

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

Например:

metrics:
  port: ${METRICS_PORT:9837

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

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

2.2.14.3.12. Секция backup

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

Например:

backup:
  zk-path: ${REPLICATOR_BACKUP_ZK_PATH:/${environment.name}/podd-adapter-replicator}
  commandTopic: ${BACKUP_COMMAND_TOPIC:adapter.command}
  adapterCommandBroadcast: ${REPLICATOR_COMMAND_BROADCAST_TOPIC:adapter.command.broadcast}
  backupTopic: ${BACKUP_TOPIC:adapter.backup}
  statusTopic: ${STATUS_TOPIC:adapter.status}
  timeout: ${BACKUP_TIMEOUT:PT180s}
  idleDelay: ${BACKUP_DELAY:500}
  kafka:
    consumer:
      property:
        bootstrap.servers: ${kafka.internal.bootstrap.servers}
        group.id: ${REPLICATOR_BACKUP_GROUP_ID:podd_adapter_replicator_adapter_command}
        auto.offset.reset: latest
    producer:
      property:
        bootstrap.servers: ${kafka.internal.bootstrap.servers}

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

  • zk-path - путь к корневой ноде zookeeper для бэкапирования, например {COUNTER_BACKUP_ZK_PATH:/${environment.name}/counter-provider/counters};

  • commandTopic - топик команд бэкапирования, например: {BACKUP_COMMAND_TOPIC:adapter.command};

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

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

2.2.15. Настройка BLOB-адаптер

2.2.15.1. Конфигурация BLOB-адаптера (application.yml)

Файл application.yml – основной конфигурационный файл BLOB-адаптер, в котором задана логика и порядок работы модуля: получение входящих запросов, их обработка, настройка подключения к СМЭВ3-адаптеру, ПОДД-адаптеру и Хранилище BLOB-объектов, а также другие настройки необходимые для корректной работы модуля.

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

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

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: 20

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:${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}
  storage:
    protocol: ${BLOB_STORAGE_PROTOCOL:http}
    host: ${BLOB_STORAGE_HOST:localhost}
    port: ${BLOB_STORAGE_PORT:8888}
    path-prefix: ${BLOB_STORAGE_PATH_PREFIX:}
    path-postfix: ${BLOB_STORAGE_PATH_POSTFIX:}
    auth:
      type: ${BLOB_STORAGE_AUTH_TYPE:NONE}
      user: ${BLOB_STORAGE_AUTH_USER:user}
      password: ${BLOB_STORAGE_AUTH_PASSWORD:pass}
      token: ${BLOB_STORAGE_AUTH_TOKEN:token}
      authorization-server:
        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:}
#  params:
#    name1: value1
#    name2: value2

logging:
  request-response:
    blob-request: ${BLOB_REQUEST_LOG_ENABLED:false}
    blob-response: ${BLOB_RESPONSE_LOG_ENABLED:false}

metrics:
  port: ${METRICS_PORT:9837}

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

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

Пример конфигурации файла application.yml для BLOB-адаптера см. Пример файла application.yml .

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

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

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

  • vertx - настройка значений вертиклов;

  • kafka - настройки параметров подключения к шине данных Apache Kafka;

  • blob - настройка подключения к Хранилищу BLOB-объектов;

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

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

2.2.15.3.1. Секция http-server

Секция http-server позволяет настроить взаимодействие с BLOB-объектами через модуль СМЭВ3-адаптер по протоколу http/https и задать порт, на котором будет открыт доступ к серверу.

Например:

http-server:
  enabled: ${SERVER_ENABLED:true}
  port: ${SERVER_PORT:8081}
  • enabled - активирована или нет работа с сервером;

  • port - порт, на котором будет открыт доступ к серверу.

2.2.15.3.2. Секция executor

Секция executor предназначена для масштабирования нагрузки на BLOB-адаптер. Увеличить или уменьшить нагрузку можно с помощью указания размера пула (reader-pool-size) чтения из Kafka.

Например:

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

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

  • reader-pool-size - размер пула для чтения Kafka, например EXECUTOR_READER_POOL_SIZE:20.

2.2.15.3.3. Секция vertx

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

vertx:
  web-client:
    max-pool-size: 20

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

  • max-pool-size - максимальное значение для веб-клиента.

2.2.15.3.4. Секция kafka

Секция kafka предназначена для настройки параметров подключения к шине данных Apache Kafka (используется для взаимодействия с ПОДД-адаптером).

Например:

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 - топики взаимодействия с ПОДД-адаптером - Модуль исполнения запросов (см. Спецификация модуля ПОДД-адаптера - Модуль исполнения запросов).

2.2.15.3.5. Секция blob

Секция blob-storage предназначена для настройки:

  • размера выгружаемого чанка BLOB;

  • пути к Хранилищу BLOB-объектов (GET-запрос);

  • метода аутентификации для модуля BLOB-адаптера;

  • получение токена;

  • повторной аутентификаций при истечении времени жизни токена.

Например:

blob:
  chunk-size: ${CHUNK_SIZE:524288}
  storage:
    protocol: ${BLOB_STORAGE_PROTOCOL:http}
    host: ${BLOB_STORAGE_HOST:localhost}
    port: ${BLOB_STORAGE_PORT:8888}
    path-prefix: ${BLOB_STORAGE_PATH_PREFIX:}
    path-postfix: ${BLOB_STORAGE_PATH_POSTFIX:}
    auth:
      type: ${BLOB_STORAGE_AUTH_TYPE:NONE}
      user: ${BLOB_STORAGE_AUTH_USER:user}
      password: ${BLOB_STORAGE_AUTH_PASSWORD:pass}
      token: ${BLOB_STORAGE_AUTH_TOKEN:token}
      authorization-server:
        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:}
#  params:
#    name1: value1
#    name2: value2

, где

  • chunk-size - размер выгружаемого чанка BLOB, например ${CHUNK_SIZE:524288};

  • protocol - протокол обмена с сервером Хранилища BLOB-объектов (одно из значений http или https), например BLOB_STORAGE_PROTOCOL:http;

  • host - имя сервера Хранилища BLOB-объектов, например BLOB_STORAGE_HOST:localhost;

  • port - TCP-порт Хранилища BLOB-объектов, если отсутствует, то следует использовать следующие порты 80 для HTTP, 443 для HTTPS, например BLOB_STORAGE_PORT:8888;

  • path-postfix - окончание пути, начало списка параметров, например BLOB_STORAGE_PATH_PREFIX:;

  • path-prefix - постоянная часть пути до Хранилища BLOB-объектов, путь до места хранения BLOB-объекта на сервере Хранилища BLOB-объектов, например BLOB_STORAGE_PATH_POSTFIX:;

  • 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:;

  • params - дополнительные параметры запроса к Хранилищу BLOB-объектов.

Пример 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.15.3.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.15.3.7. Секция metrics

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

Например:

metrics:
  port: ${METRICS_PORT:9837}

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

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

2.2.16. Настройка Сервиса формирования документов

2.2.16.1. Конфигурация Сервиса Формирования документов (application.yml)

Файл application.yml – основной конфигурационный файл Сервиса Формирования документов, в котором задана логика и порядок работы сервиса: настройка и обработка документов, путь к pebble-шаблонам документов (секция printable-forms), настройка сервиса формирования подписи (sign-service) , настройка подключения к базе данных (секция: datasource), настройка проверки состояния БД (секция health) и другие настройки необходимые для корректной работы сервиса.

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

Приведем типовую структуру файла application.yml и возможные настройки Сервиса Формирования документов. Следует учитывать, что в конфигурационном файле следует задавать только те настройки, которые необходимы для решения текущих бизнес-задач.

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

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

prostore-rest-client:
  # Признак использования rest-api для взаимодействия с простором. Если false - будет использоваться jdbc драйвер
  enabled: ${PS_REST_CLIENT_ENABLED:true}
  host: ${PS_HOST:localhost}
  port: ${PS_PORT:9195}
  http:
    max-pool-size: ${PS_MAX_POOL_SIZE:8}

prostore:
  subprotocol: ${PS_SUBPROTOCOL:prostore}
  driver: ${PS_DRIVER:ru.datamart.prostore.jdbc.Driver}
  host: ${PS_HOST:localhost}
  port: ${PS_PORT:9195}
  database: ${PS_DATABASE:}
  user: ${PS_USER:}
  password: ${PS_PASSWORD:}
  initialPoolSize: ${PS_INITIAL_POOL_SIZE:5}
  maxPoolSize: ${PS_MAX_POOL_SIZE:8}
  additional-props:
    key: value

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}
    forms:
      key: value

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

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

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

Пример конфигурации файла application.yml для Сервиса Формирования документов см. в разделе Пример файла application.yml Руководства администратора.

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

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

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

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

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

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

  • counter-service - указываются настройки подключения к сервису генерации номера;

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

  • notarius - указываются настройки сервиса подписания и проверки подписи «Нотариус»;

  • printable-forms - указываются настройки сервиса формирования документов

2.2.16.2.1. Секция http-server

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

Например:

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

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

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

2.2.16.2.2. Секция executor

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

Например:

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

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

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

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

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

Например:

prostore-rest-client:
  # Признак использования rest-api для взаимодействия с простором. Если false - будет использоваться jdbc драйвер
  enabled: ${PS_REST_CLIENT_ENABLED:true}
  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.16.2.4. Секция prostore

Секция prostore - предназначена для настройки подключения Prostore.

Например:

prostore:
  subprotocol: ${PS_SUBPROTOCOL:prostore}
  driver: ${PS_DRIVER:ru.datamart.prostore.jdbc.Driver}
  host: ${PS_HOST:localhost}
  port: ${PS_PORT:9195}
  database: ${PS_DATABASE:}
  user: ${PS_USER:}
  password: ${PS_PASSWORD:}
  initialPoolSize: ${PS_INITIAL_POOL_SIZE:5}
  maxPoolSize: ${PS_MAX_POOL_SIZE:8}
  additional-props:
    key: value

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

  • subprotocol - subprotocol для JDBC, например PS_SUBPROTOCOL:prostore;

  • driver - имя класса JDBC драйвера, например PS_DRIVER:ru.datamart.prostore.jdbc.Driver;

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

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

  • database - БД Prostore;

  • user - данные пользователя Prostore;

  • initialPoolSize - начальное число подключений к Prostore, например PS_INITIAL_POOL_SIZE:5;

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

2.2.16.2.5. Секция metrics

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

Например:

metrics:
  port: ${METRICS_PORT:9837}

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

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

2.2.16.2.6. Секция 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.16.2.7. Секция 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.16.2.8. Секция 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}
    forms:
      key: value

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

  • 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.16.2.9. Секция 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.16.3. Примеры pebble-шаблонов для Сервиса Формирования документов

2.2.16.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.16.3.2. Pebble-шаблон для обработки поступившего запроса и формирования json-файла
2.2.16.3.3. Pebble-шаблон для формирования xml-документа
2.2.16.3.4. Pebble-шаблон для формирования pdf-документа

2.2.17. Настройка REST-адаптера

2.2.17.1. Kонфигурационный файл с конечными точками

Для доступа к конечным точкам необходим отредактировать файл sample.yaml, описав все необходимые API в соответствии с приведенным в файле шаблоном (шаблон соответствует спецификации OpenAPI 3.0 https://swagger.io/specification/ ).

Пример файла sample.yaml со всеми конфигурируемыми атрибутами, приведен ниже:

openapi: 3.0.0
info:
  title: Sample API
  version: 0.1.9
servers:
  - url: /
paths:
  /test/query:
    get:
      summary: Returns some value
      operationId: execquery_get
      responses:
        '200': # status code
          description: A JSON array of user names
          content:
            application/json:
              schema:
                type: string

    post:
      summary: Returns some value
      operationId: execquery_post
      responses:
        '200':    # status code
          description: A JSON array of user names
          content:
            application/json:
              schema:
                type: string
  /test/query/{id}:
    post:
      summary: Returns some value
      operationId: execquery_post_params
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
            format: utf8
      responses:
        '200': # status code
          description: A JSON array of user names
          content:
            application/json:
              schema:
                type: string
    get:
      summary: Returns some value
      operationId: execquery_get_params
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
            format: utf8
      responses:
        '200': # status code
          description: A JSON array of user names
          content:
            application/json:
              schema:
                type: string

Секция servers

  • url: / - корневой путь сервера.

Секция: paths

  • /test/query - путь запроса;

  • тип запроса - get , post и т.д. ;

  • operationId - определение operationId для связки с файлом шаблона;

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

2.2.17.2. Шаблоны

Для парсинга и обогащениe запросов используются шаблоны.

В качестве языка шаблонов используется pebble со следующими дополнениями:

  • функция xpath(expression) - возвращает вычисленное выражение на входящем документе;

  • тэг {% mtom %} some content {% endmtom %} - отправляет внутренность вложением;

  • функция sql(var, sql, param1, param2, ...) - выполняет sql с параметрами, результат записывается в переменную var.

Пример формирования шаблона приведен в файле sample.peb.

2.2.18. Настройка Counter-provider - Сервиса генерации уникального номера

2.2.18.1. Конфигурация модуля Counter-Provider (application.yml)

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

2.2.18.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:}

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}

migration:
  enabled: ${MIGRATION_ENABLE:false}
  old-connection-string: ${OLD_ZOOKEEPER_DS_ADDRESS:localhost}

backup:
  zk-path: ${COUNTER_BACKUP_ZK_PATH:/${environment.name}/counter-provider/counters}
  commandTopic: ${BACKUP_COMMAND_TOPIC:adapter.command}
  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}

metrics:
  port: ${METRICS_PORT:9837}

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

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

Пример конфигурации файла application.yml для Сервиса генерации уникального номера см. в разделе Пример файла application.yml Руководства администратора.

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

  • environment - указывается среда разработки;

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

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

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

  • migration - настройки миграции;

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

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

2.2.18.3.1. Секция environment

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

Например:

environment:
  name: ${ENVIRONMENT_NAME:test}

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

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

2.2.18.3.2. Секция http-server

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

Например:

http-server:
  port: ${HTTP_PORT:9000}

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

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

2.2.18.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:}

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

  • start-number - начальный номер счетчика, например COUNTER_START_NUMBER:1;

  • retry-after-failure- количество попыток записи счетчика после ошибки обновления, например COUNTER_RETRY_AFTER_FAILURE:3;

  • update-timeout - таймаут обновления счетчика, например COUNTER_UPDATE_TIMEOUT:;

  • reset-period - период сброса счетчика, например COUNTER_RESET_PERIOD:.

2.2.18.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.18.3.5. Секция migration

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

Например:

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.18.3.6. Секция backup

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

Например:

backup:
  zk-path: ${COUNTER_BACKUP_ZK_PATH:/${environment.name}/counter-provider/counters}
  commandTopic: ${BACKUP_COMMAND_TOPIC:adapter.command}
  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}

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

  • zk-path - путь к корневой ноде zookeeper для бэкапирования, например {COUNTER_BACKUP_ZK_PATH:/${environment.name}/counter-provider/counters};

  • commandTopic - топик команд бэкапирования, например: {BACKUP_COMMAND_TOPIC:adapter.command};

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

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

2.2.18.3.7. Секция metrics

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

Например:

metrics:
  port: ${METRICS_PORT:9837}

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

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

2.2.19. Настройка Arenadata Cluster Manager (ADCM)

Подробная инструкция по настройке Arenadata Cluster Manager (ADCM) приведена в официальной документации разработчика (https://docs.arenadata.io/adcm/ ).

2.2.20. Настройка Arenadata Streaming (ADS)

Инструкция по настройке Arenadata Streaming (ADS) через Arenadata Cluster Manager (ADCM) приведена в официальной документации к Arenadata Cluster Manager (ADCM) (https://docs.arenadata.io/ads/AdminGuide/Config_ADCM.html ).

2.2.21. Настройка сервиса журналирования

Сервис журналирования позволяет работать с логами прикладных модулей запущенных в средах 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 прописать путь до конфигураций fluent-bit, иначе в контейнер логи не подтянутся. Например, <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. Описать конфигурацию для Fluent-bit (подробнее см документацию )

[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

2.2.22. Настройка подсистемы мониторинга

Подсистема мониторинга предназначена для регистрации отладочной информации прикладных модулей и компонентов Platform V в едином журнале.

Настройка подсистемы мониторинга должна применяться к каждому модулю.

Ниже указана последовательность действий для выставления метрик в формате Prometheus из прикладного приложения, написанного на Spring Boot.

  1. Добавить зависимости на Spring Boot Actuator и Micrometer в maven-репозиторий.

<dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
   <groupId>io.micrometer</groupId>
   <artifactId>micrometer-core</artifactId>
</dependency>
<dependency>
   <groupId>io.micrometer</groupId>
   <artifactId>micrometer-registry-prometheus</artifactId>
</dependency>
  1. Указать порт Actuator, фильтр включенных endpoints и системные теги, которые автоматически будут добавлены к прикладным метрикам (файл application.yml).

server:
port: 8080

management:
endpoint:
   health.show-details: always
endpoints:
web:
exposure:
   include: '*'
metrics:
tags:
application: ${spring.application.name}
namespace: ${POD_NAMESPACE:local}
pod: ${POD_NAME:local}
node_name: ${NODE_NAME:local}
  1. Создать прикладные метрики в проекте (с помощью micrometer).

@RestController
public class CounterController {

   private static final String COUNTER_WITH_TAG_NAME = "simple.counterWithTags";
   private static final String COUNTER_WITH_TAG_DESCRIPTION = "Just a simple counter with tags";
   private static final String TAG_NAME_1 = "terbank";
   private static final String TAG_NAME_2 = "vsp";

   private final MeterRegistry meterRegistry;

   private Counter simpleCounter;
   private Counter simpleCounterWithTags;
   private Counter simpleCounterWithTags2;

   public CounterController(MeterRegistry meterRegistry) {
   this.meterRegistry = meterRegistry;
   }

   /**
   * Инициализация метрик типа Counter
   */
   @PostConstruct
   public void init() {
      simpleCounter = Counter.builder("simple.counter")
               .description("Just a simple counter")
               .register(meterRegistry);

      simpleCounterWithTags = Counter.builder(COUNTER_WITH_TAG_NAME)
               .description(COUNTER_WITH_TAG_DESCRIPTION)
               .tag(TAG_NAME_1, "sib")
               .tag(TAG_NAME_2, "111")
               .register(meterRegistry);

      simpleCounterWithTags2 = Counter.builder(COUNTER_WITH_TAG_NAME)
               .description(COUNTER_WITH_TAG_DESCRIPTION)
               .tag(TAG_NAME_1, "msk")
               .tag(TAG_NAME_2, "111")
               .register(meterRegistry);
   }

   @PutMapping("/counter")
   public String incrementCounter() {
      simpleCounter.increment();
      return String.format("Counter has been increases\nCurrent value: %s", simpleCounter.count());
   }

   @PutMapping("/counter-with-tags/terbank/sib")
   public String incrementCounterTags1() {
      simpleCounterWithTags.increment(1);
      return String.format("Counter has been increases\nCurrent value: %s", simpleCounterWithTags.count());
   }

   @PutMapping("/counter-with-tags/terbank/msk")
   public String incrementCounterTags2() {
      simpleCounterWithTags2.increment(2);
      return String.format("Counter has been increases\nCurrent value: %s", simpleCounterWithTags2.count());
   }
}

С помощью REST API сервиса возможна генерация собственных метрик типа Counter.

curl -X PUT "MONITOR_URL/counter" -H "accept: */*"
curl -X PUT "MONITOR_URL/counter-with-tags/terbank/msk" -H "accept: */*"

В каждом из ответов можно увидеть, что общий счетчик метрик был увеличен на n-ное количество. Пример:

Counter has been increases
Current value: 1.0

2.2.22.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: 8080
      targetPort: 8080
   - name: http-actuator
      port: 8081
      targetPort: 8081
selector:
   app: monitoring-rest

2.2.22.2. Grafana: графики мониторинга

Графики мониторинга метрик можно увидеть в Grafana.

Логин/пароль для входа в Grafana: viewer/viewer.

select TIME_FLOOR(__time,'PT1M') as "time",
avg("value") as "avg_value",
"labels.app" as "app",
name as name
from "unimon.gostech_task"
WHERE
name like '%counter%'
and "labels.namespace"='gt-sol-test-coreplatform-01'
and ("labels.application"='monitoring-rest'
OR "labels.app"='monitoring-rest'
OR "labels.SUBSYSTEM"='monitoring-rest')
group by TIME_FLOOR(__time,'PT1M'), "labels.app", name

Также существуют другие типы метрик (DistributionSummary, Gauge, Timer), генерация которых реализована в demo-приложении.

2.2.23. Установка компонента сбора данных запросов и ответов Витрины данных

Компонент сбора данных запросов и ответов Витрины данных реализован с целью проведения бизнес-мониторинга ИЭП процессов обработки запросов типовым ПО витрины данных, как в целом, так и в части функционирования отдельных витрин для последующей передачи данных в СЦЛ.

2.2.23.1. Процесс установки

Общий процесс установки состоит из следующих действий:

  1. Настройка логирования приложений

  2. Установка и настройка Vector.

  3. Установка и настройка HaProxy.

  4. Установка и настройка fluentbit.

2.2.23.1.1. Настройка логирования приложений

На стороне приложений:

  • ПОДД-адаптер - Модуль исполнения запросов;

  • ПОДД-адаптер – Модуль MPPR;

  • BLOB-адаптер;

  • ПОДД-адаптер-Модуль подписок;

  • Сервис формирования документов

необходимо настроить формирование логов в формате JSON.

Для этого необоходимо в файле 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.23.1.2. Установка и настройка Vector

Установка производится по официальной документации: https://vector.dev/docs/setup/installation/

Настройка Vector

Пример настройки 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.23.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.23.1.4. Установка и настройка fluentbit

Установка производится по официальной документации: (https://docs.fluentbit.io/manual/installation/getting-started-with-fluent-bit).

Далее необходимо настроить fluentbit на чтение файлов логов приложений.

Пример файла конфигурации 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.23.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.23.1.6. Включение / выключение отправки сообщений в СЦЛ

Отправка логов в СЦЛ осуществляется автоматически после корректной настройки компонента.

Для выключения отправки логов можно закомментировать блок podd_agent_sink отправки сообщений в kafka в настройках Vector.