大部分使用了gopsutil这个lib。psutil是一个跨平台进程和系统监控的Python库,而gopsutil是其Go语言版本的实现。
网络
Mac地址
func GetMacAddrs() (macAddrs string) {
netInterfaces, err := net.Interfaces()
if err != nil {
fmt.Printf("fail to get net interfaces: %v", err)
return macAddrs
}
for _, netInterface := range netInterfaces {
macAddr := netInterface.HardwareAddr.String()
if len(macAddr) == 0 {
continue
}
macAddrs += macAddr + " "
}
return macAddrs
}
IP地址
func GetIPs() (ips string) {
interfaceAddr, err := net.InterfaceAddrs()
if err != nil {
fmt.Printf("fail to get net interface addrs: %v", err)
return ips
}
for _, address := range interfaceAddr {
ipNet, isValidIpNet := address.(*net.IPNet)
if isValidIpNet && !ipNet.IP.IsLoopback() {
if ipNet.IP.To4() != nil {
ips += ipNet.IP.String() + " "
}
}
}
return ips
}
当前网速计算
func getNetDetail()(netIOIn string,netIOOut string) {
oldIn, oldOut := getNetInfo()
time.Sleep(1 * time.Second)
curIn, curOut := getNetInfo()
netIOIn = fmt.Sprintf("%.2fkbps", float64(curIn-oldIn)/1024)
netIOOut = fmt.Sprintf("%.2fkbps", float64(curOut-oldOut)/1024)
return netIOIn,netIOOut
}
func getNetInfo() (netIn uint64, netOut uint64) {
info, _ := net.IOCounters(true)
for _, v := range info {
if !strings.HasPrefix(v.Name, "lo") {
netIn += v.BytesRecv
netOut += v.BytesSent
}
}
return netIn, netOut
}
负载相关
CPU
import "github.com/shirou/gopsutil/cpu";
import "github.com/shirou/gopsutil/load";
// cpu info
func getCpuInfo() {
cpuInfos, err := cpu.Info()
if err != nil {
fmt.Printf("get cpu info failed, err:%v", err)
}
for _, ci := range cpuInfos {
fmt.Println(ci)
}
// CPU使用率
for {
percent, _ := cpu.Percent(time.Second, false)
fmt.Printf("cpu percent:%v\n", percent)
}
//负载信息 分别存储1分钟系统负荷、5分钟系统负荷,15分钟系统负荷;
loadInfo, _ := load.Avg()
fmt.Printf("%v\n", loadInfo)
}
内存
import "github.com/shirou/gopsutil/mem";
// mem info
func getMemInfo() {
memInfo, _ := mem.VirtualMemory()
fmt.Printf("mem info:%v\n", memInfo)
}
硬盘占用
import "github.com/shirou/gopsutil/disk";
// disk info
func getDiskInfo() {
parts, err := disk.Partitions(true)
if err != nil {
fmt.Printf("get Partitions failed, err:%v\n", err)
return
}
for _, part := range parts {
fmt.Printf("part:%v\n", part.String())
diskInfo, _ := disk.Usage(part.Mountpoint)
fmt.Printf("disk info:used:%v free:%v\n", diskInfo.UsedPercent, diskInfo.Free)
}
ioStat, _ := disk.IOCounters()
for k, v := range ioStat {
fmt.Printf("%v:%v\n", k, v)
}
}
参考:https://www.cnblogs.com/nickchen121/p/11517451.html