Telegraf 是 InfluxData 开源的一款采集器,可以采集操作系统、各种中间件的监控指标,采集目标列表:https://github.com/influxdata/telegraf/tree/master/plugins/inputs 看起来是非常丰富,Telegraf是一个大一统的设计,即一个二进制可以采集CPU、内存、mysql、mongodb、redis、snmp等,不像Prometheus的exporter,每个监控对象一个exporter,管理起来略麻烦。一个二进制分发起来确实比较方便。

但是,Telegraf主要是为InfluxDB设计的,采集的很多监控指标,标签部分可能不固定,比如net_response这个采集input插件,在成功的时候,会附一个标签:result=success,超时的时候,又会变成:result=timeout,对于InfluxDB的存储模型和使用方式来说,这样做是没问题的,但是大部分时序库都不喜欢这个玩法,时序库更喜欢标签是稳态的,因为标签是监控数据的唯一标识,如果标签发生变化,就相当于是新的监控数据了,这就有点恶心了。好在Telegraf提供了一些配置机制,可以把部分标签给干掉,只留那些稳定的标签,这样就舒服多了。上面这段话不理解也没关系,后面慢慢就有感触了。

调研Telegraf是希望把Telegraf作为夜莺的一种采集端程序使用,夜莺自身是有一个Agentd的,但是支持的采集内容有限,v5版本开始,拥抱Prometheus生态,故而可以和Prometheus生态的各类Exporter协同,但是Exporter是每类监控对象一个,不太方便管理,另外就是Exporter是pull模型,夜莺的设计中,会对监控对象做额外的产品支持,需要从监控数据中解析出监控对象,pull模型的exporter,直接由Prometheus进程来采集,数据压根就不会流经夜莺的服务端,所以夜莺无法感知到这些数据,更别提解析这些数据了。Telegraf有很多output插件,比如可以把采集到的监控数据输出给InfluxDB、OpenTSDB、Prometheus、Kafka等,夜莺只要实现比如OpenTSDB的接收数据的HTTP接口,就可以接收Telegraf推送的数据啦,这样数据就会先流经夜莺的服务端,在服务端做解析,提取监控对象,做一些Nodata判断等,与夜莺的生态良好的集成到了一起。

安装

Telegraf的安装,非常简单,直接从官网下载编译好的二进制即可,或者自己编译也OK,比如64位Linux环境下,可以从这里下载:https://dl.influxdata.com/telegraf/releases/telegraf-1.20.2linuxamd64.tar.gz

下载之后,解压缩,看到如下目录结构:usr/bin/telegraf是二进制,etc/telegraf/telegraf.conf是配置文件,usr/lib下还给准备好了service文件,便于用systemd托管,如何作为后台程序去运行,看你自己癖好了,这是Linux基础知识,这里不再赘述。

├── etc
│   ├── logrotate.d
│   │   └── telegraf
│   └── telegraf
│       ├── telegraf.conf
│       └── telegraf.d
├── usr
│   ├── bin
│   │   └── telegraf
│   └── lib
│       └── telegraf
│           └── scripts
│               ├── init.sh
│               └── telegraf.service
└── var
    └── log
        └── telegraf

测试

我们来测试采集CPU相关的指标,命令如下:

./usr/bin/telegraf --config etc/telegraf/telegraf.conf --test --input-filter cpu

通过--config指定配置文件,--test表示本次仅仅是个测试,测试跑完了,进程就立马退出,--input-filter是采集插件过滤,这里的意思是只运行cpu这个插件,即只采集CPU相关的指标

输出内容如下:

[root@172-20-24-219 telegraf-1.20.2]# ./usr/bin/telegraf --config etc/telegraf/telegraf.conf --test --input-filter cpu
2021-11-05T00:48:50Z I! Starting Telegraf 1.20.2
> cpu,cpu=cpu0,host=172-20-24-219 usage_guest=0,usage_guest_nice=0,usage_idle=98.03921568448419,usage_iowait=0,usage_irq=0,usage_nice=0,usage_softirq=0,usage_steal=0,usage_system=1.960784313690687,usage_user=0 1636073331000000000
> cpu,cpu=cpu1,host=172-20-24-219 usage_guest=0,usage_guest_nice=0,usage_idle=100,usage_iowait=0,usage_irq=0,usage_nice=0,usage_softirq=0,usage_steal=0,usage_system=0,usage_user=0 1636073331000000000
> cpu,cpu=cpu2,host=172-20-24-219 usage_guest=0,usage_guest_nice=0,usage_idle=100,usage_iowait=0,usage_irq=0,usage_nice=0,usage_softirq=0,usage_steal=0,usage_system=0,usage_user=0 1636073331000000000
> cpu,cpu=cpu3,host=172-20-24-219 usage_guest=0,usage_guest_nice=0,usage_idle=100,usage_iowait=0,usage_irq=0,usage_nice=0,usage_softirq=0,usage_steal=0,usage_system=0,usage_user=0 1636073331000000000
> cpu,cpu=cpu-total,host=172-20-24-219 usage_guest=0,usage_guest_nice=0,usage_idle=99.50248752715007,usage_iowait=0,usage_irq=0,usage_nice=0,usage_softirq=0,usage_steal=0.49751243763529784,usage_system=0,usage_user=0 1636073331000000000

如果要同时采集cpu和内存呢?这么这么来搞:

