尧图网络科技YAOTU DIGITAL 获取报价
获取报价
首页 / 资讯中心 / 文章详情

OpenShift 测试套件中的 prometheus/procfs:从 /proc 与 /sys 读取系统指标的 Go 库实战指南

发布时间:2026/9/29 2:47:21

资讯中心
01
ARTICLE

OpenShift 测试套件中的 prometheus/procfs:从 /proc 与 /sys 读取系统指标的 Go 库实战指南

OpenShift 测试套件中的 prometheus/procfs:从 /proc 与 /sys 读取系统指标的 Go 库实战指南
测试云原生质量保障【免费下载链接】originConformance test suite for OpenShift项目地址https://gitcode.com/gh_mirrors/or/origin点击查看免费下载导读本文以originOpenShift Conformance Test Suite仓库内 vendored 的 github.com/prometheus/procfs 文档为主线系统讲解如何用 Go 从 Linux 伪文件系统/proc与/sys中读取系统、内核与进程指标。读完本文你将掌握 procfs 的包组织方式、FS挂载点初始化、Stat()系统级统计与Proc进程级信息的调用方法并了解其单元测试夹具ttar fixtures的构建与更新流程为在 OpenShift 相关工具链中集成指标采集提供可复用的代码范式。库定位一个面向指标采集的伪文件系统读取库procfs是一个提供函数式 API 的 Go 库用于从 Linux 的伪文件系统/proc和/sys中检索系统system、内核kernel与进程process指标。在/proc与/sys下内核以文件形式暴露运行时状态CPU 时间片、内存用量、磁盘统计、网络连接、进程命令行等都以文本文件形式呈现procfs将这些文本解析为类型化的 Go 结构体是 Prometheus 生态中 node_exporter 等组件的核心依赖。在origin仓库中该库以间接依赖indirect的形式被 vendored版本为v0.19.2见 go.mod 第 346 行其下包完整保留在 vendor/github.com/prometheus/procfs 目录中。这意味着 OpenShift 测试工具链中涉及系统指标读取的代码可以直接引用该库的 API而不必自行解析/proc下的原始文本。注意上游 README 明确警告该库仍在积极演进中work in progress其 API 可能在没有向后兼容警告的情况下发生破坏性变更backwards-incompatible使用前需自行评估风险。本文所有 API 描述均以当前仓库所 vendored 的 v0.19.2 源码为准。核心用法从挂载点初始化到指标读取procfs的使用遵循一条固定链路初始化文件系统挂载点 → 调用读取函数 → 得到类型化结构体。所有数据读取都从/proc部分子包还需要/sys出发。系统级统计/proc/statCPU 统计来自/proc/stat由根包root package提供。典型用法如下与上游 README 中的示例一致fs, err : procfs.NewFS(/proc) stats, err : fs.Stat()NewFS(mountPoint string)返回一个FS类型它封装了/proc的挂载路径如果挂载点目录无法读取或并非目录将返回错误见 fs.go。fs.Stat()返回Stat结构体其中包含系统级统计信息见 stat.go字段含义BootTime自 Epoch 起的开机时间秒CPUTotal汇总的 CPU 统计CPUStatCPU按 CPU ID 索引的逐核统计map[int64]CPUStatIRQTotal/IRQ中断处理次数总数与各编号中断次数ContextSwitches上下文切换次数ProcessCreated已创建进程数ProcessesRunning/ProcessesBlocked当前运行/阻塞等待 IO的进程数SoftIRQTotal/SoftIRQsoftirq 调度总数与细分统计CPUStat覆盖User、Nice、System、Idle、Iowait、IRQ、SoftIRQ、Steal、Guest、GuestNice共 10 个时间分量且解析时统一除以userHZ换算为秒见 stat.go 的归一化逻辑调用方拿到的直接是秒级时间值无需再关心内核时钟频率。需要双文件系统的子包以blockdevice为例部分子包如blockdevice同时需要/proc和/sys两个文件系统的访问权fs, err : blockdevice.NewFS(/proc, /sys) stats, err : fs.ProcDiskstats()以磁盘块设备为例/proc/diskstats提供逐设备的读写统计而设备号的语义解析需要/sys下的块设备信息因此该子包的构造函数同时接收两个挂载点。类似的双挂载点模式也体现在 selinuxfs/sys/fs/selinux、configfs/sys/kernel/config等特殊文件系统的默认挂载点常量上见 internal/fs/fs.go。包组织原则按数据来源与信息类型分层上游 README 明确了整个项目的组织规则包按1数据来源是/proc还是/sys或两者与2所检索的信息类型两个维度划分根包procfs覆盖大多数进程信息例如 proc.go 中的Proc类型及其方法子包blockdevice提供磁盘等块设备信息需要同时访问/proc与/sys。从当前 vendor 目录的文件清单可以直观印证这一分层根包下并存着stat.go系统统计、meminfo.go内存、loadavg.go负载、cpuinfo.goCPU 信息、mdstat.go软件 RAID、mountstats.go挂载统计等面向不同信息类型的解析文件进程维度则对应proc_stat.go、proc_status.go、proc_io.go、proc_limits.go、proc_maps.go、proc_smaps.go、proc_environ.go、proc_cgroup.go、proc_psi.go等一批按/proc/pid/下文件名一一对应的模块网络维度另有net_dev.go、net_tcp.go、net_udp.go、net_unix.go、net_route.go、net_conntrackstat.go等。这种文件即模块的组织方式让调用方可以按需引入精确对应/proc中的真实文件。深入进程维度Proc类型与常用入口除系统级统计外procfs还提供面向单进程的 API。Proc结构体只保留进程 IDPID并持有FS引用见 proc.go其构造入口包括procfs.Self()读取当前进程自身内部通过解析/proc/self符号链接拿到自身 PID见 proc.go 与 proc.goprocfs.NewProc(pid)按 PID 定位任意进程内部同样走默认挂载点/procprocfs.AllProcs()返回当前/proc下全部可用进程的列表fs.Proc(pid)在已初始化的FS上按 PID 取进程fs.Self()同理。进程信息同样通过类型化方法暴露例如p, err : procfs.Self() if err ! nil { log.Fatalf(could not get process: %s, err) } stat, err : p.Stat() if err ! nil { log.Fatalf(could not get process stat: %s, err) } fmt.Printf(command: %s\n, stat.Comm) fmt.Printf(cpu time: %fs\n, stat.CPUTime()) fmt.Printf(vsize: %dB\n, stat.VirtualMemory()) fmt.Printf(rss: %dB\n, stat.ResidentMemory())该示例出自 doc.go 的包文档可直接运行验证。其中Comm为可执行文件名CPUTime()、VirtualMemory()、ResidentMemory()分别基于进程 CPU 时间、虚拟内存与常驻内存数据计算得到。关于挂载点的两个实用细节FS类型在根包中被定义为{ proc fs.FS; isReal bool }的包装结构见 fs.go构造时不仅校验挂载点目录可读还会通过isRealProc判断该挂载点是否为真实的/proc用于区分容器内非真实挂载场景。常量DefaultMountPoint /proc与SectorSize 512Linux 块 I/O 扇区字节大小由根包导出NewDefaultFS()可直接使用默认挂载点快速初始化。构建与测试无独立二进制靠单元测试与 ttar 夹具procfs定位为被其他应用内嵌的库library不产出可分发的独立二进制文件——这一点由根包Makefile中的空build目标体现见 Makefile。但绝大多数 API 都带有单元测试可通过make test运行。测试夹具ttar 归档与自动解包procfs的测试依赖一组来自真实/proc与/sys的示例文件作为 fixture它们被打包为一个 ttar 归档文件testdata/fixtures.ttar并在测试过程中自动解包make test其背后的机制是 Makefile 中的规则%/.unpacked: %.ttar通过仓库自带的./ttar工具把fixtures.ttar解压到testdata/fixtures/目录并生成.unpacked标记文件test目标依赖该标记文件确保测试前 fixture 已就绪见 Makefile 与 Makefile。更新测试夹具的官方流程当需要新增或修改测试数据例如内核新增了某个/proc字段时按以下四步操作# 1. 移除旧目录并解包得到最新的 fixture 目录 rm -rf testdata/fixtures make test # 2. 直接修改 testdata/fixtures/ 下的文件模拟期望的 /proc、/sys 内容 # 3. 重新打包为新的 fixtures.ttar make update_fixtures # 4. 用 git diff 校验变更是否符合预期 git diff testdata/fixtures.ttar其中make update_fixtures内部执行./ttar -c -f testdata/fixtures.ttar -C testdata/ fixtures/即把testdata/fixtures/目录重新归档见 Makefile。这一真实样本文件驱动测试的模式保证了解析逻辑始终以 Linux 内核真实输出为基准进行回归验证。在 OpenShift 测试套件中的落地意义origin仓库将prometheus/procfs v0.19.2作为间接依赖 vendored见 go.mod并在测试数据中保留了相关引用如 test/extended/util/compat_otp/testdata/bindata.go。对 OpenShift 测试工具链而言这意味着指标采集可复用现成解析器无论是集群节点监控、e2e 测试中的资源观察还是resourcewatch、monitor等模块需要读取进程/系统状态时都可以直接复用/proc文本解析能力避免重复造轮子解析行为有测试兜底ttar 夹具 make test的回归体系确保了各字段解析在跨内核版本演进时的稳定性API 有明确的演进风险提示上游API 可能破坏性变更的警告提醒集成方在升级该依赖时关注解析结构体的字段变化。综上procfs的核心价值在于以挂载点初始化 类型化读取的统一抽象屏蔽了 Linux/proc、/sys文本格式的解析细节其按文件分模块、真实样本做夹具的设计也使其成为系统指标采集类 Go 库中值得借鉴的工程范式。赞分享测试云原生质量保障【免费下载链接】originConformance test suite for OpenShift项目地址https://gitcode.com/gh_mirrors/or/origin点击查看免费下载相关推荐procfs 库完全指南从 /proc 与 /sys 伪文件系统读取系统指标Prometheus 生态 Go 实现procfs 库完全指南从 /proc 与 /sys 伪文件系统读取系统指标Prometheus 生态 Go 实现 导读 procfs 是 Prometh云原生集群管理虚拟化多集群深入解读 prometheus/procfs在 Grafana Tempo 中读取 /proc 与 /sys 系统指标的标准库深入解读 prometheus/procfs在 Grafana Tempo 中读取 /proc 与 /sys 系统指标的标准库 本文以 Grafana Tem后端可观测性链路追踪Loop 如何管理 macOS 窗口5 分钟从触发键到自定义主题的完整指南Loop 如何管理 macOS 窗口5 分钟从触发键到自定义主题的完整指南 Loop 是一款免费开源的 macOS 窗口管理工具。如果你也习惯靠鼠标拖拽窗口边桌面应用上一篇终极指南如何利用radare2的模式识别自动识别算法和库函数下一篇openSUSE 上编译 openagezypper 一键安装构建依赖全指南创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
02
RELATED NEWS

相关资讯

更多网站建设与数字化升级内容

03
WHY YAOTU

想打造同款高转化官网?

懂行业、懂生意,从建站到增长一站式陪跑

◈

场景化定制

不做模板站,围绕你的业务场景量身设计,小众不撞款。

◐

营销型架构

以转化目标组织内容与路径,让官网真正带来询盘。

▲

全周期服务

设计、开发、运营、运维一体,上线只是开始。

免费获取你的建站方案

留下需求,专属顾问 24 小时内为你输出方案建议。