Настройка программы =================== Настройка на состав технических средств --------------------------------------- Серверы, на которых будет установлена Программа, должны соответствовать техническим характеристикам указанным в документе «Техническое описание системы» раздел "Рекомендуемые технические и программные средства", в котором приводится информация о требованиях к серверному оборудованию (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-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.