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,本地 InfluxDB 2.0 之前版本应使用 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 指标。此特定指标将 theuser_login counter 递增 1,并带有我们使用的服务和区域的标签。

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

就是这样!只需添加以逗号分隔的 key=value 格式的标签列表即可。

对于那些使用 StatsD 客户端的用户,可以将这个额外位添加到 bucket 中。我将使用 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 metric 将递增 1 和 15。计数器可以是始终递增的,或者您可以选择使用 delete_counters 配置选项在每次刷新时清除它们。

采样

logins.total:1|c|@0.1 告诉 StatsD 此计数器每 1/10 的时间发送一次采样。在本示例中,logins_total metric 将递增 10。

仪表

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

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

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 次计时。可以使用 percentile_limit 配置选项调整此设置。

集合

unique.users:100|s

集合可用于计算唯一事件的次数。在上面的示例中,unique.users 指标将递增 1,然后无论值 100 发送多少次,都不会再递增。

模板

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

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

这意味着对于每个以 cpu. 开头的指标,您打算将 bucket 名称拆分为三个段,第一个段属于测量名称,第二个段属于字段,最后一个段将被拆分出来,并转换为名为“region”的标签。如果原始指标如下所示

cpu.load.us-west:100|g

则在 InfluxDB 中创建的指标将如下所示

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

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

这使您可以详细控制 StatsD bucket 名称到 influxdb 中指标和标签的映射。

另外,请通过在 GitHub 上打开 issue 让我们知道您希望看到什么。

下一步