一文搞懂指标采集利器 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集合常考知识点总结了一下,并根据被问到的频率大致做了一个标注.一颗星表示知识点需要了解,被问到的频率不高,面试时起码能说个差不多.两颗 ...
随机推荐
- eclipse javaEE版下载过程中选择镜像(Select Another Mirror)无反应解决办法,附带eclipse javaEE版下载教程。
1.eclipse javaEE版下载过程中选择镜像(Select Another Mirror)无反应 (复制该网址下载即可 https://mirrors.neusoft.edu.cn/eclip ...
- java性能优化常用工具jps、jstat、jinfo
jps:虚拟机进程状况工具 jps可以用来查看虚拟机进程,基本等同于ps -ef|grep java #查看jps的使用文档 [root@localhost script]# jps -help us ...
- Ubuntu安装数据库
1.通过命令行安装:sudo apt-get install mysql-client mysql-server 2.安装过程中输入数据库密码("123456",root) 3.使 ...
- Linux 文本三剑客之 grep
Linux 系统中一切皆文件. 文件是个文本.可以读.可以写,如果是二进制文件,还能执行. 在使用Linux的时候,大都是要和各式各样文件打交道.熟悉文本的读取.编辑.筛选就是linux系统管理员的必 ...
- 负载均衡算法WRR介绍
一.负载均衡 负载均衡是一个很大的概念,既有从硬件层面来解决问题的,又有从软件层面解决的,有关负载均衡的介绍,推荐阅读: http://os.51cto.com/art/201108/285359.h ...
- linux&c 进程控制 课后习题
(声明:本篇博客只是博主自己的理解,加以整理,目的是总结刚学过的进程知识,不一定绝对正确,非常愿意听客官您提出宝贵意见.) Q1:进程中的全局数据段(全局变量),局部数据段(局部变量),静态数据段的分 ...
- Windows 常用配置
安装IIS服务器 在服务器管理器中,选择"角色"添加角色 进入添加角色向导,在安装界面,选择服务器角色为:" Web服务器(IIS) " 角色服务勾选:应用程序 ...
- Java测试开发--HttpClient常规用法(九)
1.HttpClient可以读取网页(HTTP/HTTPS)内容 2.对url发送get/post请求(带不带参数都可以),进行测试 一.maven项目pom.xml需要引入包 <depende ...
- js 透明度轮播图
js 透明度轮播图 <!DOCTYPE html> <html lang="en"> <head> <meta charset=" ...
- [LINUX] Arch Linux 硬盘拷贝式装系统+新增 home 分区
目录 前言 1. 实操 1.1 整个磁盘拷贝 1.2 创建 home 分区 1.3 修改 fstab 实现自动挂载 2. 涉及到的知识点 2.1 fstab 2.2 dd 命令 2.3 fdisk 命 ...