node_stat.go 1.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  1. package analytic
  2. import (
  3. "math"
  4. "runtime"
  5. "time"
  6. "github.com/0xJacky/Nginx-UI/internal/upstream"
  7. "github.com/shirou/gopsutil/v4/cpu"
  8. "github.com/shirou/gopsutil/v4/load"
  9. "github.com/uozi-tech/cosy/logger"
  10. )
  11. func GetNodeStat() (data NodeStat) {
  12. memory, err := GetMemoryStat()
  13. if err != nil {
  14. logger.Error(err)
  15. return
  16. }
  17. cpuTimesBefore, _ := cpu.Times(false)
  18. time.Sleep(1000 * time.Millisecond)
  19. cpuTimesAfter, _ := cpu.Times(false)
  20. threadNum := runtime.GOMAXPROCS(0)
  21. cpuUserUsage := (cpuTimesAfter[0].User - cpuTimesBefore[0].User) / (float64(1000*threadNum) / 1000)
  22. cpuSystemUsage := (cpuTimesAfter[0].System - cpuTimesBefore[0].System) / (float64(1000*threadNum) / 1000)
  23. loadAvg, err := load.Avg()
  24. if err != nil {
  25. logger.Error(err)
  26. return
  27. }
  28. diskStat, err := GetDiskStat()
  29. if err != nil {
  30. logger.Error(err)
  31. return
  32. }
  33. network, err := GetNetworkStat()
  34. if err != nil {
  35. logger.Error(err)
  36. return
  37. }
  38. // Get upstream status for current node
  39. upstreamService := upstream.GetUpstreamService()
  40. // Ensure upstream availability test is performed if targets exist
  41. if upstreamService.GetTargetCount() > 0 {
  42. upstreamService.PerformAvailabilityTest()
  43. }
  44. upstreamStatusMap := upstreamService.GetAvailabilityMap()
  45. return NodeStat{
  46. AvgLoad: loadAvg,
  47. CPUPercent: math.Min((cpuUserUsage+cpuSystemUsage)*100, 100),
  48. MemoryPercent: memory.Pressure,
  49. DiskPercent: diskStat.Percentage,
  50. Network: *network,
  51. UpstreamStatusMap: upstreamStatusMap,
  52. }
  53. }