
Telegraf Fluentd 输入插件实战通过 monitor agent 采集 Fluentd 内部运行指标【免费下载链接】telegrafAgent for collecting, processing, aggregating, and writing metrics, logs, and other arbitrary data.项目地址: https://gitcode.com/GitHub_Trending/te/telegraf本篇文章围绕 Telegraf 仓库中的 Fluentd 输入插件plugins/inputs/fluentd展开讲解如何通过 Fluentd 的 monitor agent 插件暴露的 HTTP 接口将每个 Fluentd 插件的缓冲队列、重试次数、吞吐量等内部运行状态持续采集进 Telegraf 的指标管线。读完本文你将掌握该插件的配置方式、endpoint与exclude两个核心参数的用法、全部字段与标签的含义以及其底层 HTTP 请求、JSON 解析与按需输出字段的实现原理。插件定位与工作原理Fluentd 输入插件用于采集一个 fluentd 中对应的实际端点路径为/api/plugins.json。该插件覆盖的是插件列表类数据/api/config.json提供的配置信息不在采集范围内。简单来说数据链路是Fluentd (monitor_agent 开启 HTTP 服务) │ GET /api/plugins.json ▼ Telegraf [[inputs.fluentd]] (plugins/inputs/fluentd/fluentd.go) │ 解析 JSON → 构造 metric ▼ Telegraf 指标管线processor / aggregator / output从源码看插件在 fluentd.go 中定义了固定的测量名measurement fluentd并通过init()中的inputs.Add(fluentd, ...)注册为名为fluentd的输入插件同时在 plugins/inputs/all/fluentd.go 中参与统一注册因此只需在配置中声明[[inputs.fluentd]]即可启用。快速开始最小配置在 Telegraf 配置文件中加入以下片段与插件内置的 sample.conf 完全一致# Read metrics exposed by fluentd in_monitor plugin [[inputs.fluentd]] ## This plugin reads information exposed by fluentd (using /api/plugins.json endpoint). ## ## Endpoint: ## - only one URI is allowed ## - https is not supported endpoint http://localhost:24220/api/plugins.json ## Define which plugins have to be excluded (based on type field - e.g. monitor_agent) exclude [ monitor_agent, dummy, ]配置完成后Telegraf 会按默认采集间隔由全局[agent]配置决定轮询该端点为 Fluentd 中每个符合条件的插件生成一条fluentd测量记录。配置项详解endpointendpoint是插件唯一的数据源地址指定 monitor agent 暴露的 HTTP 接口。需要注意以下几点只允许配置一个 URI插件结构体fluentd.go中Endpoint string为单值字符串而非数组因此一次配置只能指向一个端点不支持 https源码使用普通的http.Client直接GET见 fluentd.go没有 TLS 相关配置字段因此端点必须是明文 HTTP默认端口 24220这是 Fluentd monitor_agent 的默认监听端口路径固定为/api/plugins.json。源码在Gather阶段首先会对endpoint做url.Parse校验若 URL 非法会直接返回invalid URL错误fluentd.go。excludeexclude是一个字符串数组用于按 Fluentd 插件的type字段即 Fluentd 插件类型如monitor_agent、dummy、s3、stdout排除不需要采集的插件。典型场景排除monitor_agent自身避免采集监控插件自己的状态排除dummy等测试/示例插件避免无意义的数据。该参数的实现逻辑位于 fluentd.go遍历每个解析出的插件若其PluginType与exclude列表中的任一值相等则该插件被跳过不生成指标。这是一个精确字符串匹配配置时需与 Fluentd 报告的类型名完全一致。全局配置选项与其他 Telegraf 插件一样该插件同样支持全局与插件级通用配置例如name_prefix、name_override、tags、fieldpass/fielddrop、tagpass/tagdrop、alias以及插件执行顺序等。详见 docs/CONFIGURATION.md。利用这些通用选项可以方便地对采集结果做二次加工例如统一追加机房标签、裁剪不需要的字段。Fluentd 侧配置开启 monitor_agent要使用本插件首先需要在 Fluentd 配置中启用monitor_agent输入插件。一个典型配置如下source type monitor_agent bind 0.0.0.0 port 24220 /source从 fluentd_test.go 中的测试 JSON 可以看到monitor_agent插件自身会以type: monitor_agent、plugin_category: input出现在/api/plugins.json的响应中这也是插件默认建议在exclude中排除它的原因。用id降低序列基数重要插件的 README 中有一条醒目的IMPORTANT提示该插件可能产生高基数high-cardinality序列因为plugin_id的值在每次 Fluentd 重启后都是随机生成的。如果你的 Fluentd 频繁重启序列数量会持续增长导致存储与查询压力增大。解决办法是为 Fluentd 的每个插件显式添加通用参数id让plugin_id变为稳定的标识。例如测试数据中的tdlog输出插件就带有id: output_td其plugin_id即为稳定的object:output_td_1见 fluentd_test.go。有关 Fluentd 通用插件参数的详细说明可参考 Fluentd 官方文档中的 config-file 部分common plugin parameter。指标与字段详解本插件产出的测量名为fluentd其字段对应/api/plugins.json响应中每个插件的运行状态。以下是 README 列出的全部字段类型均为 float字段名含义retry_count重试次数buffer_queue_length缓冲队列长度stage 之外排队等待 flush 的 chunk 数buffer_total_queued_size缓冲队列中等待写入的总字节数rollback_count回滚次数flush_time_countflush 耗时累计次数slow_flush_count慢 flush 次数emit_count发射emit次数emit_records发射的记录条数emit_size发射的数据量write_count写入次数buffer_stage_lengthstage 缓冲区的 chunk 数量buffer_queue_byte_size队列缓冲字节数buffer_stage_byte_sizestage 缓冲字节数buffer_available_buffer_space_ratios可用缓冲空间比例0–100字段随插件类型而变化README 明确指出字段会因插件类型不同而变化。不是每个 Fluentd 插件都会报告全部字段这一点可以从两个地方得到印证测试用例 fluentd_test.go 中的sampleJSON显示dummy、monitor_agent这类 input 插件只返回retry_count且为nullstdout、s3输出插件返回buffer_queue_length、retry_count、buffer_total_queued_size而tdlog输出插件才完整报告emit_count、emit_records、emit_size、write_count、flush_time_count、slow_flush_count、buffer_stage_length等全量字段源码中所有字段均被声明为指针类型*float64fluentd.goJSON 中缺失或为null的字段解析后即为nil。字段的按需输出源码实现在 fluentd.go 中插件对每一个字段逐一做nil判断只有非空字段才会被写入指标并且只有在至少存在一个非空字段时才会调用acc.AddFields(measurement, tmpFields, tmpTags)生成该条指标。这意味着某条指标的具体字段集合由 Fluentd 实际返回的 JSON 决定是动态的不会出现字段值为 0 或空占位的情况当exclude未命中且插件有数据时总会产生一条至少携带标签的fluentd指标。标签所有fluentd测量都带以下三个标签tags用于标识指标来自哪个 Fluentd 插件标签名含义示例plugin_id插件的唯一 IDobject:9f748cplugin_type插件类型s3、stdout、tdlog、dummyplugin_category插件类别input、output这三个标签与测试 JSON 中的plugin_id、type、plugin_category字段一一对应在源码中于 fluentd.go 构建。提示由于plugin_id在 Fluentd 重启后会随机变化除非显式配置id如果用它作为序列标识需要关注存储侧的基数增长。输出示例以下是 README 中给出的真实采集输出示例fluentd,hostT440s,plugin_idobject:9f748c,plugin_categoryinput,plugin_typedummy buffer_total_queued_size0,buffer_queue_length0,retry_count0 1492006105000000000 fluentd,plugin_categoryinput,plugin_typedummy,hostT440s,plugin_idobject:8da98c buffer_queue_length0,retry_count0,buffer_total_queued_size0 1492006105000000000 fluentd,plugin_idobject:820190,plugin_categoryinput,plugin_typemonitor_agent,hostT440s retry_count0,buffer_total_queued_size0,buffer_queue_length0 1492006105000000000 fluentd,plugin_idobject:c5e054,plugin_categoryoutput,plugin_typestdout,hostT440s buffer_queue_length0,retry_count0,buffer_total_queued_size0 1492006105000000000 fluentd,plugin_types3,hostT440s,plugin_idobject:bd7a90,plugin_categoryoutput buffer_queue_length0,retry_count0,buffer_total_queued_size0 1492006105000000000 fluentd,plugin_idoutput_td, plugin_categoryoutput,plugin_typetdlog, hostT440s buffer_available_buffer_space_ratios100,buffer_queue_byte_size0,buffer_queue_length0,buffer_stage_byte_size0,buffer_stage_length0,buffer_total_queued_size0,emit_count0,emit_records0,flush_time_count0,retry_count0,rollback_count0,slow_flush_count0,write_count0 1651474085000000000可以直观看到dummy、monitor_agent、stdout、s3等插件只报告retry_count、buffer_queue_length、buffer_total_queued_size三个基础字段配置了id的tdlog插件plugin_idoutput_td报告了全量 14 个字段其中buffer_available_buffer_space_ratios100表示缓冲空间充足。源码级实现剖析HTTP 采集与超时控制在 Gather 中插件首次调用时按需创建http.Client传输层设置ResponseHeaderTimeout: 3 * time.Second客户端整体超时Timeout: 4 * time.Second。随后执行client.Get(h.Endpoint)读取响应体并校验resp.StatusCode http.StatusOK非 200 响应会返回http status ok not met错误。若请求本身失败错误信息中会携带端点地址以便定位。JSON 解析响应体通过json.Unmarshal解析到endpointInfo结构fluentd.go其核心字段为{ plugins: [ { plugin_id: ..., type: ..., plugin_category: ..., retry_count: null, ... } ] }即顶层是plugins数组每个元素对应一个 Fluentd 插件实例。过滤、标签与指标构建Gather中对每个插件执行三步按类型过滤与exclude列表逐项比较PluginType命中则跳过构建标签将plugin_id、plugin_category、plugin_type写入tmpTags按需写入字段逐字段判空后填充tmpFields任一字段非空即AddFields提交指标。版本与平台README 标注该插件自Telegraf v1.4.0起可用归类为server类插件支持all所有平台未使用任何平台专属代码。测试与验证插件在 fluentd_test.go 中提供了两类测试Test_parse直接使用来自 Fluentd0.14.9的样例 JSON 验证解析函数Test_Gather通过httptest.NewUnstartedServer在localhost:8081起一个返回样例 JSON 的 mock HTTP 服务随后调用Gather并借助testutil.Accumulator断言测量名存在HasMeasurement(fluentd)每条指标的首个 tag 为plugin_id、plugin_type、plugin_category不同插件类型的字段按预期输出如tdlog全量字段、s3基础三字段。如果你需要本地验证可以先用go test ./plugins/inputs/fluentd/运行插件测试再将上面给出的[[inputs.fluentd]]配置加入 Telegraf 配置并配合一个输出插件如file运行telegraf --config ...即可看到实时指标。注意事项与限制高基数风险plugin_id在 Fluentd 重启后随机生成频繁重启会导致序列基数膨胀建议为每个 Fluentd 插件配置id仅支持 HTTPendpoint不支持 https也不支持配置多个端点仅覆盖/api/plugins.json/api/config.json提供的配置信息不在本插件采集范围内字段动态性指标字段随插件类型动态变化依赖监控端的查询面板需兼容字段缺失的情况默认排除建议monitor_agent与dummy插件产生的数据通常没有监控价值示例配置默认将其排除实际使用时可结合自身 Fluentd 配置增删exclude列表。【免费下载链接】telegrafAgent for collecting, processing, aggregating, and writing metrics, logs, and other arbitrary data.项目地址: https://gitcode.com/GitHub_Trending/te/telegraf创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考