@@ -2,18 +2,21 @@ package apis
22
33import (
44 "fmt"
5- "github.com/shirou/gopsutil/host"
5+ "github.com/shirou/gopsutil/v3/net"
6+ "regexp"
67 "runtime"
78 "strconv"
9+ "strings"
810 "time"
911
1012 "github.com/gin-gonic/gin"
1113 "github.com/go-admin-team/go-admin-core/sdk/api"
1214 "github.com/go-admin-team/go-admin-core/sdk/pkg"
1315 _ "github.com/go-admin-team/go-admin-core/sdk/pkg/response"
14- "github.com/shirou/gopsutil/cpu"
15- "github.com/shirou/gopsutil/disk"
16- "github.com/shirou/gopsutil/mem"
16+ "github.com/shirou/gopsutil/v3/cpu"
17+ "github.com/shirou/gopsutil/v3/disk"
18+ "github.com/shirou/gopsutil/v3/host"
19+ "github.com/shirou/gopsutil/v3/mem"
1720)
1821
1922const (
@@ -23,11 +26,28 @@ const (
2326 GB = 1024 * MB
2427)
2528
29+ var (
30+ Version string
31+ expectDiskFsTypes = []string {
32+ "apfs" , "ext4" , "ext3" , "ext2" , "f2fs" , "reiserfs" , "jfs" , "btrfs" ,
33+ "fuseblk" , "zfs" , "simfs" , "ntfs" , "fat32" , "exfat" , "xfs" , "fuse.rclone" ,
34+ }
35+ excludeNetInterfaces = []string {
36+ "lo" , "tun" , "docker" , "veth" , "br-" , "vmbr" , "vnet" , "kube" ,
37+ }
38+ getMacDiskNo = regexp .MustCompile (`\/dev\/disk(\d)s.*` )
39+ )
40+
41+ var (
42+ netInSpeed , netOutSpeed , netInTransfer , netOutTransfer , lastUpdateNetStats uint64
43+ cachedBootTime time.Time
44+ )
45+
2646type ServerMonitor struct {
2747 api.Api
2848}
2949
30- //获取相差时间
50+ // GetHourDiffer 获取相差时间
3151func GetHourDiffer (startTime , endTime string ) int64 {
3252 var hour int64
3353 t1 , err := time .ParseInLocation ("2006-01-02 15:04:05" , startTime , time .Local )
@@ -64,33 +84,28 @@ func (e ServerMonitor) ServerInfo(c *gin.Context) {
6484 osDic ["hostName" ] = sysInfo .Hostname
6585 osDic ["time" ] = time .Now ().Format ("2006-01-02 15:04:05" )
6686
67- dis , _ := disk .Usage ("/" )
68- diskTotalGB := int (dis .Total ) / GB
69- diskFreeGB := int (dis .Free ) / GB
70- diskDic := make (map [string ]interface {}, 0 )
71- diskDic ["total" ] = diskTotalGB
72- diskDic ["free" ] = diskFreeGB
73-
7487 mem , _ := mem .VirtualMemory ()
75- memUsedMB := int (mem .Used ) / GB
76- memTotalMB := int (mem .Total ) / GB
77- memFreeMB := int (mem .Free ) / GB
78- memUsedPercent := int (mem .UsedPercent )
7988 memDic := make (map [string ]interface {}, 0 )
80- memDic ["total" ] = memTotalMB
81- memDic ["used" ] = memUsedMB
82- memDic ["free" ] = memFreeMB
83- memDic ["usage" ] = memUsedPercent
89+ memDic ["used" ] = mem .Used / MB
90+ memDic ["total" ] = mem .Total / MB
91+
92+ fmt .Println ("mem" , int (mem .Total / mem .Used * 100 ))
93+ memDic ["percent" ] = pkg .Round (mem .UsedPercent , 2 )
94+
95+ swapDic := make (map [string ]interface {}, 0 )
96+ swapDic ["used" ] = mem .SwapTotal - mem .SwapFree
97+ swapDic ["total" ] = mem .SwapTotal
8498
8599 cpuDic := make (map [string ]interface {}, 0 )
86100 cpuDic ["cpuInfo" ], _ = cpu .Info ()
87101 percent , _ := cpu .Percent (0 , false )
88- cpuDic ["Percent " ] = pkg .Round (percent [0 ], 2 )
102+ cpuDic ["percent " ] = pkg .Round (percent [0 ], 2 )
89103 cpuDic ["cpuNum" ], _ = cpu .Counts (false )
90104
91105 //服务器磁盘信息
92106 disklist := make ([]disk.UsageStat , 0 )
93107 //所有分区
108+ var diskTotal , diskUsed , diskUsedPercent float64
94109 diskInfo , err := disk .Partitions (true )
95110 if err == nil {
96111 for _ , p := range diskInfo {
@@ -101,16 +116,72 @@ func (e ServerMonitor) ServerInfo(c *gin.Context) {
101116 diskDetail .Used = diskDetail .Used / 1024 / 1024
102117 diskDetail .Free = diskDetail .Free / 1024 / 1024
103118 disklist = append (disklist , * diskDetail )
119+
104120 }
105121 }
106122 }
107123
124+ d , _ := disk .Usage ("/" )
125+
126+ diskTotal = float64 (d .Total / GB )
127+ diskUsed = float64 (d .Used / GB )
128+ diskUsedPercent , _ = strconv .ParseFloat (fmt .Sprintf ("%.2f" , d .UsedPercent ), 64 )
129+
130+ diskDic := make (map [string ]interface {}, 0 )
131+ diskDic ["total" ] = diskTotal
132+ diskDic ["used" ] = diskUsed
133+ diskDic ["percent" ] = diskUsedPercent
134+
135+ bootTime , _ := host .BootTime ()
136+ cachedBootTime = time .Unix (int64 (bootTime ), 0 )
137+
138+ TrackNetworkSpeed ()
139+ netDic := make (map [string ]interface {}, 0 )
140+ netDic ["in" ] = pkg .Round (float64 (netInSpeed / KB ), 2 )
141+ netDic ["out" ] = pkg .Round (float64 (netOutSpeed / KB ), 2 )
108142 e .Custom (gin.H {
109- "code" : 200 ,
110- "os" : osDic ,
111- "mem" : memDic ,
112- "cpu" : cpuDic ,
113- "disk" : diskDic ,
114- "diskList" : disklist ,
143+ "code" : 200 ,
144+ "os" : osDic ,
145+ "mem" : memDic ,
146+ "cpu" : cpuDic ,
147+ "disk" : diskDic ,
148+ "net" : netDic ,
149+ "swap" : swapDic ,
150+ "location" : "Aliyun" ,
151+ "bootTime" : GetHourDiffer (cachedBootTime .Format ("2006-01-02 15:04:05" ), time .Now ().Format ("2006-01-02 15:04:05" )),
115152 })
116153}
154+
155+ func TrackNetworkSpeed () {
156+ var innerNetInTransfer , innerNetOutTransfer uint64
157+ nc , err := net .IOCounters (true )
158+ if err == nil {
159+ for _ , v := range nc {
160+ if isListContainsStr (excludeNetInterfaces , v .Name ) {
161+ continue
162+ }
163+ innerNetInTransfer += v .BytesRecv
164+ innerNetOutTransfer += v .BytesSent
165+ }
166+ now := uint64 (time .Now ().Unix ())
167+ diff := now - lastUpdateNetStats
168+ if diff > 0 {
169+ netInSpeed = (innerNetInTransfer - netInTransfer ) / diff
170+ fmt .Println ("netInSpeed" , netInSpeed )
171+ netOutSpeed = (innerNetOutTransfer - netOutTransfer ) / diff
172+ fmt .Println ("netOutSpeed" , netOutSpeed )
173+ }
174+ netInTransfer = innerNetInTransfer
175+ netOutTransfer = innerNetOutTransfer
176+ lastUpdateNetStats = now
177+ }
178+ }
179+
180+ func isListContainsStr (list []string , str string ) bool {
181+ for i := 0 ; i < len (list ); i ++ {
182+ if strings .Contains (str , list [i ]) {
183+ return true
184+ }
185+ }
186+ return false
187+ }
0 commit comments