文章采集接口( 《详聊微服务观测》系列文章:Telegraf架构设计并发编程)
优采云 发布时间: 2022-04-04 08:21文章采集接口(
《详聊微服务观测》系列文章:Telegraf架构设计并发编程)
作者|蒋明明
来源|二达公众号
简介:为了让大家更好的了解MSP中APM系统的设计和实现,我们决定写一个《微服务详解》系列文章,深入APM系统产品、架构设计和基础技术。本文是文章系列的第三篇,主要介绍Telegraf数据处理链路的实现原理和插件的实现方法。
《详解微服务观察》系列文章:
Telegraf 是 InfluxData 开源的一款非常流行的指标采集 软件,在 GiHub 拥有数万个 Star。在社区的帮助下,拥有200多种采集插件和40多种导出插件,几乎涵盖了所有监控项,例如机器监控、服务监控甚至硬件监控.
架构设计流水线并发编程
在 Go 中,流水线并发编程模式是一种常用的并发编程模式。简单来说,它由一系列stage组成,每个stage由一组运行相同功能的goroutine组成,每个stage之间通过channel连接。
在每个阶段,goroutine 负责以下工作:
通过入口通道,接收上游阶段产生的数据。处理数据,如格式转换、数据过滤聚合等。将处理后的数据通过出口通道发送到下游阶段。
其中,每个阶段都同时有一个或多个出口和入口通道,但第一阶段和最后阶段除外,它们分别只有出口通道和入口通道。
Telegraf 中的实现
Telegraf 采用这种编程模式,主要有 4 个阶段,即 Inputs、Processor、Aggregators 和 Outputs。
并且它们之间也是通过通道相互链接的,它们的架构图如下:
可以看出,它整体采用了流水线并发编程模式。下面简单介绍一下它的运行机制:
扇入:多个函数向一个通道输出数据,一个函数读取通道直到关闭。
扇出:多个函数读取同一个通道,直到它被关闭。
插件设计
Telegraf 有这么多的输入、输出和处理器插件,那么它如何有效地管理这些插件呢?以及如何设计插件系统来应对激增的扩容需求?别着急,请允许我详细说明。
其实这里的插件并不是通常意义上的插件(即在运行时动态加载和绑定动态链接库),而是基于工厂模式的一种变体。首先我们看一下Telegraf的插件目录结构:
plugins
├── aggregators
│ ├── all
│ ├── basicstats
│ ├── registry.go
...
├── inputs
│ ├── all
│ ├── cpu
│ ├── registry.go
...
├── outputs
│ ├── all
│ ├── amqp
│ ├── registry.go
...
├── processors
│ ├── all
│ ├── clone
│ ├── registry.go
...
从上面可以看出,目录结构是有规律的(下面我们都以Inputs的Plug-in为例,其他模块实现类似)。