Go语言搬砖 系统监控库gopsutil

3,452 阅读3分钟

这是我参与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相关的包

image.png

使用

一一展示各子包的使用例子,在输出过程中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…