From cc6a325ddd67e7d8c2879feeb090bec2ff0d0efa Mon Sep 17 00:00:00 2001 From: 0xJacky Date: Wed, 12 Jul 2023 00:05:59 +0800 Subject: [PATCH] fix: analytic not send data --- frontend/vite.config.ts | 2 +- server/api/analytic.go | 333 ++++++++++++++++++++-------------------- 2 files changed, 169 insertions(+), 166 deletions(-) diff --git a/frontend/vite.config.ts b/frontend/vite.config.ts index 9be92a9c..d8566c5b 100644 --- a/frontend/vite.config.ts +++ b/frontend/vite.config.ts @@ -67,7 +67,7 @@ export default defineConfig({ server: { proxy: { '/api': { - target: 'http://127.0.0.1:9001/', + target: 'http://127.0.0.1:9002/', changeOrigin: true, secure: false, ws: true diff --git a/server/api/analytic.go b/server/api/analytic.go index 36a09a10..6b38c513 100644 --- a/server/api/analytic.go +++ b/server/api/analytic.go @@ -1,214 +1,217 @@ package api import ( - "fmt" - "github.com/0xJacky/Nginx-UI/server/internal/analytic" - "github.com/0xJacky/Nginx-UI/server/internal/logger" - "github.com/shirou/gopsutil/v3/cpu" - "github.com/shirou/gopsutil/v3/host" - "github.com/shirou/gopsutil/v3/load" - "github.com/shirou/gopsutil/v3/net" - "github.com/spf13/cast" - "net/http" - "runtime" - "time" + "fmt" + "github.com/0xJacky/Nginx-UI/server/internal/analytic" + "github.com/0xJacky/Nginx-UI/server/internal/logger" + "github.com/shirou/gopsutil/v3/cpu" + "github.com/shirou/gopsutil/v3/host" + "github.com/shirou/gopsutil/v3/load" + "github.com/shirou/gopsutil/v3/net" + "github.com/spf13/cast" + "net/http" + "runtime" + "time" - "github.com/gin-gonic/gin" - "github.com/gorilla/websocket" + "github.com/gin-gonic/gin" + "github.com/gorilla/websocket" ) type CPUStat struct { - User float64 `json:"user"` - System float64 `json:"system"` - Idle float64 `json:"idle"` - Total float64 `json:"total"` + User float64 `json:"user"` + System float64 `json:"system"` + Idle float64 `json:"idle"` + Total float64 `json:"total"` } type Stat struct { - Uptime uint64 `json:"uptime"` - LoadAvg *load.AvgStat `json:"loadavg"` - CPU CPUStat `json:"cpu"` - Memory analytic.MemStat `json:"memory"` - Disk analytic.DiskStat `json:"disk"` - Network net.IOCountersStat `json:"network"` + Uptime uint64 `json:"uptime"` + LoadAvg *load.AvgStat `json:"loadavg"` + CPU CPUStat `json:"cpu"` + Memory analytic.MemStat `json:"memory"` + Disk analytic.DiskStat `json:"disk"` + Network net.IOCountersStat `json:"network"` } func Analytic(c *gin.Context) { - var upGrader = websocket.Upgrader{ - CheckOrigin: func(r *http.Request) bool { - return true - }, - } - // upgrade http to websocket - ws, err := upGrader.Upgrade(c.Writer, c.Request, nil) - if err != nil { - logger.Error(err) - return - } + var upGrader = websocket.Upgrader{ + CheckOrigin: func(r *http.Request) bool { + return true + }, + } + // upgrade http to websocket + ws, err := upGrader.Upgrade(c.Writer, c.Request, nil) + if err != nil { + logger.Error(err) + return + } - defer ws.Close() + defer ws.Close() - var stat Stat + var stat Stat - for { - stat.Memory, err = analytic.GetMemoryStat() + for { + stat.Memory, err = analytic.GetMemoryStat() - if err != nil { - logger.Error(err) - return - } + if err != nil { + logger.Error(err) + return + } - cpuTimesBefore, _ := cpu.Times(false) - time.Sleep(1000 * time.Millisecond) - cpuTimesAfter, _ := cpu.Times(false) - threadNum := runtime.GOMAXPROCS(0) - cpuUserUsage := (cpuTimesAfter[0].User - cpuTimesBefore[0].User) / (float64(1000*threadNum) / 1000) - cpuSystemUsage := (cpuTimesAfter[0].System - cpuTimesBefore[0].System) / (float64(1000*threadNum) / 1000) + cpuTimesBefore, _ := cpu.Times(false) + time.Sleep(1000 * time.Millisecond) + cpuTimesAfter, _ := cpu.Times(false) + threadNum := runtime.GOMAXPROCS(0) + cpuUserUsage := (cpuTimesAfter[0].User - cpuTimesBefore[0].User) / (float64(1000*threadNum) / 1000) + cpuSystemUsage := (cpuTimesAfter[0].System - cpuTimesBefore[0].System) / (float64(1000*threadNum) / 1000) - stat.CPU = CPUStat{ - User: cast.ToFloat64(fmt.Sprintf("%.2f", cpuUserUsage*100)), - System: cast.ToFloat64(fmt.Sprintf("%.2f", cpuSystemUsage*100)), - Idle: cast.ToFloat64(fmt.Sprintf("%.2f", (1-cpuUserUsage-cpuSystemUsage)*100)), - Total: cast.ToFloat64(fmt.Sprintf("%.2f", (cpuUserUsage+cpuSystemUsage)*100)), - } + stat.CPU = CPUStat{ + User: cast.ToFloat64(fmt.Sprintf("%.2f", cpuUserUsage*100)), + System: cast.ToFloat64(fmt.Sprintf("%.2f", cpuSystemUsage*100)), + Idle: cast.ToFloat64(fmt.Sprintf("%.2f", (1-cpuUserUsage-cpuSystemUsage)*100)), + Total: cast.ToFloat64(fmt.Sprintf("%.2f", (cpuUserUsage+cpuSystemUsage)*100)), + } - stat.Uptime, _ = host.Uptime() + stat.Uptime, _ = host.Uptime() - stat.LoadAvg, _ = load.Avg() + stat.LoadAvg, _ = load.Avg() - stat.Disk, err = analytic.GetDiskStat() + stat.Disk, err = analytic.GetDiskStat() - if err != nil { - logger.Error(err) - return - } + if err != nil { + logger.Error(err) + return + } - network, _ := net.IOCounters(false) + network, _ := net.IOCounters(false) - if len(network) > 0 { - stat.Network = network[0] - } + if len(network) > 0 { + stat.Network = network[0] + } - // write - if err != nil || websocket.IsUnexpectedCloseError(err, - websocket.CloseGoingAway, - websocket.CloseNoStatusReceived, - websocket.CloseNormalClosure) { - logger.Error(err) - break - } - time.Sleep(800 * time.Microsecond) - } + // write + err = ws.WriteJSON(stat) + if err != nil || websocket.IsUnexpectedCloseError(err, + websocket.CloseGoingAway, + websocket.CloseNoStatusReceived, + websocket.CloseNormalClosure) { + logger.Error(err) + break + } + time.Sleep(800 * time.Microsecond) + } } func GetAnalyticInit(c *gin.Context) { - cpuInfo, _ := cpu.Info() - network, _ := net.IOCounters(false) - memory, err := analytic.GetMemoryStat() + cpuInfo, _ := cpu.Info() + network, _ := net.IOCounters(false) + memory, err := analytic.GetMemoryStat() - if err != nil { - logger.Error(err) - return - } + if err != nil { + logger.Error(err) + return + } - diskStat, err := analytic.GetDiskStat() + diskStat, err := analytic.GetDiskStat() - if err != nil { - logger.Error(err) - return - } + if err != nil { + logger.Error(err) + return + } - var _net net.IOCountersStat - if len(network) > 0 { - _net = network[0] - } - hostInfo, _ := host.Info() + var _net net.IOCountersStat + if len(network) > 0 { + _net = network[0] + } + hostInfo, _ := host.Info() - switch hostInfo.Platform { - case "ubuntu": - hostInfo.Platform = "Ubuntu" - case "centos": - hostInfo.Platform = "CentOS" - } + switch hostInfo.Platform { + case "ubuntu": + hostInfo.Platform = "Ubuntu" + case "centos": + hostInfo.Platform = "CentOS" + } - loadAvg, _ := load.Avg() + loadAvg, _ := load.Avg() - c.JSON(http.StatusOK, gin.H{ - "host": hostInfo, - "cpu": gin.H{ - "info": cpuInfo, - "user": analytic.CpuUserRecord, - "total": analytic.CpuTotalRecord, - }, - "network": gin.H{ - "init": _net, - "bytesRecv": analytic.NetRecvRecord, - "bytesSent": analytic.NetSentRecord, - }, - "disk_io": gin.H{ - "writes": analytic.DiskWriteRecord, - "reads": analytic.DiskReadRecord, - }, - "memory": memory, - "disk": diskStat, - "loadavg": loadAvg, - }) + c.JSON(http.StatusOK, gin.H{ + "host": hostInfo, + "cpu": gin.H{ + "info": cpuInfo, + "user": analytic.CpuUserRecord, + "total": analytic.CpuTotalRecord, + }, + "network": gin.H{ + "init": _net, + "bytesRecv": analytic.NetRecvRecord, + "bytesSent": analytic.NetSentRecord, + }, + "disk_io": gin.H{ + "writes": analytic.DiskWriteRecord, + "reads": analytic.DiskReadRecord, + }, + "memory": memory, + "disk": diskStat, + "loadavg": loadAvg, + }) } func GetNodeStat(c *gin.Context) { - var upGrader = websocket.Upgrader{ - CheckOrigin: func(r *http.Request) bool { - return true - }, - } - // upgrade http to websocket - ws, err := upGrader.Upgrade(c.Writer, c.Request, nil) - if err != nil { - logger.Error(err) - return - } + var upGrader = websocket.Upgrader{ + CheckOrigin: func(r *http.Request) bool { + return true + }, + } + // upgrade http to websocket + ws, err := upGrader.Upgrade(c.Writer, c.Request, nil) + if err != nil { + logger.Error(err) + return + } - defer ws.Close() + defer ws.Close() - for { - // write - if err != nil || websocket.IsUnexpectedCloseError(err, - websocket.CloseGoingAway, - websocket.CloseNoStatusReceived, - websocket.CloseNormalClosure) { - logger.Error(err) - break - } + for { + // write + err = ws.WriteJSON(analytic.GetNodeStat()) + if err != nil || websocket.IsUnexpectedCloseError(err, + websocket.CloseGoingAway, + websocket.CloseNoStatusReceived, + websocket.CloseNormalClosure) { + logger.Error(err) + break + } - time.Sleep(10 * time.Second) - } + time.Sleep(10 * time.Second) + } } func GetNodesAnalytic(c *gin.Context) { - var upGrader = websocket.Upgrader{ - CheckOrigin: func(r *http.Request) bool { - return true - }, - } - // upgrade http to websocket - ws, err := upGrader.Upgrade(c.Writer, c.Request, nil) - if err != nil { - logger.Error(err) - return - } + var upGrader = websocket.Upgrader{ + CheckOrigin: func(r *http.Request) bool { + return true + }, + } + // upgrade http to websocket + ws, err := upGrader.Upgrade(c.Writer, c.Request, nil) + if err != nil { + logger.Error(err) + return + } - defer ws.Close() + defer ws.Close() - for { - // write - if err != nil || websocket.IsUnexpectedCloseError(err, - websocket.CloseGoingAway, - websocket.CloseNoStatusReceived, - websocket.CloseNormalClosure) { - logger.Error(err) - break - } + for { + // write + err = ws.WriteJSON(analytic.NodeMap) + if err != nil || websocket.IsUnexpectedCloseError(err, + websocket.CloseGoingAway, + websocket.CloseNoStatusReceived, + websocket.CloseNormalClosure) { + logger.Error(err) + break + } - time.Sleep(10 * time.Second) - } + time.Sleep(10 * time.Second) + } }