Răsfoiți Sursa

服务监控

wilgx0 4 ani în urmă
părinte
comite
896cc88e44

+ 11 - 0
api/v1/system/sys_monitor.go

@@ -0,0 +1,11 @@
+package system
+
+import (
+	"github.com/gogf/gf/v2/frame/g"
+)
+
+type MonitorSearchReq struct {
+	g.Meta `path:"/monitor/server" tags:"服务监控" method:"get" summary:"服务监控"`
+}
+
+type MonitorSearchRes g.Map

+ 3 - 0
go.mod

@@ -10,8 +10,11 @@ require (
 	github.com/mattn/go-colorable v0.1.12 // indirect
 	github.com/mojocn/base64Captcha v1.3.5
 	github.com/mssola/user_agent v0.5.3
+	github.com/shirou/gopsutil v3.21.11+incompatible
 	github.com/tiger1103/gfast-cache v0.0.7
 	github.com/tiger1103/gfast-token v0.0.9
+	github.com/tklauser/go-sysconf v0.3.10 // indirect
+	github.com/yusufpapurcu/wmi v1.2.2 // indirect
 	go.opentelemetry.io/otel/sdk v1.6.1 // indirect
 	golang.org/x/sys v0.0.0-20220330033206-e17cdc41300f // indirect
 )

+ 12 - 0
go.sum

@@ -28,6 +28,8 @@ github.com/go-logr/logr v1.2.3 h1:2DntVwHkVopvECVRSlL5PSo9eG+cAkDCuckLubN+rq0=
 github.com/go-logr/logr v1.2.3/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=
 github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag=
 github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE=
+github.com/go-ole/go-ole v1.2.6 h1:/Fpf6oFPoeFik9ty7siob0G6Ke8QvQEuVcuChpwXzpY=
+github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0=
 github.com/go-redis/redis/v8 v8.11.4/go.mod h1:2Z2wHZXdQpCDXEGzqMockDpNyYvi2l4Pxt6RJr792+w=
 github.com/go-redis/redis/v8 v8.11.5 h1:AcZZR7igkdvfVmQTPnu9WE37LRrO/YrBH5zWyjDC0oI=
 github.com/go-redis/redis/v8 v8.11.5/go.mod h1:gREzHqY1hg6oD9ngVRbLStwAWKhA0FEgq8Jd4h5lpwo=
@@ -105,6 +107,8 @@ github.com/onsi/gomega v1.18.1 h1:M1GfJqGRrBrrGGsbxzV5dqM2U2ApXefZCQpkukxYRLE=
 github.com/onsi/gomega v1.18.1/go.mod h1:0q+aL8jAiMXy9hbwj2mr5GziHiwhAIQpFmmtT5hitRs=
 github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
 github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
+github.com/shirou/gopsutil v3.21.11+incompatible h1:+1+c1VGhc88SSonWP6foOcLhvnKlUeu/erjjvaPEYiI=
+github.com/shirou/gopsutil v3.21.11+incompatible/go.mod h1:5b4v6he4MtMOwMlS0TUMTu2PcXUg8+E1lC7eC3UO/RA=
 github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
 github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA=
 github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
@@ -114,8 +118,14 @@ github.com/tiger1103/gfast-cache v0.0.7 h1:YRuSFxFdvNlIsHAndS7XjYRLd4tmXGWhvHt9r
 github.com/tiger1103/gfast-cache v0.0.7/go.mod h1:s6cRWyr87wz6IJNGKRV6Ahq9hcuVz8h2PAtGrO66JO8=
 github.com/tiger1103/gfast-token v0.0.9 h1:+cKNu4zAMZpqaeILy3QIjuEO0HQMXtMSqVGPmhKAP90=
 github.com/tiger1103/gfast-token v0.0.9/go.mod h1:RnVRqmWD3h4qfTU1vJNXNhQjh2L5ht1vxLnjwShwGuY=
+github.com/tklauser/go-sysconf v0.3.10 h1:IJ1AZGZRWbY8T5Vfk04D9WOA5WSejdflXxP03OUqALw=
+github.com/tklauser/go-sysconf v0.3.10/go.mod h1:C8XykCvCb+Gn0oNCWPIlcb0RuglQTYaQ2hGm7jmxEFk=
+github.com/tklauser/numcpus v0.4.0 h1:E53Dm1HjH1/R2/aoCtXtPgzmElmn51aOkhCFSuZq//o=
+github.com/tklauser/numcpus v0.4.0/go.mod h1:1+UI3pD8NW14VMwdgJNJ1ESk2UnwhAnz5hMwiKKqXCQ=
 github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
 github.com/yuin/goldmark v1.4.0/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=
+github.com/yusufpapurcu/wmi v1.2.2 h1:KBNDSne4vP5mbSWnJbO+51IMOXJB67QiYCSBrubbPRg=
+github.com/yusufpapurcu/wmi v1.2.2/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0=
 go.opentelemetry.io/otel v1.0.0/go.mod h1:AjRVh9A5/5DE7S+mZtTR6t8vpKKryam+0lREnfmS4cg=
 go.opentelemetry.io/otel v1.6.1 h1:6r1YrcTenBvYa1x491d0GGpTVBsNECmrc/K6b+zDeis=
 go.opentelemetry.io/otel v1.6.1/go.mod h1:blzUabWHkX6LJewxvadmzafgh/wnvBSDBdOuwkAtrWQ=
@@ -150,6 +160,7 @@ golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5h
 golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
 golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
@@ -165,6 +176,7 @@ golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBc
 golang.org/x/sys v0.0.0-20210809222454-d867a43fc93e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.0.0-20220128215802-99c3d69c2c27/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/sys v0.0.0-20220330033206-e17cdc41300f h1:rlezHXNlxYWvBCzNses9Dlc7nGFaNMJeqLolcmQSSZY=
 golang.org/x/sys v0.0.0-20220330033206-e17cdc41300f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=

