InfluxDB和/debug/vars端点

导航至

与许多具有HTTP服务器的Go程序一样,InfluxDB通过 /debug/vars 端点公开了一些诊断信息。因为这些信息是以JSON形式公开的,所以应该非常容易将InfluxDB的诊断信息暴露给其他自定义实用工具,您可能希望使用这些工具来监控您的InfluxDB实例。

Go通过expvar包使向程序添加 /debug/vars 变得非常简单。

expvar包提供了一个标准化的接口来公开公共变量,例如服务器中的操作计数器。它以JSON格式通过HTTP在/debug/vars端点公开这些变量。

expvar 在大多数情况下都表现得非常好。尽管 InfluxDB 开始直接使用 expvar ,但仍然存在一个缺失的功能,这迫使我们停止使用标准的 expvar 包:它不允许您删除已发布的变量。至少有一个 几个 问题报告了已删除实体的统计信息。当您试图调试一个活动问题时,低信噪比永远都是没有帮助的。

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

Kapacitor采取了一种略微不同的方法:通过分叉标准库的 expvar  来为 Map 类型添加一个 Delete 方法。

/debug/vars 和 TICK 栈

InfluxDB 的 expvar 格式

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

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

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

memstats 是一个与 Goruntime.MemStats 结构体 对应的 JSON 对象。

/debug/vars 输出的其余部分,键代表正在测量的对象的详细信息,值以 "InfluxDB expvar 格式" 存在。 "InfluxDB expvar 格式" 是一个具有以下结构的对象

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

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

Kapacitor 使用 "标准" expvar 格式与简单的顶层键值对以及 kapacitor 键下的 InfluxDB 格式化 expvars 的混合。

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?在这个论坛上分享您的解决方案community.influxdata.com