Skip to main content

Интеграция с Региональной витриной данных

Project description

Проект "Интеграция с Региональной витриной данных (РВД)"

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

На текущий момент интеграция реализуется в рамках проектов Электронная школа (ЭШ) и Электронный колледж (ЭК).

Описание концепции

Со стороны Минцифры предоставляется спецификация (ЕФТТ) с требованиями по формату и механизму выгрузки данных.

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

Принцип работы

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

Модель продукта : Django-модель находящаяся в самом продукте. При помощи нее производится накапливание пользовательских данных;

Модель РВД : Django-модель находящаяся в пакете РВД продукта. Из моделей РВД формируется схема БД, позволяющая хранить данные для дальнейшей выгрузки в нормализованном виде;

Сущность РВД : Описание формата выгрузки данных в РВД в виде dataclass-а. Хранит в себе описание первичных, внешних ключей, обязательность и порядок полей.

На этапе сбора данных производится формирование данных моделей РВД на основе данных моделей продуктов. Существуют так называемые расчетные модели, для которых данные рассчитываются в процессе сбора.

Стоит обратить внимание, что сущности РВД могут содержать в себе данные из нескольких моделей РВД.

Требования к окружению

Для работы требуется Python >=3.7. Так же в зависимостях есть внутренние пакеты:

  • educommon;
  • function-tools;
  • m3-db-utils;
  • uploader-client.

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

Разворачивание

Перед внедрением пакета в проект, необходимо убедиться, что:

  • В проекте используется логирование из educommon;
  • В проект внедрен function-tools;
  • В проект внедрен m3-db-utils;
  • В проект внедрен uploader-client.

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

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

