Telegraf介绍

   数据管道,输入输出端协商好格式,然后进行数据采集input、数据清理process、数据聚合aggregator、数据转发output,与logstash类似,但更强大,有非常多的插件

Telegraf 是收集和报告指标和数据的代理。Go语言编写。

Telegraf是TICK Stack的一部分,是一个插件驱动的服务器代理,用于收集和报告指标。

Telegraf 集成了直接从其运行的容器和系统中提取各种指标,事件和日志,从第三方API提取指标,甚至通过StatsD和Kafka消费者服务监听指标。

它还具有输出插件,可将指标发送到各种其他数据存储,服务和消息队列,包括InfluxDB,Graphite,OpenTSDB,Datadog,Librato,Kafka,MQTT,NSQ等等。

 

Telegraf安装方式环境部署

 

启动命令:
# 启动
systemctl start telegraf
# 停止
systemctl stop telegraf

 

# 重启 telegraf 服务,使配置文件生效
service telegraf restart
# Linux 不同系统服务的启动方式不同
systemctl start telegraf

 

# 查看服务状态
systemctl status telegraf

 

 

Telegraf生成配置文件

telegraf 支持读取多个配置文件,可将多个配置文件放置在 /etc/telegraf/telegraf.d 目录下。

telegraf 日志目录 /var/log/telegraf/telegraf.log

 

telegraf执行命令:

telegraf --config telegraf.conf

telegraf以后台方式启动:

nohup telegraf --config telegraf.conf > /dev/null 2>&1 &

 

 

telegraf 可以根据需要采集的数据需求生成相应的配置文件,生成指定输入和输出插件的配置文件格式如下:

 

telegraf --input-filter <pluginname>[:<pluginname>] --output-filter <outputname>[:<outputname>] config > telegraf.conf

 

生成带cpu、memroy、http_listener和influxdb插件的配置文件:

telegraf --input-filter cpu:mem:http_listener --output-filter influxdb config > telegraf.conf

 

比如在当前目录下生成mysql相关的配置文件:
telegraf config > telegraf-mysql.conf

 

生成带 cpu、memroy、disk、diskio、net 和 influxdb 插件的配置文件 telegraf.conf,指定输出到 influxdb和 opentsdb

telegraf --input-filter cpu:mem:disk:diskio:net --output-filter influxdb:opentsdb config > telegraf.conf

 

默认的配置文件生成:

telegraf --input-filter cpu:mem:http_listener --output-filter influxdb config 

 

一些测试示例:

# 测试 /etc/telegraf/telegraf.conf 配置文件中输入 cpu 配置是否正确
telegraf  -config /etc/telegraf/telegraf.conf -input-filter cpu -test
# 测试 /etc/telegraf/telegraf.conf 输出 influxdb 配置是否正确
telegraf  -config /etc/telegraf/telegraf.conf -output-filter influxdb -test
# 测试 /etc/telegraf/telegraf.d/mysql.conf 输入 cpu 和 输出 influxdb 配置是否正确
telegraf  -config /etc/telegraf/telegraf.d/mysql.conf -input-filter cpu  -output-filter influxdb -test

 

 

Telegraf参数配置:

 

Agent 配置

