@@ -13,6 +13,7 @@ import (
1313 "github.com/shirou/gopsutil/v3/disk"
1414 "github.com/shirou/gopsutil/v3/host"
1515 "github.com/shirou/gopsutil/v3/mem"
16+ "github.com/shirou/gopsutil/v3/net"
1617)
1718
1819const (
@@ -31,6 +32,8 @@ func formatBytes(bytes uint64, unit string) string {
3132 }
3233}
3334
35+ // TODO: Add support for multi server management
36+ // solution: create a bridge between the gopsutil and the ssh client
3437func (m * DashboardMonitor ) GetSystemStats () {
3538 osType , err := m .getCommandOutput ("uname -s" )
3639 if err != nil {
@@ -42,24 +45,49 @@ func (m *DashboardMonitor) GetSystemStats() {
4245 stats := SystemStats {
4346 OSType : osType ,
4447 Timestamp : time .Now (),
48+ CPU : CPUStats {PerCore : []CPUCore {}},
4549 Memory : MemoryStats {},
4650 Load : LoadStats {},
4751 Disk : DiskStats {AllMounts : []DiskMount {}},
52+ Network : NetworkStats {Interfaces : []NetworkInterface {}},
4853 }
4954
55+ if hostname , err := m .getCommandOutput ("hostname" ); err == nil {
56+ stats .Hostname = strings .TrimSpace (hostname )
57+ }
58+
59+ if kernelVersion , err := m .getCommandOutput ("uname -r" ); err == nil {
60+ stats .KernelVersion = strings .TrimSpace (kernelVersion )
61+ }
62+
63+ if architecture , err := m .getCommandOutput ("uname -m" ); err == nil {
64+ stats .Architecture = strings .TrimSpace (architecture )
65+ }
66+
67+ var uptime string
5068 if hostInfo , err := host .Info (); err == nil {
51- stats . Load . Uptime = time .Duration (hostInfo .Uptime * uint64 (time .Second )).String ()
69+ uptime = time .Duration (hostInfo .Uptime * uint64 (time .Second )).String ()
5270 }
5371
5472 if loadAvg , err := m .getCommandOutput ("uptime" ); err == nil {
5573 loadAvgStr := strings .TrimSpace (loadAvg )
5674 stats .Load = parseLoadAverage (loadAvgStr )
5775 }
5876
77+ stats .Load .Uptime = uptime
78+
5979 if cpuInfo , err := cpu .Info (); err == nil && len (cpuInfo ) > 0 {
6080 stats .CPUInfo = cpuInfo [0 ].ModelName
6181 }
6282
83+ if stats .CPUCores == 0 {
84+ if coreCount , err := cpu .Counts (true ); err == nil {
85+ stats .CPUCores = coreCount
86+ }
87+ }
88+
89+ stats .CPU = m .getCPUStats ()
90+
6391 if memInfo , err := mem .VirtualMemory (); err == nil {
6492 stats .Memory = MemoryStats {
6593 Total : float64 (memInfo .Total ) / bytesInGB ,
@@ -103,6 +131,8 @@ func (m *DashboardMonitor) GetSystemStats() {
103131 stats .Disk = diskStats
104132 }
105133
134+ stats .Network = m .getNetworkStats ()
135+
106136 m .Broadcast (string (GetSystemStats ), stats )
107137}
108138
@@ -126,6 +156,74 @@ func parseLoadAverage(loadStr string) LoadStats {
126156 return loadStats
127157}
128158
159+ func (m * DashboardMonitor ) getCPUStats () CPUStats {
160+ cpuStats := CPUStats {
161+ Overall : 0.0 ,
162+ PerCore : []CPUCore {},
163+ }
164+
165+ perCorePercent , err := cpu .Percent (time .Second , true )
166+ if err == nil && len (perCorePercent ) > 0 {
167+ cpuStats .PerCore = make ([]CPUCore , len (perCorePercent ))
168+ var totalUsage float64 = 0
169+
170+ for i , usage := range perCorePercent {
171+ cpuStats .PerCore [i ] = CPUCore {
172+ CoreID : i ,
173+ Usage : usage ,
174+ }
175+ totalUsage += usage
176+ }
177+
178+ cpuStats .Overall = totalUsage / float64 (len (perCorePercent ))
179+ } else {
180+
181+ if overallPercent , err := cpu .Percent (time .Second , false ); err == nil && len (overallPercent ) > 0 {
182+ cpuStats .Overall = overallPercent [0 ]
183+ }
184+ }
185+
186+ return cpuStats
187+ }
188+
189+ func (m * DashboardMonitor ) getNetworkStats () NetworkStats {
190+ networkStats := NetworkStats {
191+ Interfaces : []NetworkInterface {},
192+ }
193+
194+ if ioCounters , err := net .IOCounters (true ); err == nil {
195+ var totalSent , totalRecv , totalPacketsSent , totalPacketsRecv uint64
196+
197+ for _ , counter := range ioCounters {
198+ interfaces := NetworkInterface {
199+ Name : counter .Name ,
200+ BytesSent : counter .BytesSent ,
201+ BytesRecv : counter .BytesRecv ,
202+ PacketsSent : counter .PacketsSent ,
203+ PacketsRecv : counter .PacketsRecv ,
204+ ErrorIn : counter .Errin ,
205+ ErrorOut : counter .Errout ,
206+ DropIn : counter .Dropin ,
207+ DropOut : counter .Dropout ,
208+ }
209+
210+ networkStats .Interfaces = append (networkStats .Interfaces , interfaces )
211+
212+ totalSent += counter .BytesSent
213+ totalRecv += counter .BytesRecv
214+ totalPacketsSent += counter .PacketsSent
215+ totalPacketsRecv += counter .PacketsRecv
216+ }
217+
218+ networkStats .TotalBytesSent = totalSent
219+ networkStats .TotalBytesRecv = totalRecv
220+ networkStats .TotalPacketsSent = totalPacketsSent
221+ networkStats .TotalPacketsRecv = totalPacketsRecv
222+ }
223+
224+ return networkStats
225+ }
226+
129227func (m * DashboardMonitor ) getCommandOutput (cmd string ) (string , error ) {
130228 session , err := m .client .NewSession ()
131229 if err != nil {
0 commit comments