Настройка программы
===================
Настройка на состав технических средств
---------------------------------------
Серверы, на которых будет установлена Программа, должны соответствовать техническим характеристикам указанным в документе «Техническое описание системы» раздел "Рекомендуемые технические и программные средства", в котором приводится информация о требованиях к серверному оборудованию (CPU, RAM, HDD и т.д.), программному обеспечению и требования к каналам связи.
Необходимые настройки для серверов описаны в документе "Руководство по установке", в котором приводится информация об общих требованиях к серверам, требуемой доступности портов для каждого сервера, настройка протоколов, наличие библиотек и т.д.
.. _software_settings:
Настройка на состав программных средств
---------------------------------------
Все предварительные действия необходимые перед установкой программы, процесс установки и проверка корректной установки программы описан в документе «Руководство по установке».
Настройка ProStore
~~~~~~~~~~~~~~~~~~
Настройка Сервиса исполнения запросов (query-execution)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Пример файла application.yml
############################
Файл ``application.yml`` – основной конфигурационный файл, в котором задана логика и порядок работы *Сервиса исполнения запросов* (query-execution). Для первоначальной установки используйте значения «по умолчанию».
Пример файла ``application.yml`` со всеми конфигурируемыми атрибутами, приведен ниже:
.. code-block:: yaml
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}
2. Настройка 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`` - интервал времени завершения задачи, выполняемой в *Сервисе исполнения запросов*.
3. Оптимизация работы сокета ``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``.
4. Настройки для ``EDML`` операторов:
- ``EDML_DATASOURCE`` - тип СУБД-источника;
- ``EDML_DEFAULT_CHUNK_SIZE`` -- размер ``chunk`` по умолчанию;
- ``EDML_STATUS_CHECK_PERIOD_MS`` - период проверки статуса плагина в миллисекундах;
- ``EDML_FIRST_OFFSET_TIMEOUT_MS`` - интервал времени ожидания до таймаута в миллисекундах при работе с первым смещением;
- ``EDML_CHANGE_OFFSET_TIMEOUT_MS`` - интервал времени ожидания до таймаута в миллисекундах при работе с первым смещением в топике Kafka.
5. Настройка 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.
6. Настройка Kafka-серверов:
- ``KAFKA_INPUT_STREAM_TIMEOUT_MS`` -- интервал времени ожидания (в миллисекундах) входного потока данных для брокера сообщений Kafka до достижения таймаута;
- ``KAFKA_STATUS_EVENT_ENABLED`` - разрешение на публикацию событий;
- ``KAFKA_STATUS_EVENT_TOPIC`` - наименование топика Kafka, в который публикуются события;
- ``STATUS_MONITOR_URL`` - сетевой адрес, порт и путь к *Сервису мониторинга статусов Kafka*.
7. Настройки кэширования запросов:
- ``CACHE_INITIAL_CAPACITY`` - первоначальный размер кэша;
- ``CACHE_MAXIMUM_SIZE`` - максимальный размер кэша;
- ``CACHE_EXPIRE_AFTER_ACCESS_MINUTES`` - время (в минутах) устаревания кэша после последнего обращения к нему.
Настройка Сервиса мониторинга Kafka (status-monitor)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Настройка *Сервиса мониторинга статусов Kafka* осуществляется путём указания в соответствующем конфигурационном yml-файле параметров отслеживания файлов-топиков брокера сообщений Kafka, таких как:
- смещение ``consumer``;
- содержание последнего сообщения;
- время появления последнего сообщения.
Ниже, представлен пример application.yml для status-monitor с конфигурируемыми атрибутами.
Пример файла application.yml для status-monitor
###############################################
.. code-block:: yaml
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*.
Настройка kafka-clickhouse-reader
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
*kafka-clickhouse-reader* - поддерживает часть функций процесса MPPR (чтение данных из Clickhouse и запись в Kafka).
Настройка ``kafka-clickhouse-reader`` осуществляется путём редактирования файла ``application.yml``, в котором задана логика и порядок работы компонента.
Пример файла application.yml для kafka-clickhouse-reader
########################################################
.. code-block:: yaml
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 :term:`ProStore`;
- ``KAFKA_CLUSTER_ROOTPATH`` - путь хранения информации о Kafka :term:`ProStore` в *Zookeeper*.
Настройка kafka-clickhouse-writer
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
*kafka-clickhouse-writer* - коннектор, который поддерживает часть функциональности процесса MPP-W (чтение из Kafka и запись данных в базу данных Clickhouse).
Настройка ``kafka-clickhouse-writer`` осуществляется путём редактирования файла ``application.yml``, в котором задана логика и порядок работы компонента.
Пример файла application.yml для kafka-clickhouse-writer
########################################################
.. code-block:: yaml
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`` - подключение к :term:`ProStore` Kafka.
- ``ENV`` - название окружения.
Настройка СМЭВ QL Сервера
~~~~~~~~~~~~~~~~~~~~~~~~~~
.. Конфигурация СМЭВ QL Сервера
.. Подключаем файл с настройками конфигурации СМЭВ QL Сервера
.. include:: ../../modules/smev-ql/doc/smev_ql_config.rst
Настройка СМЭВ3-адаптера
~~~~~~~~~~~~~~~~~~~~~~~~
.. Конфигурация СМЭВ-адаптер
.. Подключаем файл с настройками конфигурации СМЭВ-адаптер
.. include:: ../../modules/smev3-adapter/doc/smev3_adapter_config.rst
Настройка CSV-Uploader
~~~~~~~~~~~~~~~~~~~~~~
.. Конфигурация CSV-Uploader (application.yml)
.. Подключаем файл с настройками конфигурации CSV-Uploader
.. include:: ../../modules/csv-uploader/doc/csv_uploader_config.rst
Настройка ПОДД-адаптера - Модуль исполнения запросов
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
.. Конфигурация ПОДД-адаптера - Модуль исполнения запросов (application.yml)
.. Подключаем файл с настройками конфигурации ПОДД-адаптер - Модуль исполнения запросов
.. include:: ../../modules/podd-adapter-query/doc/podd_adapter_query_config.rst
Настройка ПОДД-адаптер – Модуль MPPR
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
.. Конфигурация ПОДД-адаптер – Модуль MPPR (application.yml)
.. Подключаем файл с настройками конфигурации ПОДД-адаптер – Модуль MPPR
.. include:: ../../modules/podd-adapter-mppr/doc/podd_adapter_mppr_config.rst
Настройка ПОДД-адаптер-Модуль MPPW
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
.. Конфигурация ПОДД-адаптер-Модуль MPPW (application.yml)
.. Подключаем файл с настройками конфигурации ПОДД-адаптер-Модуль MPPW
.. include:: ../../modules/podd-adapter-mppw/doc/podd_adapter_mppw_config.rst
Настройка ПОДД-адаптер – Модуль импорта данных табличных параметров
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
.. Конфигурация ПОДД-адаптер – Модуль импорта данных табличных параметров (application.yml)
.. Подключаем файл с настройками конфигурации ПОДД-адаптер – Модуль импорта данных табличных параметров
.. include:: ../../modules/podd-adapter-import-tp/doc/podd_adapter_import_tp_config.rst
Настройка ПОДД-адаптер – Модуль группировки данных табличных параметров
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
.. Конфигурация ПОДД-адаптер – Модуль группировки данных табличных параметров (application.yml)
.. Подключаем файл с настройками конфигурации ПОДД-адаптер – Модуль группировки данных табличных параметров
.. include:: ../../modules/podd-adapter-import-tp/doc/podd_adapter_import_tp_config.rst
Настройка ПОДД-адаптер – ПОДД-адаптер – Wrapper
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
.. Конфигурация ПОДД-адаптер – Wrapper (application.yml)
.. Подключаем файл с настройками конфигурации ПОДД-адаптер – Wrapper
.. include:: ../../modules/podd-avro-defragmentator/doc/podd_avro_defragmentator_config.rst
Настройка Модуля группировки чанков
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
.. Конфигурация модуля
.. Подключаем файл с настройками конфигурации модуля
.. include:: ../../modules/podd-adapter-group-repl/doc/podd_adapter_group_repl_config.rst
Настройка DATA-Uploader – Модуль исполнения асинхронных заданий
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
.. Конфигурация DATA-Uploader – Модуль исполнения асинхронных заданий (application.yml)
.. Подключаем файл с настройками конфигурации DATA-Uploader – Модуль исполнения асинхронных заданий
.. include:: ../../modules/data-uploader/doc/data_uploader_config.rst
Настройка REST-Uploader – Модуль асинхронной загрузки данных из сторонних источников
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
.. Конфигурация REST-Uploader – Модуль асинхронной загрузки данных из сторонних источников (application.yml)
.. Подключаем файл с настройками конфигурации REST-Uploader – Модуль асинхронной загрузки данных из сторонних источников
.. include:: ../../modules/rest-uploader/doc/rest_uploader_config.rst
.. Подключение ФЛК
.. include:: ../../modules/rest-uploader/doc/rest_uploader_format_control.rst
.. Подключаем файл спецификации
.. include:: ../../modules/rest-uploader/doc/rest_uploader_specification.rst
.. подключаем файл openapi.yml
.. literalinclude:: ../../modules/rest-uploader/doc/specs/upload.yml
:language: yaml
Настройка ПОДД-адаптер – Модуль подписки
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
.. Конфигурация ПОДД-адаптер – Модуль подписки (application.yml)
.. Подключаем файл с настройками конфигурации ПОДД-адаптер – Модуль подписки
.. include:: ../../modules/podd-adapter-replicator/doc/podd_adapter_replicator_config.rst
Настройка BLOB-адаптер
~~~~~~~~~~~~~~~~~~~~~~
.. Конфигурация BLOB-адаптер (application.yml)
.. Подключаем файл с настройками конфигурации BLOB-адаптер
.. include:: ../../modules/blob-adapter/doc/blob_adapter_config.rst
Настройка Сервиса формирования документов
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
.. Конфигурация Сервис формирования документов (application.yml)
.. Подключаем файл с настройками конфигурации Сервис формирования документов
.. include:: ../../modules/printable-form-service/doc/printable_form_service_config.rst
Настройка REST-адаптера
~~~~~~~~~~~~~~~~~~~~~~~
Kонфигурационный файл с конечными точками
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Для доступа к конечным точкам необходим отредактировать файл ``sample.yaml``, описав все необходимые API в соответствии с приведенным в файле шаблоном (шаблон соответствует спецификации OpenAPI 3.0 https://swagger.io/specification/ ).
Пример файла ``sample.yaml`` со всеми конфигурируемыми атрибутами, приведен ниже:
.. code-block:: 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`` - описание параметров ответа.
Шаблоны
^^^^^^^
Для парсинга и обогащениe запросов используются шаблоны.
В качестве языка шаблонов используется ``pebble`` со следующими дополнениями:
- функция ``xpath(expression)`` - возвращает вычисленное выражение на входящем документе;
- тэг ``{% mtom %} some content {% endmtom %}`` - отправляет внутренность вложением;
- функция ``sql(var, sql, param1, param2, ...)`` - выполняет ``sql`` с параметрами, результат записывается в переменную ``var``.
Пример формирования шаблона приведен в файле ``sample.peb``.
Настройка Counter-provider - Сервиса генерации уникального номера
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
.. Конфигурация Сервиса генерации уникального номера (application.yml)
.. Подключаем файл с настройками конфигурации Сервиса генерации уникального номера
.. include:: ../../modules/counter-provider/doc/counter_provider_config.rst
Настройка Arenadata Cluster Manager (ADCM)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Подробная инструкция по настройке Arenadata Cluster Manager (ADCM) приведена в официальной документации разработчика (https://docs.arenadata.io/adcm/ ).
Настройка Arenadata Streaming (ADS)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Инструкция по настройке Arenadata Streaming (ADS) через Arenadata Cluster Manager (ADCM) приведена в официальной документации к Arenadata Cluster Manager (ADCM) (https://docs.arenadata.io/ads/AdminGuide/Config_ADCM.html ).
Настройка сервиса журналирования
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Сервис журналирования позволяет работать с логами прикладных модулей запущенных в средах WildFly и Kubernetes/OpenShift.
Настройка сервиса журналирования должна применяться к каждому модулю.
Ниже указаны шаги, позволяющие обеспечить интеграцию сервиса с системой журналирования Платформы ГосТех.
1. Добавить зависимости в проект.
.. code-block:: xml
org.springframework.boot
spring-boot-starter-parent
2.3.4.RELEASE
4.0.0
logger-test
11
Hoxton.SR5
org.springframework.boot
spring-boot-starter-web
org.springframework.boot
spring-boot-starter-validation
ch.qos.logback
logback-classic
1.2.3
ch.qos.logback.contrib
logback-json-classic
0.1.5
ch.qos.logback.contrib
logback-jackson
0.1.5
net.logstash.logback
logstash-logback-encoder
6.3
org.projectlombok
lombok
1.18.12
provided
io.springfox
springfox-boot-starter
3.0.0
org.codehaus.janino
janino
3.0.6
org.springframework.cloud
spring-cloud-starter-sleuth
org.springframework.kafka
spring-kafka
2.5.9.RELEASE
org.springframework.cloud
spring-cloud-dependencies
${spring-cloud.version}
pom
import
2. Подключить Fluentbit к приложению как отдельный контейнер в OpenShift.
.. code-block:: yaml
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
3. Создать файл ``logback.xml`` для логирования приложения ( подробнее см. `документацию `_).
.. attention:: Обязательно в appender FILE_FLUENT прописать путь до конфигураций fluent-bit, иначе в контейнер логи не подтянутся. Например, ``name-project/docker/fluentbit/conf/log.log``.
.. code-block:: xml
%d{yyyy-MM-dd HH:mm:ss}%-5level %logger{36} - %msg%n
docker/fluentbit/conf/log.log
false
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
4. Описать конфигурацию для Fluent-bit (подробнее см `документацию `_ )
.. code-block::
[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``.
.. code-block::
[PARSER]
Name logfmt
Format logfmt
5. Добавить форматирование даты
.. code-block:: lua
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
6. Добавить параметры модуля
.. code-block:: yaml
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
Настройка подсистемы мониторинга
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Подсистема мониторинга предназначена для регистрации отладочной информации прикладных модулей и компонентов Platform V в едином журнале.
Настройка подсистемы мониторинга должна применяться к каждому модулю.
Ниже указана последовательность действий для выставления метрик в формате **Prometheus** из прикладного приложения, написанного на Spring Boot.
1. Добавить зависимости на **Spring Boot Actuator** и **Micrometer** в maven-репозиторий.
.. code-block:: xml
org.springframework.boot
spring-boot-starter-web
org.springframework.boot
spring-boot-starter-actuator
io.micrometer
micrometer-core
io.micrometer
micrometer-registry-prometheus
2. Указать порт **Actuator**, фильтр включенных endpoints и системные теги, которые автоматически будут добавлены к прикладным метрикам (файл application.yml).
.. code-block:: yaml
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}
3. Создать прикладные метрики в проекте (с помощью micrometer).
.. code-block:: java
@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*.
.. code-block:: bash
curl -X PUT "MONITOR_URL/counter" -H "accept: */*"
curl -X PUT "MONITOR_URL/counter-with-tags/terbank/msk" -H "accept: */*"
В каждом из ответов можно увидеть, что общий счетчик метрик был увеличен на n-ное количество. Пример:
.. code-block:: bash
Counter has been increases
Current value: 1.0
Настройка конфигурации для OpenShift
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Для того, чтобы Prometheus мог идентифицировать сервис и собрать с него информацию, необходимо создать Service и указать путь, на котором располагаются метрики приложения.
.. code-block:: yaml
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
Grafana: графики мониторинга
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Графики мониторинга метрик можно увидеть в **Grafana**.
Логин/пароль для входа в **Grafana**: viewer/viewer.
.. code-block:: sql
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-приложении.
Установка компонента сбора данных запросов и ответов Витрины данных
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Компонент сбора данных запросов и ответов Витрины данных реализован с целью проведения бизнес-мониторинга ИЭП процессов обработки запросов типовым ПО витрины данных, как в целом, так и в части функционирования отдельных витрин для последующей передачи данных в СЦЛ.
Процесс установки
^^^^^^^^^^^^^^^^^^
Общий процесс установки состоит из следующих действий:
1. Настройка логирования приложений
2. Установка и настройка Vector.
3. Установка и настройка HaProxy.
4. Установка и настройка fluentbit.
Настройка логирования приложений
#################################
На стороне приложений:
- **ПОДД-адаптер - Модуль исполнения запросов**;
- **ПОДД-адаптер – Модуль MPPR**;
- **BLOB-адаптер**;
- **ПОДД-адаптер-Модуль подписок**;
- **Сервис формирования документов**
необходимо настроить формирование логов в формате JSON.
Для этого необоходимо в файле logback.xml включить ``net.logstash.logback.encoder.LogstashEncoder``.
Пример logback.xml:
.. code-block:: xml
logs/application.log
logs/application.%d{yyyy-MM-dd}.log
30
3GB
Подробная информация об encoder: https://github.com/logfellow/logstash-logback-encoder
Чтобы включить генерацию СЦЛ необоходимо также в секции **logging** файлa настроек **application.yaml** установить значения ``true``.
Установка и настройка Vector
############################
Установка производится по официальной документации: https://vector.dev/docs/setup/installation/
Настройка Vector
Пример настройки source:
.. code-block:: yaml
json_source:
type: fluent
address: 0.0.0.0:24226
Пример фильтрации сообщений, имеющих флаг ``scl``:
.. code-block:: yaml
scl_tags_filter:
type: filter
inputs:
- json_source
condition:
type: "vrl"
source: |-
exists(.tags) && includes(array!(.tags), "TYPE_SCL")
Пример парсинга scl-сообщений:
.. code-block:: yaml
scl_message_remap:
type: remap
inputs:
- scl_tags_filter
source: |-
. = parse_json!(.message)
Пример отправки scl-сообщений в kafka:
.. code-block:: yaml
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
Установка и настройка HaProxy
##############################
Установка производится по официальной документации: http://docs.haproxy.org/
Для настройки HaProxy в секции backend нужно перечислить список установленных инстансов Vector.
Пример файла ``haproxy.cfg``:
.. code-block:: 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
Установка и настройка fluentbit
################################
Установка производится по официальной документации: (https://docs.fluentbit.io/manual/installation/getting-started-with-fluent-bit).
Далее необходимо настроить fluentbit на чтение файлов логов приложений.
Пример файла конфигурации ``fluent-bit.conf``:
.. code-block::
[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``:
.. code-block::
[PARSER]
Name json
Format json
На этом настройка fluentbit завершена.
Работа с БД ClickHouse
#######################
В рамках технического решения по хранению протоколируемых запросов и ответов с возможностью извлечение данных по уникальному идентификатору реализовано использование колоночной аналитической базы данных ClickHouse.
Ключевые функциональные особенности базы данных ClickHouse:
- **движок базы данных**: по умолчанию ClickHouse использует движок Atomic;
- **движок таблиц**: MergeTree;
- **версия ClickHouse**: LTS;
- запрос на создание таблицы хранения логов в ClickHouse: **CREATE TABLE**.
Пример создания таблицы:
.. code-block:: sql
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;
Пример задания конфигурационных настроек:
.. code-block:: yaml
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 }}"
Включение / выключение отправки сообщений в СЦЛ
#################################################
Отправка логов в СЦЛ осуществляется автоматически после корректной настройки компонента.
Для выключения отправки логов можно закомментировать блок ``podd_agent_sink`` отправки сообщений в kafka в настройках Vector.