Для возможности конфигурирования необходимо проделать ряд действий:

  • Определение значений по умолчанию настроек в settings.py:

    PROJECT_DEFAULT_CONFIG.update({
        # Настройки РВД
        ('rdm_general', 'EXPORT_ENTITY_ID_PREFIX'): '', # Дефолтное значение нужно изменить на специфическое системе
        ('rdm_general', 'COLLECT_CHUNK_SIZE'): 500,
        ('rdm_general', 'EXPORT_CHUNK_SIZE'): 500,
        ('rdm_transfer_task', 'MINUTE'): '0',
        ('rdm_transfer_task', 'HOUR'): '*/4',
        ('rdm_transfer_task', 'TRANSFER_TASK_DAY_OF_WEEK'): '*',
        ('rdm_transfer_task', 'TIMEDELTA'): 3600,
        ('rdm_upload_status_task', 'MINUTE'): '*/30',
        ('rdm_upload_status_task', 'HOUR'): '*',
        ('rdm_upload_status_task', 'DAY_OF_WEEK'): '*',
        ('uploader_client', 'URL'): 'http://localhost:8090',
        ('uploader_client', 'DATAMART_NAME'): '',
        ('uploader_client', 'REQUEST_RETRIES'): 10,
        ('uploader_client', 'REQUEST_TIMEOUT'): 10,
        ('uploader_client', 'ENABLE_REQUEST_EMULATION'): False,
    })
    
  • Получение значений настроек из конфигурационного файла в settings.py:

    # Ссылка на каталог с файлами для загрузки
    UPLOADS = 'uploads'
    
    # =============================================================================
    # Интеграция с Региональной витриной данных (РВД)
    # =============================================================================
    
    # Префикс идентификаторов записей сущностей специфический для продукта
    RDM_EXPORT_ENTITY_ID_PREFIX = conf.get('rdm_general', 'EXPORT_ENTITY_ID_PREFIX') 
    
    # Количество записей моделей ЭШ обрабатываемых за одну итерацию сбора данных
    RDM_COLLECT_CHUNK_SIZE = conf.get_int('rdm_general', 'COLLECT_CHUNK_SIZE')
    
    # Количество записей моделей обрабатываемых за одну итерацию экспорта данных
    RDM_EXPORT_CHUNK_SIZE = conf.get_int('rdm_general', 'EXPORT_CHUNK_SIZE')
    
    # Настройка запуска периодической задачи выгрузки данных:
    RDM_TRANSFER_TASK_MINUTE = conf.get('rdm_transfer_task', 'MINUTE')
    RDM_TRANSFER_TASK_HOUR = conf.get('rdm_transfer_task', 'HOUR')
    RDM_TRANSFER_TASK_DAY_OF_WEEK = conf.get('rdm_transfer_task', 'DAY_OF_WEEK')
    RDM_TRANSFER_TASK_TIMEDELTA = conf.get_int('rdm_transfer_task', 'TIMEDELTA')
    
    # Настройка запуска периодической задачи статуса загрузки данных в витрину:
    RDM_UPLOAD_STATUS_TASK_MINUTE = conf.get('rdm_upload_status_task', 'MINUTE')
    RDM_UPLOAD_STATUS_TASK_HOUR = conf.get('rdm_upload_status_task', 'HOUR')
    RDM_UPLOAD_STATUS_TASK_DAY_OF_WEEK = conf.get('rdm_upload_status_task', 'DAY_OF_WEEK')
    
    # Настройка запуска периодической задачи поиска зависших этапов экспорта:
    RDM_CHECK_SUSPEND_TASK_MINUTE = conf.get('rdm_check_suspend_task', 'MINUTE')
    RDM_CHECK_SUSPEND_TASK_HOUR = conf.get('rdm_check_suspend_task', 'HOUR')
    RDM_CHECK_SUSPEND_TASK_DAY_OF_WEEK = conf.get('rdm_check_suspend_task', 'DAY_OF_WEEK')
    RDM_CHECK_SUSPEND_TASK_TIMEDELTA = conf.get_int('rdm_check_suspend_task', 'TIMEDELTA')
    
    # Загрузка данных в Региональную витрину данных (РВД)
    # Адрес витрины (schema://host:port)
    RDM_UPLOADER_CLIENT_URL = conf.get('uploader_client', 'URL')
    
    # Мнемоника Витрины
    RDM_UPLOADER_CLIENT_DATAMART_NAME = conf.get('uploader_client', 'DATAMART_NAME')
    
    # Количество повторных попыток запроса
    RDM_UPLOADER_CLIENT_REQUEST_RETRIES = conf.get_int('uploader_client', 'REQUEST_RETRIES')
    
    # Таймаут запроса, сек
    RDM_UPLOADER_CLIENT_REQUEST_TIMEOUT = conf.get_int('uploader_client', 'REQUEST_TIMEOUT')
    
    # Включить эмуляцию отправки запросов
    RDM_UPLOADER_CLIENT_ENABLE_REQUEST_EMULATION = conf.get_bool('uploader_client', 'ENABLE_REQUEST_EMULATION')
    
    

    Перечень настроек в settings.py указан в таблице ниже.

    Название настройки в settings Описание Значение по умолчанию
    UPLOADS Основная директория в MEDIA, в которой будет создана директория edu_rdm_integration для сохранения файлов для дальнейшей выгрузки 500
    RDM_COLLECT_CHUNK_SIZE Количество записей моделей обрабатываемых за одну итерацию сбора данных 500
    RDM_EXPORT_CHUNK_SIZE Количество записей моделей обрабатываемых за одну итерацию экспорта 500
    RDM_UPLOADER_CLIENT_URL Адрес витрины (schema://host:port) 'http://localhost:8090'
    RDM_UPLOADER_CLIENT_DATAMART_NAME Мнемоника Витрины 'test'
    RDM_UPLOADER_CLIENT_REQUEST_RETRIES Количество повторных попыток запроса 10
    RDM_UPLOADER_CLIENT_REQUEST_TIMEOUT Таймаут запроса, сек 10
    RDM_UPLOADER_CLIENT_ENABLE_REQUEST_EMULATION Включить эмуляцию отправки запросов True
    RDM_TRANSFER_TASK_MINUTE Настройка запуска периодической задачи выгрузки данных. Минута '0'
    RDM_TRANSFER_TASK_HOUR Настройка запуска периодической задачи выгрузки данных. Час '*/4'
    RDM_TRANSFER_TASK_DAY_OF_WEEK Настройка запуска периодической задачи выгрузки данных. День недели '*'
    RDM_TRANSFER_TASK_TIMEDELTA Дельта между предыдущим и следующим запуском периодической задачи в секундах 3600
    RDM_UPLOAD_STATUS_TASK_MINUTE Настройка запуска периодической задачи статуса загрузки данных в витрину. Минута '*/30'
    RDM_UPLOAD_STATUS_TASK_HOUR Настройка запуска периодической задачи статуса загрузки данных в витрину. Час '*'
    RDM_UPLOAD_STATUS_TASK_DAY_OF_WEEK Настройка запуска периодической задачи статуса загрузки данных в витрину. День недели '*'
    RDM_CHECK_SUSPEND_TASK_STAGE_TIMEOUT Дельта для определения зависшего подэтапа. Минута 120
  • В дефолтный конфиг проекта необходимо добавить:

    # Общие настройки интеграции с РВД
    [rmd_general]
    # Префикс идентификаторов записей сущностей специфический для продукта. Указывается в settings.py и не должен 
    # изменяться. Возможность изменения через конфигурационный файл оставлена для экстренных случаев.
    # EXPORT_ENTITY_ID_PREFIX = 
    # Количество записей моделей обрабатываемых за одну итерацию экспорта данных
    EXPORT_CHUNK_SIZE = 500
    # Количество записей моделей ЭШ обрабатываемых за одну итерацию сбора данных
    COLLECT_CHUNK_SIZE = 500
    
    # Настройка запуска периодической задачи выгрузки данных
    [rdm_transfer_task]
    MINUTE=*/2
    HOUR=*
    DAY_OF_WEEK=*
    # Дельта между прошлым и текущим запуском, сек
    TIMEDELTA=120
    
    # Настройка запуска периодической задачи статуса загрузки данных в витрину
    [rdm_upload_status_task]
    MINUTE=*/2
    HOUR=*
    DAY_OF_WEEK=*
    
    # Настройка запуска периодической задачи поиска зависших этапов экспорта
    [rdm_check_suspend_task]
    MINUTE=*/10
    HOUR=*
    DAY_OF_WEEK=*
    # Дельта для определения зависшего подэтапа, мин
    STAGE_TIMEOUT=120
    
    [uploader_client]
    # Адрес витрины
    URL = http://localhost:8090
    # Мнемоника Витрины
    DATAMART_NAME = test
    # Количество повторных попыток запроса
    REQUEST_RETRIES = 10
    # Таймаут запроса, сек
    REQUEST_TIMEOUT = 10
    # Включить эмуляцию отправки запросов
    ENABLE_REQUEST_EMULATION = True
    

На основе дефолтного конфига произвести конфигурирование приложений.

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

Сборка пакета производится при помощи Job-а в Jenkins M3.build_dist.

Пакет выкладывается в глобальный PYPI и во внутренний Nexus

Документация

С документацией можно ознакомиться по ссылке http://docs.py.bars.group/edu-rdm-integration/

История изменений

Все изменения проекта должны быть отражены в этом файле.

Формат основан на Keep a Changelog и проект следует Семантическому версионированию.

[x.y.z] - гггг-мм-дд

Здесь должно быть расширенное описание того, что было сделано, какие есть планы у команды по дальнейшему развитию. Желательно будущие цели привязывать к конкретным задачам. Т.е. на каждую цель нужно поставить отдельную задачу и отразить ее номер здесь.

Добавлено

Изменено

Исправлено

Удалено

[0.6.2] - 2023-10-04

Изменено

  • EDUCLLG-7942 PATCH Доработка сборки документации.

[0.6.1] - 2023-10-02

Дополнение поведения BaseExportDataFunctionHelper.

Изменено

  • EDUSCHL-20535 PATCH - В логике BaseExportDataFunctionHelper добавлена очистка строковых полей от управляющих символов.

[0.6.0] - 2023-09-29

Добавлена функция set_failed_status_suspended_exporting_data_stages для определения и перевода зависших этапов/подэтапов экспорта в статус (FAILED). Добавлена функция set_failed_status_suspended_collecting_data_stages для определения и перевода зависших этапов/подэтапов сбора в статус (FAILED).

Добавлено

  • EDUSCHL-20487 MINOR Добавлена функция set_failed_status_suspended_exporting_data_stages.

  • EDUSCHL-20487 MINOR Добавлена функция set_failed_status_suspended_collecting_data_stages.

[0.5.9] - 2023-09-25

Повышена версия wheel

Изменено

[0.5.8] - 2023-09-13

Исправлена ошибка добавления в описание асинхронной задачи списка выгруженных сущностей BaseExportLatestEntitiesData._set_description_to_async_task.

Исправлено

  • EDUSCHL-20334 PATCH - Баг с обновлением поля description в BaseExportLatestEntitiesData._set_description_to_async_task.

[0.5.7] - 2023-09-12

Баг фикс и дополнение поведения BaseExportLatestEntitiesData.

Изменено

  • EDUSCHL-20435 PATCH - BaseExportLatestEntitiesData теперь поддерживает выгрузку ни разу невыгруженных сущностей.

Исправлено

  • EDUSCHL-20435 PATCH - Баг с условием в фильтре в BaseExportLatestEntitiesData._update_model_modified_field.

[0.5.6] - 2023-09-06

Доработаны классы BaseExportLatestEntitiesData и BaseExportEntitiesData.

Исправлено

  • EDUSCHL-20435 PATCH - Исправлено нахождение левой границы в классе ExportLatestEntitiesData; - Добавлена проверка на наличие запущенных или готовых к выгрузке сущностей; - Добавлен параметр update_modified, который обновляет поле modified у собранных моделей, чтобы выгрузить невыгруженные записи.

[0.5.5] - 2023-09-04

Добавление pip в зависимости сборки пакета.

Добавлено

  • EDUSCHL-19919 PATCH Добавление pip в зависимости сборки пакета.

[0.5.4] - 2023-09-04

split_by_days_count переименовал в split_by_quantity.

Изменено

  • EDUSCHL-20302 PATCH split_by_days_count переименовал в split_by_quantity.

[0.5.3] - 2023-09-03

Изменены параметры формирования подпериодов в generate_first_collect_models_data_script.

Изменено

  • EDUSCHL-20302 PATCH Изменены параметры формирования подпериодов в generate_first_collect_models_data_script.

[0.5.2] - 2023-08-28

Замена базового класса функций.

Изменено

  • EDUSCHL-20344 PATCH Замена базового класса функций на WebEduLazySavingPredefinedQueueFunction.

[0.5.1] - 2023-08-22

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

Исправлено

  • EDUSCHL-20227 PATCH Если у сущности не заполнен creating_trigger_models, то в генераторе BaseFirstCollectModelsDataCommandsGenerator не формируется словарь с параметрами для команды.

  • EDUSCHL-20229 PATCH Если у сущности не заполнен creating_trigger_models, то в генераторе BaseFirstCollectModelsDataCommandsGenerator не формируется словарь с параметрами для команды.

[0.5.0] - 2023-08-19

Дополнительная функциональность WebEduEntityValueCache была перенесена в EntityCache в function_tools.

Удалено

[0.4.7] - 2023-08-17

Изменено формирование очередности сбора/экспорта моделей/сущностей. Вместо отдельных перечислений используется существующее поле order_number модели-перечисления TitledModelEnum. В случае, когда order_number не указан, т.е. будет использоваться значение по умолчанию DEFAULT_ORDER_NUMBER, модель/сущность будет исключена из сбора/экспорта.

Изменено

  • EDUSCHL-19164 MINOR Изменено формирование очередности сбора/экспорта моделей/сущностей.

[0.4.6] - 2023-08-16

Удален лишний вызов метода _prepare_logs

Исправлено

  • EDUSCHL-19991 PATCH удален лишний вызов метода _prepare_logs в методе __init__ класса BaseCollectingCalculatedExportedDataFunctionCacheStorage

[0.4.5] - 2023-08-09

Объединение обрабатываемых логов относящихся к одному объекту

Добавлено

  • EDUSCHL-19991 PATCH Новый миксин ReformatLogsMixin , новое поле is_merge_logs и новый метод _merge_logs у класса BaseCollectingExportedDataFunctionCacheStorage

[0.4.4] - 2023-08-12

Исправлен баг с timedelta

Исправлено

[0.4.3] - 2023-08-12

Исправлен баг с timedelta

Исправлено

[0.4.2] - 2023-08-11

Исправление ошибки учета миллисекунд, при генерации скриптов сбора и выгрузки данных. В текущий момент chunk_size все равно работает некорректно. Это связано с тем, что при обнулении миллисекунд за одной записью выборки может скрываться большое количество, например, которые были созданы или обновлены скриптами. Проблему необходимо решить в будущем, но текущего решения хватает для эксплуатации. В выборках моделей и логов не должна входить правая граница периода выборки.

Исправлено

  • EDUSCHL-20235 PATCH Исправлена ошибка учета миллисекунд в выборках при генерации скриптов с командами для сбора и выгрузки данных.

  • EDUSCHL-20235 PATCH В выборках моделей и логов не должна входить правая граница периода выборки.

[0.4.1] - 2023-08-09

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

Добавлено

  • EDUSCHL-20235 PATCH Доработки для реализации принудительного выполнения функций экспорта данных сущностей.

[0.4.0] - 2023-08-09

Реализованы общие классы для команд сбора/экспорта.

Добавлено

  • EDUSCHL-20200 MINOR Добавлены общие модели, методы и классы.

Изменено

  • EDUSCHL-20200 MINOR Реализованы общие классы для команд сбора/экспорта.

[0.3.3] - 2023-08-08

Добавлено принудительное выполнение функций в ранере для экономии памяти.

Исправлено

  • EDUSCHL-20235 PATCH Добавлено принудительное выполнение функций в ранере для экономии памяти.

[0.3.2] - 2023-08-08

Откат к спискам необработанных логов. Исправлена ошибка бесконечного создания чанков логов.

Исправлено

  • EDUSCHL-20235 PATCH Откат к спискам необработанных логов.

[0.3.1] - 2023-08-08

Организована передача необработанных логов в виде генератора.

Изменено

  • EDUSCHL-20235 PATCH Организована передача необработанных логов в виде генератора.

[0.3.0] - 2023-08-06

Добавление функциональности для отложенного заполнения кешей. Заполнение производится перед началом работы запускаемого объекта.

Добавлено

  • EDUSCHL-20235 PATCH Добавлено отложенное заполнение кешей хелперов функций.

  • EDUSCHL-20235 MINOR Добавлено проставление подэтапа выгрузки данных у записей моделей.

[0.2.2] - 2023-08-06

Для API РВД добавлена поддержка параметра типа операции для загрузки данных.

Добавлено

  • EDUSCHL-19920 PATCH Для API РВД добавлена поддержка параметра типа операции для загрузки данных.

[0.2.1] - 2023-08-05

Восстановление сборки пакета после ухода с poetry.

Исправлено

  • EDUSCHL-19919 PATCH Восстановление сборки пакета после миграции с poetry.

[0.2.0] - 2023-08-04

Перенос стратегий формирования Функций используемых в генерации исходников.

Добавлено

  • EDUSCHL-19919 MINOR Перенесены стратегии создания Функций из ЭШ.

[0.1.4] - 2023-08-03

Возвращение ранее удаленных зависимостей миграции

Изменено

  • EDUSCHL-20209 PATCH Возвращение зависимостей миграции.

  • EDUSCHL-20209 PATCH Доработки по формированию документации.

  • EDUSCHL-20200 Закреплены версии зависимостей, добавлена ссылка на uploader-client

[0.1.3] - 2023-07-24

Для раскатки миграций на ЭШ, пришлось закомментировать зависимости в initial-миграции.

Изменено

  • EDUSCHL-19919 PATCH Вынести общую часть для работы с РВД из ЭШ для использования в ЭК.

[0.1.2] - 2023-07-23

Внесены изменения в кодовую базу после переноса механизма логирования из ЭШ в educommon.

Изменено

  • EDUSCHL-19919 PATCH Вынести общую часть для работы с РВД из ЭШ для использования в ЭК.

[0.1.0] - 2023-07-18

Внесены изменения в кодовую базу после переноса механизма логирования из ЭШ в educommon.

Добавлено

  • EDUSCHL-19919 MINOR Перенос базовых компонентов интеграции с РВД из ЭШ.

Project details


Release history Release notifications | RSS feed

This version

0.6.2

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

edu-rdm-integration-0.6.2.tar.gz (75.3 kB view hashes)

Uploaded Source

Built Distribution

edu_rdm_integration-0.6.2-py3-none-any.whl (96.8 kB view hashes)

Uploaded Python 3

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page