diff --git a/app/other/apis/sys_server_monitor.go b/app/other/apis/sys_server_monitor.go index a8054052..a7a4172e 100644 --- a/app/other/apis/sys_server_monitor.go +++ b/app/other/apis/sys_server_monitor.go @@ -2,18 +2,21 @@ package apis import ( "fmt" - "github.com/shirou/gopsutil/host" + "github.com/shirou/gopsutil/v3/net" + "regexp" "runtime" "strconv" + "strings" "time" "github.com/gin-gonic/gin" "github.com/go-admin-team/go-admin-core/sdk/api" "github.com/go-admin-team/go-admin-core/sdk/pkg" _ "github.com/go-admin-team/go-admin-core/sdk/pkg/response" - "github.com/shirou/gopsutil/cpu" - "github.com/shirou/gopsutil/disk" - "github.com/shirou/gopsutil/mem" + "github.com/shirou/gopsutil/v3/cpu" + "github.com/shirou/gopsutil/v3/disk" + "github.com/shirou/gopsutil/v3/host" + "github.com/shirou/gopsutil/v3/mem" ) const ( @@ -23,11 +26,28 @@ const ( GB = 1024 * MB ) +var ( + Version string + expectDiskFsTypes = []string{ + "apfs", "ext4", "ext3", "ext2", "f2fs", "reiserfs", "jfs", "btrfs", + "fuseblk", "zfs", "simfs", "ntfs", "fat32", "exfat", "xfs", "fuse.rclone", + } + excludeNetInterfaces = []string{ + "lo", "tun", "docker", "veth", "br-", "vmbr", "vnet", "kube", + } + getMacDiskNo = regexp.MustCompile(`\/dev\/disk(\d)s.*`) +) + +var ( + netInSpeed, netOutSpeed, netInTransfer, netOutTransfer, lastUpdateNetStats uint64 + cachedBootTime time.Time +) + type ServerMonitor struct { api.Api } -//获取相差时间 +// GetHourDiffer 获取相差时间 func GetHourDiffer(startTime, endTime string) int64 { var hour int64 t1, err := time.ParseInLocation("2006-01-02 15:04:05", startTime, time.Local) @@ -64,33 +84,28 @@ func (e ServerMonitor) ServerInfo(c *gin.Context) { osDic["hostName"] = sysInfo.Hostname osDic["time"] = time.Now().Format("2006-01-02 15:04:05") - dis, _ := disk.Usage("/") - diskTotalGB := int(dis.Total) / GB - diskFreeGB := int(dis.Free) / GB - diskDic := make(map[string]interface{}, 0) - diskDic["total"] = diskTotalGB - diskDic["free"] = diskFreeGB - mem, _ := mem.VirtualMemory() - memUsedMB := int(mem.Used) / GB - memTotalMB := int(mem.Total) / GB - memFreeMB := int(mem.Free) / GB - memUsedPercent := int(mem.UsedPercent) memDic := make(map[string]interface{}, 0) - memDic["total"] = memTotalMB - memDic["used"] = memUsedMB - memDic["free"] = memFreeMB - memDic["usage"] = memUsedPercent + memDic["used"] = mem.Used / MB + memDic["total"] = mem.Total / MB + + fmt.Println("mem", int(mem.Total/mem.Used*100)) + memDic["percent"] = pkg.Round(mem.UsedPercent, 2) + + swapDic := make(map[string]interface{}, 0) + swapDic["used"] = mem.SwapTotal - mem.SwapFree + swapDic["total"] = mem.SwapTotal cpuDic := make(map[string]interface{}, 0) cpuDic["cpuInfo"], _ = cpu.Info() percent, _ := cpu.Percent(0, false) - cpuDic["Percent"] = pkg.Round(percent[0], 2) + cpuDic["percent"] = pkg.Round(percent[0], 2) cpuDic["cpuNum"], _ = cpu.Counts(false) //服务器磁盘信息 disklist := make([]disk.UsageStat, 0) //所有分区 + var diskTotal, diskUsed, diskUsedPercent float64 diskInfo, err := disk.Partitions(true) if err == nil { for _, p := range diskInfo { @@ -101,16 +116,72 @@ func (e ServerMonitor) ServerInfo(c *gin.Context) { diskDetail.Used = diskDetail.Used / 1024 / 1024 diskDetail.Free = diskDetail.Free / 1024 / 1024 disklist = append(disklist, *diskDetail) + } } } + d, _ := disk.Usage("/") + + diskTotal = float64(d.Total / GB) + diskUsed = float64(d.Used / GB) + diskUsedPercent, _ = strconv.ParseFloat(fmt.Sprintf("%.2f", d.UsedPercent), 64) + + diskDic := make(map[string]interface{}, 0) + diskDic["total"] = diskTotal + diskDic["used"] = diskUsed + diskDic["percent"] = diskUsedPercent + + bootTime, _ := host.BootTime() + cachedBootTime = time.Unix(int64(bootTime), 0) + + TrackNetworkSpeed() + netDic := make(map[string]interface{}, 0) + netDic["in"] = pkg.Round(float64(netInSpeed/KB), 2) + netDic["out"] = pkg.Round(float64(netOutSpeed/KB), 2) e.Custom(gin.H{ - "code": 200, - "os": osDic, - "mem": memDic, - "cpu": cpuDic, - "disk": diskDic, - "diskList": disklist, + "code": 200, + "os": osDic, + "mem": memDic, + "cpu": cpuDic, + "disk": diskDic, + "net": netDic, + "swap": swapDic, + "location": "Aliyun", + "bootTime": GetHourDiffer(cachedBootTime.Format("2006-01-02 15:04:05"), time.Now().Format("2006-01-02 15:04:05")), }) } + +func TrackNetworkSpeed() { + var innerNetInTransfer, innerNetOutTransfer uint64 + nc, err := net.IOCounters(true) + if err == nil { + for _, v := range nc { + if isListContainsStr(excludeNetInterfaces, v.Name) { + continue + } + innerNetInTransfer += v.BytesRecv + innerNetOutTransfer += v.BytesSent + } + now := uint64(time.Now().Unix()) + diff := now - lastUpdateNetStats + if diff > 0 { + netInSpeed = (innerNetInTransfer - netInTransfer) / diff + fmt.Println("netInSpeed", netInSpeed) + netOutSpeed = (innerNetOutTransfer - netOutTransfer) / diff + fmt.Println("netOutSpeed", netOutSpeed) + } + netInTransfer = innerNetInTransfer + netOutTransfer = innerNetOutTransfer + lastUpdateNetStats = now + } +} + +func isListContainsStr(list []string, str string) bool { + for i := 0; i < len(list); i++ { + if strings.Contains(str, list[i]) { + return true + } + } + return false +} diff --git a/go-admin-db.db b/go-admin-db.db index 5152f46f..ca8e0720 100644 Binary files a/go-admin-db.db and b/go-admin-db.db differ diff --git a/go.mod b/go.mod index c28d385e..a8a33c66 100644 --- a/go.mod +++ b/go.mod @@ -17,12 +17,11 @@ require ( github.com/opentracing/opentracing-go v1.1.0 github.com/prometheus/client_golang v1.11.0 github.com/robfig/cron/v3 v3.0.1 - github.com/shirou/gopsutil v3.21.5+incompatible + github.com/shirou/gopsutil/v3 v3.22.1 github.com/spf13/cast v1.3.1 github.com/spf13/cobra v1.0.0 github.com/swaggo/gin-swagger v1.2.0 github.com/swaggo/swag v1.6.7 - github.com/tklauser/go-sysconf v0.3.6 // indirect github.com/unrolled/secure v1.0.8 golang.org/x/crypto v0.0.0-20210220033148-5ea612d1eb83 golang.org/x/lint v0.0.0-20200302205851-738671d3881b // indirect @@ -31,4 +30,4 @@ require ( gorm.io/driver/sqlite v1.1.5-0.20201206014648-c84401fbe3ba gorm.io/driver/sqlserver v1.0.4 gorm.io/gorm v1.21.11 -) \ No newline at end of file +)