+ 142 - 0
internal/app/system/controller/sys_monitor.go

@@ -0,0 +1,142 @@
+package controller
+
+import (
+	"context"
+	"fmt"
+	"github.com/gogf/gf/v2/os/gtime"
+	"github.com/gogf/gf/v2/util/gconv"
+	"github.com/shirou/gopsutil/cpu"
+	"github.com/shirou/gopsutil/disk"
+	"github.com/shirou/gopsutil/host"
+	"github.com/shirou/gopsutil/load"
+	"github.com/shirou/gopsutil/mem"
+	"github.com/tiger1103/gfast/v3/api/v1/system"
+	"github.com/tiger1103/gfast/v3/library/libUtils"
+	"os"
+	"runtime"
+	"strconv"
+	"time"
+)
+
+var Monitor = &sysMonitorController{
+	startTime: gtime.Now(),
+}
+
+type sysMonitorController struct {
+	BaseController
+	startTime *gtime.Time
+}
+
+func (c *sysMonitorController) List(ctx context.Context, req *system.MonitorSearchReq) (res *system.MonitorSearchRes, err error) {
+	cpuNum := runtime.NumCPU() //核心数
+	var cpuUsed float64 = 0    //用户使用率
+	var cpuAvg5 float64 = 0    //CPU负载5
+	var cpuAvg15 float64 = 0   //当前空闲率
+
+	cpuInfo, err := cpu.Percent(time.Duration(time.Second), false)
+	if err == nil {
+		cpuUsed, _ = strconv.ParseFloat(fmt.Sprintf("%.2f", cpuInfo[0]), 64)
+	}
+
+	loadInfo, err := load.Avg()
+	if err == nil {
+		cpuAvg5, _ = strconv.ParseFloat(fmt.Sprintf("%.2f", loadInfo.Load5), 64)
+		cpuAvg15, _ = strconv.ParseFloat(fmt.Sprintf("%.2f", loadInfo.Load5), 64)
+	}
+
+	var memTotal uint64 = 0  //总内存
+	var memUsed uint64 = 0   //总内存  := 0 //已用内存
+	var memFree uint64 = 0   //剩余内存
+	var memUsage float64 = 0 //使用率
+
+	v, err := mem.VirtualMemory()
+	if err == nil {
+		memTotal = v.Total
+		memUsed = v.Used
+		memFree = memTotal - memUsed
+		memUsage, _ = strconv.ParseFloat(fmt.Sprintf("%.2f", v.UsedPercent), 64)
+	}
+
+	var goTotal uint64 = 0  //go分配的总内存数
+	var goUsed uint64 = 0   //go使用的内存数
+	var goFree uint64 = 0   //go剩余的内存数
+	var goUsage float64 = 0 //使用率
+
+	var gomem runtime.MemStats
+	runtime.ReadMemStats(&gomem)
+	goUsed = gomem.Sys
+	goUsage = gconv.Float64(fmt.Sprintf("%.2f", gconv.Float64(goUsed)/gconv.Float64(memTotal)*100))
+	sysComputerIp := "" //服务器IP
+
+	ip, err := libUtils.GetLocalIP()
+	if err == nil {
+		sysComputerIp = ip
+	}
+
+	sysComputerName := "" //服务器名称
+	sysOsName := ""       //操作系统
+	sysOsArch := ""       //系统架构
+
+	sysInfo, err := host.Info()
+
+	if err == nil {
+		sysComputerName = sysInfo.Hostname
+		sysOsName = sysInfo.OS
+		sysOsArch = sysInfo.KernelArch
+	}
+
+	goName := "GoLang"             //语言环境
+	goVersion := runtime.Version() //版本
+	gtime.Date()
+	goStartTime := c.startTime //启动时间
+
+	goRunTime := gtime.Now().Timestamp() - c.startTime.Timestamp() //运行时长(秒)
+	goHome := runtime.GOROOT()                                     //安装路径
+	goUserDir := ""                                                //项目路径
+
+	curDir, err := os.Getwd()
+
+	if err == nil {
+		goUserDir = curDir
+	}
+
+	//服务器磁盘信息
+	diskList := make([]disk.UsageStat, 0)
+	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)
+				diskList = append(diskList, *diskDetail)
+			}
+		}
+	}
+	res = new(system.MonitorSearchRes)
+	*res = system.MonitorSearchRes{
+		"cpuNum":          cpuNum,
+		"cpuUsed":         cpuUsed,
+		"cpuAvg5":         cpuAvg5,
+		"cpuAvg15":        cpuAvg15,
+		"memTotal":        memTotal,
+		"goTotal":         goTotal,
+		"memUsed":         memUsed,
+		"goUsed":          goUsed,
+		"memFree":         memFree,
+		"goFree":          goFree,
+		"memUsage":        memUsage,
+		"goUsage":         goUsage,
+		"sysComputerName": sysComputerName,
+		"sysOsName":       sysOsName,
+		"sysComputerIp":   sysComputerIp,
+		"sysOsArch":       sysOsArch,
+		"goName":          goName,
+		"goVersion":       goVersion,
+		"goStartTime":     goStartTime,
+		"goRunTime":       goRunTime,
+		"goHome":          goHome,
+		"goUserDir":       goUserDir,
+		"diskList":        diskList,
+	}
+	return
+}

+ 1 - 0
internal/app/system/router/router.go

@@ -30,6 +30,7 @@ func BindController(group *ghttp.RouterGroup) {
 			controller.DictType,
 			controller.DictData,
 			controller.Config,
+			controller.Monitor,
 		)
 	})
 }