Настройки конфигурации


Настройки проекта (template_config.yml)

Ниже представлено описание основных параметров конфигурационного файла template_config.yml:

Название параметра Описание
environment

Тестовая среда или окружение. Возможные значения:

  • dev
  • dev_demo
  • local
  • Ift
  • prod
  • psi

Если environment входит в health_check.debug_envs, то в проекте появляется возможность вызвать запросы с информацией об утечках памяти от memstats: 

  • get_meminfo (http://0.0.0.0:1234/meminfo),
  • show_growth (http://0.0.0.0:1234/objgrowth),
  • show_most_common_types (http://0.0.0.0:1234/objtypes),
  • get_leaking_objects (http://0.0.0.0:1234/objleak).

Также этот параметр можно использовать как условия (Requirements)

data_adapter

Способ хранения статики:

  • ceph (дополнительно необходимо задать ceph_config.yml)
  • os (в локальной файловой системе)
health_check

Проверка состояния приложения средствами Open Shift. Рекомендуется оперировать следующими параметрами:

  • debug_envs
  • enabled
jaeger_config


Настройка трассировки. Рекомендуется оперировать следующими параметрами:

  • enabled
  • trace_id_header (уникальный трейс id сервиса)
monitoring.enabled

Настройка отправки метрик в Prometheus:

  • true - включить отправку метрик
  • false - отключить отправку метрик

user_save_check_for_collisions

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

  • true - делать проверку
  • false - не делать проверку

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

user_save_collisions_tries

При сохранении данных в db_adapter.type:ignite возможны коллизии, (перезатирание результата предыдущей ноды). Если включена обработка коллизий, то последнее состояние не будет записано - нода вычитает новое состояние и повторит последний запрос с новым состоянием. Чтобы выключить обработку коллизии, необходимо передать 0

db_adapter.type

Тип адаптера:

  • ignite: 
    • в cache_name указывается имя кеша,
    • в url указывается ip БД,
    • в try_count - количество попыток подключения при недоступности БД
  • memory - кеш хранится в локальной памяти и дополнительные поля в конфиге не нужны.
  • redis - набор полей в конфиге определяется документацией класса Redis из redis-py.
masking_fields

Поля из этого конфига маскируются в логах. Принимает значение в виде списка полей из payload

---
environment: prod
data_adapter: ceph
health_check:
    enabled: true
    port: 1234
    interface: 0.0.0.0
    debug_envs:
        - dev
jaeger_config:
    logging: true
    enabled: true
    trace_id_header: dp-trace-id
    sampler:
        type: const
        param: true
monitoring:
    enabled: true
user_save_collisions_tries: 2
db_adapter:
    type: ignite
    url:
        - [10.53.81.125, 10800]
    cache_name: nlpp
    try_count: 2
masking_fields:
    - token
    - access_token
    - refresh_token
    - epkId
    - profileId
    - bankProfile
    - client_profile

Настройки логирования (logging_config.yml)

Настройки нативного Python модуля logging. Ниже представлено описание основных параметров конфигурационного файла logging_config.yml:

Параметр Описание
level Минимальный уровень логирования
handlers

Куда записывается лог - в консоль или файл



class logging.handlers.RotatingFileHandler — настройка, чтобы файлы с логами перезаписывались
backupCount

Количество файлов до ротации.

Всё хранится в памяти пода, поэтому не рекомендуется передавать большое число


maxBytes Размер файла в байтах. При превышении указанного значения создается новый файл
formatters

Форматы для корректной работы с файлбитом.

Указанные значения рекомендуется оставить без изменений

---
logging:
    loggers:
        behaviour_logger:
            handlers:
                - console_behaviour_handler
                - file_behaviour_handler
            propagate: false
            level: DEBUG
        system_logger:
            handlers:
                - console_handler
                - file_handler
            propagate: false
            level: DEBUG
    version: 1
    root:
        handlers:
            - console_handler
        level: INFO
    handlers:
        file_behaviour_handler:
            backupCount: 3
            encoding: utf-8
            filename: '/log/behaviour.log'
            formatter: file_json_formatter
            class: logging.handlers.RotatingFileHandler
            maxBytes: 15728640
        console_handler:
            formatter: console_simple_formatter
            class: logging.StreamHandler
            stream: ext://sys.stdout
        file_handler:
            backupCount: 3
            encoding: utf-8
            filename: '/log/system.log'
            formatter: file_json_formatter
            class: logging.handlers.RotatingFileHandler
            maxBytes: 15728640
        console_behaviour_handler:
            formatter: console_behaviour_formatter
            class: logging.StreamHandler
            stream: ext://sys.stdout
    formatters:
        file_json_formatter:
            '()': smart_kit.utils.logger_writer.logger_formatter.SmartKitJsonFormatter
            json_ensure_ascii: false
            format: '%(created)f %(msecs)d %(relativeCreated)d %(levelname)s %(name)s %(asctime)s %(module)s  %(message)s'
        console_behaviour_formatter:
            style: '{'
            format: '[{levelname}] {name} {asctime} {module} {args[uid]} {args[message_id]} {args[logging_uuid]} {args[class_name]}: {message}'
        console_simple_formatter:
            format: '[%(levelname)s] %(name)s %(asctime)s %(module)s: %(message)s'

Настройки Ceph (ceph_config.yml)

Настройка файла осуществляется, если при настройке проекта в template_config.yml был передан параметр data_adapter: ceph.

Настройки необходимо разбить на 2 файла - configs и secrets. Для загрузки необходимо использовать следующую команду:

SecretFileRepository(filename=self.subfolder_path("ceph_config.yml"),
                     secret_filename=self.subfolder_secret_path("ceph_config.yml"),
                     loader=yaml.safe_load, key=self.CephAdapterKey)

ceph_config:

---
bucket: dev_dialog_policy_bucket
host: 10.36.2.119
is_secure: false
port: 7480

ceph_config в secret:

---access_key: 3HZF4G4CSQ8V3ZLLXKB9
secret_key: BPL60pBS00yksiFJwlL857OW2GnqPCj57c85dEJT

Настройки Kafka (kafka_config.yml)

При использовании подключения по протоколу SSL необходимо прописать блоки с настройками сертификата в publisher (настройки того, кто пишет) и в consumer (настройки того, кто читает).

Ниже представлено описание основных параметров в publisher:

Параметр Описание
conf Передача параметров конфигурации для confluent_kafka



bootstrap.servers IP сервера Kafka (брокера)
broker.version.fallback

Отключение клиентом запроса на получение версии брокера. Если не прописать эти параметры, то при нестабильной работе на стороне Kafka, произойдет потеря заголовков (headers)

api.version.fallback.ms
poll_timeout

Время, в течение которого клиент остается в poll при вычитке коммита. Управление возвращается, если:

  • получен результат коммита
  • или истекло указанное время
topic Топики, в которые осуществляется запись. Для удобства использования ключ размещен в коде, так как топики могут меняться

Ниже представлено описание основных параметров в consumer:

Параметр Описание
poll_timeout

Время, в течение которого клиент остается в poll при ожидании нового сообщения. Управление возвращается, если:

  • новое сообщение не получено
  • или истекло указанное время
assign_offset_end

Если значение false, то при подключении нового клиента все непрочитанные сообщения будут прочитаны.

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

topics Топики, из которых читаются записи
conf Настройки файла конфигурации

bootstrap.servers IP сервера Kafka (брокера)
group.id  Экземпляры с одинаковой группой распределяют между собой сообщения, т.е. если сообщение вычитал один клиент, то второй его уже не вычитает. Чтобы поды читали сообщения параллельно, необходимо указать для них разные группы
enable.auto.commit: true

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

Чтобы сообщение не было вычитано дважды, offset хранятся локально и отправляются на бэкенд через auto.commit.interval.ms. Из-за этого время коммита на Kafka SSL может занимать до 1 секунды

enable.auto.offset.store: false
auto.commit.interval.ms Время, через которое локальные коммиты отправляются на бек
auto.offset.reset

Способ чтения топика:

  • earliest - чтение с начала;
  • largest - чтение с конца. Выбирается, если у брокера нет сохраненного offset

kafka_config c ssl:

---
template-engine:
  main:
    publisher:
      conf:
        security.protocol: SSL
        ssl.keystore.location: "{{ app.secret_path }}keystore.p12"
        ssl.keystore.password: "{{ kafka_ssl.keystore.password }}"
        ssl.ca.location: "{{ app.secret_path }}ca_root"
        ssl.certificate.location: "{{ app.secret_path }}cert"
        ssl.key.location: "{{ app.secret_path }}key"
        bootstrap.servers: tkle-mess0066.vm.esrt.cloud.sbrf.ru:9093,tkle-mess0067.vm.esrt.cloud.sbrf.ru:9093
        topic.metadata.refresh.interval.ms: 100000
        broker.version.fallback: 0.10.0.0
        api.version.fallback.ms: 0
      poll_timeout: 0
      flush_timeout: 15000
      topic:
        vps: dpToKis
        ir: DPtoIR
        axon: DPtoAX
        axon: toAX
        client_info: giveMemory
        external: APP_CONNECTOR.REQ
        history: aiHistorySaveTopic
        account_linking: dpToAlts
        client_info_remember: rememberMemory
    consumer:
      poll_timeout: 0.001
      assign_offset_end: false
      topics:
        to_dp: toDP
      conf:
        security.protocol: SSL
        ssl.keystore.location: "{{ app.secret_path }}keystore.p12"
        ssl.keystore.password: "{{ kafka_ssl.keystore.password }}"
        ssl.ca.location: "{{ app.secret_path }}ca_root"
        ssl.certificate.location: "{{ app.secret_path }}cert"
        ssl.key.location: "{{ app.secret_path }}key"
        bootstrap.servers:  tkle-mess0066.vm.esrt.cloud.sbrf.ru:9093,tkle-mess0067.vm.esrt.cloud.sbrf.ru:9093
        topic.metadata.refresh.interval.ms: 100000
        group.id: dialog_policy
        session.timeout.ms: 6000
        enable.auto.commit: true
        enable.auto.offset.store: false
        auto.commit.interval.ms: 1000
        broker.version.fallback: 0.10.0.0
        api.version.fallback.ms: 0
        default.topic.config:
          auto.offset.reset: largest

kafka_config без ssl:

---
template-engine:
    main:
        publisher:
            conf:
                bootstrap.servers: tkle-mess0066.vm.esrt.cloud.sbrf.ru:9092,tkle-mess0067.vm.esrt.cloud.sbrf.ru:9092
                topic.metadata.refresh.interval.ms: 100000
                broker.version.fallback: 0.10.0.0
                api.version.fallback.ms: 0
            poll_timeout: 0
            flush_timeout: 15000
            topic:
                vps: dpToKis
                ir: DPtoIR
                axon: DPtoAX
                client_info: giveMemory
                external: APP_CONNECTOR.REQ
                history: aiHistorySaveTopic
                account_linking: dpToAlts
                client_info_remember: rememberMemory
        consumer:
            poll_timeout: 0.001
            assign_offset_end: false
            topics:
                to_dp: toDP
            conf:
                bootstrap.servers: tkle-mess0066.vm.esrt.cloud.sbrf.ru:9092,tkle-mess0067.vm.esrt.cloud.sbrf.ru:9092
                topic.metadata.refresh.interval.ms: 100000
                group.id: dialog_policy
                session.timeout.ms: 6000
                enable.auto.commit: true
                enable.auto.offset.store: false
                auto.commit.interval.ms: 1000
                broker.version.fallback: 0.10.0.0
                api.version.fallback.ms: 0
                default.topic.config:
                    auto.offset.reset: largest

Заметили ошибку?

Выделите текст и нажмите Ctrl + Enter, чтобы сообщить нам о ней