Hashicorp Consul Agent 输入插件深度指南:用 Telegraf 采集 Consul Agent 运行时指标
【免费下载链接】telegrafAgent for collecting, processing, aggregating, and writing metrics, logs, and other arbitrary data.项目地址: https://gitcode.com/GitHub_Trending/te/telegraf
本文是一篇围绕 Telegraf 官方inputs.consul_agent输入插件的完整技术指南。该插件从 HashiCorp Consul Agent 本地暴露的/v1/agent/metricsHTTP 接口读取指标,适用于在每一个部署了 Consul Agent 的节点上并行运行 Telegraf,实现边车式的本机指标采集。读完本文,你将掌握该插件的完整配置参数、指标语义(计数器/仪表/采样/点)、与源码实现对应的采集与转换流程,以及基于仓库测试用例的可验证输出形态。
插件概览与适用场景
consul_agent插件由 Telegraf v1.22.0 引入,官方标注的类型标签为server,支持平台为all(全平台)。根据仓库中的插件 README(plugins/inputs/consul_agent/README.md),该插件从 Consul Agent 采集指标,Telegraf 可以出现在每个节点上并连接本地的 Agent,已在 Consul v1.10 上完成测试。
典型部署形态是“节点级边车模式”:Telegraf 与 Consul Agent 同机部署,默认连接http://127.0.0.1:8500,避免了跨网络抓取 Consul 集群的额外开销,也让每个节点的 Consul 运行状态(RPC 请求量、HTTP API 延迟、成员数量等)都能被独立观测。
插件在插件注册表中的注册方式可见 plugins/inputs/all/consul_agent.go,它通过_ import方式引入github.com/influxdata/telegraf/plugins/inputs/consul_agent完成注册,这也是 Telegraf 全部输入插件统一采用的注册机制。
配置说明
完整的配置样板由仓库中的 plugins/inputs/consul_agent/sample.conf 提供,并通过//go:embed嵌入插件源码,作为SampleConfig()的返回值。配置如下:
# Read metrics from the Consul Agent API [[inputs.consul_agent]] ## URL for the Consul agent # url = "http://127.0.0.1:8500" ## Use auth token for authorization. ## If both are set, an error is thrown. ## If both are empty, no token will be used. # token_file = "/path/to/auth/token" ## OR # token = "a1234567-40c7-9048-7bae-378687048181" ## Set timeout (default 5 seconds) # timeout = "5s" ## Optional TLS Config # tls_ca = /path/to/cafile # tls_cert = /path/to/certfile # tls_key = /path/to/keyfileurl
Consul Agent 的 HTTP 地址。从源码 consul_agent.go 的Init()逻辑可以看出,当该字段为空时会自动回退为http://127.0.0.1:8500,因此不配置也能在标准部署下直接工作。若 Agent 启用了 HTTPS,则应在此处填入https://开头的地址并配合下方 TLS 配置。
token_file 与 token(互斥)
两者用于 Consul ACL 鉴权,请求时通过X-Consul-Token请求头发送(见 loadJSON 实现)。关键约束在源码中清晰体现:
- 若两者同时设置,
Init()直接返回config error: both token_file and token are set,插件启动失败; - 若
token_file设置了而token为空,插件会读取该文件内容并做strings.TrimSpace去除首尾空白后作为 token; - 若两者都为空,则不携带任何 token 访问。
token_file的读取失败(如文件不存在)会导致启动错误,错误信息为reading file failed。
timeout
请求超时时间,默认 5 秒(config.Duration(5 * time.Second),见 插件构造函数的默认值)。该值在Init()中被同时用于http.Transport的TLSHandshakeTimeout与ResponseHeaderTimeout,因此对 TLS 握手和响应头的等待都生效。
TLS 配置
插件内嵌了 Telegraf 统一的tls.ClientConfig(见 结构体定义),支持标准的tls_ca、tls_cert、tls_key三项。Init()中通过n.ClientConfig.TLSConfig()构建*tls.Config,再装配进http.Transport。更完整的 TLS 参数体系(如tls_server_name、tls_insecure_skip_verify等)可参考 Telegraf 的通用 TLS 配置文档(docs/TLS.md)。
除上述插件专属配置外,所有 Telegraf 插件还支持通用配置项(如name_override、tags、interval、precision等),可参考 docs/CONFIGURATION.md#plugins。
采集流程与指标分类
插件的核心采集逻辑非常精简:Gather()请求/v1/agent/metrics,将 JSON 响应解析后转换为 Telegraf 指标(见 Gather 实现)。
HTTP 调用链
loadJSON方法完整展示了请求构造细节:
- 构造
GET请求到{url}/v1/agent/metrics; - 设置请求头
X-Consul-Token(token 存在时)与Accept: application/json; - 通过配置好的
roundTripper(自定义的http.Transport)发起请求; - 非 200 状态码会被包装为
{url} returned HTTP status ...错误; - JSON 解码到
agentInfo结构体。
响应结构体
agentInfo及子结构定义在 consul_structs.go 中,对应 Consul Agent Metrics API 的四种指标集合:
| JSON 字段 | 结构体 | 指标类型 | 字段映射 |
|---|---|---|---|
Gauges | gaugeValue | gauge | value |
Counters | sampledValue | counter | count、sum、min、max、mean、rate、stddev |
Samples | sampledValue | counter | 同上 |
Points | pointValue | fields | value |
值得注意的是Points类型的指标在转换时被写入空的 tags 映射(见 buildConsulAgent 实现)。
指标转换规则
buildConsulAgent函数是转换核心(consul_agent.go):
- Gauge:
acc.AddGauge(name, {"value": Value}, labels, t),标签直接沿用 Consul 返回的Labels; - Counter/Sample:
acc.AddCounter(name, {count, sum, min, max, mean, rate, stddev}, labels, t),注意在语义上 Samples(采样分布)也被映射为 counter 类型,但保留了完整的分布字段; - Point:
acc.AddFields(name, {"value": Points}, 空标签, t)。
时间戳方面,响应中的Timestamp字段按固定格式2006-01-02 15:04:05 -0700 MST(源码中的timeLayout常量)解析,作为所有指标的采集时间,解析失败会返回error parsing time错误。
采集到的指标示例
仓库测试数据 testdata/response_key_metrics.json 展示了一次真实响应的形态。基于该数据与转换逻辑,输出到输出端的指标格式可还原为如下形态(供参考,实际值取决于 Consul 运行状态):
consul.rpc.request count=5,sum=5,min=1,max=1,mean=1,rate=0.5,stddev=0 1639218930000000000 consul.consul.members.clients,datacenter=dc1 value=0 1639218930000000000 consul.api.http,method=GET,path=v1_agent_self count=1,sum=4.148,min=4.148,max=4.148,mean=4.148,rate=0.414,stddev=0 1639218930000000000关于 Consul 侧各指标(如 RPC 请求计数、HTTP API 时延采样、成员数量 gauge 等)的详细语义,请参考 Consul Agent Metrics API 的官方文档(/v1/agent/metrics视图)。
源码验证与测试用例
仓库的测试实现为插件的正确性提供了直接佐证。consul_agent_test.go 中的TestConsulStats使用httptest.NewServer模拟 Consul Agent:
- 当请求 URI 为
/v1/agent/metrics时返回testdata/response_key_metrics.json的固定内容; - 然后调用插件的
Init()与Gather(); - 最后用
testutil.RequireMetricsEqual将实际输出与期望的telegraf.Metric集合逐字段比对。
期望指标中包含了consul.rpc.request(counter,含 count/sum/min/max/mean/rate/stddev 七个字段)、带datacenter=dc1标签的consul.consul.members.clients(gauge)、带method=GET,path=v1_agent_self标签的consul.api.http(采样),时间戳为time.Unix(1639218930, 0),与测试数据中的Timestamp字段一致。这套测试同时验证了标签透传、字段映射与时间戳解析三条链路。
常见问题排查
- 同时设置 token 与 token_file 导致启动失败:这是源码强制约束的互斥规则,请只保留一种鉴权方式;
- 访问失败返回 HTTP 非 200:检查
url是否指向正确的 Agent 端口(默认 8500)、Agent 是否已启动、ACL token 是否有效;错误信息会明确包含状态码; - HTTPS 握手超时:
timeout同时控制 TLS 握手与响应头超时,若 Agent 证书链复杂,可适当调大该值,或通过 TLS 配置项指定 CA 证书; - 时间戳解析报错:插件要求 Consul 返回的
Timestamp符合2006-01-02 15:04:05 -0700 MST格式,升级 Consul 或检查是否有代理层改写响应体时需留意。
小结
consul_agent是一个体量小巧但结构清晰的输入插件:一次 HTTP 请求、四种指标分类、统一的标签透传与时间戳处理。结合 源码实现、配置样板 与 端到端测试,你可以快速将它纳入节点级可观测性方案,与 Consul 自身的告警与治理能力形成互补。
【免费下载链接】telegrafAgent for collecting, processing, aggregating, and writing metrics, logs, and other arbitrary data.项目地址: https://gitcode.com/GitHub_Trending/te/telegraf
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考