夜莺-Nightingale
夜莺V7
项目介绍 功能概览
部署升级 部署升级
数据接入 数据接入
告警管理 告警管理
数据查看 数据查看
功能介绍 功能介绍
API FAQ
夜莺V6
项目介绍 架构介绍
快速开始 快速开始
黄埔营
安装部署 安装部署
升级
采集器 采集器
使用手册 使用手册
API API
数据库表结构 数据库表结构
FAQ FAQ
开源生态
Prometheus
版权声明
第1章:天降奇兵 第1章:天降奇兵
第2章:探索PromQL 第2章:探索PromQL
第3章:Prometheus告警处理 第3章:Prometheus告警处理
第4章:Exporter详解 第4章:Exporter详解
第5章:数据与可视化 第5章:数据与可视化
第6章:集群与高可用 第6章:集群与高可用
第7章:Prometheus服务发现 第7章:Prometheus服务发现
第8章:监控Kubernetes 第8章:监控Kubernetes
第9章:Prometheus Operator 第9章:Prometheus Operator
参考资料

Telegraf调研笔记1:介绍、安装、初步测试

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 :-)

快猫星云 联系方式 快猫星云 联系方式
快猫星云 联系方式
快猫星云 联系方式
快猫星云 联系方式
快猫星云
OpenSource
开源版
Flashcat
Flashcat