生产环境通常需要掌握主机硬盘、CPU、内存、进程等资源使用情况,可以执行系统命令获得,通过os/exec执行命令,如:ps,cd,top,然后解析命令执行结果。对于linux操作系统,一切都是文件,更直接的方法是从相关文件读取,例如/proc目录中的内容。
上述方法能够满足需求,但需要重复创建工具,因为已经有第三方库完美地实现了这些功能,这就是本文要介绍的gopsutil库。
介绍gopsutil库
psutil (process and system utilities)是Python实现的跨平台库,用于获取进程和系统信息工具(CPU, memory, disk, network, sensors),gopsutil是Go语言实现版本。
gopsutil屏蔽了不同系统的差异,有良好的可移植性。支持下面操作系统:
- FreeBSD i386/amd64/arm
- Linux i386/amd64/arm(raspberry pi)
- Windows i386/amd64/arm/arm64
- Darwin i386/amd64
- OpenBSD amd64
- Solaris amd64
部分支持:
- CPU on DragonFly BSD
- host on Linux RISC-V
另外,通过移植C结构体至Go,gopsutil没有cgo代码,跨平台编译更容易。
使用示例
gopsutil有V3和V2版本,不保证向后兼容,所以有两种使用方式。
import (
// "github.com/shirou/gopsutil/v3/mem" // to use v3
"github.com/shirou/gopsutil/mem"
)
- 获取内容使用信息
package main
import (
"fmt"
"github.com/shirou/gopsutil/v3/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)
}
gopsutil包一个友好特性是大多数收集函数返回结构体对象,实现了fmt.Stringer接口,所以返回json格式。举例,上面示例返回VirtualMemoryStat 结构体,在String方法中调用了json.Marshal()函数。
type VirtualMemoryStat struct {
Total uint64 `json:"total"`
Available uint64 `json:"available"`
Used uint64 `json:"used"`
UsedPercent float64 `json:"usedPercent"`
Free uint64 `json:"free"`
Active uint64 `json:"active"`
Inactive uint64 `json:"inactive"`
Wired uint64 `json:"wired"`
func (m VirtualMemoryStat) String() string {
s, _ := json.Marshal(m)
return string(s)
}
Gopsutil根据不同的采集单元分为不同的子包,在使用中可以通过引入不同的子包调用相关的方法。
import (
"github.com/shirou/gopsutil/v3/mem"
"github.com/shirou/gopsutil/v3/cpu"
"github.com/shirou/gopsutil/v3/disk"
"github.com/shirou/gopsutil/v3/docker"
"github.com/shirou/gopsutil/v3/host"
"github.com/shirou/gopsutil/v3/internal"
"github.com/shirou/gopsutil/v3/load"
"github.com/shirou/gopsutil/v3/mem"
"github.com/shirou/gopsutil/v3/net"
"github.com/shirou/gopsutil/v3/process"
"github.com/shirou/gopsutil/v3/winservices"
)
举例,如果想获取主机信息,需要使用github.com/shirou/gopsutil/v3/host子包:
import (
"fmt"
"github.com/shirou/gopsutil/v3/host"
)
func main() {
hostInfo, _ := host.Info()
fmt.Println(hostInfo)
}
总结
gopsutil库的功能非常全面,包括主机、磁盘、内存、CPU、网络、进程、docker等模块,它可以很好地帮助我们获取系统信息。并且gopsutil处理跨平台兼容性问题,外部接口基本一致,对开发者友好。
参考文档:https://github.com/shirou/gopsutil