Краткое руководство по разработке собственных операторов данных amon
В этой главе:
Обычно его реализация разбивается на несколько модулей в соответствии с описанной ранее структурой - provider, analyzer и непосредственно operator. Модуль analyzer может быть реализован средствами платформы Синаптика. Модуль operator является главным модулем и реализуется в виде класса наследника интерфейсного класса Operator:
#include <amon/operator.hpp>class MyOperator : public Operator {private:MyProvider *Provider;MyAnalyzer *Analyzer;/* ... */public:void doInit(int vlevel, int opid, const NotifierFunction& notifier, json_object *jparameters) override;void doRunHandler() override;void doLearnAnomalyData(AlertData*) override;void setCommand(Command command) override;/* ... */};
Обязательно наличие реализаций функций doInit, doRunHandler, doLearnAnomalyData и setCommand.
Модуль operator.cpp обязательно должен включать в себя точку входа:
extern "C" void* amon_operator_entry();void* amon_operator_entry() {return new MyOperator();}
Этот код выполняется, когда сервис amon загружает разделяемую библиотеку оператора данных. После этого сервис выполняет метод doInit. Данный метод должен обеспечивать доступ к уровню вербозности и к callback-функции оператора данных, а также выполнять обработку параметров оператора данных из конфигурационного файла:
void MyOperator::doInit(int vlevel, int opid, const NotifierFunction& notifier, json_object *jparameters) {VLevel = vlevel;OperatorID = opid;Notifier = notifier;/* парсинг параметров из JSON */}
Затем автоматически вызывается метод doRunHandler. Он запускает пайплайн получения, подготовки и анализа данных, принятия решения, а также возвращает обработанные данные обратно в сервис amon. Пример реализации этого метода:
void MyOperator::doRunHandler() {if (VLevel > 0) std::cout << "Running MyOperator..." << std::endl;// Создаём объекты провайдера и анализатора данныхProvider = new MyProvider();Analyzer = new MyAnalyzer();// Создаём поток обработчика данныхWorker = std::thread([this]() {while (true) {// Создаём списки объектов и оповещенийstd::vector<ObjectData> objects;std::vector<AlertData> alerts;/* Получаем данные из провайдера и анализируем их, заполняем списки objects и alerts */// Отправляем результаты анализа в сервис amonNotifier(OperatorID, objects, alerts, ProcessingTime);delay(Interval);}});if (VLevel > 0) std::cout << "MyOperator init done" << std::endl;}
Метод doLearnAnomalyData позволяет сообщить анализатору данных, что нужно произвести дообучение системы на определённой аномалии, например:
void MyOperator::doLearnAnomalyData(AlertData *a) {Analyzer -> doLearnAnomalyData(a);}
Метод setCommand позволяет изменить режим работы анализатора данных (обучение\анализ).
Предыдущий раздел: перейти