将StatsD指标发送到Telegraf & InfluxDB入门教程

导航至

本教程将向您介绍如何将StatsD指标发送到Telegraf。StatsD是一种简单的通过UDP发送应用程序指标的协议。这些指标可以发送到Telegraf实例,在那里它们被聚合,并定期刷新到InfluxDB或其他您已配置的输出端。在撰写本文时,我们支持37种不同的输出插件

为什么选择StatsD?

使用StatsD有很多好理由,并且有许多关于为什么它很棒的文章,例如这些这些。StatsD简单、占用空间小,拥有强大的客户端库生态系统。它不会使您的应用程序崩溃,并且已成为大规模指标收集的标准。

它的工作原理

Telegraf是一个用Go编写的代理,它通过UDP接受StatsD协议指标,然后定期将指标转发到InfluxDB。可以使用许多可用的客户端库中的任何一个从应用程序发送StatsD指标。以下是收集StatsD指标的标准配置

statsd telegraf influxdb

为什么使用UDP?

UDP通常被称为“发射后不管”协议。UDP是无连接协议,不等待响应。UDP数据包在不需要响应的情况下发送,不受网络延迟的影响,也不受可能导致连接中断的网络故障的影响。这意味着UDP是有损耗的,但对于指标数据通常是可以接受的。

设置

首先,您需要安装Telegraf。接下来,您需要使用statsd插件设置Telegraf。--sample-config选项告诉Telegraf输出一个配置文件。--input-filter--output-filter 告诉Telegraf要配置哪些插件(StatsD)和输出(InfluxDB)。(注意,如果您使用的是InfluxDB 2.0云或OSS beta,则应使用influxdb_v2;对于2.0之前的本地InfluxDB,则使用influxdb)

$ telegraf --sample-config --input-filter statsd --output-filter influxdb_v2 > telegraf.conf
$ telegraf --config telegraf.conf

配置文件(telegraf.conf)将假设您的InfluxDB实例正在localhost上运行,如果情况不是这样,则需要编辑。还有许多针对StatsD服务器的配置选项,但在此指南中我不会全部介绍,有关更多详细信息,请参阅文档

发送StatsD指标

默认情况下,Telegraf将开始监听端口8125的UDP数据包。可以使用echo和netcat将StatsD指标发送到它

$ echo "mycounter:10|c" | nc -C -w 1 -u localhost 8125

或者使用您最喜欢的客户端库

Influx StatsD

由于InfluxDB支持标签,我们的StatsD实现也是如此!向StatsD指标添加标签的方式与它们在行协议中显示的方式相似。

这意味着您可以像下面这样标记您的StatsD指标。这个特定的指标通过service和region标签增加了theuser_login计数器 1次。

user.logins,service=payroll,region=us-west:1|c

就这样!只需以键值格式的逗号分隔的标签列表添加即可。

对于使用StatsD客户端的用户,可以将此附加到桶中。我将使用Python客户端作为示例

>>> import statsd
>>> c = statsd.StatsClient('localhost', 8125)
>>> c.incr('user.logins,service=payroll,region=us-west')  # Increment counter

一旦刷新,该指标将在InfluxDB中以所有标记的形式可用。

> SELECT * FROM statsd_user_logins
name: statsd_user_logins
------------------------
time                    host    metric_type  region   service  value
2015-10-27T03:26:40Z    tyrion  counter      us-west  payroll  1
2015-10-27T03:26:50Z    tyrion  counter      us-west  payroll  1

指标

Telegraf支持所有标准的StatsD指标,以下将详细介绍。

计数器

logins.total:1|c
logins.total:15|c

这是一个简单的计数器,如上述示例中的logins_total指标 将被增加1和15。计数器可以是始终递增的,或者您可以选择使用delete_counters配置选项在刷新时清除它们。

采样

logins.total:1|c|@0.1告诉StatsD此计数器每1/10的时间被发送采样。在此示例中,logins_total指标将被增加10。

仪表

current.users:105|g 仪表值会随着每次发送的后续值而更改。最终达到 InfluxDB 的值将是最后记录的值。仪表将保持相同的值,直到发送新的值。您可以选择使用 delete_gauges 配置选项在每个刷新时清除它们。

添加符号可以改变仪表的值,而不是覆盖它

current.users:-10|g
current.users:+12|g

时间与直方图

response.time:301|ms
response.time:301|h

时间用于跟踪某物花费了多长时间。它是跟踪应用程序性能的非常有价值的工具。

当 Telegraf 接收时间度量时,它将它们聚合,并将以下统计信息写入 InfluxDB,有关这些统计信息的更多详细信息可以在 文档 中找到。

  • stat_name_lower
  • stat_name_upper
  • stat_name_mean
  • stat_name_stddev
  • stat_name_count
  • stat_name_percentile_90

采样

response.time:301|ms|@0.1

时间,就像计数器一样,也可以进行采样。这将让 Telegraf 知道这个时间只在每 10 次运行中记录一次。

注意

Telegraf 会按到达顺序聚合统计信息,并限制缓存的计时数量以保持其内存占用低。默认情况下,Telegraf 在计算百分位数时会为每个统计信息保留 1000 个计时。这可以通过百分位数限制配置选项进行调整。

集合

unique.users:100|s

集合可以用于计数唯一发生次数。在上面的例子中,unique.users 度量将增加 1,然后无论发送多少次值 100,都不会再增加。

模板

插件支持指定模板,以使用关键字将 statsd 存储桶转换为 InfluxDB 度量名称、标签和字段。这些可以用于指定要在度量名称中使用的存储桶的部分。模板中的其他单词用作标签名称。例如,以下模板

templates = ["cpu.* measurement.field.region"]

这意味着对于以 cpu. 开头的每个指标,您打算将存储桶名称拆分为三个部分,第一个属于度量名称,第二个属于字段,最后一个将拆分出来,并转换为名为“region”的标签。如果原始指标看起来像这样

cpu.load.us-west:100|g

在 InfluxDB 中创建的指标将看起来像这样

cpu,metric_type=gauge,region=us-west load=100

其中度量名称是 cpu_load,并且它有一个名为 region 的标签,其值为 us-west。

这为您提供了对将 StatsD 存储桶名称映射到 influxdb 中的指标和标签的详细控制。

此外,通过 在 GitHub 上打开问题 通知我们您想看到的内容。

下一步