InfluxDB 和 /debug/vars 端点

导航至

像许多带有 HTTP 服务器的 Go 程序一样,InfluxDB 通过 /debug/vars 端点公开一些诊断信息。因为我们在此处公开的信息只是 JSON,所以将 InfluxDB 的诊断信息公开给您可能想要使用的其他自定义实用程序来监控您的 InfluxDB 实例应该非常简单。

通过 the /debug/vars package expvar 包,Go 可以轻松地向您的程序添加 /debug/vars

Package expvar 为公共变量(例如服务器中的操作计数器)提供了标准化接口。它通过 HTTP 以 JSON 格式在 /debug/vars 中公开这些变量。

expvar 在大多数用例中都非常有效。尽管 InfluxDB 最初直接使用 expvar,但当时以及现在仍然缺少一个功能,导致我们停止使用标准的 expvar 包:它不允许您删除已发布的变量。至少有 a couple 个问题是关于已删除实体的统计信息被报告的问题。当您尝试调试活动问题时,低信噪比绝不是有帮助的。

InfluxDB PR 6964(首次出现在 1.0 版本中)中,我们放弃了直接使用 expvar,转而使用具有 expvar 兼容输出的自定义实现。

Kapacitor 采用了略有不同的方法:fork 标准库 expvar package expvar 包,以便在 Map 类型上添加 Delete 方法。

/debug/vars 和 TICK Stack

InfluxDB 的 expvar 格式

InfluxDB 的 /debug/vars 端点的输出是一个 JSON 对象,它大致对应于 _internal 数据库的内容。_internal 数据库默认情况下每 10 秒存储一次值,但 /debug/vars 端点(如 SHOW STATS 查询)为您提供这些统计信息的即时视图。

首先,有两个键值对与标准 expvar 输出匹配

cmdline 是一个字符串数组,表示用于调用进程的命令行参数。如果您在 Linux 上将 influxd 作为服务运行,则 cmdline 的值将类似于: ["/usr/bin/influxd","-config","/etc/influxdb/influxdb.conf"]

memstats 是一个 JSON 对象,对应于 Goruntime.MemStats struct 结构。

其余的 /debug/vars 输出的键表示被测量对象的详细信息,值采用“InfluxDB expvar 格式”。“InfluxDB expvar 格式”是一个具有以下结构的对象

  • name:一个描述正在测量内容的字符串,即相应的 InfluxDB 度量
  • tags:一个具有字符串键和值的对象,对应于用于字段的标签
  • values:一个键和值与度量的字段对应的对象

Kapacitor 的 /kapacitor/v1/debug/vars 端点

Kapacitor 混合使用了“标准” expvar 格式和简单的顶层键值对,以及 InfluxDB 格式的 expvars,用于 kapacitor 键下接收的写入。

Telegraf 的 InfluxDB 输入插件

Telegraf 的 Influxdb 输入插件支持 从远程 HTTP 端点摄取 InfluxDB 格式的 expvars。它还将 memstats 作为特殊情况处理。对于单个 InfluxDB 实例,这将仅导致与 _internal 数据库冗余的信息,但这是一种在中心位置监控多个 InfluxDB 实例的直接方法。

与 InfluxDB 和 Kapacitor 不同,Telegraf(目前)不公开 /debug/vars HTTP 端点。

在您自己的应用程序中发出 InfluxDB 格式的 expvars

我还没有看到任何允许您发出 InfluxDB 格式 expvars 的独立项目,但是如果您理解格式,自己编写代码并不需要太多。我们的第一个纯 expvar 实现的整个文件不到 50 行,而通过 HTTP 提供 expvars 的相应代码只有大约 11 行。

您是否用 Go 或任何其他语言实现了发出 InfluxDB 格式 expvars 的代码?在 this thread on community.influxdata.com 上的这个帖子中分享您的解决方案。