You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

138 lines
3.4 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

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)
}
}
}