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
|
|
}
|