187 lines
		
	
	
		
			5.1 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
		
		
			
		
	
	
			187 lines
		
	
	
		
			5.1 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
| 
								 | 
							
								package apis
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								import (
							 | 
						||
| 
								 | 
							
									"fmt"
							 | 
						||
| 
								 | 
							
									"github.com/shirou/gopsutil/v3/net"
							 | 
						||
| 
								 | 
							
									"runtime"
							 | 
						||
| 
								 | 
							
									"strconv"
							 | 
						||
| 
								 | 
							
									"strings"
							 | 
						||
| 
								 | 
							
									"time"
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									"github.com/gin-gonic/gin"
							 | 
						||
| 
								 | 
							
									"github.com/go-admin-team/go-admin-core/sdk/api"
							 | 
						||
| 
								 | 
							
									"github.com/go-admin-team/go-admin-core/sdk/pkg"
							 | 
						||
| 
								 | 
							
									_ "github.com/go-admin-team/go-admin-core/sdk/pkg/response"
							 | 
						||
| 
								 | 
							
									"github.com/shirou/gopsutil/v3/cpu"
							 | 
						||
| 
								 | 
							
									"github.com/shirou/gopsutil/v3/disk"
							 | 
						||
| 
								 | 
							
									"github.com/shirou/gopsutil/v3/host"
							 | 
						||
| 
								 | 
							
									"github.com/shirou/gopsutil/v3/mem"
							 | 
						||
| 
								 | 
							
								)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								const (
							 | 
						||
| 
								 | 
							
									B  = 1
							 | 
						||
| 
								 | 
							
									KB = 1024 * B
							 | 
						||
| 
								 | 
							
									MB = 1024 * KB
							 | 
						||
| 
								 | 
							
									GB = 1024 * MB
							 | 
						||
| 
								 | 
							
								)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								var (
							 | 
						||
| 
								 | 
							
									//Version           string
							 | 
						||
| 
								 | 
							
									//expectDiskFsTypes = []string{
							 | 
						||
| 
								 | 
							
									//	"apfs", "ext4", "ext3", "ext2", "f2fs", "reiserfs", "jfs", "btrfs",
							 | 
						||
| 
								 | 
							
									//	"fuseblk", "zfs", "simfs", "ntfs", "fat32", "exfat", "xfs", "fuse.rclone",
							 | 
						||
| 
								 | 
							
									//}
							 | 
						||
| 
								 | 
							
									excludeNetInterfaces = []string{
							 | 
						||
| 
								 | 
							
										"lo", "tun", "docker", "veth", "br-", "vmbr", "vnet", "kube",
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
									//getMacDiskNo = regexp.MustCompile(`\/dev\/disk(\d)s.*`)
							 | 
						||
| 
								 | 
							
								)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								var (
							 | 
						||
| 
								 | 
							
									netInSpeed, netOutSpeed, netInTransfer, netOutTransfer, lastUpdateNetStats uint64
							 | 
						||
| 
								 | 
							
									cachedBootTime                                                             time.Time
							 | 
						||
| 
								 | 
							
								)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								type ServerMonitor struct {
							 | 
						||
| 
								 | 
							
									api.Api
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								// GetHourDiffer 获取相差时间
							 | 
						||
| 
								 | 
							
								func GetHourDiffer(startTime, endTime string) int64 {
							 | 
						||
| 
								 | 
							
									var hour int64
							 | 
						||
| 
								 | 
							
									t1, err := time.ParseInLocation("2006-01-02 15:04:05", startTime, time.Local)
							 | 
						||
| 
								 | 
							
									t2, err := time.ParseInLocation("2006-01-02 15:04:05", endTime, time.Local)
							 | 
						||
| 
								 | 
							
									if err == nil && t1.Before(t2) {
							 | 
						||
| 
								 | 
							
										diff := t2.Unix() - t1.Unix() //
							 | 
						||
| 
								 | 
							
										hour = diff / 3600
							 | 
						||
| 
								 | 
							
										return hour
							 | 
						||
| 
								 | 
							
									} else {
							 | 
						||
| 
								 | 
							
										return hour
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								// ServerInfo 获取系统信息
							 | 
						||
| 
								 | 
							
								// @Summary 系统信息
							 | 
						||
| 
								 | 
							
								// @Description 获取JSON
							 | 
						||
| 
								 | 
							
								// @Tags 系统信息
							 | 
						||
| 
								 | 
							
								// @Success 200 {object} response.Response "{"code": 200, "data": [...]}"
							 | 
						||
| 
								 | 
							
								// @Router /api/v1/server-monitor [get]
							 | 
						||
| 
								 | 
							
								// @Security Bearer
							 | 
						||
| 
								 | 
							
								func (e ServerMonitor) ServerInfo(c *gin.Context) {
							 | 
						||
| 
								 | 
							
									e.Context = c
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									sysInfo, err := host.Info()
							 | 
						||
| 
								 | 
							
									osDic := make(map[string]interface{}, 0)
							 | 
						||
| 
								 | 
							
									osDic["goOs"] = runtime.GOOS
							 | 
						||
| 
								 | 
							
									osDic["arch"] = runtime.GOARCH
							 | 
						||
| 
								 | 
							
									osDic["mem"] = runtime.MemProfileRate
							 | 
						||
| 
								 | 
							
									osDic["compiler"] = runtime.Compiler
							 | 
						||
| 
								 | 
							
									osDic["version"] = runtime.Version()
							 | 
						||
| 
								 | 
							
									osDic["numGoroutine"] = runtime.NumGoroutine()
							 | 
						||
| 
								 | 
							
									osDic["ip"] = pkg.GetLocaHonst()
							 | 
						||
| 
								 | 
							
									osDic["projectDir"] = pkg.GetCurrentPath()
							 | 
						||
| 
								 | 
							
									osDic["hostName"] = sysInfo.Hostname
							 | 
						||
| 
								 | 
							
									osDic["time"] = time.Now().Format("2006-01-02 15:04:05")
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									memory, _ := mem.VirtualMemory()
							 | 
						||
| 
								 | 
							
									memDic := make(map[string]interface{}, 0)
							 | 
						||
| 
								 | 
							
									memDic["used"] = memory.Used / MB
							 | 
						||
| 
								 | 
							
									memDic["total"] = memory.Total / MB
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									fmt.Println("mem", int(memory.Total/memory.Used*100))
							 | 
						||
| 
								 | 
							
									memDic["percent"] = pkg.Round(memory.UsedPercent, 2)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									swapDic := make(map[string]interface{}, 0)
							 | 
						||
| 
								 | 
							
									swapDic["used"] = memory.SwapTotal - memory.SwapFree
							 | 
						||
| 
								 | 
							
									swapDic["total"] = memory.SwapTotal
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									cpuDic := make(map[string]interface{}, 0)
							 | 
						||
| 
								 | 
							
									cpuDic["cpuInfo"], _ = cpu.Info()
							 | 
						||
| 
								 | 
							
									percent, _ := cpu.Percent(0, false)
							 | 
						||
| 
								 | 
							
									cpuDic["percent"] = pkg.Round(percent[0], 2)
							 | 
						||
| 
								 | 
							
									cpuDic["cpuNum"], _ = cpu.Counts(false)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									//服务器磁盘信息
							 | 
						||
| 
								 | 
							
									disklist := make([]disk.UsageStat, 0)
							 | 
						||
| 
								 | 
							
									//所有分区
							 | 
						||
| 
								 | 
							
									var diskTotal, diskUsed, diskUsedPercent float64
							 | 
						||
| 
								 | 
							
									diskInfo, err := disk.Partitions(true)
							 | 
						||
| 
								 | 
							
									if err == nil {
							 | 
						||
| 
								 | 
							
										for _, p := range diskInfo {
							 | 
						||
| 
								 | 
							
											diskDetail, err := disk.Usage(p.Mountpoint)
							 | 
						||
| 
								 | 
							
											if err == nil {
							 | 
						||
| 
								 | 
							
												diskDetail.UsedPercent, _ = strconv.ParseFloat(fmt.Sprintf("%.2f", diskDetail.UsedPercent), 64)
							 | 
						||
| 
								 | 
							
												diskDetail.Total = diskDetail.Total / 1024 / 1024
							 | 
						||
| 
								 | 
							
												diskDetail.Used = diskDetail.Used / 1024 / 1024
							 | 
						||
| 
								 | 
							
												diskDetail.Free = diskDetail.Free / 1024 / 1024
							 | 
						||
| 
								 | 
							
												disklist = append(disklist, *diskDetail)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
											}
							 | 
						||
| 
								 | 
							
										}
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									d, _ := disk.Usage("/")
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									diskTotal = float64(d.Total / GB)
							 | 
						||
| 
								 | 
							
									diskUsed = float64(d.Used / GB)
							 | 
						||
| 
								 | 
							
									diskUsedPercent, _ = strconv.ParseFloat(fmt.Sprintf("%.2f", d.UsedPercent), 64)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									diskDic := make(map[string]interface{}, 0)
							 | 
						||
| 
								 | 
							
									diskDic["total"] = diskTotal
							 | 
						||
| 
								 | 
							
									diskDic["used"] = diskUsed
							 | 
						||
| 
								 | 
							
									diskDic["percent"] = diskUsedPercent
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									bootTime, _ := host.BootTime()
							 | 
						||
| 
								 | 
							
									cachedBootTime = time.Unix(int64(bootTime), 0)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									TrackNetworkSpeed()
							 | 
						||
| 
								 | 
							
									netDic := make(map[string]interface{}, 0)
							 | 
						||
| 
								 | 
							
									netDic["in"] = pkg.Round(float64(netInSpeed/KB), 2)
							 | 
						||
| 
								 | 
							
									netDic["out"] = pkg.Round(float64(netOutSpeed/KB), 2)
							 | 
						||
| 
								 | 
							
									e.Custom(gin.H{
							 | 
						||
| 
								 | 
							
										"code":     200,
							 | 
						||
| 
								 | 
							
										"os":       osDic,
							 | 
						||
| 
								 | 
							
										"mem":      memDic,
							 | 
						||
| 
								 | 
							
										"cpu":      cpuDic,
							 | 
						||
| 
								 | 
							
										"disk":     diskDic,
							 | 
						||
| 
								 | 
							
										"net":      netDic,
							 | 
						||
| 
								 | 
							
										"swap":     swapDic,
							 | 
						||
| 
								 | 
							
										"location": "Aliyun",
							 | 
						||
| 
								 | 
							
										"bootTime": GetHourDiffer(cachedBootTime.Format("2006-01-02 15:04:05"), time.Now().Format("2006-01-02 15:04:05")),
							 | 
						||
| 
								 | 
							
									})
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								func TrackNetworkSpeed() {
							 | 
						||
| 
								 | 
							
									var innerNetInTransfer, innerNetOutTransfer uint64
							 | 
						||
| 
								 | 
							
									nc, err := net.IOCounters(true)
							 | 
						||
| 
								 | 
							
									if err == nil {
							 | 
						||
| 
								 | 
							
										for _, v := range nc {
							 | 
						||
| 
								 | 
							
											if isListContainsStr(excludeNetInterfaces, v.Name) {
							 | 
						||
| 
								 | 
							
												continue
							 | 
						||
| 
								 | 
							
											}
							 | 
						||
| 
								 | 
							
											innerNetInTransfer += v.BytesRecv
							 | 
						||
| 
								 | 
							
											innerNetOutTransfer += v.BytesSent
							 | 
						||
| 
								 | 
							
										}
							 | 
						||
| 
								 | 
							
										now := uint64(time.Now().Unix())
							 | 
						||
| 
								 | 
							
										diff := now - lastUpdateNetStats
							 | 
						||
| 
								 | 
							
										if diff > 0 {
							 | 
						||
| 
								 | 
							
											netInSpeed = (innerNetInTransfer - netInTransfer) / diff
							 | 
						||
| 
								 | 
							
											fmt.Println("netInSpeed", netInSpeed)
							 | 
						||
| 
								 | 
							
											netOutSpeed = (innerNetOutTransfer - netOutTransfer) / diff
							 | 
						||
| 
								 | 
							
											fmt.Println("netOutSpeed", netOutSpeed)
							 | 
						||
| 
								 | 
							
										}
							 | 
						||
| 
								 | 
							
										netInTransfer = innerNetInTransfer
							 | 
						||
| 
								 | 
							
										netOutTransfer = innerNetOutTransfer
							 | 
						||
| 
								 | 
							
										lastUpdateNetStats = now
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								func isListContainsStr(list []string, str string) bool {
							 | 
						||
| 
								 | 
							
									for i := 0; i < len(list); i++ {
							 | 
						||
| 
								 | 
							
										if strings.Contains(str, list[i]) {
							 | 
						||
| 
								 | 
							
											return true
							 | 
						||
| 
								 | 
							
										}
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
									return false
							 | 
						||
| 
								 | 
							
								}
							 |