1
0

stat.go 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  1. package analytic
  2. import (
  3. "fmt"
  4. "github.com/dustin/go-humanize"
  5. "github.com/pkg/errors"
  6. "github.com/shirou/gopsutil/v4/disk"
  7. "github.com/shirou/gopsutil/v4/mem"
  8. "github.com/spf13/cast"
  9. "math"
  10. )
  11. type MemStat struct {
  12. Total string `json:"total"`
  13. Used string `json:"used"`
  14. Cached string `json:"cached"`
  15. Free string `json:"free"`
  16. SwapUsed string `json:"swap_used"`
  17. SwapTotal string `json:"swap_total"`
  18. SwapCached string `json:"swap_cached"`
  19. SwapPercent float64 `json:"swap_percent"`
  20. Pressure float64 `json:"pressure"`
  21. }
  22. type DiskStat struct {
  23. Total string `json:"total"`
  24. Used string `json:"used"`
  25. Percentage float64 `json:"percentage"`
  26. Writes Usage[uint64] `json:"writes"`
  27. Reads Usage[uint64] `json:"reads"`
  28. }
  29. func GetMemoryStat() (MemStat, error) {
  30. memoryStat, err := mem.VirtualMemory()
  31. if err != nil {
  32. return MemStat{}, errors.Wrap(err, "error analytic getMemoryStat")
  33. }
  34. return MemStat{
  35. Total: humanize.Bytes(memoryStat.Total),
  36. Used: humanize.Bytes(memoryStat.Used),
  37. Cached: humanize.Bytes(memoryStat.Cached),
  38. Free: humanize.Bytes(memoryStat.Free),
  39. SwapUsed: humanize.Bytes(memoryStat.SwapTotal - memoryStat.SwapFree),
  40. SwapTotal: humanize.Bytes(memoryStat.SwapTotal),
  41. SwapCached: humanize.Bytes(memoryStat.SwapCached),
  42. SwapPercent: cast.ToFloat64(fmt.Sprintf("%.2f",
  43. 100*float64(memoryStat.SwapTotal-memoryStat.SwapFree)/math.Max(float64(memoryStat.SwapTotal), 1))),
  44. Pressure: cast.ToFloat64(fmt.Sprintf("%.2f", memoryStat.UsedPercent)),
  45. }, nil
  46. }
  47. func GetDiskStat() (DiskStat, error) {
  48. diskUsage, err := disk.Usage(".")
  49. if err != nil {
  50. return DiskStat{}, errors.Wrap(err, "error analytic getDiskStat")
  51. }
  52. return DiskStat{
  53. Used: humanize.Bytes(diskUsage.Used),
  54. Total: humanize.Bytes(diskUsage.Total),
  55. Percentage: cast.ToFloat64(fmt.Sprintf("%.2f", diskUsage.UsedPercent)),
  56. Writes: DiskWriteRecord[len(DiskWriteRecord)-1],
  57. Reads: DiskReadRecord[len(DiskReadRecord)-1],
  58. }, nil
  59. }