./usr/bin/telegraf --config etc/telegraf/telegraf.conf --test --input-filter cpu:mem
2021-11-05T00:51:47Z I! Starting Telegraf 1.20.2
> mem,host=172-20-24-219 active=744894464i,available=7693004800i,available_percent=93.8048142657935,buffered=2662400i,cached=1393319936i,commit_limit=4100538368i,committed_as=392212480i,dirty=0i,free=6590001152i,high_free=0i,high_total=0i,huge_page_size=2097152i,huge_pages_free=0i,huge_pages_total=0i,inactive=623808512i,low_free=0i,low_total=0i,mapped=54579200i,page_tables=3637248i,shared=17301504i,slab=146083840i,sreclaimable=97878016i,sunreclaim=48205824i,swap_cached=0i,swap_free=0i,swap_total=0i,total=8201076736i,used=215093248i,used_percent=2.6227439996483897,vmalloc_chunk=35184340365312i,vmalloc_total=35184372087808i,vmalloc_used=23142400i,write_back=0i,write_back_tmp=0i 1636073507000000000
> cpu,cpu=cpu0,host=172-20-24-219 usage_guest=0,usage_guest_nice=0,usage_idle=100,usage_iowait=0,usage_irq=0,usage_nice=0,usage_softirq=0,usage_steal=0,usage_system=0,usage_user=0 1636073508000000000
> cpu,cpu=cpu1,host=172-20-24-219 usage_guest=0,usage_guest_nice=0,usage_idle=100,usage_iowait=0,usage_irq=0,usage_nice=0,usage_softirq=0,usage_steal=0,usage_system=0,usage_user=0 1636073508000000000
> cpu,cpu=cpu2,host=172-20-24-219 usage_guest=0,usage_guest_nice=0,usage_idle=100,usage_iowait=0,usage_irq=0,usage_nice=0,usage_softirq=0,usage_steal=0,usage_system=0,usage_user=0 1636073508000000000
> cpu,cpu=cpu3,host=172-20-24-219 usage_guest=0,usage_guest_nice=0,usage_idle=100,usage_iowait=0,usage_irq=0,usage_nice=0,usage_softirq=0,usage_steal=0,usage_system=0,usage_user=0 1636073508000000000
> cpu,cpu=cpu-total,host=172-20-24-219 usage_guest=0,usage_guest_nice=0,usage_idle=100,usage_iowait=0,usage_irq=0,usage_nice=0,usage_softirq=0,usage_steal=0,usage_system=0,usage_user=0 1636073508000000000

--input-filter cpu:mem 指定要同时运行cpu和内存两个采集插件,输出的内容格式是InfluxDB生态的格式,我们随便分析一条,比如最后这一条:

cpu,cpu=cpu-total,host=172-20-24-219 usage_guest=0,usage_guest_nice=0,usage_idle=100,usage_iowait=0,usage_irq=0,usage_nice=0,usage_softirq=0,usage_steal=0,usage_system=0,usage_user=0 1636073508000000000

这一条数据用空格分成了3部分,第一部分是measurement和tags,上例中第一个逗号之前的部分即cpu,就是measurement,第一个逗号之后的部分cpu=cpu-total,host=172-20-24-219就是tags,host这个标签标识了这个监控数据是从哪里采集的,也就是夜莺里的监控对象,后面Telegraf这个数据进入夜莺服务端之后,夜莺就是从host标签中提取的监控对象标识(夜莺里把监控对象标识叫ident)。cpu=cpu-total这个标签表示这是cpu的整机情况,其他的那些监控数据大家可以看到,有cpu=cpu0,cpu=cpu1等标签,表示不同CPU核的监控数据。

第二部分是fields,filed_key=field_value这种格式,usage_guest=0就是一个field,因为Telegraf是InfluxDB生态的,InfluxDB是列式存储,这种格式非常合适。但是在夜莺、OpenTSDB、Prometheus这种生态里,一般不这么描述监控数据,所以后续是需要有个格式转换的,转换逻辑也很简单,就是${measurement}_${field_key}组成metric,上面这一条数据,会被拆成10个metric。不理解也没关系,后面真正要上报数据的时候,会给大家演示。

第三部分是时间戳:1636073508000000000,这个时间戳应该是纳秒为单位的,上报给不同的后端的时候,要做转换,比如上报给OpenTSDB的时候,OpenTSDB就把时间转换为秒了。

上面的采集的CPU和内存数据,标签部分只有:host=172-20-24-219和cpu=cpu-total这种数据,是稳定的,不需要对标签做额外处理。这个host标签默认是取的机器名,大家可以通过修改telegraf.conf的配置来手工设置别的内容,比如把host标签的值设置为本机ip之类的,配置项在agent那个section:

[agent]
  interval = "10s"
  round_interval = true
  metric_batch_size = 1000
  metric_buffer_limit = 10000
  collection_jitter = "0s"
  flush_interval = "10s"
  flush_jitter = "0s"
  precision = ""
  hostname = ""
  omit_hostname = false

上面倒数第二行,默认为空,自动获取本机hostname,可以设置一个不为空的值,就会以你设置 的值为准了。个人建议维持默认,就用hostname挺好的,公司里的每台机器,建议hostname都不要相同,这才是最佳实践。

好了,本篇到此结束,主要对Telegraf做了基本介绍、安装和测试,后面我们就要开始测试这些常用的input插件了,有了此等神器,监控采集这块,估计是不太用担心了,enjoy :-)