analytic.go 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124
  1. package tool
  2. import (
  3. "github.com/0xJacky/Nginx-UI/server/settings"
  4. "github.com/shirou/gopsutil/v3/cpu"
  5. "github.com/shirou/gopsutil/v3/disk"
  6. "github.com/shirou/gopsutil/v3/net"
  7. "runtime"
  8. "time"
  9. )
  10. type usage struct {
  11. Time time.Time `json:"x"`
  12. Usage float64 `json:"y"`
  13. }
  14. var CpuUserBuffer []usage
  15. var CpuTotalBuffer []usage
  16. var NetRecvBuffer []usage
  17. var NetSentBuffer []usage
  18. var DiskWriteBuffer []usage
  19. var DiskReadBuffer []usage
  20. var LastDiskWrites uint64
  21. var LastDiskReads uint64
  22. var LastNetRecv uint64
  23. var LastNetSent uint64
  24. func RecordServerAnalytic() {
  25. network, _ := net.IOCounters(false)
  26. diskIOCounters, _ := disk.IOCounters(settings.ServerSettings.DiskName)
  27. diskIO, ok := diskIOCounters[settings.ServerSettings.DiskName]
  28. if ok {
  29. LastDiskWrites = diskIO.WriteCount
  30. LastDiskReads = diskIO.ReadCount
  31. }
  32. if len(network) > 0 {
  33. LastNetRecv = network[0].BytesRecv
  34. LastNetSent = network[0].BytesSent
  35. }
  36. now := time.Now()
  37. // 初始化记录数组
  38. for i := 100; i > 0; i-- {
  39. u := usage{Time: now.Add(time.Duration(-i) * time.Second)}
  40. CpuUserBuffer = append(CpuUserBuffer, u)
  41. CpuTotalBuffer = append(CpuTotalBuffer, u)
  42. NetRecvBuffer = append(NetRecvBuffer, u)
  43. NetSentBuffer = append(NetSentBuffer, u)
  44. DiskWriteBuffer = append(DiskWriteBuffer, u)
  45. DiskReadBuffer = append(DiskReadBuffer, u)
  46. }
  47. for {
  48. cpuTimesBefore, _ := cpu.Times(false)
  49. time.Sleep(1000 * time.Millisecond)
  50. cpuTimesAfter, _ := cpu.Times(false)
  51. threadNum := runtime.GOMAXPROCS(0)
  52. cpuUserUsage := (cpuTimesAfter[0].User - cpuTimesBefore[0].User) / (float64(1000*threadNum) / 1000)
  53. cpuUserUsage *= 100
  54. cpuSystemUsage := (cpuTimesAfter[0].System - cpuTimesBefore[0].System) / (float64(1000*threadNum) / 1000)
  55. cpuSystemUsage *= 100
  56. now := time.Now()
  57. u := usage{
  58. Time: now,
  59. Usage: cpuUserUsage,
  60. }
  61. CpuUserBuffer = append(CpuUserBuffer, u)
  62. s := usage{
  63. Time: now,
  64. Usage: cpuUserUsage + cpuSystemUsage,
  65. }
  66. CpuTotalBuffer = append(CpuTotalBuffer, s)
  67. if len(CpuUserBuffer) > 100 {
  68. CpuUserBuffer = CpuUserBuffer[1:]
  69. }
  70. if len(CpuTotalBuffer) > 100 {
  71. CpuTotalBuffer = CpuTotalBuffer[1:]
  72. }
  73. network, _ = net.IOCounters(false)
  74. if len(network) == 0 {
  75. continue
  76. }
  77. NetRecvBuffer = append(NetRecvBuffer, usage{
  78. Time: now,
  79. Usage: float64(network[0].BytesRecv - LastNetRecv),
  80. })
  81. NetSentBuffer = append(NetRecvBuffer, usage{
  82. Time: now,
  83. Usage: float64(network[0].BytesSent - LastNetSent),
  84. })
  85. LastNetRecv = network[0].BytesRecv
  86. LastNetSent = network[0].BytesSent
  87. if len(NetRecvBuffer) > 100 {
  88. NetRecvBuffer = NetRecvBuffer[1:]
  89. }
  90. if len(NetSentBuffer) > 100 {
  91. NetSentBuffer = NetSentBuffer[1:]
  92. }
  93. diskIOCounters, _ = disk.IOCounters(settings.ServerSettings.DiskName)
  94. diskIO, ok = diskIOCounters[settings.ServerSettings.DiskName]
  95. if ok {
  96. DiskReadBuffer = append(DiskReadBuffer, usage{
  97. Time: now,
  98. Usage: float64(diskIO.ReadCount - LastDiskReads),
  99. })
  100. DiskWriteBuffer = append(DiskWriteBuffer, usage{
  101. Time: now,
  102. Usage: float64(diskIO.WriteCount - LastDiskWrites),
  103. })
  104. if len(DiskReadBuffer) > 100 {
  105. DiskReadBuffer = DiskReadBuffer[1:]
  106. }
  107. if len(DiskWriteBuffer) > 100 {
  108. DiskWriteBuffer = DiskWriteBuffer[1:]
  109. }
  110. LastDiskWrites = diskIO.WriteCount
  111. LastDiskReads = diskIO.ReadCount
  112. }
  113. }
  114. }