《详聊微服务观测》系列文章:Telegraf架构设计并发编程​

优采云 发布时间: 2021-08-17 05:05

  

《详聊微服务观测》系列文章:Telegraf架构设计并发编程​

  

  作者|江有名

  出处|尔达尔达公众号

  指南:为了让大家更好的了解MSP中APM系统的设计和实现,我们决定写一系列《浅谈微服务观察》文章深入产品、架构设计APM系统的基础技术。本文是文章系列的第三篇,主要介绍Telegraf数据处理链路的实现原理和插件实现方法。

  《详谈微服务观察》系列文章:

  Telegraf 是 InfluxData 开源的一个非常受欢迎的指标采集 软件。 GiHub 中已经有数以万计的星星。在社区的帮助下,拥有200多种采集插件和40多种导出插件,几乎涵盖了机器监控、服务监控甚至硬件监控等所有监控项目。

  架构设计流水线并发编程

  在 Go 中,Pipeline 并发编程模式是一种常用的并发编程模式。简单的说,它是由一系列的stage作为一个整体组成的,每个stage由一组运行相同功能的goroutine组成,每个stage之间通过一个channel连接起来。

  在每个阶段,goroutine 负责以下内容:

  通过入口通道接收上游阶段产生的数据。处理数据,如格式转换、数据过滤和聚合等。将处理后的数据通过出口通道发送到下游阶段。

  其中,除了第一级和最后一级分别只有出口通道和入口通道外,每个阶段都有一个或多个出口和入口通道。

  在 Telegraf 中实现

  Telegraf 使用这种编程模型,它有四个主要阶段,即输入、处理器、聚合器和输出。

  并且它们也是通过通道相互链接的,架构图如下:

  

  如您所见,它整体使用管道并发编程模型。先简单介绍一下它的运行机制:

  Fan-in:多个函数向一个通道输出数据,一个函数读取该通道直到它关闭。

  扇出:多个函数读取同一个通道,直到它关闭。插件设计

  Telegraf 有这么多的输入、输出和处理器插件,它是如何高效管理这些插件的?以及如何设计插件系统来应对不断增长的扩展需求?别担心,请让我详细说明。

  其实这里的插件并不是通常意义上的插件(即运行时动态加载和绑定动态链接库),而是基于工厂模型的变体。首先我们看一下 Telegraf 插件的目录结构:

  plugins

├── aggregators

│ ├── all

│ ├── basicstats

│ ├── registry.go

...

├── inputs

│ ├── all

│ ├── cpu

│ ├── registry.go

...

├── outputs

│ ├── all

│ ├── amqp

│ ├── registry.go

...

├── processors

│ ├── all

│ ├── clone

│ ├── registry.go

...

  从上面可以看出,目录结构是规则的(下面我们都以Inputs插件为例,其他模块的实现类似)。

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线