尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

KubeEdge 的 Linux 指标读取底座:prometheus/procfs 库全解(/proc 与 /sys 访问、包组织与测试夹具机制)

KubeEdge 的 Linux 指标读取底座:prometheus/procfs 库全解(/proc 与 /sys 访问、包组织与测试夹具机制) KubeEdge 的 Linux 指标读取底座prometheus/procfs 库全解/proc 与 /sys 访问、包组织与测试夹具机制【免费下载链接】kubeedgeKubernetes Native Edge Computing Framework (project under CNCF)项目地址: https://gitcode.com/GitHub_Trending/ku/kubeedge本文围绕 KubeEdge 仓库中 vendor 的依赖文档 procfs README 展开procfs 是从 Linux 伪文件系统/proc和/sys中读取系统、内核与进程指标的 Go 库。读完本文你将理解该库的FS抽象与初始化方式、子包的划分原则、源码中挂载点校验的实现细节以及它作为 KubeEdge 间接依赖是如何被 kubelet 侧指标代码GetProcessStart实际消费的。procfs 是什么以及它在 KubeEdge 中的依赖地位procfs 官方定位为提供从伪文件系统 /proc 与 /sys 检索系统、内核和进程指标的函数库原文见 README。它没有任何可分发的二进制设计目标就是作为库被嵌入到别的 Go 应用中——这正是 KubeEdge 引入它的方式。在当前仓库中procfs 是一条典型的间接依赖链路go.mod 第 208 行声明github.com/prometheus/procfs v0.15.1 // indirect即 KubeEdge 自身代码没有直接 import 它而是经由 Kubernetes 上游组件间接引入external-dependency.md 第 79 行将其登记为外部依赖许可协议为 Apache License 2.0vendor 目录下的完整源码位于 vendor/github.com/prometheus/procfs版本信息记录在 vendor/modules.txt# github.com/prometheus/procfs v0.15.1。仓库内唯一的直接消费点GetProcessStart通过全仓库检索 import 语句KubeEdge vendor 树内直接引用prometheus/procfs的 Go 代码只有一处Kubernetes 的component-base/metrics组件 processstarttime_others.go。该文件//go:build !windows中的GetProcessStart函数func GetProcessStart() (float64, error) { pid : os.Getpid() p, err : procfs.NewProc(pid) if err ! nil { return 0, err } if stat, err : p.Stat(); err nil { return stat.StartTime() } return 0, err }这段代码完整体现了 procfs 的典型用法procfs.NewProc(pid)构造一个进程句柄p.Stat()解析/proc/pid/statstat.StartTime()返回进程启动时间自系统启动以来的秒数。component-base用它作为process_start_time_seconds指标的计算基础而 KubeEdge 的 cloudcore、edgecore 等基于 Kubernetes 组件框架的进程都会间接受到这条链路的影响——这就是// indirect背后的真实调用关系。核心用法FS 类型与两种初始化方式README 指出procfs 按数据来源组织包数据来自/proc、/sys还是两者兼有。每个包都包含一个FS类型代表/proc、/sys或两者的挂载路径。CPU 统计来自/proc/stat因此挂在根包procfs下先初始化 proc 文件系统挂载点再读取统计信息fs, err : procfs.NewFS(/proc) stats, err : fs.Stat()部分子包如blockdevice需要同时访问两个伪文件系统此时NewFS接收两个挂载点fs, err : blockdevice.NewFS(/proc, /sys) stats, err : fs.ProcDiskstats()这个挂载点即构造参数的设计是 procfs 最重要的可测性设计把真实的/proc路径替换成测试 fixture 目录解析逻辑就可以在任何机器上离线复现。源码层面印证了这一点见 vendor/github.com/prometheus/procfs/fs.go// FS represents the pseudo-filesystem sys, which provides an interface to // kernel data structures. type FS struct { proc fs.FS isReal bool } // DefaultMountPoint is the common mount point of the proc filesystem. const DefaultMountPoint fs.DefaultProcMountPoint func NewFS(mountPoint string) (FS, error) { fs, err : fs.NewFS(mountPoint) if err ! nil { return FS{}, err } isReal, err : isRealProc(mountPoint) ... return FS{fs, isReal}, nil }其中isRealProc会校验传入路径是否真的是 proc 挂载点如果不是真实 procfs例如指向 fixture 目录后续读取某些文件时会回退到模拟值或宽松解析避免测试数据与真实内核输出格式不一致时误报错误。这也解释了为什么 README 允许NewFS接受任意目录——库对非真实挂载点做了一等公民支持。进程级 APIdoc.go 中的官方示例包注释 vendor/github.com/prometheus/procfs/doc.go 给出了进程维度的最短示例p, err : procfs.Self() // 当前进程 stat, err : p.Stat() // 解析 /proc/self/stat 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())与前面GetProcessStart的实现呼应Self()/NewProc(pid)拿到进程对象后Stat()返回的结构体上挂着一系列以内存页数为单位的原始字段再由CPUTime()、VirtualMemory()、ResidentMemory()等便捷方法换算成秒和字节。包组织原则按数据源 信息类型划分README 的 Package Organization 一节明确了组织规则(1) 数据来自/proc还是/sys(2) 获取的是哪类信息。绝大多数进程信息stat、status、io、fd、ns 等收敛在根包procfs中块设备信息在blockdevice子包中。从 vendor 目录的文件清单可以直接对照验证这一划分例如根包下按主题命名的解析文件CPU/内核态stat.go/proc/stat、cpuinfo.go 及各架构拆分文件cpuinfo_armx.go、cpuinfo_riscvx.go等内存/交换meminfo.go、swaps.go、slab.go网络栈net_dev.go、net_tcp.go、net_udp.go、ipvs.go 等进程维度proc.go、proc_stat.go、proc_status.go、proc_io.go、proc_psi.go。对 KubeEdge 场景的含义是边缘侧若需要采集节点 CPU、内存、网络或进程级指标例如 edge-node-tasks、监控上报类功能procfs 提供了现成的、按文件一一对应的解析入口无需自行处理/proc文本格式的版本差异。构建、测试与 fixture 更新机制procfs 没有可分发的二进制README Building and Testing 一节的要点是多数 API 附带单元测试通过make test运行。其测试机制有两个值得学习的设计基于 ttar 的测试夹具测试夹具testdata/fixtures收录了大量真实的/proc与/sys样例文件打包为一个 ttar 归档测试时自动解包。更新夹具的标准流程是# 1. 清理并重新解包 fixturemake test 会自动解包 rm -rf testdata/fixtures make test # 2. 手工修改解包后的 fixtures 目录中的样例文件 # 3. 重新生成 fixtures.ttar make update_fixtures # 4. 用 git diff 核对变更 git diff testdata/fixtures.ttar对应仓库内的构建脚本见 Makefile 与 Makefile.commonKubeEdge 以 vendor 方式冻结该版本日常开发无需构建 procfs 本身。为什么这套机制对边缘项目重要边缘节点的内核版本、发行版多样/proc文件格式存在历史差异。把解析逻辑与挂载点参数解耦、用固定 fixture 回归测试保证了同一个解析器可以在不同内核输出的样例上做确定性的单元测试——这比只在某台开发机上跑集成测试可靠得多。使用注意事项README 开头有一段明确的警告该库处于持续演进中API 可能以不兼容方式变更work in progress。对 KubeEdge 的启示以 vendor 为准当前冻结版本为 v0.15.1见 go.mod 与 vendor/modules.txt排查行为差异时应以 vendor 目录内的源码为准而不是上游 master平台限制procfs 面向 Linux 伪文件系统Windows 平台相关能力在组件侧通过构建标签隔离如 processstarttime_others.go 的//go:build !windows错误处理NewFS在挂载点不可读或指向普通文件时会返回错误嵌入方应显式处理该分支而非静默使用零值FS。小结procfs 在 KubeEdge 仓库中扮演Linux 指标读取底座的角色它按数据源/proc//sys与信息类型组织解析 API以NewFS(mountPoint)为核心的设计让解析逻辑可以被 fixture 目录完整离线测试在本仓库中它经由 Kubernetes 上游组件component-base/metrics的GetProcessStart间接参与进程启动时间等指标的计算版本固定在 v0.15.1。若需要在边缘组件中采集 CPU、内存、网络或进程指标直接对照 vendor 目录下的同名解析文件选择 API是最低成本的接入路径。【免费下载链接】kubeedgeKubernetes Native Edge Computing Framework (project under CNCF)项目地址: https://gitcode.com/GitHub_Trending/ku/kubeedge创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表