这是我参与8月更文挑战的第21天,活动详情查看:8月更文挑战
简介
gopsutil是psutil的go语言版本实现,主要功能是获取系统上各项监控信息,包括不限于cpu,内存,磁盘,网络,进程,docker等等
gopsutil支持跨平台多架构,包括i386/amd64/arm架构,以及windows,linux等各种系统,其中对linux的支持项最多
gopsutil最新为v3版本,默认是v2版本
"github.com/shirou/gopsutil/v3/mem"
"github.com/shirou/gopsutil/mem" // to use v2
官网地址: github.com/shirou/gops…
应用场景
go语言本身高并发,无环境依赖部署,轻量级,内存占用低等特点,加上gopsutil可以做性能监控,系统监控或系统信息采集,信息上报等
子包
gopsutil将不同功能划分到不同的子包中,使用时直接引入子包,然后调用,子包分类如下:
- CPU 相关;
- disk 磁盘相关
- host 主机相关
- mem 内存相关
- net 网络相关
- process 进程相关
- docke docker相关
在实际生产过程中,大多数服务器都是linux的,所以这里不介绍windows相关的包
使用
一一展示各子包的使用例子,在输出过程中gopusutil包已经将数据格式转换了json,也实现String()方法,当你输出整个对象是json格式,当你输出单个值是String
采集cpu信息
info方法包含cpu整个信息,Percent方法显示cpu使用率,而load值需要引入load包
//打印cpu相关信息
info, _ := cpu.Info()
for _, ci := range info {
fmt.Println(ci)
}
//打印cpu使用率,每5秒一次,总共9次
for i := 1; i < 10; i++ {
time.Sleep(time.Millisecond * 5000)
percent, _ := cpu.Percent(time.Second, false)
fmt.Printf("%v, cpu percent: %v", i, percent)
}
//显示cpu load值
avg, _ := load.Avg()
fmt.Println(avg)
采集内存信息
VirtualMemory方法显示物理内存信息,SwapMemory方法显示交换内存信息
//显示物理内存信息
memory, _ := mem.VirtualMemory()
fmt.Printf("Total: %v, Free:%v,UsedPercent:%f%%\n",memory.Total, memory.Free, memory.UsedPercent)
//显示交换内存信息
swapMemory, _ := mem.SwapMemory()
fmt.Println(swapMemory)
采集主机信息
//显示机器启动时间戳
bootTime, _ := host.BootTime()
fmt.Println(bootTime)
//显示机器信息
info, _ := host.Info()
fmt.Println(info)
//显示终端用户
users, _ := host.Users()
for _,user := range users {
fmt.Println(user.User)
}
采信磁盘信息
Partitions方法显示所有分区信息,Usage方法显示分区使用量
//显示磁盘分区信息
partitions, _ := disk.Partitions(true)
for _,part := range partitions {
fmt.Printf("part:%v\n",part.String())
usage, _ := disk.Usage(part.Mountpoint)
fmt.Printf("disk info:used :%v free:%v\n",usage.UsedPercent,usage.Free)
}
//显示磁盘分区IO信息
counters, _ := disk.IOCounters()
for k,v := range counters {
fmt.Printf("%v,%v\n",k,v)
}
采集进程信息
//显示所有进程名称和PID
processes, _ := process.Processes()
for _,process := range processes {
fmt.Println(process.Pid)
fmt.Println(process.Name())
}
采集网络信息
为了避免和内部包net冲突,改成net2
//显示显络信息和IO
counters, _ := net2.IOCounters(true)
for k,v := range counters{
fmt.Printf("%v:%v send:%v recv:%v\n", k, v, v.BytesSent, v.BytesRecv)
}
采集docker信息
//显示dockerID列表
list, _ := docker.GetDockerIDList()
for _,v := range list{
fmt.Println(v)
}
总结
使用gopsutil工具包可以简单的就获取系统相关信息,对于信息采集,系统监控等场景非常方便就可以实现
对于复杂的进程管理,process子包功能调用也比较复杂,这里推荐另一个操作系统使用systemctl管理进程的包: github.com/coreos/go-s…