如何开发原生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
类的构造函数中注册该插件的管理类