⼀⽂搞懂指标采集利器Telegraf
作者|姜闻名
来源|
导读:为了让⼤家更好的了解 MSP 中 APM 系统的设计实现,我们决定编写⼀个《详聊微服务观测》系列⽂章,深⼊ APM 系统的产品、架构设计和基础技术。本⽂为该系列⽂章的第三篇,将主要对 Telegraf 数据处理链路的实现原理以及插件实现⽅式进⾏介绍。
《详聊微服务观测》系列⽂章:
《⼀⽂搞懂指标采集利器 Telegraf》(本⽂)
Telegraf 是 InfluxData 公司开源的⼀款⼗分流⾏的指标采集软件,在 GiHub 已有上万 Star。其借助社区的⼒量,拥有了多达 200 余种采集插件以及 40 余种导出插件,⼏乎覆盖了所有的监控项,例如机器监控、服务监控甚⾄是硬件监控。
架构设计
Pipeline 并发编程
在 Go 中,Pipeline 并发编程模式是⼀种常⽤的并发编程模式。简单来说,其整体上是由⼀系列阶段(stage),每个 stage 由⼀组运⾏着相同函数的 goroutine 组成,且各个 stage 之间由 channel 相互连接。
可以在电脑上用吗在每个阶段中,goroutine 负责以下事宜:
1. 通过⼊⼝ channel,接收上游 stage 产⽣的数据。
2. 处理数据,例如格式转换、数据过滤聚合等。
3. 通过出⼝ channel,发送处理后的数据到下游 stage。
其中,每个 stage 都同时拥有⼀个或多个出⼝、⼊⼝ channel,除了第⼀个和最后⼀个 stage,其分别只有出⼝ channel 和⼊⼝ channel。Telegraf 中的实现
多省工厂因同一原因停产 发生了啥Telegraf 采⽤了这种编程模式,其主要有 4 个 stage,分别为 Inputs、Processors、Aggregators 和 Outputs。法国香水品牌大全
Inputs:负责采集原始监控指标,包括主动采集和被动采集。
Processors:负责处理 Inputs 收集的数据,包括去重、重命名、格式转换等。
Aggregators:负责聚合 Processors 处理后的数据,并对聚合后的数据计算。
Outputs:负责接收处理 Processors 或 Aggregators 输出的数据,并导出到其他媒介,例如⽂件、数据库等。
且它们彼此之间也是由 channel 相互链接的,其架构图如下所⽰:
可以看到,其整体上采⽤的就是 pipeline 并发编程模式,我们简单介绍下它的运作机制:
第⼀个 stage 为 Inputs,每个 input ⽣成⼀个 goroutine,各⾃采集数据并扇⼊(fan-in)到 channel 中。
第⼆个 stage 为 Processors,每个 processor ⽣成⼀个 goroutine,并按顺序彼此⽤ channel 连接。
第三个 stage 为 Aggregators,每个 aggregator ⽣成⼀个 goroutine,并消费 Processors 产⽣的数据,并扇出(fan-out)到各个aggregator。
最后⼀个 stage 为 Outputs,每个 output ⽣成⼀个 goroutine,并消费由 Processors 或 Aggregators 产⽣的数据,并扇出到各个output。
扇⼊(fan-in):多个函数输出数据到⼀个 channel,并由某个函数读取该 channel 直到其被关闭。
扇出(fan-out):多个函数读取同⼀个 channel 直到其被关闭。
插件设计
Telegraf 拥有如此众多的 input、output 以及 processor 插件,那么它是如何⾼效地管理这些插件呢?并且⼜是如何设计插件体系以应对不断激增的扩展需求呢?别急,请容我细说。
其实,这⾥的插件并⾮通常意义上的插件(即在运⾏时动态加载与绑定动态链接库),⽽是⼀种基于⼯⼚模式的变体,⾸先我们来看下Telegraf 的插件⽬录结构:
plugins
├── aggregators
如何打开端口今夜无眠原唱│├── all
│├── basicstats
│├──
...
├── inputs
│├── all
│├── cpu
│├──
...
├── outputs
│├── all
│├── amqp
│├──
...
├── processors
│├── all
│├── clone
│├──
全国化妆品排行榜...
由上可以看到,⽬录结构是有规律的(以下我们均以 Inputs 的插件为例,其他模块实现类似)。
plugins/inputs:为各个 input 插件的包⽬录。
plugins/inputs/all:通过 import 的⽅式引⼊插件模块包(主要是为了避免循环引⽤)。
plugins/:存放注册表以及相关函数。
接⼝声明
Telegraf 通过 interface 来声明如下 Input 接⼝,表⽰ Input:
接⼝实现
在 plugins/inputs/ ⽬录中创建插件,例如 cpu,实现 Input 接⼝:
注册插件
最后,我们只需要往全局注册表中注册插件的⼯⼚函数即可:
如此,众多插件就被有条不紊的管理起来了。同时,扩展插件也很⽅便,只需实现 Input 接⼝并注册⼯⼚函数即可。
Erda 中的应⽤
在 Erda 中,我们使⽤ Telegraf 作为 Erda 平台的指标采集服务,以守护进程的⽅式部署在每台物理机上。现如今,已⼴泛应⽤⽣产,在上千台机器上稳定运⾏,采集并上报⼤量指标,以供 SRE 及相关运维⼈员⽅便地分析与排查。
由于⼀些特殊的需求,我们不得不基于 Telegraf 进⾏了⼆次开发,以便更好的适配业务需求。虽然如此,得益于 Telegraf 强⼤的插件系统,我们往往只需要针对需求新增插件即可。例如,增加 output 插件以上报到我们⾃⼰的收集端,增加 intput 插件检查 Erda ⾃⾝组件健康度等。
后续,我们将逐渐抛弃⼆开部分,拥抱开源,最⼤化地与 Telegraf 官⽅开源版本保持⼀致,以回馈社区。
参考
如果你有任何疑问,欢迎添加⼩助⼿(Erda202106)加⼊交流,参与交流和讨论!
Erda Github 地址:
Erda Cloud 官⽹:
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论