我要提问
ARTICLE DETAIL

资讯详情

前沿编程新知与开发实战干货的深度解读。

Telegraf swap 输入插件:采集操作系统 Swap 交换内存指标的完整解析

Telegraf swap 输入插件:采集操作系统 Swap 交换内存指标的完整解析 Telegraf swap 输入插件采集操作系统 Swap 交换内存指标的完整解析【免费下载链接】telegrafAgent for collecting, processing, aggregating, and writing metrics, logs, and other arbitrary data.项目地址: https://gitcode.com/GitHub_Trending/te/telegraf本文基于 Telegraf 仓库中plugins/inputs/swap插件的官方文档与源码系统讲解 swap 交换内存指标插件的配置方式、指标字段含义、输出格式以及其底层如何通过 gopsutil 读取系统统计信息、gauge 与 counter 两类指标的分流上报机制。读完本文你将能够正确启用该插件、解读swap指标的各字段并理解从Gather到操作系统接口的完整调用链。插件定位与功能概述swap交换内存是操作系统在物理内存不足时将暂不活跃的内存页换出到磁盘swap 分区或 swap 文件的机制。Swap 的使用率、换入/换出流量是判断系统内存压力、排查 OOM 风险和容量规划的重要参考指标。Telegraf 的 swap 输入插件自 Telegraf v1.7.0 引入标签为 system支持所有平台负责定期采集操作系统的 swap 内存使用情况并将其作为一条名为swap的指标输出到下游如 InfluxDB。插件本体位于 plugins/inputs/swap/ 目录核心实现仅约 50 行 Go 代码依赖仓库内的公共 psutil 封装层。配置方式该插件没有任何专属配置项启用方式就是在 Telegraf 配置文件中添加一个空的插件表。仓库中的 sample.conf 与官方文档给出的示例一致# Read metrics about swap memory usage [[inputs.swap]] # no configuration将上述段落追加到telegraf.conf或由--config指定的配置文件中即可。采集间隔由全局配置agent.interval插件级interval控制即 Telegraf 按周期调用插件的Gather方法拉取一次数据。与 Telegraf 中几乎所有输入插件一样swap 插件还支持全局的插件级配置能力包括字段/标签的过滤与重写name_suffix、tagpass/tagdrop、fieldpass/fielddrop等、插件别名与执行顺序控制。这些能力的完整说明见 docs/CONFIGURATION.md 的 Plugins 章节官方 README 也通过!-- /docs/includes/plugin_config.md --标记引用了该文档片段。另外值得注意的是sample.conf 文件是通过//go:generate//go:embed机制直接嵌入到 Go 源码中的——swap.go 顶部声明了//go:generate ../../../tools/readme_config_includer/generator并用//go:embed sample.conf将配置文件嵌入为sampleConfig字符串变量供SampleConfig()方法返回。这保证了telegraf --usage等命令打印的示例配置与实际文件内容始终一致。指标字段详解插件每次采集输出一个名为swap的 measurement不带任何 tag。字段分为两组README 中的定义与源码实现完全对应Gauge瞬时值字段单位为字节字段类型含义totalint (bytes)swap 内存总量usedint (bytes)已使用的 swap 内存freeint (bytes)空闲的 swap 内存used_percentfloat (percent)swap 使用率百分比Counter累计值字段单位同样为字节字段类型含义inint (bytes)自上次启动以来换入的数据量由页号换算outint (bytes)自上次启动以来换出的数据量由页号换算在 swap.go 的 Gather 方法 中可以看到这一分组是显式实现的total、used、free、used_percent被放入fieldsG并通过acc.AddGauge(swap, fieldsG, nil)上报而in、out被放入fieldsC并通过acc.AddCounter(swap, fieldsC, nil)上报。这一区分是有意义的gauge 值表示某一时刻的状态可以直接用于used_percent阈值告警而in/out是单调递增的累计计数器在查询侧如 InfluxDB通常需要对其做速率计算例如derivative(swap_in)/1求每秒换入字节数才能得到“当前 swap 吞吐”。采集失败时的错误处理从源码看Gather的第一行就是调用ss.ps.SwapStat()一旦底层系统调用出错会以error getting swap memory info: %w包装错误并返回由 agent 框架统一记录并按重试策略处理。在系统完全没有配置 swap 分区/文件时多数平台的 gopsutil 会返回总量为 0 的统计结果而非错误此时total0i,free0i等指标照常输出这一点在解读监控数据时需要注意区分“无 swap”与“采集异常”。示例输出官方文档给出的真实输出样例如下swap total20855394304i,used_percent45.43883523785713,used9476448256i,free1715331072i 1511894782000000000解读这条行总 swap 约 19.4 GiB20855394304 字节已用约 8.8 GiB使用率约 45.4%。行尾的1511894782000000000是纳秒级 Unix 时间戳。in/out字段在部分平台的采样中会一并出现其值随每次采集单调不减。底层实现从 Gather 到 gopsutilswap 插件本身不直接访问操作系统接口而是依赖 Telegraf 的公共封装层 plugins/common/psutil/ps.go。该文件定义了PS接口其中包含// SwapStat returns the swap memory statistics. SwapStat() (*mem.SwapMemoryStat, error)接口的默认实现SystemPS将调用直接委托给第三方库github.com/shirou/gopsutil/v4/mem的mem.SwapMemory()// SwapStat returns the swap memory statistics. func (*SystemPS) SwapStat() (*mem.SwapMemoryStat, error) { return mem.SwapMemory() }见 ps.go 第 208-211 行。mem.SwapMemoryStat结构体的Total/Used/Free/UsedPercent/Sin/Sout字段与上文指标表逐一对应。gopsutil 在各平台通过读取/proc/meminfoLinux、sysctlBSD/macOS或系统 APIWindows获得这些数据因此插件天然具备跨平台能力这也正是 README 中标注 “ all” 的依据。这种“插件 → PS 接口 → gopsutil”的三层结构还有一个直接好处测试时可以注入 mock而不需要真实机器状态。swap_test.go 就采用了这一做法——它构造了psutiltest.MockPS对SwapStat桩定返回固定的SwapMemoryStat{Total: 8123, Used: 1232, Free: 6412, UsedPercent: 12.2, Sin: 7, Sout: 830}然后断言Gather产出的swap指标字段与期望值完全一致且无 tag。该测试用例验证了字段名、类型uint64/float64以及指标名是插件契约的可靠参照。插件注册链路Telegraf 采用“空导入注册”模式组织输入插件插件包在init()中调用inputs.Add(swap, ...)见 swap.go 第 46-51 行而 plugins/inputs/all/swap.go 中一行_ github.com/influxdata/telegraf/plugins/inputs/swap的空白导入负责把 swap 插件包拉进最终二进制使配置中的[[inputs.swap]]生效。如果你使用默认构建的 Telegrafswap 插件开箱即用只有在构建 custom builder 裁剪插件集时才需要留意是否包含它。小结启用方式极简在配置文件中添加[[inputs.swap]]空表即可无专属参数采集周期由 agent/插件 interval 决定输出一个swap指标包含 4 个 gauge 字段total、used、free、used_percent和 2 个 counter 字段in、out单位均为字节数据经由 plugins/common/psutil/ps.go 的PS.SwapStat()接口从 gopsutil 的mem.SwapMemory()获得跨所有平台可用gauge 与 counter 的区分上报AddGauge/AddCounter让下游可以分别按“状态量”和“速率量”消费used_percent适合直接告警in/out适合求导分析换页吞吐。典型的使用场景是将used_percent设置持续高水位告警以提前发现内存压力同时用in/out的速率曲线判断 swap 颠簸thrashing趋势为扩容内存或调优应用内存占用提供数据支撑。【免费下载链接】telegrafAgent for collecting, processing, aggregating, and writing metrics, logs, and other arbitrary data.项目地址: https://gitcode.com/GitHub_Trending/te/telegraf创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表