一文搞懂指标采集利器 Telegraf

作者| 姜闻名
来源|尔达 Erda 公众号
导读:为了让大家更好的了解 MSP 中 APM 系统的设计实现,我们决定编写一个《详聊微服务观测》系列文章,深入 APM 系统的产品、架构设计和基础技术。本文为该系列文章的第三篇,将主要对 Telegraf 数据处理链路的实现原理以及插件实现方式进行介绍。
《详聊微服务观测》系列文章:
- 《从监控到可观测性,我们最终要走向哪里?》
- 《上手后才知道,这套仪表盘系统用起来是真的爽!》
- 《一文搞懂指标采集利器 Telegraf》(本文)
Telegraf 是 InfluxData 公司开源的一款十分流行的指标采集软件,在 GiHub 已有上万 Star。其借助社区的力量,拥有了多达 200 余种采集插件以及 40 余种导出插件,几乎覆盖了所有的监控项,例如机器监控、服务监控甚至是硬件监控。
架构设计
Pipeline 并发编程
在 Go 中,Pipeline 并发编程模式是一种常用的并发编程模式。简单来说,其整体上是由一系列阶段(stage),每个 stage 由一组运行着相同函数的 goroutine 组成,且各个 stage 之间由 channel 相互连接。
在每个阶段中,goroutine 负责以下事宜:
- 通过入口 channel,接收上游 stage 产生的数据。
- 处理数据,例如格式转换、数据过滤聚合等。
- 通过出口 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
│ ├── registry.go
...
├── inputs
│ ├── all
│ ├── cpu
│ ├── registry.go
...
├── outputs
│ ├── all
│ ├── amqp
│ ├── registry.go
...
├── processors
│ ├── all
│ ├── clone
│ ├── registry.go
...
由上可以看到,目录结构是有规律的(以下我们均以 Inputs 的插件为例,其他模块实现类似)。
- plugins/inputs:为各个 input 插件的包目录。
- plugins/inputs/all:通过 import 的方式引入插件模块包(主要是为了避免循环引用)。
- plugins/inputs/registry.go:存放注册表以及相关函数。
接口声明
Telegraf 通过 interface 来声明如下 Input 接口,表示 Input:

接口实现
在 plugins/inputs/ 目录中创建插件,例如 cpu,实现 Input 接口:

注册插件
最后,我们只需要往全局注册表中注册插件的工厂函数即可:

