|
|
package util
|
|
|
|
|
|
import (
|
|
|
"fmt"
|
|
|
"github.com/shirou/gopsutil/v3/cpu"
|
|
|
"github.com/shirou/gopsutil/v3/disk"
|
|
|
"github.com/shirou/gopsutil/v3/host"
|
|
|
"github.com/shirou/gopsutil/v3/load"
|
|
|
"github.com/shirou/gopsutil/v3/mem"
|
|
|
"net"
|
|
|
"strings"
|
|
|
"time"
|
|
|
)
|
|
|
|
|
|
var (
|
|
|
IsAlert = false
|
|
|
MSG = ""
|
|
|
)
|
|
|
|
|
|
// 获取网络信息
|
|
|
func GetNetInfo() string {
|
|
|
|
|
|
addrs, err := net.InterfaceAddrs()
|
|
|
if err != nil {
|
|
|
fmt.Println(err)
|
|
|
return ""
|
|
|
}
|
|
|
|
|
|
for _, address := range addrs {
|
|
|
// 检查ip地址判断是否回环地址
|
|
|
if ipnet, ok := address.(*net.IPNet); ok && !ipnet.IP.IsLoopback() {
|
|
|
|
|
|
if ipnet.IP.To4() != nil {
|
|
|
//fmt.Println(ipnet.Mask)
|
|
|
//fmt.Println(ipnet.IP)
|
|
|
return ipnet.IP.String()
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
return ""
|
|
|
}
|
|
|
|
|
|
// 获取主机信息
|
|
|
func GetHostInfo() {
|
|
|
hostInfo, err := host.Info()
|
|
|
if err != nil {
|
|
|
fmt.Println("get host info fail, error: ", err)
|
|
|
}
|
|
|
fmt.Printf("hostname is: %v, os platform: %v \n", hostInfo.Hostname, hostInfo.Platform)
|
|
|
MSG += fmt.Sprintf("hostname is: %v, os platform: %v \n", hostInfo.Hostname, hostInfo.Platform)
|
|
|
}
|
|
|
|
|
|
// 获取CPU信息
|
|
|
func GetCpuInfo() {
|
|
|
// cpuInfo,err := cpu.Info()
|
|
|
// if err != nil {
|
|
|
// fmt.Println("get cpu info fail, err: %v",err)
|
|
|
// }
|
|
|
// for _,ci := range cpuInfo {
|
|
|
// fmt.Printf("%v \n",ci)
|
|
|
// }
|
|
|
|
|
|
cpuPercent, _ := cpu.Percent(time.Second, true)
|
|
|
|
|
|
cpuNumber, _ := cpu.Counts(true)
|
|
|
|
|
|
if cpuPercent[0] >= 95 {
|
|
|
//IsAlert = true
|
|
|
//暂时不监控cpu情况
|
|
|
MSG += fmt.Sprintf("CPU核心数: %v \n", cpuNumber)
|
|
|
MSG += fmt.Sprintf("CPU使用率: %.3f%% \n", cpuPercent[0])
|
|
|
}
|
|
|
}
|
|
|
|
|
|
// 获取内存信息
|
|
|
func GetMemInfo() {
|
|
|
memInfo, err := mem.VirtualMemory()
|
|
|
if err != nil {
|
|
|
fmt.Println("get memory info fail. err: ", err)
|
|
|
}
|
|
|
// 获取总内存大小,单位GB
|
|
|
memTotal := memInfo.Total / 1024 / 1024 / 1024
|
|
|
// 获取已用内存大小,单位MB
|
|
|
memUsed := memInfo.Used / 1024 / 1024
|
|
|
// 可用内存大小
|
|
|
memAva := memInfo.Available / 1024 / 1024
|
|
|
// 内存可用率
|
|
|
memUsedPercent := memInfo.UsedPercent
|
|
|
|
|
|
if memUsedPercent >= 95 {
|
|
|
IsAlert = true
|
|
|
MSG += fmt.Sprintf("总内存: %v GB, 已用内存: %v MB, 可用内存: %v MB, 内存使用率: %.3f %% \n", memTotal, memUsed, memAva, memUsedPercent)
|
|
|
}
|
|
|
}
|
|
|
|
|
|
// 获取系统负载
|
|
|
func GetSysLoad() {
|
|
|
loadInfo, err := load.Avg()
|
|
|
if err != nil {
|
|
|
fmt.Println("get average load fail. err: ", err)
|
|
|
}
|
|
|
|
|
|
if loadInfo.Load15 >= 10 {
|
|
|
IsAlert = true
|
|
|
MSG += fmt.Sprintf("系统平均负载: %v \n", loadInfo)
|
|
|
}
|
|
|
}
|
|
|
|
|
|
// 获取硬盘存储信息
|
|
|
func GetDiskInfo() {
|
|
|
diskPart, err := disk.Partitions(false)
|
|
|
if err != nil {
|
|
|
fmt.Println(err)
|
|
|
}
|
|
|
for _, dp := range diskPart {
|
|
|
if find := strings.Contains(dp.String(), "/snap/core"); find {
|
|
|
//oracle arm cpu core 被误认为分区
|
|
|
return
|
|
|
}
|
|
|
if find := strings.Contains(dp.String(), "/snap/lxd"); find {
|
|
|
//oracle arm cpu loop 被误认为分区
|
|
|
return
|
|
|
}
|
|
|
fmt.Println(dp)
|
|
|
diskUsed, _ := disk.Usage(dp.Mountpoint)
|
|
|
fmt.Printf("分区总大小: %d MB \n", diskUsed.Total/1024/1024)
|
|
|
fmt.Printf("分区使用率: %.3f %% \n", diskUsed.UsedPercent)
|
|
|
fmt.Printf("分区inode使用率: %.3f %% \n", diskUsed.InodesUsedPercent)
|
|
|
if diskUsed.UsedPercent >= 80 || diskUsed.InodesUsedPercent >= 80 {
|
|
|
IsAlert = true
|
|
|
MSG += fmt.Sprintf("异常分区: %s \n", dp.Mountpoint)
|
|
|
MSG += fmt.Sprintf("分区总大小: %d GB \n", diskUsed.Total/1024/1024/1024)
|
|
|
MSG += fmt.Sprintf("分区使用率: %.3f %% \n", diskUsed.UsedPercent)
|
|
|
MSG += fmt.Sprintf("分区inode使用率: %.3f %% \n", diskUsed.InodesUsedPercent)
|
|
|
}
|
|
|
}
|
|
|
}
|