@@ -2,18 +2,21 @@ package apis
2
2
3
3
import (
4
4
"fmt"
5
- "github.com/shirou/gopsutil/host"
5
+ "github.com/shirou/gopsutil/v3/net"
6
+ "regexp"
6
7
"runtime"
7
8
"strconv"
9
+ "strings"
8
10
"time"
9
11
10
12
"github.com/gin-gonic/gin"
11
13
"github.com/go-admin-team/go-admin-core/sdk/api"
12
14
"github.com/go-admin-team/go-admin-core/sdk/pkg"
13
15
_ "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"
17
20
)
18
21
19
22
const (
@@ -23,11 +26,28 @@ const (
23
26
GB = 1024 * MB
24
27
)
25
28
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
+
26
46
type ServerMonitor struct {
27
47
api.Api
28
48
}
29
49
30
- //获取相差时间
50
+ // GetHourDiffer 获取相差时间
31
51
func GetHourDiffer (startTime , endTime string ) int64 {
32
52
var hour int64
33
53
t1 , err := time .ParseInLocation ("2006-01-02 15:04:05" , startTime , time .Local )
@@ -64,33 +84,28 @@ func (e ServerMonitor) ServerInfo(c *gin.Context) {
64
84
osDic ["hostName" ] = sysInfo .Hostname
65
85
osDic ["time" ] = time .Now ().Format ("2006-01-02 15:04:05" )
66
86
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
-
74
87
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 )
79
88
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
84
98
85
99
cpuDic := make (map [string ]interface {}, 0 )
86
100
cpuDic ["cpuInfo" ], _ = cpu .Info ()
87
101
percent , _ := cpu .Percent (0 , false )
88
- cpuDic ["Percent " ] = pkg .Round (percent [0 ], 2 )
102
+ cpuDic ["percent " ] = pkg .Round (percent [0 ], 2 )
89
103
cpuDic ["cpuNum" ], _ = cpu .Counts (false )
90
104
91
105
//服务器磁盘信息
92
106
disklist := make ([]disk.UsageStat , 0 )
93
107
//所有分区
108
+ var diskTotal , diskUsed , diskUsedPercent float64
94
109
diskInfo , err := disk .Partitions (true )
95
110
if err == nil {
96
111
for _ , p := range diskInfo {
@@ -101,16 +116,72 @@ func (e ServerMonitor) ServerInfo(c *gin.Context) {
101
116
diskDetail .Used = diskDetail .Used / 1024 / 1024
102
117
diskDetail .Free = diskDetail .Free / 1024 / 1024
103
118
disklist = append (disklist , * diskDetail )
119
+
104
120
}
105
121
}
106
122
}
107
123
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 )
108
142
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" )),
115
152
})
116
153
}
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