深入解读 prometheus/procfs:在 Grafana Tempo 中读取 /proc 与 /sys 系统指标的标准库 📅 发布时间:2026/9/20 2:47:53 👁 浏览次数: 后端可观测性链路追踪【免费下载链接】tempoGrafana Tempo is a high volume, minimal dependency distributed tracing backend.项目地址https://gitcode.com/GitHub_Trending/tempo1/tempo点击查看免费下载本文以 Grafana Tempo 仓库中 vendored 的 prometheus/procfs 使用文档 为主体系统讲解这一 Go 库如何从 Linux 伪文件系统/proc与/sys中检索系统、内核与进程指标包括核心FS类型的使用范式、包组织结构、构建测试方法以及测试 fixture 的维护流程。读完本文你将掌握 procfs 的基本调用模型并理解它作为 Tempo 间接依赖v0.21.1在可观测性底座中扮演的角色。procfs 是什么从伪文件系统读取内核数据的 Go 工具库prometheus/procfs是 Prometheus 生态中用于检索 Linux 系统指标的 Go 库。正如其 README 所述它提供的函数从两个伪文件系统中收集数据/proc进程与系统运行信息进程状态、CPU 统计、内存、文件描述符等/sys内核导出的设备与子系统信息块设备、网络等。在 Grafana Tempo 中该库以间接依赖// indirect形式出现版本为v0.21.1记录于 go.mod 与 vendor/modules.txt。它实际由 Prometheus 客户端库client_golang的进程指标采集器所使用见 process_collector_procfsenabled.go 中的procfs.NewDefaultFS()调用用于为 Tempo 自身暴露进程级的 CPU、内存与文件描述符指标——这正是一个分布式追踪后端实现最小化依赖、高可用监控的基础设施层。需要特别注意的是procfs 是 Linux 特有的库它直接解析/proc与/sys下的内核接口文件因此只在 Linux 主机上提供完整功能。README 也给出明确警告该库仍处于演进中work in progressAPI 可能在无警告的情况下发生不兼容变更。快速上手初始化挂载点并读取统计信息procfs 的核心抽象是一个FS类型它代表/proc、/sys或两者的路径。绝大多数场景下你只需要初始化/proc挂载点然后直接调用读取函数。README 给出的最小示例如下fs, err : procfs.NewFS(/proc) stats, err : fs.Stat()NewFS(mountPoint string)返回一个绑定到指定挂载点的FS实例如果挂载点目录无法读取或不是目录会返回错误fs.Stat()解析/proc/stat返回内核与系统级统计。如果目标路径恰好是系统默认挂载点/proc还可以用更简洁的NewDefaultFS()。从 fs.go 的源码可以看到默认挂载点常量定义// DefaultMountPoint is the common mount point of the proc filesystem. DefaultMountPoint fs.DefaultProcMountPoint底层实现internal/fs/fs.go中统一定义了各伪文件系统的默认挂载路径除/proc外还包括/sys、/sys/kernel/config与/sys/fs/selinuxDefaultProcMountPoint /proc DefaultSysMountPoint /sys DefaultConfigfsMountPoint /sys/kernel/config DefaultSelinuxMountPoint /sys/fs/selinux初始化时NewFS会调用os.Stat校验挂载点存在且为目录随后通过Path(p ...string)方法拼接文件路径internal/fs/fs.go。此外NewFS还会调用isRealProc检查挂载点是否为真实的 proc 文件系统这一机制对在容器或测试环境中挂载模拟/proc的场景尤为重要。同时需要 /proc 与 /sys 的场景blockdevice 子包部分子系统同时依赖两个伪文件系统。README 以blockdevice为例——磁盘块设备信息需要同时从/proc/diskstats与/sys/block读取fs, err : blockdevice.NewFS(/proc, /sys) stats, err : fs.ProcDiskstats()这类子包不再用单个挂载点初始化而是同时传入/proc与/sys的路径封装了跨文件系统聚合的复杂度调用方无需关心数据究竟来自哪个伪文件系统。包组织结构按数据来源与信息类型划分README 明确了本项目的组织原则即同时依据两点划分包数据来源来自/proc还是/sys或两者信息类型进程信息、块设备信息、网络信息等。具体来说绝大多数进程信息由根级procfs包提供例如进程状态、命令行参数、环境变量、内存映射、文件描述符与各种限制块设备信息如磁盘统计由blockdevice子包提供仓库中还包含sys风格的只读封装见 vendor/github.com/prometheus/procfs 目录下的stat.go、meminfo.go、loadavg.go、net_dev.go、mdstat.go等数十个解析文件以及internal/fs与internal/util两个内部辅助包。这种划分让使用者可以按需引入只关心 CPU 统计就引入根包关心磁盘就引入blockdevice避免无谓的代码膨胀。核心 API 速览从 FS 到 Proc 的调用链除了 README 中的FS.Stat()示例包文档 doc.go 给出了面向单个进程的完整用法这是理解 API 层次的关键入口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())整个调用链可分为两个层次系统/内核层FS方法解析/proc/stat、/proc/meminfo、/proc/loadavg、/proc/net/*等全局文件。以 stat.go 中的Stat结构体为例它聚合了启动时间、CPU 总计与按核统计、中断、上下文切换、进程创建数、运行/阻塞进程数以及 softirq 统计等字段其解析函数parseCPUStat在读取原始数值后会除以userHZ完成从时钟 tick 到秒的换算stat.go调用方拿到的直接是物理时间单位。进程层Proc方法通过/proc/pid/目录下的文件按进程读取。常用方法包括Proc.CmdLine()解析命令行参数见 proc.go、Proc.Comm()进程名见 proc.go、Proc.Stat()进程 CPU 与内存统计见 proc_stat.go以及Proc.Limits()进程资源限制见 proc_limits.go。procfs.Self()则直接指向调用进程自身非常适合做自监控。构建与测试作为库被集成使用 make test 验证procfs 定位为被其他应用集成的库本身不产出可分发的二进制文件这一点与 Grafana Tempo 对它的使用方式完全一致——Tempo 只是通过 Go module 机制将其编译进自身可执行文件。仓库内大部分 API 都配有单元测试可通过仓库根目录的 Makefile 运行make test测试依赖一套随仓库分发的测试 fixture这些 fixture 收录了大量来自真实/proc与/sys的示例文件并以 ttar 归档形式打包在测试过程中自动解压。这样即使在没有 Linux 环境的开发机上测试也能基于固定的样本文件稳定运行。更新测试 Fixture完整工作流当 procfs 需要新增或修正某个解析逻辑时通常需要先扩充样本数据。README 给出了完整的 fixture 维护流程第 1 步解包现有 fixture。删除旧的testdata/fixtures目录再通过make test或make testdata/fixtures/.unpacked触发自动解包rm -rf testdata/fixtures make test第 2 步修改样本文件。在解包出的testdata/fixtures目录中增删或修改需要的/proc、/sys示例文件。第 3 步重新打包。运行make update_fixtures将修改后的目录重新压缩为新的fixtures.ttar归档。第 4 步校验差异。用git diff testdata/fixtures.ttar检查归档变更是否符合预期确认无误后再提交。这套流程保证了解析代码—测试样本—归档文件三者始终同步是维护内核接口解析库时值得借鉴的工程实践。在 Grafana Tempo 中的实际定位与注意事项结合本仓库的实际情况使用 procfs 时有几点值得注意它是间接依赖Tempo 并未直接调用 procfs而是经 client_golang 的 process collector 间接使用用于采集自身进程的 CPU、内存与文件描述符指标。因此在 go.mod 中它被标记为// indirect升级需跟随上游client_golang的版本约束。平台限制解析/proc、/sys的代码只能在 Linux 上编译运行跨平台构建时需依赖对应的构建约束与平台特化文件如 cpuinfo_x86.go、cpuinfo_others.go 的分支实现。API 稳定性README 明确声明该库 API 可能随时发生不兼容变更集成方应通过 vendor 锁定版本Tempo 的 vendor 目录正是这种做法的体现——即使上游 API 变化构建依然可复现。总而言之prometheus/procfs是一套结构清晰、测试完备的 Linux 系统指标读取库FS类型统一了/proc与/sys的访问入口根包与blockdevice等子包按信息类型分工ttar fixture 机制则保证了解析逻辑的可测试性。理解它的使用与组织方式既能帮助你读懂 Tempo 依赖树中的这一底层组件也能为自行实现系统级指标采集提供直接可复用的范式。赞分享后端可观测性链路追踪【免费下载链接】tempoGrafana Tempo is a high volume, minimal dependency distributed tracing backend.项目地址https://gitcode.com/GitHub_Trending/tempo1/tempo点击查看免费下载相关推荐Loki 仓库中的 prometheus/procfs从 /proc 与 /sys 读取系统指标的核心 Go 库解析Loki 仓库中的 prometheus/procfs从 /proc 与 /sys 读取系统指标的核心 Go 库解析 导读 procfs 是 Promethe可观测性日志分析后端微服务对象存储云原生Kubetap 的 mitmproxy 代理镜像剖析Dockerfile、入口脚本与 ConfigMap 注入全解读Kubetap 的 mitmproxy 代理镜像剖析Dockerfile、入口脚本与 ConfigMap 注入全解读 Kubetap 是一款 kubectl构建工具云原生后端深入解析 prometheus/procfs从 /proc 与 /sys 伪文件系统采集系统指标的 Go 标准库级利器深入解析 prometheus/procfs从 /proc 与 /sys 伪文件系统采集系统指标的 Go 标准库级利器 导读 prometheus/procf时序数据库数据库指标监控可观测性后端创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考