Telegraf简介
Telegraf是Influx公司一款基于插件化的开源指标收集工具.主要结合时序性数据库进行使用,用于性能监控.通常Telegraf会每间隔一段时间抓取一批指标数据并将数据发送给时序性数据库或其他自定义的Output.
官方文档 https://docs.influxdata.com/telegraf/v1.24
与Promethus类似,不同的在于Promethus基于各种Exporter通过HTTP Pull的形式进行数据拉取,Telegraf通过插件化的形式进行数据采集,官方提供了300多个不同的插件用于不同的使用场景.
安装
安装官方文档https://docs.influxdata.com/telegraf/v1.24/install/
-
安装Yum源
cat <<EOF | sudo tee /etc/yum.repos.d/influxdb.repo [influxdb] name = InfluxData Repository - Stable baseurl = https://repos.influxdata.com/stable/\$basearch/main enabled = 1 gpgcheck = 1 gpgkey = https://repos.influxdata.com/influxdb.key EOF
-
yum安装即可
yum install -y telegraf
-
查看telegraf是否安装成功
systemctl status telegraf
入门示例
最简单的单输入流和输出流的telegraf
-
创建一个目录用于管理telegraf的配置文件
mkdir -p /home/telegraf/config
-
编写配置文件 vim /home/telegraf/config/example1.conf
[agent] interval = "3s" [[inputs.cpu]] percpu = true totalcpu = true collect_cpu_time = false report_active = false core_tags = false [[outputs.file]] files = ["stdout"]
-
启动telegraf
telegraf --config /home/telegraf/config/example1.conf
输出内容解析
2022-12-01T02:10:41Z I! Starting Telegraf 1.24.4 #telegraf版本
2022-12-01T02:10:41Z I! Available plugins: 222 inputs, 9 aggregators, 26 processors, 20 parsers, 57 outputs # 可用组件
2022-12-01T02:10:41Z I! Loaded inputs: cpu # 目前已经加载的组件 只有CPU
2022-12-01T02:10:41Z I! Loaded aggregators: # 聚合插件 无
2022-12-01T02:10:41Z I! Loaded processors: # 处理插件 无
2022-12-01T02:10:41Z I! Loaded outputs: file # 出去插件 只有file
2022-12-01T02:10:41Z I! Tags enabled: host=node2 # 全局Tag只有一个 node2主机名
2022-12-01T02:10:41Z I! [agent] Config: Interval:3s, Quiet:false, Hostname:"node2", Flush Interval:10s # Interval 3s 每三秒采集一次 # Flush Interval 10 每10从telegraf拉去一批数据输出 3s采集一次 10s输出一次 可能一次telegraf就输出了3批的数据
Telegraf架构
- Agent: 全局配合文件用单[]包裹 主要同于定义全局默认的配置
- inputs: 输入插件
- outputs: 输出插件
- aggregator 和 processor: 聚合插件与处理插件的配置
telegraf各种模型以插件形式进行集成,以一种Pipeline的设计思想处理数据,其中各个组件的顺序是telegraf底层已经定义好了的,一定是从input -> proccessor -> aggregator -> output
- 所有input将数据汇入一个管道
- 所有processor按先后顺序处理数据之后传递给下一个processor processor需要指定order顺序不然telegraf默认随机顺序
- 从processor管道出去的数据会广播分发到各个aggregator聚合组件进行数据的聚合
- 从aggregator聚合之后数据会广播分发给所有的output输出组件
- telegraf提供了各种指标的过滤器可以选择性的接受部分数据
telegraf插件
插件文档需要与telegraf版本相对应,telegraf采用go语言编写,有一个特点就是打包出来就是一个可执行文件,在使用插件之前需要与对应telegraf版本匹配
官方文档 https://docs.influxdata.com/telegraf/v1.24/plugins/
因为telegraf的插件非常多 在官网可以查询自己需要类型的插件如Input outputs等 再选择具体某一个组件看关于他的详细示例
telegraf命令行常见用法
-
创建一个telegraf 配置模板 telegraf config > telegraf.conf
-
使用 input-filter 和 output-filter选择输入输出插件 生成对应模板
telegraf --input-filter cpu:mem --output-filter influxdb > ./example_filter.conf
-
远程配置 --config 直接跟远程地址 但是不支持热更新
telegraf --config http://www.xxxx.com/telegraf.conf
telegraf通用配置参数
官方网站 https://docs.influxdata.com/telegraf/v1.24/configuration/
如下配置是通用配置不同的插件的差异化配置参考具体插件的文档
Agent
配置名 | 解释 |
---|---|
interval | 所有的input组件采集数据的间隔时间 |
round_interval | 将采集的间隔时间取整。比如,如果interval设置为10s,但我们在1分02秒启动了telegraf服务,那么采集的时间会取整到1分10秒,1分20秒,1分30秒 |
metric_batch_size | telegraf一批次从output组件向外发送数据的大小,网络不稳定时可以减小此参数。 |
metric_buffer_limit | telegraf会为每个output插件创建一个缓冲区,来缓存指标数据,并在output成功将数据发送后,将成功发送的数据从缓冲区删除。所以,metriac_buffer_limit参数应该至少是metric_batch_size参数的两倍 |
collection_jitter | 这个参数会在采集的时间点上加一个随机的抖动,这样可以避免很多插件同时查询一些消耗资源的指标,从而对被观测的系统产生不可忽视的影响。 |
flush_interval | 所有output的输出间隔,这个参数不应该设的比interval(所有input组件的采集间隔)小。最大的实际发送间隔将会是 |
flush_jitter | 对output的输出时间加上一个随机的抖动,这主要是为了避免大量的Telegraf实例在同样的时间同时执行写入操作,出现较大的写入峰值。比如,flush_jitter设为5s,flush_interval设为10s意味着会在10~15秒的时候进行一次输出。 |
precision | 精度配置确定从输入插件接收的点中保留多少时间戳精度。所有传入的时间戳都被阶段为给定的精度。然后Telegraf用零填充截断的时间戳以创建纳秒时间戳,输出插件将以纳秒为单位发出时间戳。有效的精度为ns,us,ms和s。例如:如果精度设置为ms,则纳秒时间戳1480000000123456789将被截断为1480000000123毫秒精度,然后用0填充以生成新的,不太精确的纳秒时间戳1480000000123000000。输出插件不会进一步更改时间戳。如果是服务型的输出插件会忽略这个设置。 |
logfile | 自定义的日志名称, |
debug | 使用debug模式运行Telegraf |
quiet | 安静地运行Telegraf,只会提示错误信息 |
logtarget | 该配置用来空值日志的目标。它可以是"file",“stderr"之一,如果是在Windows系统上,它还可以设为"eventlog”。设置为"file"时,输入文件由 logfile 配置项决定。 |
logfile | 指定logtarget指定为"file"时的日志文件名。如果设置为空,那么日志会输出到stderr上。 |
logfile_rotation_interval | 日志轮转间隔,多长时间开启一个新的日志文件,如果设置为0,那么就不按时间进行轮转。 |
logfile_rotation_max_size | 当正在使用的日志文件的大小超过该值时,开启一个新的日志文件。当设置为0,表示不按照日志文件的大小进行日志轮转。 |
logfile_rotation_max_archives | 最大的日志归档数量,每一次日志轮转发生时,都会产生一个新的正在使用的日志文件,和一个归档(旧的不再使用的日志文件) |
log_with_timezone | 设置日志记录要使用的时区,或者设为"local"即为本地时间。 |
hostname | 覆盖默认的主机名,如果不设该值,那么os.Hostname( )的返回值。(os.Hostname)是Go语言标准库中的方法,可以获取当前机器的名称。 |
omit_hostname | telegraf输出的指标数据中,有一个默认的 |
input插件
配置名 | 解释 |
---|---|
alias | 给一个input插件实例进行命名。 |
interval | 单个Input组件收集指标的间隔时间,插件中的interval配置比全局的interval配置的优先级要高。 |
precision | 单个Input组件的时间精度,覆盖[agent]中的配置。精度配置确定从输出插件接收的点中保留多少时间戳精度。所有传入的时间戳都被阶段为给定的精度。然后Telegraf用零填充截断的时间戳以创建纳秒时间戳,输出插件将以纳秒为单位发出时间戳。有效的精度为ns,us,ms和s。例如:如果精度设置为ms,则纳秒时间戳1480000000123456789将被截断为1480000000123毫秒精度,然后用0填充以生成新的,不太精确的纳秒时间戳1480000000123000000。输出插件不会进一步更改时间戳。如果是服务型的输出插件会忽略这个设置。 |
collection_jitter | 单个Input组件的采集抖动 |
name_override | 覆盖原来的指标名称,默认值为input组件的名称 |
name_prefix | 指定要附加到度量值名称的前缀 |
name_suffix | 指定要附加到度量值名称的后缀 |
tags | 给当前input数据添加新的标签集。 |
output插件
配置名 | 解释 |
---|---|
alias | 给一个output插件起一个别名 |
flush_interval | 单个output插件的输出间隔(覆盖全局配置) |
flush_jitter | 单个output插件的输出时间抖动(覆盖全局配置) |
metric_batch_size | 一次最多发送多少条数据(会覆盖全局配置) |
metric_buffer_limit | 未发送数据的缓冲区(会覆盖全局配置) |
name_override | 覆盖原来的指标名称,默认值为output的名称(我怀疑官网说错了) |
name_prefix | 指标名称的前缀 |
name_suffix | 指标名称的后缀 |
Aggregator插件
配置名 | 解释 |
---|---|
alias | 给一个Aggregator插件的实例命名 |
period | 聚合器对从now-period 到now 之间的数据进行聚合。 |
delay | 聚合时进行一个小的延迟,防止在对时间戳为1000的数据进行聚合时,上游还在正在发送时间戳为1000的数据 |
grace | 迟到多久的数据可以进入下一个聚合周期。 |
drop_original | 默认为false,如果设置为true,袁术的指标数据就会从流水线上删除,不会发给下游的output插件 |
name_override | 给数据的指标名称重新命名 |
name_prefix | 给指标名称加一个前缀 |
name_suffix | 给指标名称加一个后缀 |
tags | 添加额外的标签集 |
processor插件
配置名 | 解释 |
---|---|
alias | 给Processor插件的示例起一个名字 |
order | 这是处理器的执行顺序,如果没有制定,那么执行器的顺序就是随机的。注意!不是按照配置文件的先后顺序来的,而是随机。 |
Metric filtering通用配置
可以通过过滤器卸载input output
配置名 | 解释 |
---|---|
namepass | 一个glob模式的字符串数组,仅有measurement名称与这个配置的参数能匹配的指标数据可以进入此插件。 |
namedrop | 一个glob模式的字符串数组,能匹配上measurement的数据直接删除。 |
fieldpass | 一个glob模式的字符串数组,只有能匹配上的字段才能通过 |
fielddrop | 一个glob模式的字符串数组,如果匹配上了就删除这个资源。 |
tagpass | 一个glob模式的字符串数组,tag能匹配上的数据才能通过 |
tagdrop | 一个glob模式的字符串数组,tag能匹配上的数据会被删除 |
taginclude | 一个glob模式的字符串数据,能匹配到其中一个的整条数据才能通过。 |
tagexclude | tageinclude的反函数 |
配置文件中使用环境变量
- 在telegraf配置文件中可以使用"$STR_VAR"来表示字符串变量(需要使用双引号包裹) $INT_VAR引用其他类型
- 默认会加载/etc/default/telegraf 的配置文件,但是生效需要重启influx
- 直接编辑一个文件 vim /home/telegraf/defalut.conf 然后source 即可
- export VAR_NAME=xxx
[agent]
interval = "3s"
[global_tags]
who = "$MY_NAME"
[[inputs.cpu]]
percpu = true
totalcpu = true
collect_cpu_time = false
report_active = false
core_tags = false
[[outputs.file]]
files = ["stdout"]
telegraf集成自定义插件
通过telegraf自带的exec 或者 execd插件集成
https://github.com/influxdata/telegraf/blob/release-1.24/plugins/inputs/exec/README.md
https://github.com/influxdata/telegraf/blob/release-1.24/plugins/inputs/execd/README.md
telegraf强大的扩展性可以通过执行脚本调用其他语言编写的插件获取结果进行收集
如集成Python或者 shell等
import glob
import sys
import time
# 获取给定目录下的文件数
# 定义输出的 模板字符串
template = "PathFileNum,name=test num={num} {timestamp}"
# 获取传入的第一个参数
path = sys.argv[1]
# 使用glob进行文件匹配,得到匹配到文件数量
path_file_num = glob.glob(path).__len__()
# 套用模板
data = template.format(num=path_file_num)
print(data)
sys.exit(0)
#!/bin/sh
echo 'example,tag1=a,tag2=b i=42i,j=43i,k=44i'
telegraf配置如下Input插件
[[inputs.exec]]
commands = ["python3 /home/telegraf/script/dir_num_input_exec.py /home/*","bash /home/telegraf/script/test.sh"]
data_format = "influx"
- command表示执行的命令 也可以使用[ “command1”, “comm2and” ]执行多个命令
- data_format 表示数据格式 influx 表示使用influx行协议
exec与execd区别
- exec调用执行具体命令或者标准输出作为telegraf的Input数据
- execd可以长时运行一个外部进程作为守护进程,并且可以发送signal信号给该程序
使用GoLang对telegraf源码进行二次开发
参考https://github.com/influxdata/telegraf/tree/release-1.24