InfluxDB 和 /debug/vars 端点
作者:Mark Rushakoff / 产品, 用例, 开发者
2017年4月3日
导航至
像许多带有 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 上的这个帖子中分享您的解决方案。