当前位置: 首页 > 科技观察

你还在自己写Go系统监控函数吗?

时间:2023-03-13 18:18:01 科技观察

如果有Go开发的需求:获取宿主机的硬盘、CPU、内存、进程等的使用率,你会怎么做?更简单的思路是通过os/exec执行ps、cd、top等一些命令,然后解析它们的执行结果。当然,基于Linux一切皆文件的思想,更直接的做法是读取相关文件的内容,比如/proc目录下的文件。上面的方法可以满足需求,但是我们不需要重新造轮子,因为已经有一个比较完善的三方库为我们完成了这些采集需求,它就是gopsutil。gopsutil简介psutil(processandsystemutilities,)是Python中获取进程和系统利用率(CPU、内存、磁盘、网络、传感器)信息的跨平台库,gopsutil是其Go语言版本。gopsutil使我们免受系统差异的影响,并具有良好的可移植性。SupportedlistFreeBSDi386/amd64/armLinuxi386/amd64/arm(raspberrypi)Windowsi386/amd64/arm/arm64Darwini386/amd64OpenBSDamd64Solarisamd64PartiallysupportedlistCPUonDragonFlyBSDhostonLinuxRISC-V结构移植到Go结构,并且其实现中没有cgo代码,更有利于交叉编译。使用gopsutil现有的v3和v2版本,没有向后兼容性保证,所以有两种方式使用import(//"github.com/shirou/gopsutil/v3/mem"//使用v3"github.com/shirou/gopsutil/mem")比如我们要查看系统内存使用信息,可以获取packagemainimport("fmt""github.com/shirou/gopsutil/v3/mem"//"github.com/shirou/gopsutil/mem"//使用v2)funcmain(){v,_:=mem.VirtualMemory()//几乎每个返回值都是一个结构fmt.Printf("Total:%v,Free:%v,UsedPercent:%f%%\n",v.Total,v.Free,v.UsedPercent)//转换为JSON。String()也实现了fmt.Println(v)}结果是Total:8589934592,Free:138248192,UsedPercent:76.416254%{"total":8589934592,"available":2025828352,"used":6564106240,"usedPercent":76.4162540435791,“免费”:138248192,“活动”:1949327♂0435791,“活动”:1949327♂0435791,“活动”:1949327♂0435791,“活动”:1949327?0,18878“,”有线“1:252924洗衣”:0,“缓冲区”:0,“缓存”:0,“writeBack”:0,“脏”:0,“writeBackTmp”:0,“共享”:0,“平板”:0,“可回收”:0,“sunreclaim”:0,“pageTables”:0,“swapCached”:0,“commitLimit”:0,“committedAS”:0,“highTotal”:0,“highFree”:0,“lowTotal”:0,“lowFree”:0,“swapTotal”:0,“swapFree”:0,“mapped”:0,“vmallocTotal”:0,"vmallocUsed":0,"vmallocChunk":0,"hugePagesTotal":0,"hugePagesFree":0,"hugePageSize":0}对gopsutil包友好的一点是,大多数集合函数返回一个结构object,它们都实现了fmt.Stringer接口,所以打印的时候会输出json格式。比如上面的例子,mem.VirtualMemory返回的是VirtualMemoryStat结构,在String()方法中调用了json.Marshal()函数。typeVirtualMemoryStatstruct{Totaluint64`json:"total"`可用uint64`json:"available"`Useduint64`json:"used"`UsedPercentfloat64`json:"usedPercent"`Freeuint64`json:"free"`Activeuint64`json:"active"`Inactiveuint64`json:"inactive"`Wireduint64`json:"wired"`func(mVirtualMemoryStat)String()string{s,_:=json.Marshal(m)returnstring(s)}gopsutil通过不同的获取单元分为不同的子包,使用过程中引入不同的子包即可调用相关方法。导入(“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")比如我们想要获取host信息,需要引入github.com/shirou/gopsutil/v3/host子包import("fmt""github.com/shirou/gopsutil/v3/host")funcmain(){hostInfo,_:=host.Info()fmt.Println(hostInfo)}输出{"hostname":"MacBook-Pro.local","uptime":1619284,"bootTime":1644332729,"procs":301,"os":"darwin","platform":"darwin","platformFamily":"独立工作站","platformVersion":"10.15.5","kernelVersion":"19.5.0","kernelArch":"x86_64","虚拟化系统”:“”,“虚拟化角色”:“”,“hostId”:“7a1a74f2-30fc-4cc1-b439-6b7aef22e45d"}总结gopsutil库对单元的覆盖非常全面,包括主机、磁盘、内存、CPU、网络、进程、docker等模块,可以帮助我们获取系统信息和gopsutil处理跨平台兼容问题,对外接口基本一致,使用起来也比较友好。在信息采集、系统监控、资源限制、进程管理等场景,这个库都会帮到你。