-
Notifications
You must be signed in to change notification settings - Fork 80
/
Copy pathmonitor.go
156 lines (135 loc) · 3.53 KB
/
monitor.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
package main
import (
"akile_monitor/client/model"
"fmt"
"github.com/shirou/gopsutil/v3/cpu"
"github.com/shirou/gopsutil/v3/host"
"github.com/shirou/gopsutil/v3/load"
"github.com/shirou/gopsutil/v3/mem"
"github.com/shirou/gopsutil/v3/net"
"log"
"runtime"
"strconv"
"time"
"github.com/docker/docker/client"
"context"
)
func GetState() *model.HostState {
var ret model.HostState
cp, err := cpu.Percent(0, false)
if err != nil || len(cp) == 0 {
log.Println("cpu.Percent error:", err)
} else {
ret.CPU = cp[0]
}
loadStat, err := load.Avg()
if err != nil {
log.Println("load.Avg error:", err)
} else {
ret.Load1 = Decimal(loadStat.Load1)
ret.Load5 = Decimal(loadStat.Load5)
ret.Load15 = Decimal(loadStat.Load15)
}
vm, err := mem.VirtualMemory()
if err != nil {
log.Println("mem.VirtualMemory error:", err)
} else {
ret.MemUsed = vm.Total - vm.Available
}
uptime, err := host.Uptime()
if err != nil {
log.Println("host.Uptime error:", err)
} else {
ret.Uptime = uptime
}
swap, err := mem.SwapMemory()
if err != nil {
log.Println("mem.SwapMemory error:", err)
} else {
ret.SwapUsed = swap.Used
}
ret.NetInTransfer, ret.NetOutTransfer = netInTransfer, netOutTransfer
ret.NetInSpeed, ret.NetOutSpeed = netInSpeed, netOutSpeed
return &ret
}
func GetHost() *model.Host {
var ret model.Host
ret.Name = cfg.Name
var cpuType string
hi, err := host.Info()
if err != nil {
log.Println("host.Info error:", err)
}
cpuType = "Virtual"
ret.Platform = hi.Platform
ret.PlatformVersion = hi.PlatformVersion
ret.Arch = hi.KernelArch
ret.Virtualization = hi.VirtualizationSystem
ret.BootTime = hi.BootTime
// 检查是否在 Docker 环境中
if ret.Virtualization == "docker" {
// 创建 Docker 客户端
cli, err := client.NewClientWithOpts(client.FromEnv, client.WithAPIVersionNegotiation())
if err != nil {
log.Println("Failed to create Docker client:", err)
} else {
defer cli.Close()
// 获取 Docker 信息
info, err := cli.Info(context.Background())
if err != nil {
log.Println("Failed to get Docker info:", err)
} else {
// 更新宿主机信息
ret.Platform = info.OperatingSystem
ret.PlatformVersion = ""
ret.Arch = info.Architecture
}
}
}
ci, err := cpu.Info()
if err != nil {
log.Println("cpu.Info error:", err)
}
ret.CPU = append(ret.CPU, fmt.Sprintf("%s %d %s Core", ci[0].ModelName, runtime.NumCPU(), cpuType))
vm, err := mem.VirtualMemory()
if err != nil {
log.Println("mem.VirtualMemory error:", err)
}
swap, err := mem.SwapMemory()
if err != nil {
log.Println("mem.SwapMemory error:", err)
}
ret.MemTotal = vm.Total
ret.SwapTotal = swap.Total
return &ret
}
var (
netInSpeed, netOutSpeed, netInTransfer, netOutTransfer, lastUpdateNetStats uint64
)
// TrackNetworkSpeed NIC监控,统计流量与速度
func TrackNetworkSpeed() {
var innerNetInTransfer, innerNetOutTransfer uint64
nc, err := net.IOCounters(true)
if err == nil {
for _, v := range nc {
if v.Name == cfg.NetName {
innerNetInTransfer += v.BytesRecv
innerNetOutTransfer += v.BytesSent
}
}
now := uint64(time.Now().Unix())
diff := now - lastUpdateNetStats
if diff > 0 {
netInSpeed = (innerNetInTransfer - netInTransfer) / diff
netOutSpeed = (innerNetOutTransfer - netOutTransfer) / diff
}
netInTransfer = innerNetInTransfer
netOutTransfer = innerNetOutTransfer
lastUpdateNetStats = now
}
}
// 保留两位小数
func Decimal(value float64) float64 {
value, _ = strconv.ParseFloat(fmt.Sprintf("%.2f", value), 64)
return value
}