Telegraf Lustre2 输入插件实战指南:采集 Lustre 并行文件系统的 OST/MDS 运行指标
【免费下载链接】telegrafAgent for collecting, processing, aggregating, and writing metrics, logs, and other arbitrary data.项目地址: https://gitcode.com/GitHub_Trending/te/telegraf
Lustre 是面向 HPC(高性能计算)环境的开源并行文件系统,其运行状态与性能统计信息以文本形式记录在proc/sys文件系统中。Telegraf 的lustre2输入插件(插件源码)专门在 OST、MDS 等 Lustre 服务节点上读取这些统计文件,将其转换为标准 Telegraf 指标。读完本文,你将掌握lustre2插件的完整配置方法、全部指标字段的语义与来源文件,以及基于源码理解其底层解析逻辑,从而在 HPC 集群监控中直接落地使用。
插件概览与适用场景
lustre2插件通过读取 Lustre 暴露在proc/sys伪文件系统中的统计条目来采集指标,报告的字段与官方 Lustre Monitoring and Statistics Guide 对应。它并不报告 Lustre 提供的全部信息,而是聚焦于一组精选的、可运维的指标子集。
该插件具备以下特征(见 README.md):
- 版本起点:自 Telegraf v0.1.5 起提供;
- 分类标签:属于
system类输入插件; - 平台支持:仅支持 Linux(💻 linux)。
从源码结构看(lustre2_notlinux.go),非 Linux 平台编译时插件依然会被注册,但Gather直接返回空,并在Init时输出"Current platform is not supported"警告;真正的采集逻辑全部位于带//go:build linux标签的 lustre2.go 中。
配置详解
lustre2插件在配置上非常灵活:Lustre 各版本的proc/sys文件布局会变化,插件特意允许用户通过三个数组参数自定义要扫描的路径(glob 模式),实现“面向未来”的兼容设计。
完整配置示例
以下为插件的默认配置(来源:sample.conf,同时被 README 通过@sample.conf指令内嵌):
# Read metrics from local Lustre service on OST, MDS # This plugin ONLY supports Linux [[inputs.lustre2]] ## An array of /proc globs to search for Lustre stats ## If not specified, the default will work on Lustre 2.12.x ## # mgs_procfiles = [ # "/sys/fs/lustre/mgs/*/eviction_count", # ] # ost_procfiles = [ # "/proc/fs/lustre/obdfilter/*/stats", # "/proc/fs/lustre/osd-ldiskfs/*/stats", # "/proc/fs/lustre/obdfilter/*/job_stats", # "/proc/fs/lustre/obdfilter/*/exports/*/stats", # "/proc/fs/lustre/osd-ldiskfs/*/brw_stats", # "/proc/fs/lustre/osd-zfs/*/brw_stats", # "/sys/fs/lustre/odbfilter/*/eviction_count", # ] # mds_procfiles = [ # "/proc/fs/lustre/mdt/*/md_stats", # "/proc/fs/lustre/mdt/*/job_stats", # "/proc/fs/lustre/mdt/*/exports/*/stats", # "/proc/fs/lustre/osd-ldiskfs/*/brw_stats", # "/proc/fs/lustre/osd-zfs/*/brw_stats", # "/sys/fs/lustre/mdt/*/eviction_count", # ]三个核心配置参数
| 参数 | 类型 | 默认值(Lustre 2.12.x) | 作用 |
|---|---|---|---|
mgs_procfiles | []string | /sys/fs/lustre/mgs/*/eviction_count | 管理服务(MGS)侧统计文件 glob,当前仅支持以eviction_count结尾的路径 |
ost_procfiles | []string | 见下方说明 | 对象存储目标(OST)侧统计文件 glob 数组 |
mds_procfiles | []string | 见下方说明 | 元数据目标(MDT)侧统计文件 glob 数组 |
OST 默认扫描文件(对应源码 lustre2.go#L64-L79):
/proc/fs/lustre/obdfilter/*/stats—— 读写字节数与调用次数;/proc/fs/lustre/osd-ldiskfs/*/stats—— 缓存命中/未命中计数器(ldiskfs 后端);/proc/fs/lustre/obdfilter/*/job_stats—— 按作业 ID 统计的 I/O;/proc/fs/lustre/osd-ldiskfs/*/brw_stats—— 批量读写分布(ldiskfs);/proc/fs/lustre/osd-zfs/*/brw_stats—— 批量读写分布(ZFS);/sys/fs/lustre/obdfilter/*/eviction_count—— 驱逐计数。
MDT 默认扫描文件(lustre2.go#L81-L90):
/proc/fs/lustre/mdt/*/md_stats—— 元数据操作统计;/proc/fs/lustre/mdt/*/job_stats—— 元数据目标作业统计;/sys/fs/lustre/mdt/*/eviction_count—— 驱逐计数。
从源码看,三个参数的默认值仅在各自数组长度为 0 时才会被填充(if len(l.MgsProcfiles) == 0等判断),因此你完全可以只覆盖其中一个数组、保留其他默认值,例如只自定义ost_procfiles以适配 Lustre 新版本布局。
文件类型与处理分派
在 Gather 方法 中,插件根据文件路径的后缀自动分派解析器,这一点对自定义配置非常关键:
| 路径后缀 | 分派解析函数 | 说明 |
|---|---|---|
brw_stats | getLustreProcBrwStats | 批量读写分布直方图 |
job_stats | getLustreProcStats(jobstats 字段表) | 按 jobid 聚合的统计 |
eviction_count | getLustreEvictionCount | 驱逐计数(MGS/MDT/OST 通用) |
其他(如stats、md_stats) | getLustreProcStats(普通字段表) | 常规计数器 |
值得注意的是,mgs_procfiles数组中的条目如果不以eviction_count结尾,插件会直接返回错误no handler found for mgs procfile pattern ...(lustre2.go#L92-L100)——即 MGS 目录下目前只支持驱逐计数这一种文件。
指标说明(Metrics)
lustre2插件输出的测量名统一为lustre2,通过不同的 tags 与 fields 区分数据来源。以下内容完整继承自 README.md 的 Metrics 章节,并结合源码补充了字段提取细节。
健康状态(health)
来源文件:/sys/fs/lustre/health_check(若不存在则回退到旧的/proc/fs/lustre/health_check,参见 getLustreHealth)。
- tags:无
- fields:
health:文件内容为healthy时值为1,否则为0(源码将字符串与"healthy"精确比较后转为 uint64)
OST 常规统计
来源文件:/proc/fs/lustre/obdfilter/*/stats与/proc/fs/lustre/osd-ldiskfs/*/stats。
- tags:
name:OST 目标名(取自路径倒数第二段,如OST0001)
- fields:
write_byteswrite_callsread_bytesread_callscache_hit(samples 值,为向后兼容保留)cache_hit_samplescache_hit_pagescache_miss(samples 值,为向后兼容保留)cache_miss_samplescache_miss_pagescache_access(samples 值,为向后兼容保留)cache_access_samplescache_access_pages
字段提取原理:以read_bytes 203238095 samples [bytes] 4096 1048576 78026117632000这类行为例,wantedOstFields(lustre2.go#L469-L526)通过mapping结构指定行首关键字与取第几列(field字段):read_bytes/write_bytes的调用次数取第 1 列、字节数取第 6 列;cache_*的 samples 默认取第 1 列、pages 取第 6 列。测试用例 TestCacheStatsReportSamplesAndPages 验证了这些字段会同时以“原始名(samples 值)+_samples+_pages”三种形态上报。
OST 客户端(exports)统计
来源文件:/proc/fs/lustre/obdfilter/*/exports/*/stats(按客户端 NID 细分)。
- tags:
name:OST 目标名client:客户端 NID
- fields:
write_byteswrite_callsread_bytesread_calls
路径解析细节:getLustreProcStats中,对包含/exports/的路径,目标名取倒数第 4 段、客户端 NID 取倒数第 2 段(lustre2.go#L220-L239)。例如测试目录中的/proc/fs/lustre/obdfilter/OST0001/exports/10.2.4.27@o2ib1/stats会生成name=OST0001, client=10.2.4.27@o2ib1的指标。
OST 作业统计(job_stats)
来源文件:/proc/fs/lustre/obdfilter/*/job_stats。
- tags:
name:OST 目标名jobid:作业 ID(Lustre jobid)
- fields:
jobstats_ost_getattrjobstats_ost_setattrjobstats_ost_syncjobstats_punchjobstats_destroyjobstats_createjobstats_ost_statfsjobstats_get_infojobstats_set_infojobstats_quotactljobstats_read_bytesjobstats_read_callsjobstats_read_max_sizejobstats_read_min_sizejobstats_write_bytesjobstats_write_callsjobstats_write_max_sizejobstats_write_min_size
解析要点:job_stats文件以- job_id: <jobid>分段,插件按"- "拆分段落、读取job_id行生成jobidtag(lustre2.go#L250-L259)。同时,wantedOstJobstatsFields同时支持旧格式(read/write行)与新格式(read_bytes/write_bytes行)两种 inProc 关键字,字段分别取第 3/7/9/11 列对应 calls、min、max、bytes。
MDT 元数据统计
来源文件:/proc/fs/lustre/mdt/*/md_stats。
- tags:
name:MDT 目标名
- fields:
openclosemknodlinkunlinkmkdirrmdirrenamegetattrsetattrgetxattrsetxattrstatfssyncsamedir_renamecrossdir_rename
MDT 客户端(exports)统计
来源文件:/proc/fs/lustre/mdt/*/exports/*/stats。
- tags:
name:MDT 目标名client:客户端 NID
- fields:与上节 MDT 常规统计完全相同(
open、close、mknod、link、unlink、mkdir、rmdir、rename、getattr、setattr、getxattr、setxattr、statfs、sync、samedir_rename、crossdir_rename)
MDT 作业统计(job_stats)
来源文件:/proc/fs/lustre/mdt/*/job_stats。
- tags:
name:MDT 目标名jobid:作业 ID
- fields:
jobstats_closejobstats_crossdir_renamejobstats_getattrjobstats_getxattrjobstats_linkjobstats_mkdirjobstats_mknodjobstats_openjobstats_renamejobstats_rmdirjobstats_samedir_renamejobstats_setattrjobstats_setxattrjobstats_statfsjobstats_syncjobstats_unlink
驱逐计数(eviction_count)
来源文件:/proc/fs/lustre/*/*/eviction_count(含/sys/fs/lustre/mgs|obdfilter|mdt/*/eviction_count)。
- tags:
name:MGT/MDT/OST 目标名
- fields:
evictions:驱逐次数
brw_stats 批量读写分布(源码级补充)
除 README 列出的指标外,插件还会解析brw_stats文件,按brw_section与bucket两个 tag 组织指标(wantedBrwstatsFields)。brw_stats文件包含“标题行 + 桶行”结构(参见测试数据 brw_stats):
- tags:
name:OST 目标名brw_section:分类标题(如pages per bulk r/w、discontiguous pages、disk I/Os in flight、I/O time (1/1000s)、disk I/O size),上报时转换为下划线命名bucket:桶值(如1、16、1K、1M)
- fields:
read_ios:读 I/O 次数(列 1)read_percent:读占比(列 2)write_ios:写 I/O 次数(列 5)write_percent:写占比(列 6)
解析器会跳过snapshot_time行与空行,并容忍无权限读取的文件(仅记录 Debug 日志后跳过,lustre2.go#L320-L327)。
运行示例与输出格式
在配置了lustre2插件的 Telegraf 实例上,采集到的数据形如(来源:README.md 的 Example Output 章节):
lustre2,host=oss2,jobid=42990218,name=wrk-OST0041 jobstats_ost_setattr=0i,jobstats_ost_sync=0i,jobstats_punch=0i,jobstats_read_bytes=4096i,jobstats_read_calls=1i,jobstats_read_max_size=4096i,jobstats_read_min_size=4096i,jobstats_write_bytes=310206488i,jobstats_write_calls=7423i,jobstats_write_max_size=53048i,jobstats_write_min_size=8820i 1556525847000000000 lustre2,host=mds1,jobid=42992017,name=wrk-MDT0000 jobstats_close=31798i,jobstats_crossdir_rename=0i,jobstats_getattr=34146i,jobstats_getxattr=15i,jobstats_link=0i,jobstats_mkdir=658i,jobstats_mknod=0i,jobstats_open=31797i,jobstats_rename=0i,jobstats_rmdir=0i,jobstats_samedir_rename=0i,jobstats_setattr=1788i,jobstats_setxattr=0i,jobstats_statfs=0i,jobstats_sync=0i,jobstats_unlink=0i 1556525828000000000可以看到,host为 Telegraf 自动添加的主机 tag,name与jobid则来自 Lustre 统计文件;所有字段均以整数类型(i后缀)上报,方便后续在 InfluxDB、Prometheus 等时序存储中直接聚合。
全局配置选项与插件通用能力
与其他 Telegraf 插件一样,lustre2支持在配置中使用 Telegraf 的通用配置机制,例如:
- 指标与字段的改名、过滤(
namepass、fieldpass、tagexclude等); - 自定义 tag 注入;
- 通过别名(alias)复用同一插件采集不同路径集合;
- 配置插件执行顺序。
详细说明参见 docs/CONFIGURATION.md。你可以在[[inputs.lustre2]]区块内按需叠加这些通用选项。
源码解析与测试验证
核心采集流程
lustre2的采集入口是Gather方法(lustre2.go#L49-L169),整体流程为:
- 调用
getLustreHealth()读取健康状态; - 按需填充 MGS/OST/MDS 三组默认 glob;
- 依次对三组 glob 展开(
filepath.Glob)并按后缀分派解析; - 所有解析结果统一汇总到
allFields(键为tags结构体:name、brwSection、bucket、job、client); - 最后将
allFields中的每个条目以lustre2为测量名、按 tag 映射关系(name、brw_section、bucket、jobid、client)调用acc.AddFields输出。
测试用例
插件自带完整的表驱动测试(lustre2_test.go),会遍历testcases目录下的每个子目录:
- v2.12:模拟 Lustre 2.12 的完整目录布局(含
proc与sys两套伪文件),验证默认配置下的采集结果; - v2.12_no_client_stats:验证没有 exports 客户端统计文件时的行为;
- custom_locations:验证自定义非默认路径(
/host_proc/...)的 glob 配置。
每个测试目录内的telegraf.conf定义了插件配置(如 v2.12 配置),测试通过设置内部字段rootdir将文件读取根目录重定向到测试目录,从而在不依赖真实 Lustre 集群的情况下完成端到端验证。此外还有针对缓存统计字段形态的独立单测 TestCacheStatsReportSamplesAndPages。
注册与打包
插件通过inputs.Add("lustre2", ...)注册到 Telegraf 插件注册表(lustre2.go#L795-L798),并作为内置输入插件随 Telegraf 二进制分发,无需额外安装。sample.conf通过//go:embed嵌入二进制,SampleConfig()返回的配置即上文的默认示例。
实战建议
- 平台前提:
lustre2仅支持 Linux,且必须运行在能够访问 Lustreproc/sys统计文件的节点上(通常是 OST/MDS 服务节点或已挂载 Lustre 的客户端); - 版本适配:默认 glob 面向 Lustre 2.12.x。若你的集群是其他版本,建议先在各节点执行
ls /proc/fs/lustre/obdfilter/*/确认文件布局,再通过ost_procfiles/mds_procfiles/mgs_procfiles定制; - 权限注意:
brw_stats等文件可能因权限不足无法读取,插件对此会以 Debug 日志记录并跳过,不会导致整个采集失败,可通过日志观察确认; - 组合使用:结合 Telegraf 通用过滤配置(见 docs/CONFIGURATION.md),可以按
name、client、jobid标签拆分出“按客户端”“按作业”等不同维度的监控视图。
相关资源
- 插件文档:plugins/inputs/lustre2/README.md
- 实现源码:plugins/inputs/lustre2/lustre2.go(Linux)、plugins/inputs/lustre2/lustre2_notlinux.go(非 Linux 占位)
- 默认配置:plugins/inputs/lustre2/sample.conf
- 测试用例:plugins/inputs/lustre2/lustre2_test.go 及 testcases 下的模拟数据目录
【免费下载链接】telegrafAgent for collecting, processing, aggregating, and writing metrics, logs, and other arbitrary data.项目地址: https://gitcode.com/GitHub_Trending/te/telegraf
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考