使用 Telegraf 时控制基数的三个方法

导航至

本文将展示我们如何通过对 Telegraf 配置进行一些调整来控制基数。如果您还不熟悉 Telegraf,TelegrafInfluxDB 的原生开源插件驱动的指标收集代理。

如您所知,基数是时序数据库中度量 (measurements)、标签 (tags)、集合 (sets)、字段 (fields) 和值 (values) 的组合,高基数可能是一个挑战。不过不用担心,这里有三种方法(基于我之前的 SRE 经验)来控制基数。

其中一种方法是根据我们的需求、我们需要的特定指标以及我们需要它们的时间长度来选择间隔收集。

让我们仔细看看这三个调整以及它们是如何提供帮助的。

数据收集间隔

当我们需要重新架构监控系统时,我们问自己:我们的 SLA 是什么?我们希望将数据存储多久?Telegraf 的默认间隔可以,但对我们来说是否太短了?我们需要来自 100 多台服务器每 10 秒发送一次的数据吗?我们不需要,根据我们的策略,每 60 秒接收一次数据就足够了。因此,这是我们首先调整的事情之一。

这是我们针对此调整的 Telegraf 配置。

[agent]
  interval = "60s"
  round_interval = true
  metric_batch_size = 1000
  metric_buffer_limit = 10000
  collection_jitter = "0s"
  flush_interval = "60s"
  flush_jitter = "0s"
  precision = ""

  debug = false
  quiet = false
  logfile = ""

  hostname = ""
  omit_hostname = false

调整间隔是控制基数的好方法,但不是唯一的方法。让我们看看团队(和我自己)最喜欢的方法,那就是……

过滤指标

过滤指标是控制基数的另一种好方法;有时,根据我们的需求和场景,我们不需要输入插件可以提供的所有指标。看看当我们运行 Mem Telegraf 输入插件时收集的所有这些字段。

active (integer, Darwin, FreeBSD, Linux, OpenBSD)
available (integer)
available_percent (float)
buffered (integer, FreeBSD, Linux)
cached (integer, FreeBSD, Linux, OpenBSD)
commit_limit (integer, Linux)
committed_as (integer, Linux)
dirty (integer, Linux)
free (integer, Darwin, FreeBSD, Linux, OpenBSD)
high_free (integer, Linux)
high_total (integer, Linux)
huge_pages_free (integer, Linux)
huge_page_size (integer, Linux)
huge_pages_total (integer, Linux)
inactive (integer, Darwin, FreeBSD, Linux, OpenBSD)
laundry (integer, FreeBSD)
low_free (integer, Linux)
low_total (integer, Linux)
mapped (integer, Linux)
page_tables (integer, Linux)
shared (integer, Linux)
slab (integer, Linux)
sreclaimable (integer, Linux)
sunreclaim (integer, Linux)
swap_cached (integer, Linux)
swap_free (integer, Linux)
swap_total (integer, Linux)
total (integer)
used (integer)
used_percent (float)
vmalloc_chunk (integer, Linux)
vmalloc_total (integer, Linux)
vmalloc_used (integer, Linux)
wired (integer, Darwin, FreeBSD, OpenBSD)
write_back (integer, Linux)
write_back_tmp (integer, Linux)

很多,对吧?问问自己:您需要所有这些值吗?我们不需要,因为对我们来说重要的数据是 used_percentavailable

对于其他输入插件,我们也问了自己同样的问题。因此,我们过滤并仅收集对我们重要的数据,并且我们积极监控。我们的配置如下所示

[[inputs.cpu]]
  percpu = true
  totalcpu = true
  collect_cpu_time = false
  report_active = false
  fieldpass = ["usage_guest", "usage_system", "usage_idle"]

[[inputs.disk]]
  ignore_fs = ["tmpfs", "devtmpfs", "devfs", "overlay", "aufs", "squashfs"]
  fieldpass = ["used, "free"]

[[inputs.diskio]]
  fieldpass = ["read_bytes", "write_bytes", "read_time", "read_write", "read", "writes"]

[[inputs.mem]]
  fieldpass = ["used_percent", "available"]

[[inputs.net]]
  fieldpass = ["bytes_sent", "bytes_recv", "err_in", "err_out", "drop_in", "drop_out"]

[[inputs.processes]]
  fieldpass = ["running", "zombie", "sleeping", "total"]

[[inputs.swap]]
  fieldpass = ["total", "used", "free"]

[[inputs.system]]
  fieldpass = ["load1", "load15", "load5", "uptime"]

此配置将收集的字段从 109 个减少到 30 个。数据收集量减少了 72% 以上。

我们应用并帮助控制基数的另一个策略是……

保留策略和降采样

在 InfluxDB 中自定义数据库保留策略是控制基数的好方法。再次问问自己,您是否需要三年的数据。您会查询三年前运行的服务器的磁盘使用情况吗?甚至是一年前?

在我们的案例中,我们根据 PCI 合规性和我们的内部策略设置了数据的生命周期。我们需要保留有关我们系统的信息一年。为了立即分析,我们需要保留最近 14 天的数据。因此,我们架构了我们的监控系统,在我们的主存储桶中存储了过去 14 天的数据,并且每隔相同的天数,我们将旧数据转储到另一个保留策略为一年的存储桶中。

总结...

如您所见,通过对 Telegraf 配置进行一些调整,例如间隔和我们收集的数据量,加上当时可用的保留和降采样数据,我们能够控制基数。您如何看待这些调整,您还有哪些其他技巧来控制基数?请在下面的评论中告诉我们。