Описание
Установка
Запуск и создание контейнеров
Отладка
Запуск тестов
Запуск нагрузочных тестов
Генерация документации
Полная текущая документация доступна по адресу https://mp-co-ru.github.io/mpc-peresvet/.
В настоящее время документация обновляется каждый раз,
когда в ветку разработки dev
добавляется
новая функциональность.
МПК-Пересвет - платформа для автоматизации технических объектов. Главная задача - построение модели технического объекта. Модель объекта состоит из двух частей: статическая, в виде иерархии, и динамическая - как совокупность всех вычислительных методов, привязанных к узлам иерархии.
Платформа может использоваться для сбора, хранения, обработки данных, а также автоматизации процессов, протекающих в рамках технического объекта.
Отличия от баз данных реального времени (Prometheus, VictoriaMetrics и т.д.):
Говоря в общем, платформа МПК-Пересвет, в отличие от большинства баз данных реального времени, нацелена не столько на сбор метрик, сколько на автоматизацию технических объектов.
Процесс установки описан в документации: Установка.
Docker-контейнеры - основной способ запуска сервисов платформы. Сервисы - независимые приложения, которые общаются друг с другом через RabbitMQ.
Возможны совершенно разные комбинации сервисов в одном контейнере. Это открывает большие возможности по масштабированию создаваемой информационной системы.
Релаизованные варианты запуска платформы:
$ ./run_all_svc_in_one.sh
Для запуска такой конфигурации достаточно запустить на исполнение скрипт:
$ ./run.sh
Скрипт, если необходимо, создаст контейнеры и запустит их на исполнение.
Для запуска контейнеров в фоне запускаем скрипт с ключом -d
:
$ ./run.sh -d
Для создания контейнера запускаем команду вида:
$ docker compose --env-file docker/compose/.cont_all_in_one.env -f docker/compose/docker-compose.alerts.all.yml build
В файле docker/compose/.cont_all_in_one.env
содержатся переменные с портами
и именами хостов для следующей конфигурации:
nginx
по порту 80.Руководство по построению образов для разных платформ: https://devdotnet.org/post/sborka-docker-konteinerov-dlya-arm-arhitekturi-ispolzuya-buildx/
Команда построения образа для linux/arm64 docker buildx build --platform linux/arm64 -f docker/docker-files/all/Dockerfile.all_svc.uvicorn --build-arg IMAGE_VERSION=mpc:0.4 -t mpc/peresvet_all-svc:0.4-arm64 . --load
Пересвет разрабатывается с использованием VSCode, поэтому отладка описана применительно к этому инструменту.
Так как основной способ развёртывания платформы - в контейнерах, поэтому отладка сервисов производится также в контейнерах.
Текущие версии контейнеров не экранируют исполняемый код в папку проекта, поэтому при изменении кода сервисов при отладке необходимо пересобирать контейнеры. Для того, чтобы при изменении кода сервиса процесс в контейнере перезапускался автоматически, необходимо создать новые docker-compose файлы.
Для отладки в VSCode должен быть установлен плагин
ms-vscode-remote.remote-containers
.
Далее описан процесс запуска отладки.
Допустим, мы запустили какие-либо контейнеры с сервисами платформы. Если их запустить во внутреннем терминале VSCode с помощью команды
$ ./run.sh -d
, то конейнеры будут запущены в фоновом режиме и продолжать процесс можно будет в этом же терминале.
Пусть мы собираемся отлаживать сервис app_psql
, который запущен в
контейнере data_storages_all
.
Имена сервисов указаны в соответствующих файлах конфигураций для
nginx.unit
. К примеру:
mpc-peresvet/docker/docker-files/dataStorages/config_nginx.unit_dataStorages.all.json
в этих же файлах указывается и имя исполняемого модуля. Для нашего примера
это "module": "dataStorages_app_postgresql_svc"
Выведем список всех работающих контейнеров, чтобы определить id нужного нам контейнера:
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
f43825ef56f3 compose_data_storages_all "/usr/local/bin/dock…" 8 hours ago Up 8 hours 0.0.0.0:82->82/tcp, :::82->82/tcp compose-data_storages_all-1
cc6246329561 compose_alerts_all "/usr/local/bin/dock…" 5 days ago Up 8 hours 0.0.0.0:85-86->85-86/tcp, :::85-86->85-86/tcp compose-alerts_all-1
0800773b53a8 compose_methods_all "/usr/local/bin/dock…" 5 days ago Up 8 hours 0.0.0.0:87->87/tcp, :::87->87/tcp compose-methods_all-1
13ce75017a6a compose_tags_all "/usr/local/bin/dock…" 11 days ago Up 8 hours 0.0.0.0:80-81->80-81/tcp, :::80-81->80-81/tcp compose-tags_all-1
...
Нужный нам контейнер - compose-data_storages_all-1
, в качестве его id
возьмём f438
.
Находясь с корневой папке проекта, запускаем на исполнение скрипт
run_debug.sh
, передавая ему в качестве параметров id контейнера
и имя сервиса для отладки:
$ ./run_debug.sh f438 app_psql
При первом запуске отладки в контейнере будут установлены пакеты
debugpy
иuvicorn
, поэтому в связи с этим требуется соединение с интернетом и первый запуск потребует несколько больше времени.
Выполнение скрипта остановится выводом строки
$ Запускаем процесс uvicorn. Для остановки процесса нажмите Ctrl+C...
mpc-peresvet/src/services/dataStorages/app/postgresql/dataStorages_app_postgresql_svc.py
.
Устанавливаем необходимые точки установки.Переключаемся на панель "Запуск и отладка" и выбираем конфигурацию
MPC_DEBUG: f438 app_psql
:
F5
или зелёную стрелку слева от имени конфигурации и входим в
режим отладки.Для выхода из режима отладки необходимо остановить отладку в VSCode и нажать
Ctrl+C
в терминале, в котором был запущен скрипт run_debug.sh
.
Находясь в корневой папке проекта, запускаем файл run_tests.sh
.
Будут запущены unit-тесты, также будет показана статистика покрытия тестами исходных кодов проекта.
В модуле ldap3
есть проблема при работе в режиме mock-сервера: объект Connection
в режиме работы
MOCK_SYNC
возвращает результат в другом формате, нежели при нормальной работе.
Поэтому для прогона тестов создаётся дополнительный контейнер и каждый раз при новом запуске тестов удаляются данные, записанные во время предыдущего теста.
После прогона тестов с помощью ldap-браузера (JXplorer) можно подсоединиться
к ldap-серверу, на котором прогонялись тесты. Он доступен по порту 3890
.
:zap:Контейнер, на котором работает тестовый ldap-сервер, называется
ldap_test
. Не забудьте вручную остановить контейнерldap_test
командой$ docker stop ldap_test
В настоящем разделе содержится инструкция для разворачивания полигона для
выполнения нагрузочных тестов для команд data/set
и data/get
.
Предполагается, что все команды выполняются в корневой папке проекта.
Восстанавливаем из архива образ иерархической базы с 4000 тегов, для чего выполняем команду
$ docker load -i load_tests/images/ldap_4000_tags.tar
Выполним следующее: создадим две базы данных PostgreSQL для двух разных типов тестов, для записи и для чтения данных. Обе базы будут идентичны по структуре таблиц, только база для тестов на чтение будет заполнена данными.
Создадим каталог для базы данных PostgreSQL. Этот каталог должен быть вне папки проекта, так как в противном случае построение контейнеров будет занимать очень много времени в связи с большим размером баз.
Допустим, каталог базы будет располагаться в корневом каталоге:
$ mkdir /psql_set_data
Создадим пустую базу.
Для этого откроем файл docker-compose.postgres.set_test.yml
и значение параметра volumes
приведём к следующему виду:
- /psql_set_data:/var/lib/postgresql/data
Сохраним файл.
Запустим контейнер с PostgreSQL:
$ docker compose -f docker-compose.postgres.set_test.yml up
В результате в созданном нами на предыдущем шаге каталоге будет создана
база данных peresvet
(параметры создания базы - в файле .env
).
Создадим в базе данных таблицы (их имена будут соответствовать тегам в восстановленной нами из архива иерархической базе):
$ pipenv shell
$ cd load_tests
$ python create_tables.py
Запущенный скрипт откроет файл tags_in_postgres.json
, в котором записаны
id всех тегов и для каждого тега создаст таблицу.
Подготовка для тестов команды data/set
завершена.
Теперь необходимо создать аналогичную базу и заполнить её данными.
Продублируем созданную базу, для чего просто скопируем каталог уже созданной нами базы. Выполнять команду необходимо с правами администратора.
$ sudo su
# cp -apr /psql_set_data/ /psql_get_data
# exit
Откроем файл docker-compose.postgres.get_test.yml
и исправим параметр
volumes
:
- /psql_get_data:/var/lib/postgresql/data
Сохраним файл.
Запустим PostgreSQL с новой базой:
$ docker compose -f docker-compose.postgres.get_test.yml up
Заполним данными базу:
$ pipenv shell
$ cd load_tests
$ python set_data_to_db_many.py
:warning: Внимание! Процесс записи данных будет долгим.
Запустим все необходимые контейнеры.
$ ./run_locust_data_set_prs-psql.sh
В скрипте указано, что будут запущены 4 копии сервиса peresvet
.
Это число можно изменить, исходя из правила, что количество копий сервиса
равно числу ядер процессора.
В целях ускорения работы платформы уровень логирования во всех сервисах понижен до минимального.
При запуске платформа начинает создавать кэш для каждого тега. Для этого требуется некоторое время, в течение которого платформа не будет отвечать на запросы.
При отсутствии логов определить, что построение кэша закончено, можно
по активности процессов: запускаем в консоли команду top
и наблюдаем
за активностью процессов slapd
, uvicorn
. Как только активность
этих процессов упадёт, значит, кэши построены.
Запускаем браузер и вводим в адресную строку: http://localhost:8089
.
Указываем нужное количество пользователей, а также адрес - http://nginx
.
В этом случае в тесте будут задействованы все запущенные экземпляры платформы.
Для теста одного экземпляра платформы, без nginx-прокси, в строке адреса
указываем http://peresvet
.
После выполнения тестов можно очистить от данных базу. Для этого сначала остановим все контейнеры, затем выполним команды:
$ docker compose -f docker-compose.postgres.set_test.yml up
$ cd load_tests
$ python delete_data.py
:warning: Выполняйте скрипт удаления данных только на базе для теста data/set! Не путайте с data/get!
Запуск тестов на получение данных аналогичен предыдущему, за исключением того, что выполняется он скриптом
$ ./run_locust_data_get_prs-psql.sh
В тестах data/set используется файл
load_tests/src/locustfile_set_data_prs-psql.py
, а в тестах data/get -
locustfile_get_data_prs-psql.py
.
Файлы можно расширять новыми тестами, а также создавать новые файлы.
Эмулируется одновременная работа 100 коннекторов, каждый из которых раз в секунду записывает значения для 50 тегов, а также 50 экранов, каждый из которых раз в секунду читает текущие значения для 28 тегов.
$ ./run_locust_real_job.sh
Документация создаётся с помощью инструмента
"sphinx" <https://www.sphinx-doc.org/en/master/>
_. Все необходимые пакеты
прописаны в Pipfile
и устанавливаются автоматически при создании
окружения проекта.
В консоли заходим в папку docs
и выполняем команду
$ make html
Созданная документация будет расположена в папке docs/build/html
.
Основной файл - index.html
.
PDF вариант документации создаётся с помощью
LaTeX <https://www.latex-project.org/>
_.
Устанавливаем необходимые пакеты:
$ sudo apt-get install texmaker gummi texlive texlive-full \
texlive-latex-recommended latexdraw intltool-debian lacheck \
lmodern luatex po-debconf tex-common texlive-binaries texlive-extra-utils \
texlive-latex-base texlive-latex-base-doc texlive-luatex texlive-xetex \
texlive-lang-cyrillic texlive-fonts-extra texlive-science \
texlive-latex-extra texlive-pstricks
Заходим в каталог docs/latex
и выполняем команды:
$ pdflatex mpc_peresvet.tex
$ makeindex mpc_peresvet.idx
$ pdflatex mpc_peresvet.tex
В этой же папке появится сгенерированный файл документации
mpc_peresvet.pdf
.
Для генерации исходных кодов в виде pdf-файла выполняем два раза одну и ту же команду:
$ pdflatex sources.tex
$ pdflatex sources.tex