analytic.go 3.2 KB

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