分布式系统操作的一个重要方面是监视其总体状态的能力。这通常需要从各个层收集日志,包括操作系统、安全软件、网络设备、中间件和用户应用程序。从每一层收集日志后,需要将它们发送到多个目标位置以进行警报、分析、可视化和归档。由于日志数据有多个来源和目的地,因此,如果生产者和消费者之间没有统一的接口,集成的复杂性将大大增加。
Fluent Bit是一个开放源代码日志和数据处理器和转发器,它允许从不同源到多个目标的统一数据收集。在基于Fluentd(企业级,开放源代码日志收集器)的基础结构中,它通常用作边缘日志和数据转发器。
这些工具共同构成了许多基于Grafana或Kibana的DevOps仪表板的幕后工作人员。他们负责从许多计算机收集和处理大量日志数据。 Fluentd是基于ELK的日志管道中最受欢迎的日志聚合器之一。实际上,它是如此流行,使得“ EFK堆栈”(Elasticsearch,Fluentd,Kibana)变得可行。
尽管Fluentd是服务器级的应用程序类型(用Ruby编写,具有较大的内存占用),但是Fluent Bit是在考虑特定用例的情况下创建的高度分布式的环境中,有限的容量和减少的开销(内存和CPU)巨大的考虑。 Fluent Bit用C编写,旨在实现高性能。它占用空间非常小(仅小于500Kb),也可以部署在较小的嵌入式系统上。
由于其大量的输入/输出插件,Fluent Bit可用作数据处理管道,以快速集成来自不同来源的数据。它可以在大型分布式系统的运行监视中发挥关键作用。作为美国能源部(DOE)资助的研究项目的一部分,RTI开发了一套Fluent Bit插件,使其能够与RTI Connext DDS集成。这篇博客文章探讨了这些插件,并提供了一个示例场景,在这种情况下,这种集成可能会很有用。
假设您需要通过现有应用程序(可能是传统应用程序,无法访问源代码)生成的DDS上发布一些信息。借助Fluent Bit,您可以快速建立一个通过外部应用程序生成的DDS发布数据的系统,而无需编写任何代码!
使用简单的文本编辑器,您可以为Fluent Bit创建一个配置文件,该文件定义了如下管道:
- 输入:使用“ Tail”插件实时读取附加在日志文件中的行
- 解析:您可以使用正则表达式定义提取规则
- 可选:添加一些其他转换(如有必要)
- 输出:RTI Connext DDS Fluent位结构输出插件
在我们的RTI社区项目中,我们为Fluent Bit构建了两个输出插件,它们都可以通过DDS发布通过管道收集的所有事件:
- 非结构化输出插件:
- 最易于使用(配置选项更少)
- 使用由键值对的简单序列组成的预定义数据类型,将每个Fluent Bit事件转换为DDS样本。
- 与Fluent Bit事件相关的所有属性都通过DDS发布。
- 通过配置文件,用户可以指定一个(或多个)包含用于发布的QoS的XML文件。
- 结构化输出插件:
- 更高级,因为它可以更好地控制通过DDS发布的数据。
- 使用您自己的数据类型发布事件
- 插件读取数据映射文件(在插件配置中指定),该文件包含有关如何将事件的属性转换为DDS数据类型的成员的说明。
作为此类应用程序的示例,假设我们想使用定义明确的数据结构(我们通过IDL定义)在DDS上发布McAfee监控代理(“旧版”应用程序)的结果。 由于McAfee可以将其分析结果发布到syslog或日志文件中,因此我们可以开始使用下图所示的“ Syslog”或“ Tail”输入插件构建Fluent Bit管道。
McAfee识别到威胁时,会在syslog上记录如下行:
Oct 01 10:33:35 ubuntu ERROR AMOASScanner [27304] Infection caught File Name: /home/jason/Desktop/malware/G1test.bin File Size: 11264 Infection Name: Generic BackDoor.agg Time: 1569951215 Process Name: /usr/bin/scp User Name: root Profile Type: 1
通过RegExparser处理该行之后,该事件将分解为包含所有提取信息的属性:
time: Oct 01 10:33:35
hostname: ubuntu
appName: AMOASScanner
pid: 27304
filepath: /home/jason/Desktop/malware/G1test.bin
filesize: 11264
virusname: Generic BackDoor.agg
scantime: 1569951215
processname: /usr/bin/scp
username: root
profile: 1
tag: mcafee.found
然后,使用grep筛选器从管道中删除RegEx解析器未解析的所有其他无关消息(来自syslog)。
最后,将dds_stroutput配置为通过特定域上的DDS发布,并将上面显示的细分事件属性映射为以下类型(IDL):
struct Threat { string<100> product_name; string<1024> file_name; string<100> threat_name; string<100> date; };
然后,映射文件(必须通过dds_str输出插件的必需配置参数之一定义),然后告诉插件执行以下映射:
如您所见,Fluent Bit-DDS集成使我们能够快速发布McAfee通过DDS检测到的威胁,而无需编写复杂的应用程序!
Fluent Bit插件项目还包括一个DDS非结构化输入插件,用于订阅DDS数据(使用DDS非结构化输出插件所使用的相同数据类型),并将其插入Fluent Bit管道中。
我们对使用DDS非结构化插件(输入和输出)作为两个Fluent Bit实例之间的传输进行了一些性能测试。为了衡量吞吐量,我们逐渐增加了每秒的消息数量。我们确定,我们的插件每秒可以线性扩展多达350,000条消息!在所有情况下,消息的大小均为100字节。为了最大化吞吐量,我们使用了DDS Batch QoS。
要了解有关Fluent Bit插件的更多信息,请参考Github项目。