Telegraf有一些可以在配置[agent]部分下配置的选项。

  • interval:所有输入的默认数据收集间隔

  • round_interval:将收集间隔舍入为“interval”例如,如果interval =“10s”则始终收集于:00,:10,:20等。

  • metric_batch_size:Telegraf将指标发送到大多数metric_batch_size指标的批量输出。

  • metric_buffer_limit:Telegraf将缓存metric_buffer_limit每个输出的指标,并在成功写入时刷新此缓冲区。这应该是倍数,metric_batch_size不能少于2倍metric_batch_size

  • collection_jitter:集合抖动用于随机抖动集合。每个插件在收集之前将在抖动内随机休眠一段时间。这可以用来避免许多插件同时查询sysfs之类的东西,这会对系统产生可测量的影响。

  • flush_interval:所有输出的默认数据刷新间隔。您不应将此设置为以下间隔。最大值flush_intervalflush_interval+flush_jitter

  • flush_jitter:将刷新间隔抖动一个随机量。这主要是为了避免运行大量Telegraf实例的用户出现大量写入峰值。例如,flush_jitter5s和flush_interval10s之一意味着每10-15秒就会发生一次冲洗。

  • precision:默认情况下,precision将设置为与收集时间间隔相同的时间戳顺序,最大值为1s。精度不会用于服务输入,例如logparserstatsd。有效值为 nsus(或µsms,和s

  • logfile:指定日志文件名。空字符串表示要登录stderr

  • debug:在调试模式下运行Telegraf。

  • quiet:以安静模式运行Telegraf(仅限错误消息)。

  • hostname:覆盖默认主机名,如果为空使用os.Hostname()

  • omit_hostname:如果为true,则不host在Telegraf代理中设置标记。

Input 配置

以下配置参数可用于所有输入:

  • interval:收集此指标的频率。普通插件使用单个全局间隔,但是如果一个特定输入应该运行得更少或更频繁,则可以在此处进行配置。

  • name_override:覆盖度量的基本名称。(默认为输入的名称)。

  • name_prefix:指定附加到度量名称的前缀。

  • name_suffix:指定附加到度量名称的后缀。

  • tags:要应用于特定输入测量的标签映射。

Aggregator 配置

以下配置参数可用于所有聚合器:

  • period:刷新和清除每个聚合器的时间段。聚合器将忽略在此时间段之外使用时间戳发送的所有度量标准。

  • delay:刷新每个聚合器之前的延迟。这是为了控制聚合器在从输入插件接收度量标准之前等待多长时间,如果聚合器正在刷新并且输入在相同的时间间隔内收集。

  • drop_original:如果为true,聚合器将丢弃原始度量标准,并且不会将其发送到输出插件。

  • name_override:覆盖度量的基本名称。(默认为输入的名称)。

  • name_prefix:指定附加到度量名称的前缀。

  • name_suffix:指定附加到度量名称的后缀。

  • tags:要应用于特定输入测量的标签映射。

Processor 配置

以下配置参数可用于所有处理器:

  • order:这是执行处理器的顺序。如果未指定,则处理器执行顺序将是随机的。

Measurement filtering (测量过滤)

可以根据输入,输出,处理器或聚合器配置过滤器,请参阅下面的示例。

  • namepass:一个glob模式字符串数组。仅发出测量名称与此列表中的模式匹配的点。

  • 命名工作:逆转namepass。如果找到匹配,则丢弃该点。这是在通过namepass测试后的点上测试的。

  • fieldpass:一个glob模式字符串数组。仅发出其字段键与此列表中的模式匹配的字段。不适用于输出。

  • fielddrop:逆的fieldpass。具有匹配其中一个模式的字段键的字段将从该点中丢弃。不适用于输出。

  • tagpass:将标记键映射到glob模式字符串数组的表。仅发出表中包含标记键的点和与其模式之一匹配的标记值。

  • tagdrop:逆的tagpass。如果找到匹配,则丢弃该点。这是在通过tagpass测试后的点上测试的。

  • taginclude:一个glob模式字符串数组。仅发出具有与其中一个模式匹配的标签键的标签。相反tagpass,它将根据其标记传递整个点,taginclude从该点移除所有不匹配的标记。此滤波器可用于输入和输出,但 建议在输入上使用,因为在摄取点过滤掉标签更有效。

  • tagexclude:倒数taginclude。具有与其中一个模式匹配的标记键的标记将从该点被丢弃。

注意: 由于解析TOML的方式,tagpass并且tagdrop必须在插件定义的末尾定义参数,否则后续插件配置选项将被解释为tagpass / tagdrop表的一部分。

 

 


配置详解

配置由以下几个部分组成

全局tag

 

 
[global_tags]
  # dc = "us-east-1" # will tag all metrics with dc=us-east-1
  # rack = "1a"
  ## Environment variables can be used as tags, and throughout the config file
  # user = "$USER"

 

代理

 

 
[agent]
  ## 数据收集周期
  interval = "10s"
  ## 如果 interval="10s"  :00, :10, :20 依次进行收集
  round_interval = true

  ## 输出大小
  metric_batch_size = 1000

  ## 缓存大小
  metric_buffer_limit = 10000

  ## 接收插件休眠周期
  collection_jitter = "0s"

  ## 数据flush周期
  flush_interval = "10s"
  ## 发送插件休眠周期
  flush_jitter = "0s"

  
  ## 支持的时间单位 "ns", "us" (or "µs"), "ms", "s".
  precision = ""


  ## 调试模式
  debug = false
  ## 静默模式
  quiet = false
  ## 日志路径
  logfile = ""

  ## 主机名,默认 os.Hostname()
  hostname = ""
  ## 如果设置为true,tag中将没有host信息
  omit_hostname = false

 

输出插件 (非常多)

以influxdb插件为例

 

 
[[outputs.influxdb]]
  # urls = ["unix:///var/run/influxdb.sock"]
  # urls = ["udp://127.0.0.1:8089"]
  # urls = ["http://127.0.0.1:8086"]

  ## 输出数据库
  # database = "telegraf"

  ## 输出时是否创建数据库,当telegraf没有权限创建数据库时设置为false
  # skip_database_creation = false

  ## 存储策略,默认default策略
  # retention_policy = ""

  ## Write consistency (clusters only), can be: "any", "one", "quorum", "all".
  ## Only takes effect when using HTTP.
  #
  # write_consistency = "any"

  ## http 超时设置
  # timeout = "5s"

  ## HTTP 基本认证
  # username = "telegraf"
  # password = "metricsmetricsmetricsmetrics"

  ## HTTP User-Agent
  # user_agent = "telegraf"

  ## UDP payload 大小限制
  # udp_payload = 512

  ## https证书
  # tls_ca = "/etc/telegraf/ca.pem"
  # tls_cert = "/etc/telegraf/cert.pem"
  # tls_key = "/etc/telegraf/key.pem"
  ## 是否跳过证书校验 
  # insecure_skip_verify = false

  ## http代理设置
  # http_proxy = "http://corporate.proxy:3128"

  ## 自定义HTTP头
  # http_headers = {"X-Special-Header" = "Special-Value"}


  # HTTP Content-Encoding 编码, gzip或者identity
  # content_encoding = "identity"

  ## 是否支持无符号整型,必须与influxdb版本兼容
  # influx_uint_support = false

 

处理插件

  1. 数值类型转换
  2. 枚举类型
  3. 字符串转换
  4. topN

聚合插件

  1. 直方图
  2. 最大最小值

输入插件 (非常多)

示例 输入对象为文件

 

 
# # Reload and gather from file[s] on telegraf's interval.
# [[inputs.file]]
#   ## Files to parse each interval.
#   ## These accept standard unix glob matching rules, but with the addition of
#   ## ** as a "super asterisk". ie:
#   ##   /var/log/**.log     -> recursively find all .log files in /var/log
#   ##   /var/log/*/*.log    -> find all .log files with a parent dir in /var/log
#   ##   /var/log/apache.log -> only read the apache log file
#   files = ["/var/log/apache/access.log"]
#
#   ## The dataformat to be read from files
#   ## Each data format has its own unique set of configuration options, read
#   ## more about them here:
#   ## https://github.com/influxdata/telegraf/blob/master/docs/DATA_FORMATS_INPUT.md
#   data_format = "influx"

 

服务器输入插件

示例 kafka

 

 
# # Read metrics from Kafka topic(s)
# [[inputs.kafka_consumer]]
#   ## kafka servers
#   brokers = ["localhost:9092"]
#   ## topic(s) to consume
#   topics = ["telegraf"]
#
#   ## Optional Client id
#   # client_id = "Telegraf"
#
#   ## Set the minimal supported Kafka version.  Setting this enables the use of new
#   ## Kafka features and APIs.  Of particular interest, lz4 compression
#   ## requires at least version 0.10.0.0.
#   ##   ex: version = "1.1.0"
#   # version = ""
#
#   ## Optional TLS Config
#   # tls_ca = "/etc/telegraf/ca.pem"
#   # tls_cert = "/etc/telegraf/cert.pem"
#   # tls_key = "/etc/telegraf/key.pem"
#   ## Use TLS but skip chain & host verification
#   # insecure_skip_verify = false
#
#   ## Optional SASL Config
#   # sasl_username = "kafka"
#   # sasl_password = "secret"
#
#   ## the name of the consumer group
#   consumer_group = "telegraf_metrics_consumers"
#   ## Offset (must be either "oldest" or "newest")
#   offset = "oldest"
#
#   ## Data format to consume.
#   ## Each data format has its own unique set of configuration options, read
#   ## more about them here:
#   ## https://github.com/influxdata/telegraf/blob/master/docs/DATA_FORMATS_INPUT.md
#   data_format = "influx"
#
#   ## Maximum length of a message to consume, in bytes (default 0/unlimited);
#   ## larger messages are dropped
#   max_message_len = 1000000

 

生成配置

telegraf config >telegraf_test.conf

 

StatsD为Telegraf的一个插件:

 

StatsD 基本介绍

StatsD 是一个使用 Node.js 开发的简单的网络守护进程,通过 UDP 或者 TCP 方式侦听各种统计信息,包括计数器和定时器,并发送聚合信息到后端服务,例如 Graphite、ElasticSearch、InfluxDB 等等。

StatsD 最初是由 Etsy 的 Erik Kastner 写的提供 Graphite/Carbon 指标的前端代理,初衷是为了汇总和分析应用指标。它基于两大功能:计数和计时。最开始使用 Node,后来也实现了其他语言。通过 Statsd ,能通过特定语言的客户端检测应用程序的指标。基于个性化需求,可以通过 Statsd 收集任何想要的数据。

StatsD系统包括三部分:客户端(client)服务器(server)和后端(backend)。客户端植入于应用代码中,将相应的metrics上报给StatsD server。statsd server聚合这些metrics之后,定时发送给backends。backends则负责存储这些时间序列数据,并通过适当的图表工具展示。

StatsD 采用协议

statsd采用简单的行协议:

<bucket>:<value>|<type>[|@sample_rate]

statsd协议说明:

      • bucket

        bucket是一个metric的标识,可以看成一个metric的变量。
      • value

        metric的值,通常是数字。

      • type

        metric的类型,通常有timer、counter、gauge和set四种。

      • sample_rate

        如果数据上报量过大,很容易溢满statsd。所以适当的降低采样,减少server负载。
        这个频率容易误解,需要解释一下。客户端减少数据上报的频率,然后在发送的数据中加入采样频率,如0.1。statsd server收到上报的数据之后,如cnt=10,得知此数据是采样的数据,然后flush的时候,按采样频率恢复数据来发送给backend,即flush的时候,数据为cnt=10/0.1=100,而不是容易误解的10*0.1=1。

 

Statsd 通过发送 UDP 数据包来调用每个 Statsd 服务器,下面我们来了解一下为什么选择 UDP 而不是 TCP。

StatsD 是通过 UDP 传输数据的,那么有人会问为什么选 UDP 而不选 TCP 呢? 首先,它速度很快。任何人都不想为了追踪应用的表现而减慢其速度。此外,UDP 包遵循「fire-and-forget」机制。所以要么 StatsD 接收了这个包,要么没有。应用不会在意 StatsD 是运行、宕机还是着火了,它单纯地相信一切运行正常。也就是说我们不用在意后台 StatsD 服务器是不是崩了,就算崩了也不会影响前台应用。(当然,我们可以通过图表追踪 UDP 包接收失败的情况。)

StatsD 具有以下优点:

  • 简单——非常容易获取的应用程序,StatsD 协议是基于文本的,可以直接写入和读取。
  • 低耦合性——基于后台程序运行的应用程序,采取 UDP 这种「fire-and-forget」的协议,收集指标和应用程序本身之间没有依赖。
  • 占用空间小——StatsD 客户端非常轻便的,不带任何状态,不需要的线程。
  • 普遍及支持多种语言——有基于 Ruby,Python, Java, erlang, Node, Scala, Go, haskell 等几乎所有语言的客户端。

 

StatsD开发库      

        c/c++: libstatsd(https://github.com/jmslocum/libstatsd)

        clpss:    statsd_module(http://kamailio.org/docs/modules/stable/modules/statsd.html)

        java:    java-statsd-client(https://github.com/tim-group/java-statsd-client)

        python: pystatsd(https://github.com/jsocol/pystatsd)


 

StatsD  GitHub 地址: https://github.com/statsd/statsd

 

 

 

 

 

 

 

 

 

 

 

 

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