From f114424079b7e55ad5ad61af150a95acaf459cb4 Mon Sep 17 00:00:00 2001 From: zhangwenjian Date: Sun, 13 Feb 2022 00:23:20 +0800 Subject: [PATCH] =?UTF-8?q?fix=F0=9F=90=9B:=20fix=20monitor=20macos=20env?= =?UTF-8?q?=20error?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/other/apis/sys_server_monitor.go | 125 +++++++++++++++++++++------ go-admin-db.db | Bin 335872 -> 335872 bytes go.mod | 5 +- 3 files changed, 100 insertions(+), 30 deletions(-) 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 5152f46f01355ce66606ca35ebb7339afcce872c..ca8e07201def51a5fcf3b6866d6711da66da7a2c 100644 GIT binary patch delta 2143 zcmah~eQZ?47N41WX7Aq5+1-Aw6j`KDw6yFlR<>1Wp+y^7p{@1BK7wArT4E ztKuW_hpi=!F9u)h13#eJ!dfOi;$?;#mnS_HDo$!K6|KVI$I`6~b)9L(Eh4c$s`Fck1J%6x%z6+Kgq|1ZtT??f6HQ z8b1weNP2WTyTpEA-?1TMP^5O_K6YL1!f+%UluIieCVfStbd{yjEzgWIZ?|>}wKvW; z1q~!}Sc5{nIF4TGQOVfTvfRsvU1p=Qt3!;B{)1SMf)*jJx067MepJuVI<;)H$QUv% zNc#9AzD|R`VI1L37r9nk=pfIyz`lZx@$IjWqoTnN2Z-o9Oy(;fH#>rK5rQYuT>dr9 z+r*k0>LVU4PQM~<+|y6el9o$oN;9PCk%T(0DiUQ&k7=SclIB}>bf1?r|QNAK3>Vo{I*Cly)v=(;J!zu-<)n_L5~2k85BF}w~bibG-~j1OWDdPLr?Tlm6s z%H3YaHc`#Zc|3Fwu9NxQ&-!UuBE6o_XPId2xcvAcKj5dulj5vvsHM2UQDqIYv-#RL zVGb{yPM7j`&O^F5GM%m@Vt)*hF@Z;UM+~xfdxtD=Q$H;Eb<5{a;VP8<&p_)D+iDNn ztE>;KrRLM7ZR|FXzC-&#TjT!JU844=A=f@SMz_HQs8UWUS>$<=g!iH!(Rx|S4I=j} z9KwWd;$uA%X?AqOxDwuQ4)%f**kJN2=b)X?_2avWj>2uC_YF8s!6AP&#jbyWiWPE~ z$t9XIuGM!03i*}{nl7F^4m%)UYW1Tg#Om$O>`M8`dCU#QTSi3Rq8-%I-FK;d>SEVs z8lxrfHiVUD$R)BAJMxdSNvg~jOQK+7k^WEMs_N+TW#jY4zYHmb^7Dsa4LHklOqe|w4um3Gy;{5h@C>cK=nk%_i<^Pe}%h$aQTU3(uJ8pTdB+(Alm?OiX?8K2{ pU4XHg7~>hlJs05y8)}sIlmhY`QE@doBa3enK1%%{z8QgJ;};8mc((um delta 4615 zcmbVP3vd+W9sj;>zrDM?-M!7_E{`(?j$m@e%i}JWK&XF>vX4QW!bab`EFmnCp*LI^Je>ePM0s=+l(}~;+t;+K&;VLWyVX5FM6rlxPkfO@vPWrD*t`3H#=(}M6hN9mV zruyJ_Qf!3w0-CsQrOVQgbU}&r!^2V%HFB@48eS+%^tW^c{VADCe=_a}TOJ788>PMs zpN#~m-{{fJt%2}wNLOi=FG%F-4kYT#@O@zVo*4R&U4ZWgzWfFLbWcGX=6`|KDem2< z4Wcd|k@uk~%ITk@=X4kV=6=$-6TL&e--!&pPjN;vxD)B6H7#{D9raZYbylYWfVzo4 z5vRhm-u-+m8A-%xR1ZZF`xKlIf7jfFg$0#`_R4}erG@tD_RjXIHSP6n)ykqNcn_q4 zAdTehMRzKP-$I!T>bgVAII-?SBY`NcN;iU0yobcGM~6`qXHauRuTl~yBEXyfKKXgMIO~R7v|{zCsf=hhYQ6lr zT5WUMJWRNG!ciJ%T2-$#jFNvl{)ib{sZ1Q~htWnKccfe`!{Y2fcKh%( zsR9{694H1-o$0Ue5mOQ<7S{`h!D%#?zrx?gUE-D-{$gPD&AQKYi`heLDt?YR$;2Z< z)gnK#EmZ(Za?&l9Vp8pgQ^_kv)^w5_2yz&s(gaYGoNTca2H5s%m?aH7J2SvG zJA&*;?I%p^k5qPw(YO!fQFV_chMf8XOe8P=fTMYNVY&d;G*m>o+^CsT9*699y`JLR zMKO^hSMZ&rm}4JQZwv*jUtK}W$B>nm<1>SpBSBHYBFzfFBtuYzsr?0HKgaG4*nXF1 z7eVrx$o^W-r%=>xCxMr-gRl~NV=;Ub#Dmj-`IIS;I!u>L4~QR#bA+veiQfoL^8oGP zPIF5PhYb1p-|B6;$JuM_!}vIgMK2;9e3U9jd>A_*pelJZqcgt7#VUlj+uZI9m)Dn< zof}vsviUxNN+w%kg4w(4I@Z#jf^iwxL7GPJ%e-t|p$d(f(<<=Y6+A}^%V@s;RvVNZ zC>>{BvB14M4NB51cgngTh!`)zB#5b4`*;1$B6K$l* z5A9^pFiu%GuduYRvM|e)m6h(&Hmy4^-;OQJgyvXAU*$!FY~nms1;L1+kyq8 z=Q>Vqm{-55zN0>U`RdG?md4CS+?ln_P0Je_CUNKW`8=LU+(qzZ%R>>7BzJ|K4Q=il ze(8MPqG8W=CgB{UlIw^E`RklR$~!%SqJ}K_RbP#3_*= z&c5J3`^?^3K+q*yGZ}~+wm84NLcVO4lY%ZwN=S_#PX9mpXw-6++cmz8CSuD8@-zX|C+CQkTid9HH2I-f zO&m`$E@Pc;c+)fI4(=rdmvL-)W_x`{`Hw3jN)oi4ospO8^SQ_O&4he8S+>)O>~xZ4 zewaj_mDt3Z^Uo?nTelDIe){}A`COkI%5-f_OGoX)HN}M!I`w8}c|DUjjpQre{1G38 z9N!AIYCS;Q!#GK65QR3#Pm#J)HmDqR%}fs@;8!2x`GOoL$7vej{iG#_@@54V$(B#> zqfGHJUJOfH!jV(-A)m~%`4 zlHf}8mTXZy)4^{G4t_cnwU$f~^w$`(%5#RjHx31OaS3DBhg~+&J$QFcSak3dHjufe zaEZ2V#>vOaBHak|-U;n`DjyJ)#+W8Q{St4ddzf8Hn}+=TE9@k7U*R@Ew#eXCh|W}TsuYt64WbAo$-vPkh}I48J{5i9 zG?y#1xU-p9;7E>f+9Zpc%6dbx|K0#QHCZt%%ls0QkcV4fF_PoSz&dE9HbG!zkdgKD zf$PRP=+$)Y4C~02^bi)!eh3RV^WNUG&;LH4w|PCx8jH)C7S{7b#xT4dE*XPMcn&Ng zYujL%P3Giks+OE8PM1V2bWV~uZq@>_wGG~@sU?j<6XdF}aE|IDBy4Vn6`C+VD$J9v zb{IoVfwMc_JiqUCV()-c$boj~9BbAnFAJMhQyMmF>wsmNFc&tf;5D#HeWe2?c5T}%N@a3BFgB?R?C>+Oi;_njh1okTDX2}D0dSxEgqr`;aCT| z#~>n`-@}~}^B}OHdjPrzFJ(SKCy617y-SDmuo4`lFK#a&Y*UU$vF#Acyj(-%c4$E~ z$wC_}A8W3z1#VR1Ya;(_fh+8?AlHVYicET_k)Ca(X?3*1w6UlK($WfJR5zPigXM|H z<3%fL<+l%D9BpBvf#F31)_2lrR>bzQ(TZUZ-@wYzDAtA*=Sh50H$^mffwYX?S_?(L zXcK