如此,众多插件就被有条不紊的管理起来了。同时,扩展插件也很方便,只需实现 Input 接口并注册工厂函数即可。
Erda 中的应用
在 Erda 中,我们使用 Telegraf 作为 Erda 平台的指标采集服务,以守护进程的方式部署在每台物理机上。现如今,已广泛应用生产,在上千台机器上稳定运行,采集并上报大量指标,以供 SRE 及相关运维人员方便地分析与排查。
由于一些特殊的需求,我们不得不基于 Telegraf 进行了二次开发,以便更好的适配业务需求。虽然如此,得益于 Telegraf 强大的插件系统,我们往往只需要针对需求新增插件即可。例如,增加 output 插件以上报到我们自己的收集端,增加 intput 插件检查 Erda 自身组件健康度等。
后续,我们将逐渐抛弃二开部分,拥抱开源,最大化地与 Telegraf 官方开源版本保持一致,以回馈社区。
参考
如果你有任何疑问,欢迎添加小助手微信(Erda202106)加入交流群,参与交流和讨论!
- Erda Github 地址:https://github.com/erda-project/erda
- Erda Cloud 官网:https://www.erda.cloud/
一文搞懂指标采集利器 Telegraf的更多相关文章
- 一篇文章教你搞懂日志采集利器 Filebeat
关注「开源Linux」,选择"设为星标" 回复「学习」,有我为您特别筛选的学习资料~ 本文使用的Filebeat是7.7.0的版本,文章将从如下几个方面说明: Filebeat是什 ...
- 一文搞懂 Prometheus 的直方图
原文链接:一文搞懂 Prometheus 的直方图 Prometheus 中提供了四种指标类型(参考:Prometheus 的指标类型),其中直方图(Histogram)和摘要(Summary)是最复 ...
- 一文搞懂RAM、ROM、SDRAM、DRAM、DDR、flash等存储介质
一文搞懂RAM.ROM.SDRAM.DRAM.DDR.flash等存储介质 存储介质基本分类:ROM和RAM RAM:随机访问存储器(Random Access Memory),易失性.是与CPU直接 ...
- 基础篇|一文搞懂RNN(循环神经网络)
基础篇|一文搞懂RNN(循环神经网络) https://mp.weixin.qq.com/s/va1gmavl2ZESgnM7biORQg 神经网络基础 神经网络可以当做是能够拟合任意函数的黑盒子,只 ...
- Web端即时通讯基础知识补课:一文搞懂跨域的所有问题!
本文原作者: Wizey,作者博客:http://wenshixin.gitee.io,即时通讯网收录时有改动,感谢原作者的无私分享. 1.引言 典型的Web端即时通讯技术应用场景,主要有以下两种形式 ...
- 一文搞懂vim复制粘贴
转载自本人独立博客https://liushiming.cn/2020/01/18/copy-and-paste-in-vim/ 概述 复制粘贴是文本编辑最常用的功能,但是在vim中复制粘贴还是有点麻 ...
- 三文搞懂学会Docker容器技术(中)
接着上面一篇:三文搞懂学会Docker容器技术(上) 6,Docker容器 6.1 创建并启动容器 docker run [OPTIONS] IMAGE [COMMAND] [ARG...] --na ...
- 三文搞懂学会Docker容器技术(下)
接着上面一篇:三文搞懂学会Docker容器技术(上) 三文搞懂学会Docker容器技术(中) 7,Docker容器目录挂载 7.1 简介 容器目录挂载: 我们可以在创建容器的时候,将宿主机的目录与容器 ...
- 一文搞懂所有Java集合面试题
Java集合 刚刚经历过秋招,看了大量的面经,顺便将常见的Java集合常考知识点总结了一下,并根据被问到的频率大致做了一个标注.一颗星表示知识点需要了解,被问到的频率不高,面试时起码能说个差不多.两颗 ...
随机推荐
- bash执行顺序:alias --> function --> builtin --> program
linux bash的执行顺序如下所示: 先 alias --> function --> builtin --> program 后 验证过程: 1,在bash shell中有内置 ...
- advanced base-scripting guide in chinese(高级Bash脚本编程指南-10)
<高级Bash脚本编程指南>Revision 10中文版 github上链接地址: https://github.com/LinuxStory/Advanced-Bash-Scriptin ...
- best-time-to-buy-and-sell-stock-ii leetcode C++
Say you have an array for which the i th element is the price of a given stock on day i. Design an a ...
- Java RMI学习与解读(三)
Java RMI学习与解读(三) 写在前面 接下来这篇就是最感兴趣的Attack RMI部分了. 前面也说过,RMI的通信过程会用到反序列化,那么针对于RMI的三个角色: Server/Regisrt ...
- Github图床设置
创建新仓库 点击右上角加号->新建仓库,填写基本信息后点击下面的创建即可 https://github.com/new 创建新令牌 点击设置->开发者设置->私人令牌->生成新 ...
- axios & fetch 异步请求
// 一.创建实例 const request = axios.create({ baseURL: "http://kg.zhaodashen.cn/v2", headers: { ...
- Laravel/Lumen 分组求和问题 where groupBy sum
在Laravel中使用分组求和,如果直接使用Laravel各数据库操作方法,应该会得出来如下代码式: DB::table('table_a') ->where('a','=',1) ->g ...
- JMeter学习笔记--关联
1.什么是关联? 本次请求需要的数据,需要上一步的请求返回给提供的过程. 2.JMeter关联中常用的两种方式 正则表达式提取器 正则表达式提取器用于对页面任何文本的提取,提取的内容是根据正则表达式在 ...
- Swift-Framework(一)访问资源文件
摘要 Framework 就是在 APP 应用中的一种封装功能的表现形式,虽然不能独立运行,但是也可以在它里面存放和访问图片.语音等资源文件,可算是麻雀虽小,五脏俱全. 毕竟不是 APP 工程,所以 ...
- mysql-5.7.30安装
1.由于在线安装受制于网络环境,所以选择tar包编译安装. 首先去mysql镜像站下载mysql-5.7.30-linux-glibc2.5-x86_64.tar.gz2.上传到linux服 ...