analytic.go 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166
  1. package analytic
  2. import (
  3. "fmt"
  4. "net/http"
  5. "runtime"
  6. "time"
  7. "github.com/0xJacky/Nginx-UI/internal/analytic"
  8. "github.com/0xJacky/Nginx-UI/internal/helper"
  9. "github.com/shirou/gopsutil/v4/cpu"
  10. "github.com/shirou/gopsutil/v4/host"
  11. "github.com/shirou/gopsutil/v4/load"
  12. "github.com/shirou/gopsutil/v4/net"
  13. "github.com/spf13/cast"
  14. "github.com/uozi-tech/cosy/logger"
  15. "github.com/gin-gonic/gin"
  16. "github.com/gorilla/websocket"
  17. )
  18. func Analytic(c *gin.Context) {
  19. var upGrader = websocket.Upgrader{
  20. CheckOrigin: func(r *http.Request) bool {
  21. return true
  22. },
  23. }
  24. // upgrade http to websocket
  25. ws, err := upGrader.Upgrade(c.Writer, c.Request, nil)
  26. if err != nil {
  27. logger.Error(err)
  28. return
  29. }
  30. defer ws.Close()
  31. var stat Stat
  32. for {
  33. stat.Memory, err = analytic.GetMemoryStat()
  34. if err != nil {
  35. logger.Error(err)
  36. continue
  37. }
  38. cpuTimesBefore, _ := cpu.Times(false)
  39. time.Sleep(1000 * time.Millisecond)
  40. cpuTimesAfter, _ := cpu.Times(false)
  41. threadNum := runtime.GOMAXPROCS(0)
  42. cpuUserUsage := (cpuTimesAfter[0].User - cpuTimesBefore[0].User) / (float64(1000*threadNum) / 1000)
  43. cpuSystemUsage := (cpuTimesAfter[0].System - cpuTimesBefore[0].System) / (float64(1000*threadNum) / 1000)
  44. stat.CPU = CPUStat{
  45. User: cast.ToFloat64(fmt.Sprintf("%.2f", cpuUserUsage*100)),
  46. System: cast.ToFloat64(fmt.Sprintf("%.2f", cpuSystemUsage*100)),
  47. Idle: cast.ToFloat64(fmt.Sprintf("%.2f", (1-cpuUserUsage-cpuSystemUsage)*100)),
  48. Total: cast.ToFloat64(fmt.Sprintf("%.2f", (cpuUserUsage+cpuSystemUsage)*100)),
  49. }
  50. stat.Uptime, err = host.Uptime()
  51. if err != nil {
  52. logger.Error(err)
  53. continue
  54. }
  55. stat.LoadAvg, err = load.Avg()
  56. if err != nil {
  57. logger.Error(err)
  58. continue
  59. }
  60. stat.Disk, err = analytic.GetDiskStat()
  61. if err != nil {
  62. logger.Error(err)
  63. continue
  64. }
  65. network, err := net.IOCounters(false)
  66. if err != nil {
  67. logger.Error(err)
  68. continue
  69. }
  70. if len(network) > 0 {
  71. stat.Network = network[0]
  72. }
  73. // write
  74. err = ws.WriteJSON(stat)
  75. if err != nil {
  76. if helper.IsUnexpectedWebsocketError(err) {
  77. logger.Error(err)
  78. }
  79. break
  80. }
  81. time.Sleep(1 * time.Second)
  82. }
  83. }
  84. func GetAnalyticInit(c *gin.Context) {
  85. cpuInfo, err := cpu.Info()
  86. if err != nil {
  87. logger.Error(err)
  88. }
  89. network, err := net.IOCounters(false)
  90. if err != nil {
  91. logger.Error(err)
  92. }
  93. memory, err := analytic.GetMemoryStat()
  94. if err != nil {
  95. logger.Error(err)
  96. }
  97. diskStat, err := analytic.GetDiskStat()
  98. if err != nil {
  99. logger.Error(err)
  100. }
  101. var _net net.IOCountersStat
  102. if len(network) > 0 {
  103. _net = network[0]
  104. }
  105. hostInfo, err := host.Info()
  106. if err != nil {
  107. logger.Error(err)
  108. hostInfo = &host.InfoStat{}
  109. }
  110. switch hostInfo.Platform {
  111. case "ubuntu":
  112. hostInfo.Platform = "Ubuntu"
  113. case "centos":
  114. hostInfo.Platform = "CentOS"
  115. }
  116. loadAvg, err := load.Avg()
  117. if err != nil {
  118. logger.Error(err)
  119. loadAvg = &load.AvgStat{}
  120. }
  121. c.JSON(http.StatusOK, InitResp{
  122. Host: hostInfo,
  123. CPU: CPURecords{
  124. Info: cpuInfo,
  125. User: analytic.CpuUserRecord,
  126. Total: analytic.CpuTotalRecord,
  127. },
  128. Network: NetworkRecords{
  129. Init: _net,
  130. BytesRecv: analytic.NetRecvRecord,
  131. BytesSent: analytic.NetSentRecord,
  132. },
  133. DiskIO: DiskIORecords{
  134. Writes: analytic.DiskWriteRecord,
  135. Reads: analytic.DiskReadRecord,
  136. },
  137. Memory: memory,
  138. Disk: diskStat,
  139. LoadAvg: loadAvg,
  140. })
  141. }