如何开发原生Input插件
工作模式
同一输入类型的所有插件实例共享同一个线程来获取数据,插件实例只负责保存插件配置。
接口定义
开发步骤
-
在plugin/input目录下新建一个Inputxxx.h和Inputxxx.cpp文件,用于派生Input接口生成具体的插件类;
-
在Inputxxx.h文件中定义新的输入插件类Inputxxx,满足以下规范:
a. 所有的可配置参数的权限为public,其余参数的权限均为private。
-
在Inputxxx.cpp文件中实现
Init
函数,即根据入参初始化插件,针对非法参数,根据非法程度和影响决定是跳过该参数、使用默认值或直接拒绝加载插件。 -
在根目录下新增一个目录,用于创建当前输入插件的管理类及其他辅助类,该管理类需要继承InputRunner接口:
管理类是输入插件线程资源的实际拥有者,其最基本的运行流程如下:
-
依次访问每个注册的配置,根据配置情况抓取数据;
-
根据数据类型将源数据转换为PipelineEvent子类中的一种,并将一批数据组装成PipelineEventGroup;
-
将PipelineEventGroup发送到相应配置的处理队列中:
其中,
-
queueKey是队列的key,可以从相应流水线的PipelineContext类的
GetProcessQueueKey()
方法来获取。 -
inputIdx是当前数据所属输入插件在该流水线所有输入插件的位置(即配置中第几个,从0开始计数)
-
group是待发送的数据包
最后,为了支持插件向管理类注册,管理类还需要提供注册和注销函数供插件使用,从性能的角度考虑,该注册和注销过程应当是独立的,即某个插件的注册和注销不应当影响整个线程的运转。
-
在Inputxxx.cpp文件中实现其余接口函数:
-
在
PluginRegistry
类中注册该插件:a. 在pipeline/plugin/PluginRegistry.cpp文件的头文件包含区新增如下行:
b. 在
PluginRegistry
类的LoadStaticPlugins()
函数中新增如下行:c. 在
PipelineManager
类的构造函数中注册该插件的管理类