Плагіни Фільтрів
Плагіни фільтрів надають механізм для зміни потоку даних під час його проходження через екземпляр fledge, фільтри можуть бути застосовані на півдні або півночі мікросервісів і можуть утворювати трубопровід з декількох елементів обробки через які проходять потоки даних. Фільтри, застосовані у південному сервісі, будуть лише оброблятимуть лише ті дані, які отримує південний сервіс, в той час як фільтри, розміщені на півночі, будуть обробляти всі дані, які виходять з північного інтерфейсу.
Фільтри можуть;
- доповнювати дані, додаючи до них статичні метадані або обчислені значення
- видаляти дані з потоку
- додавати дані до потоку
- змінювати дані в потоці
Слід зазначити, що існують деякі альтернативи створенню фільтра якщо ви хочете внести прості зміни до потоку даних. Існує ряд існуючих фільтрів, які забезпечують певну ступінь програмованості. До них відносяться , який дозволяє застосувати довільну математичну формулу до даних, або , який дозволяє невеликий вбудований скрипт на Python, що можна застосувати до даних.
Плагіни фільтрів можуть бути написані на C++ або Python і мають дуже простий інтерфейс. Механізм плагіна і підмножина API є спільним для всіх типів плагінів, включаючи фільтри.
Конфігурація
Фільтри використовують той самий механізм конфігурації, що і решта Fledge, використовуючи JSON-документ для опису параметрів конфігурації. Як і у випадку з будь-яким іншим плагіном, структура визначається плагіном і отримується через точку входу plugin_info. Потім вона зіставляється з базою даних для передачі налаштованих значень до точки входу plugin_init.
API Плагіну Фільтру на C++
API фільтра складається з невеликої кількості точок входу до функцій C, вони викликаються у строгому порядку і базуються на однаковому наборі спільних API для всіх плагінів Fledge.
Информація про плагін
Точка входу plugin_info є першою точкою входу, яка викликається у плагіні фільтра і повертає інформаційну структуру плагіна. Це той самий виклик, який має підтримувати кожен плагін Fledge, і який використовується для визначення типу плагіна і категорії конфігурації за замовчуванням для плагіна.
Типова реалізація plugin_info просто повертає вказівник на статичну структуру PLUGIN_INFORMATION.
PLUGIN_INFORMATION *plugin_info()
{
return &info;
}
Ініціалізація плагіна
Точка входу plugin_init викликається після виклику plugin_info і до того, як будь-які дані будуть передані фільтру. Вона викликається на етапі, коли сервіс налаштовує трубопровід фільтру і надає фільтру категорію конфігурації, яка тепер містить введені користувачем значення і місце призначення, куди фільтр буде надсилати вихідні дані.
PLUGIN_HANDLE plugin_init(ConfigCategory* config,
OUTPUT_HANDLE *outHandle,
OUTPUT_STREAM output)
{
}
Параметр config - це категорія конфігурації з наданими користувачем значеннями, outHandle - дескриптор для наступного фільтра в ланцюжку, і output - вказівник на функцію, яку слід викликати для надсилання даних до наступного фільтра у ланцюжку. Аргументи outHandle та output слід зберігати для подальшого викор истання у plugin_inest, коли дані будуть пересилатимуться у трубопроводі.
Функція plugin_init повертає дескриптор, який буде передано усім наступним викликам плагіна. Цей дескриптор можна використовувати для зберігання стану, який потрібно передати між викликами. Зазвичай виклик plugin_init створює клас C++, який реалізує фільтр, і повертає точку на екземпляр як дескриптор. Потім екземпляр можна використовувати для зберігання стану фільтра, включно з дескриптором виводу та функцією зворотного виклику, яку буде потрібно використати.
Класи фільтрів також можна використовувати для буферизації даних між викликами plugin_ingest, що дозволяє фільтру відкласти обробку даних доти, доки він не матиме достатньої кількості буферизованих даних.
Інтегрування плагіна
Точка входу plugin_inest є робочою конячкою фільтра, вона викликається з наборами показань для обробки, а потім передає новий набір даних до наступного фільтру у трубопроводі. Процес передачі даних наступному фільтру даних до наступного фільтра відбувається через вказівник функції OUTPUT_STREAM. Фільтр не зобов'язаний виводити дані кожного разу, коли він отримує дані, він може не виводити жодних даних або виводити більше чи менше даних, ніж було отримано.
void plugin_ingest(PLUGIN_HANDLE *handle,
READINGSET *readingSet)
{
}
Кількість зчитувань, з якими викликається фільтр, буде залежати від середовища, у якому він працює, і від того, що було отримано попередніми фільтрами у трубопроводі. Фільтр, який вимагає певного розміру вибірки для обробки результату, слід підготувати для буферизації даних під час декількох викликів plugin_ingest. Кілька прикладів фільтрів доступні для ознайомлення.
Виклик plugin_ingest може надсилати дані далі у трубопроводі фільтрів використовуючи збережені параметри output і outHandle, передані до plugin_init.
(*output)(outHandle, readings);
Переналаштування плагіна
Як і для інших типів плагінів, фільтр може бути переналаштований під час його роботи. Коли виконується операція реконфігурації, буде викликано метод plugin_reconfigure із новою конфігурацією для фільтра.
void plugin_reconfigure(PLUGIN_HANDLE *handle, const std::string& newConfig)
{
}