sys_server_monitor.go 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188
  1. package apis
  2. import (
  3. "fmt"
  4. "runtime"
  5. "strconv"
  6. "strings"
  7. "time"
  8. "github.com/shirou/gopsutil/v3/net"
  9. "IotAdmin/core/sdk/api"
  10. "IotAdmin/core/sdk/pkg"
  11. _ "IotAdmin/core/sdk/pkg/response"
  12. "github.com/gin-gonic/gin"
  13. "github.com/shirou/gopsutil/v3/cpu"
  14. "github.com/shirou/gopsutil/v3/disk"
  15. "github.com/shirou/gopsutil/v3/host"
  16. "github.com/shirou/gopsutil/v3/mem"
  17. )
  18. const (
  19. B = 1
  20. KB = 1024 * B
  21. MB = 1024 * KB
  22. GB = 1024 * MB
  23. )
  24. var (
  25. //Version string
  26. //expectDiskFsTypes = []string{
  27. // "apfs", "ext4", "ext3", "ext2", "f2fs", "reiserfs", "jfs", "btrfs",
  28. // "fuseblk", "zfs", "simfs", "ntfs", "fat32", "exfat", "xfs", "fuse.rclone",
  29. //}
  30. excludeNetInterfaces = []string{
  31. "lo", "tun", "docker", "veth", "br-", "vmbr", "vnet", "kube",
  32. }
  33. //getMacDiskNo = regexp.MustCompile(`\/dev\/disk(\d)s.*`)
  34. )
  35. var (
  36. netInSpeed, netOutSpeed, netInTransfer, netOutTransfer, lastUpdateNetStats uint64
  37. cachedBootTime time.Time
  38. )
  39. type ServerMonitorApi struct {
  40. api.Api
  41. }
  42. // GetHourDiffer 获取相差时间
  43. func GetHourDiffer(startTime, endTime string) int64 {
  44. var hour int64
  45. t1, err := time.ParseInLocation("2006-01-02 15:04:05", startTime, time.Local)
  46. t2, err := time.ParseInLocation("2006-01-02 15:04:05", endTime, time.Local)
  47. if err == nil && t1.Before(t2) {
  48. diff := t2.Unix() - t1.Unix() //
  49. hour = diff / 3600
  50. return hour
  51. } else {
  52. return hour
  53. }
  54. }
  55. // ServerInfo 获取系统服务信息
  56. // @Summary 获取系统服务系统信息
  57. // @Description 获取JSON
  58. // @Tags 系統接口/系统服务监控
  59. // @Success 200 {object} response.Response "{"code": 200, "data": [...]}"
  60. // @Router /api/sys/server-monitor [get]
  61. // @Security Bearer
  62. func (e ServerMonitorApi) ServerInfo(c *gin.Context) {
  63. e.Context = c
  64. sysInfo, err := host.Info()
  65. osDic := make(map[string]interface{}, 0)
  66. osDic["goOs"] = runtime.GOOS
  67. osDic["arch"] = runtime.GOARCH
  68. osDic["mem"] = runtime.MemProfileRate
  69. osDic["compiler"] = runtime.Compiler
  70. osDic["version"] = runtime.Version()
  71. osDic["numGoroutine"] = runtime.NumGoroutine()
  72. osDic["ip"] = pkg.GetLocalHost()
  73. osDic["projectDir"] = pkg.GetCurrentPath()
  74. osDic["hostName"] = sysInfo.Hostname
  75. osDic["time"] = time.Now().Format("2006-01-02 15:04:05")
  76. memory, _ := mem.VirtualMemory()
  77. memDic := make(map[string]interface{}, 0)
  78. memDic["used"] = memory.Used / MB
  79. memDic["total"] = memory.Total / MB
  80. fmt.Println("mem", int(memory.Total/memory.Used*100))
  81. memDic["percent"] = pkg.Round(memory.UsedPercent, 2)
  82. swapDic := make(map[string]interface{}, 0)
  83. swapDic["used"] = memory.SwapTotal - memory.SwapFree
  84. swapDic["total"] = memory.SwapTotal
  85. cpuDic := make(map[string]interface{}, 0)
  86. cpuDic["cpuInfo"], _ = cpu.Info()
  87. percent, _ := cpu.Percent(0, false)
  88. cpuDic["percent"] = pkg.Round(percent[0], 2)
  89. cpuDic["cpuNum"], _ = cpu.Counts(false)
  90. //服务器磁盘信息
  91. disklist := make([]disk.UsageStat, 0)
  92. //所有分区
  93. var diskTotal, diskUsed, diskUsedPercent float64
  94. diskInfo, err := disk.Partitions(true)
  95. if err == nil {
  96. for _, p := range diskInfo {
  97. diskDetail, err := disk.Usage(p.Mountpoint)
  98. if err == nil {
  99. diskDetail.UsedPercent, _ = strconv.ParseFloat(fmt.Sprintf("%.2f", diskDetail.UsedPercent), 64)
  100. diskDetail.Total = diskDetail.Total / 1024 / 1024
  101. diskDetail.Used = diskDetail.Used / 1024 / 1024
  102. diskDetail.Free = diskDetail.Free / 1024 / 1024
  103. disklist = append(disklist, *diskDetail)
  104. }
  105. }
  106. }
  107. d, _ := disk.Usage("/")
  108. diskTotal = float64(d.Total / GB)
  109. diskUsed = float64(d.Used / GB)
  110. diskUsedPercent, _ = strconv.ParseFloat(fmt.Sprintf("%.2f", d.UsedPercent), 64)
  111. diskDic := make(map[string]interface{}, 0)
  112. diskDic["total"] = diskTotal
  113. diskDic["used"] = diskUsed
  114. diskDic["percent"] = diskUsedPercent
  115. bootTime, _ := host.BootTime()
  116. cachedBootTime = time.Unix(int64(bootTime), 0)
  117. TrackNetworkSpeed()
  118. netDic := make(map[string]interface{}, 0)
  119. netDic["in"] = pkg.Round(float64(netInSpeed/KB), 2)
  120. netDic["out"] = pkg.Round(float64(netOutSpeed/KB), 2)
  121. e.Custom(gin.H{
  122. "code": 200,
  123. "os": osDic,
  124. "mem": memDic,
  125. "cpu": cpuDic,
  126. "disk": diskDic,
  127. "net": netDic,
  128. "swap": swapDic,
  129. "location": "Aliyun",
  130. "bootTime": GetHourDiffer(cachedBootTime.Format("2006-01-02 15:04:05"), time.Now().Format("2006-01-02 15:04:05")),
  131. })
  132. }
  133. func TrackNetworkSpeed() {
  134. var innerNetInTransfer, innerNetOutTransfer uint64
  135. nc, err := net.IOCounters(true)
  136. if err == nil {
  137. for _, v := range nc {
  138. if isListContainsStr(excludeNetInterfaces, v.Name) {
  139. continue
  140. }
  141. innerNetInTransfer += v.BytesRecv
  142. innerNetOutTransfer += v.BytesSent
  143. }
  144. now := uint64(time.Now().Unix())
  145. diff := now - lastUpdateNetStats
  146. if diff > 0 {
  147. netInSpeed = (innerNetInTransfer - netInTransfer) / diff
  148. fmt.Println("netInSpeed", netInSpeed)
  149. netOutSpeed = (innerNetOutTransfer - netOutTransfer) / diff
  150. fmt.Println("netOutSpeed", netOutSpeed)
  151. }
  152. netInTransfer = innerNetInTransfer
  153. netOutTransfer = innerNetOutTransfer
  154. lastUpdateNetStats = now
  155. }
  156. }
  157. func isListContainsStr(list []string, str string) bool {
  158. for i := 0; i < len(list); i++ {
  159. if strings.Contains(str, list[i]) {
  160. return true
  161. }
  162. }
  163. return false
  164. }