shirou/gopsutil

GitHub: shirou/gopsutil

gopsutil 是 psutil 的 Go 语言移植版,提供跨平台的系统与进程资源监控数据采集能力。

Stars: 11882 | Forks: 1676

# gopsutil: Go 语言的 psutil [![Test](https://static.pigsec.cn/wp-content/uploads/repos/cas/ce/ce733292a922c08274cf5a2096f8fa4cf01023bfa51a36ef6beecaaef371a9d9.svg)](https://github.com/shirou/gopsutil/actions/workflows/test.yml) [![Go Reference](https://pkg.go.dev/badge/github.com/shirou/gopsutil/v4.svg)](https://pkg.go.dev/github.com/shirou/gopsutil/v4) [![Calendar Versioning](https://img.shields.io/badge/calver-vMAJOR.YY.MM-22bfda.svg)](https://calver.org/) 这是 psutil (https://github.com/giampaolo/psutil) 的一个移植版本。挑战 在于将所有的 psutil 功能移植到某些架构上。 ## 迁移 ### v4 迁移 存在一些破坏性更新。请查阅 [v4 发布说明](https://github.com/shirou/gopsutil/releases/tag/v4.24.5)。 ## 标签语义 gopsutil 的标签策略与语义化版本控制几乎相同,但 会像 [Ubuntu 版本控制](https://calver.org/) 那样自动递增。 例如,v4.24.04 表示 - v4:主版本号 - 24:发布年份,2024 年 - 04:发布月份 gopsutil 致力于在主版本变更之前保持向后兼容性。 在每个月末进行标签标记,但如果只有少数几次提交,则 可能会跳过。 ## 支持的架构 - FreeBSD i386/amd64/arm - Linux i386/amd64/arm(raspberry pi) - Windows i386/amd64/arm/arm64 - Darwin amd64/arm64 - OpenBSD i386/amd64/armv7/arm64/riscv64 (感谢 @mpfz0r!) - Solaris amd64 (在 SmartOS/Illumos 上开发并测试,感谢 @jen20!) - DragonFly BSD 上的 CPU (#893, 感谢 @gballet!) - Linux RISC-V 上的 host (#896, 感谢 @tklauser!) 所有的工作都是通过将 C 结构体移植为 Go 结构体来实现的,没有使用 cgo。 ## 用法 ``` package main import ( "fmt" "github.com/shirou/gopsutil/v4/mem" ) func main() { v, _ := mem.VirtualMemory() // almost every return value is a struct fmt.Printf("Total: %v, Free:%v, UsedPercent:%f%%\n", v.Total, v.Free, v.UsedPercent) // convert to JSON. String() is also implemented fmt.Println(v) } ``` 输出如下。 ``` Total: 3179569152, Free:284233728, UsedPercent:84.508194% {"total":3179569152,"available":492572672,"used":2895335424,"usedPercent":84.50819439828305, (snip...)} ``` 你可以使用以下环境变量来为各种系统目录设置备用位置: - /proc: `HOST_PROC` - /sys: `HOST_SYS` - /etc: `HOST_ETC` - /var: `HOST_VAR` - /run: `HOST_RUN` - /dev: `HOST_DEV` - /: `HOST_ROOT` - /proc/N/mountinfo: `HOST_PROC_MOUNTINFO` ### 使用 `context` 添加设置(自 v3.23.6 起) 从 v3.23.6 开始,现在可以使用 `context` 来传递路径位置:导入 `"github.com/shirou/gopsutil/v3/common"`,并传递一个将 `common.EnvMap` 设置为 `common.EnvKey` 的 context,该位置将在每个函数中使用。 ``` ctx := context.WithValue(context.Background(), common.EnvKey, common.EnvMap{common.HostProcEnvKey: "/myproc"}, ) v, err := mem.VirtualMemoryWithContext(ctx) ``` 优先级首先赋予 `context` 中设置的值,其次是环境变量的值,最后是默认位置。 ### 缓存 从 v3.24.1 开始,现在可以对某些值进行缓存。这些值默认为 false,即不缓存。 请注意,启用缓存可能会导致不一致。例如,如果你在 Linux 上启用了 boottime 缓存,请注意,如果[在启动后 boottime 被 NTP 修改](https://github.com/shirou/gopsutil/issues/1070#issuecomment-842512782),则可能会返回意外的值。 - `host` - EnableBootTimeCache - `process` - EnableBootTimeCache ### `Ex` 结构体(自 v4.24.5 起) gopsutil 旨在跨多个平台运行。然而,不同平台上可用的信息存在差异,例如 Linux 上存在内存信息,而 Windows 上则没有。 从 v4.24.5 开始,为了访问这些特定于平台的信息,gopsutil 在包中提供了名为 `Ex` 的函数。目前,这些函数可在 mem 和 sensor 包中使用。 Ex 结构体是特定于每个平台的。例如,在 Linux 上有一个 `ExLinux` 结构体,可以使用 `mem.NewExLinux()` 函数获取。在 Windows 上,则是 `mem.ExWindows()`。这些 Ex 结构体提供了特定于平台的信息。 ``` ex := NewExWindows() v, err := ex.VirtualMemory() if err != nil { panic(err) } fmt.Println(v.VirtualAvail) fmt.Println(v.VirtualTotal) // Output: // 140731958648832 // 140737488224256 ``` gopsutil 旨在通过提供通用函数来最小化平台差异。然而,有很多获取每个平台独有信息的需求。Ex 结构体旨在满足这些需求。未来可能会添加额外的功能。使用这些结构体可以明确表明它们提供的信息是特定于每个平台的,这也是采用这种设计方式的原因。 ## 文档 参见 https://pkg.go.dev/github.com/shirou/gopsutil/v4 或 https://godocs.io/github.com/shirou/gopsutil/v4 ## 要求 - 需要 go1.18 或更高版本。 ## 更多信息 添加了一些 psutil 中不存在的方法,但 将提供有用的信息。 - host/HostInfo() (linux) - Hostname - Uptime - Procs - OS (例如: "linux") - Platform (例如: "ubuntu", "arch") - PlatformFamily (例如: "debian") - PlatformVersion (例如: "Ubuntu 13.10") - VirtualizationSystem (例如: "LXC") - VirtualizationRole (例如: "guest"/"host") - IOCounters - Label (仅限 linux) 注册的 [device mapper 名称](https://www.kernel.org/doc/Documentation/ABI/testing/sysfs-block-dm) - cpu/CPUInfo() (linux, freebsd) - CPU (例如: 0, 1, ...) - VendorID (例如: "GenuineIntel") - Family - Model - Stepping - PhysicalID - CoreID - Cores (例如: 2) - ModelName (例如: "Intel(R) Core(TM) i7-2640M CPU @ 2.80GHz") - Mhz - CacheSize - Flags (例如: "fpu vme de pse tsc msr pae mce cx8 ...") - Microcode - load/Avg() (linux, freebsd, solaris) - Load1 - Load5 - Load15 - docker/GetDockerIDList() (仅限 linux) - container id 列表 ([]string) - docker/CgroupCPU() (仅限 linux) - user - system - docker/CgroupMem() (仅限 linux) - 各种状态 - net_protocols (仅限 linux) - 网络协议的系统级统计信息 (如 IP, TCP, UDP 等) - 来源于 /proc/net/snmp - iptables nf_conntrack (仅限 linux) - netfilter conntrack 模块的系统级统计信息 - 来源于 /proc/sys/net/netfilter/nf_conntrack_count 部分代码移植自 Ohai。非常感谢。 ## 当前状态 - x: 正常工作 - b: 基本正常工作,但有些功能存在问题 |名称 |Linux |FreeBSD |OpenBSD |macOS |Windows |Solaris |Plan 9 |AIX | |----------------------|-------|---------|---------|--------|---------|---------|---------|---------| |cpu\_times |x |x |x |x |x | |b |x | |cpu\_count |x |x |x |x |x | |x |x | |cpu\_percent |x |x |x |x |x | | |x | |cpu\_times\_percent |x |x |x |x |x | | |x | |virtual\_memory |x |x |x |x |x |b |x |x | |swap\_memory |x |x |x |x | | |x |X | |disk\_partitions |x |x |x |x |x | | |x | |disk\_io\_counters |x |x |x |x |x | | | | |disk\_usage |x |x |x |x |x | | |x | |net\_io\_counters |x |x |x |b |x |x | | | |boot\_time |x |x |x |x |x | | |X | |users |x |x |x |x |x | | |x | |pids |x |x |x |x |x | | | | |pid\_exists |x |x |x |x |x | | | | |net\_connections |x |x |x |x | | | |x | |net\_protocols |x | | | | | | |x | |net\_if\_addrs | | | | | | | |x | |net\_if\_stats | | | | | | | |x | |netfilter\_conntrack |x | | | | | | | | |sensors_temperature |x | | |x |x |x | | | ### Process 类 |名称 |Linux |FreeBSD |OpenBSD |macOS |Windows | |--------------------|-------|---------|---------|-------|---------| |pid |x |x |x |x |x | |ppid |x |x |x |x |x | |name |x |x |x |x |x | |cmdline |x |x |x |x |x | |create\_time |x | | |x |x | |status |x |x |x |x | | |cwd |x |x |x |x |x | |exe |x |x |x | |x | |uids |x |x |x |x | | |gids |x |x |x |x | | |terminal |x |x |x | | | |io\_counters |x |x |x | |x | |nice |x |x |x |x |x | |num\_fds |x | | |x |x | |num\_ctx\_switches |x | | | | | |num\_threads |x |x |x |x |x | |cpu\_times |x | | | |x | |memory\_info |x |x |x |x |x | |memory\_maps |x | | | | | |open\_files |x | | | |x | |send\_signal |x |x |x |x | | |suspend |x |x |x |x |x | |resume |x |x |x |x |x | |terminate |x |x |x |x |x | |kill |x |x |x |x | | |username |x |x |x |x |x | |ionice | | | | | | |rlimit |x | | | | | |num\_handlers | | | | | | |threads |x | | | | | |cpu\_percent |x | |x |x |x | |cpu\_affinity | | | | | | |memory\_percent |x | | | |x | |parent |x | |x |x |x | |children |x |x |x |x |x | |connections |x | |x |x | | |is\_running | | | | | | |page\_faults |x | | | |x | ### gopsutil 原生指标 |项目 |Linux |FreeBSD |OpenBSD |macOS |Windows |Solaris |AIX | |------------------------|-------|---------|---------|--------|--------|---------|---------| |**HostInfo** | | | | | | | | |hostname |x |x |x |x x |x |X | |uptime |x |x |x |x | |x |x | |process |x |x |x | | |x | | |os |x |x |x |x |x |x |x | |platform |x |x |x |x | |x |x | |platformfamily |x |x |x |x | |x |x | |virtualization |x | | | | | | | |**CPU** | | | | | | | | |VendorID |x |x |x |x |x |x |x | |Family |x |x |x |x |x |x |x | |Model |x |x |x |x |x |x |x | |Stepping |x |x |x |x |x |x | | |PhysicalID |x | | | | |x | | |CoreID |x | | | | |x | | |Cores |x | | |x |x |x |x | |ModelName |x |x |x |x |x |x |x | |Microcode |x | | | | |x | | |**LoadAvg** | | | | | | | | |Load1 |x |x |x |x |x |x |x | |Load5 |x |x |x |x |x |x |x | |Load15 |x |x |x |x |x |x |x | |**Docker GetDockerID** | | | | | | | | |container id |x |no |no |no |no |no |no | |**Docker CgroupsCPU** | | | | | | | | |user |x |no |no |no |no |no |no | |system |x |no |no |no |no |no |no | |**Docker CgroupsMem** | | | | | | | | |various |x |no |no |no |no |no |no | - 未来工作 - process_iter - wait_procs - Process class - as_dict - wait - AIX processes ## 许可证 New BSD License (与 psutil 相同) ## 相关作品 我受到了以下优秀作品的影响: - psutil: https://github.com/giampaolo/psutil - dstat: https://github.com/dagwieers/dstat - gosigar: https://github.com/cloudfoundry/gosigar/ - goprocinfo: https://github.com/c9s/goprocinfo - go-ps: https://github.com/mitchellh/go-ps - ohai: https://github.com/opscode/ohai/ - bosun: https://github.com/bosun-monitor/bosun/tree/master/cmd/scollector/collectors - mackerel: https://github.com/mackerelio/mackerel-agent/tree/master/metrics
标签:EVTX分析, 日志审计