В данном проекте было реализовано приложение для мониторинга системных показателей OS в концепции ядро - агенты. Агент представляют собой динамическую библиотеку реализующую интерфейс Agent, а ядро является их менеджером - управляет их загрузкой, включением/отключением, обрабатывает метрики и т.д. Это означает, что вы можете самостоятельно создать и загрузить своего агента прямо во время выполнения программы.
В качестве примера, было реализовано четыре различных агента. У каждого агента имеется свой конфигурационный файл, имя которого по умолчанию строится из .conf + Agent::type, все конфигурационные файлы должны быть в одной директории.
Конфигурационный файл считывается при инициализации агента, и в дальнейшем с заданной периодичностью, по умолчанию в 2 секунды. В конфигурационном файле можно изменять следующие параметры:
-
Имя агента;
-
Тип агента;
-
Время обновления метрик;
-
Любые дополнительные настройки в формате key:value
-
Следом вы можете добавить критические значения для каждой метрики конкретного агента использую простой синтаксис: metric_name(<,<=,>,>=,==,!=)crit_value
Каждый раз когда метрика достигает критическое значение, вы можете получить уведомление об этом на свой Telegram и Email, для этого нажмите ПКМ на нижнем правом квадрате и откройте настройки уведомлений, включите необходимые и оставьте данные куда отправлять сообщения:
- Для Telegram это ваш UserId, вы можете узнать его через официального
бота
@getmyid_bot
- Для Email это ваш почтовый адрес
Для сборки и установки проекта выполните следующие шаги:
-
Клонирование репозитория:
git clone [URL репозитория]
-
Переход в директорию проекта:
cd src
-
Установка проекта:
make install
Исполняемый файл и необходимая для работы библиотека libMonitoringKernel
будут в src
Для сборки всех агентов выполните следующие шаги:
-
Переход в директорию проекта:
cd src
-
Установка:
make agents
Все собранные агенты будут помещены в ./agents
.
Помимо этого вы также можете собрать конкретного агента, для этого используйте конкретную цель для агента.
make AgentCPU
make AgentMemory
make AgentNetwork
make AgentExtra
Для запуска ядра нажмите большую кнопку START.
Для остановки ядра нажмите ПКМ на окно с метриками и выберите STOP KERNEL, ядру потребуется время для полной остановки, после этого вы вернетесь на стартовый экран.
По умолчанию все агенты ищутся в директории ./agents
относительно
исполняемого файла, чтобы изменить это нажмите ПКМ на окно с
загруженными агентами
(верхний левый квадрат) и выберите Change search directory.;
Аналогично, по умолчанию конфигурационные файлы ищутся в папке ./config
и
результаты агентов записываются в ./logs
относительно исполняемого файла, их
так же можно изменять.
Вы так же можете отключить поиск новых агентов и запись новых метрик, нажмите ПКМ на нужное вам окошко и выберите необходимую настройку.
Выбрав конкретного агента из списка вы можете увидеть его настройки и время работы. Все настройки можно изменять, будет перезаписан конфигурационный файл.
Для удаления установленного проекта выполните следующие шаги:
-
Переход в директорию проекта:
cd src
-
Удаление проекта:
make uninstall
Удаление произойдет по установленным по умолчанию путям, если какие-то файлы были перемещены они не будут удалены.
Для сборки и запуска тестов проекта выполните следующие шаги:
-
Переход в директорию проекта:
cd src
-
Сборка и запуск тестов:
make tests
Исполняемый файл будет создан в src
.
Тестирование занимает время, для запуска и остановок ядра требуется время.
Для создания архива проекта выполните следующие шаги:
-
Переход в директорию проекта:
cd src
-
Сборка архива:
make dist
Для удаления всех временных и сборочных файлов, созданных в процессе компиляции и тестирования, выполните следующие шаги:
-
Переход в директорию проекта:
cd src
-
Очистка проекта:
make clean
Для создания собственного агента:
-
Создайте класс наследующий абстрактный класс Agent -
./core/agents/Agent.h
-
Создайте простую функцию создания объекта, так ядро сможет найти вашего агента, замените AgentCPU на имя вашего класса:
extern "C" AgentCPU* create_obj() { return new AgentCPU; }
-
Задайте параметры name, type, config_name, update_time_ по умолчанию, пример:
Agent::name = "AgentCPU"; Agent::type = "CPU"; Agent::config_name = ".conf" + Agent::type; Agent::update_time_ = 3;
-
Добавьте названия отслеживаемых метрик:
Agent::addMetric("cpu"); Agent::addMetric("processes");
-
[не обязательно] Вы можете так же добавить критическое значение по умолчанию, используя:
Agent::addCriticalComparison("cpu", Comparisons<double>::is_equal, CompareType::IS_EQ); Agent::addCriticalValue("cpu", std::numeric_limits<double>::max());
-
Если ваш агент будет считывать какой-либо конфигурационный файл ему необходимо создать config_reader_, если вас устраивает формат приведенных в примере агентов, тогда можно использовать AgentConfigReader -
./core/agents/AgentConfigReader.h
. В противном случае вы можете наследовать класс ConfigReader и задать свою логику.Agent::config_reader_ = std::make_unique<AgentConfigReader>(this);
-
Реализуйте метод updateMetrics(), в нем вы должны реализовать логику считывание данных и отправки результата своему наблюдателю, не забывайте проверить его наличие. Используйте observer_->NotifyError для уведомления о возникших ошибках, observer_->NotifyCritical при критических значений метрик и observer_->NotifyResult для отправки результата.
-
Реализуйте метод toString(), в нем вы можете красиво представить последний результат считывания метрик, например в формате:
<Metric1> : <Value1> | <Metric2> : <Value2> | <Metric3> : <Value3> | ...