feat: 服务器资源监控信息
This commit is contained in:
57
src/modules/monitor/controller/monitor.go
Normal file
57
src/modules/monitor/controller/monitor.go
Normal file
@@ -0,0 +1,57 @@
|
|||||||
|
package controller
|
||||||
|
|
||||||
|
import (
|
||||||
|
"ems.agt/src/framework/vo/result"
|
||||||
|
"ems.agt/src/modules/monitor/service"
|
||||||
|
|
||||||
|
"github.com/gin-gonic/gin"
|
||||||
|
)
|
||||||
|
|
||||||
|
// 实例化控制层 MonitorInfoController 结构体
|
||||||
|
var NewMonitor = &MonitorController{
|
||||||
|
monitorService: service.NewMonitorImpl,
|
||||||
|
}
|
||||||
|
|
||||||
|
// 服务器资源监控信息
|
||||||
|
//
|
||||||
|
// PATH /monitor
|
||||||
|
type MonitorController struct {
|
||||||
|
// 服务器系统相关信息服务
|
||||||
|
monitorService service.IMonitor
|
||||||
|
}
|
||||||
|
|
||||||
|
// 资源监控信息加载
|
||||||
|
//
|
||||||
|
// GET /load
|
||||||
|
func (s *MonitorController) Load(c *gin.Context) {
|
||||||
|
var querys struct {
|
||||||
|
// 数据类型all/cpu/memory/io/network
|
||||||
|
Type string `form:"type" binding:"required,oneof=all cpu memory io network"`
|
||||||
|
// 开始时间
|
||||||
|
StartTime int64 `form:"startTime" binding:"required"`
|
||||||
|
// 结束时间
|
||||||
|
EndTime int64 `form:"endTime" binding:"required"`
|
||||||
|
// 网元类型
|
||||||
|
NeType string `form:"neType"`
|
||||||
|
// 网元ID
|
||||||
|
NeID string `form:"neId"`
|
||||||
|
// 名称,networ和iok时有效
|
||||||
|
Name string `form:"name"`
|
||||||
|
}
|
||||||
|
err := c.ShouldBindQuery(&querys)
|
||||||
|
if err != nil {
|
||||||
|
c.JSON(400, result.CodeMsg(400, "参数错误"))
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
// 查询数据
|
||||||
|
data := s.monitorService.SelectMonitorInfo(map[string]any{
|
||||||
|
"type": querys.Type,
|
||||||
|
"startTime": querys.StartTime,
|
||||||
|
"endTime": querys.EndTime,
|
||||||
|
"neType": querys.NeType,
|
||||||
|
"neId": querys.NeID,
|
||||||
|
"name": querys.Name,
|
||||||
|
})
|
||||||
|
c.JSON(200, result.OkData(data))
|
||||||
|
}
|
||||||
29
src/modules/monitor/model/monitor_base.go
Normal file
29
src/modules/monitor/model/monitor_base.go
Normal file
@@ -0,0 +1,29 @@
|
|||||||
|
package model
|
||||||
|
|
||||||
|
// MonitorBase 监控_基本信息 monitor_base
|
||||||
|
type MonitorBase struct {
|
||||||
|
// id
|
||||||
|
ID int64 `json:"id" gorm:"primaryKey"`
|
||||||
|
// 创建时间
|
||||||
|
CreateTime int64 `json:"createTime"`
|
||||||
|
// cpu使用率
|
||||||
|
CPU float64 `json:"cpu"`
|
||||||
|
// cpu平均使用率
|
||||||
|
LoadUsage float64 `json:"loadUsage"`
|
||||||
|
// cpu使用1分钟
|
||||||
|
CPULoad1 float64 `json:"cpuLoad1"`
|
||||||
|
// cpu使用5分钟
|
||||||
|
CPULoad5 float64 `json:"cpuLoad5"`
|
||||||
|
// cpu使用15分钟
|
||||||
|
CPULoad15 float64 `json:"cpuLoad15"`
|
||||||
|
// 内存使用率
|
||||||
|
Memory float64 `json:"memory"`
|
||||||
|
// 网元ID
|
||||||
|
NeType string `json:"neType"`
|
||||||
|
// 网元类型
|
||||||
|
NeID string `json:"neId"`
|
||||||
|
}
|
||||||
|
|
||||||
|
func (MonitorBase) TableName() string {
|
||||||
|
return "monitor_base"
|
||||||
|
}
|
||||||
27
src/modules/monitor/model/monitor_io.go
Normal file
27
src/modules/monitor/model/monitor_io.go
Normal file
@@ -0,0 +1,27 @@
|
|||||||
|
package model
|
||||||
|
|
||||||
|
// MonitorIO 监控_磁盘IO monitor_io
|
||||||
|
type MonitorIO struct {
|
||||||
|
// id
|
||||||
|
ID int64 `json:"id" gorm:"primaryKey"`
|
||||||
|
// 创建时间
|
||||||
|
CreateTime int64 `json:"createTime"`
|
||||||
|
// 磁盘名
|
||||||
|
Name string `json:"name"`
|
||||||
|
// 读取K
|
||||||
|
Read int64 `json:"read"`
|
||||||
|
// 写入K
|
||||||
|
Write int64 `json:"write"`
|
||||||
|
// 次数
|
||||||
|
Count int64 `json:"count"`
|
||||||
|
// 耗时
|
||||||
|
Time int64 `json:"time"`
|
||||||
|
// 网元ID
|
||||||
|
NeType string `json:"neType"`
|
||||||
|
// 网元类型
|
||||||
|
NeID string `json:"neId"`
|
||||||
|
}
|
||||||
|
|
||||||
|
func (MonitorIO) TableName() string {
|
||||||
|
return "monitor_io"
|
||||||
|
}
|
||||||
23
src/modules/monitor/model/monitor_network.go
Normal file
23
src/modules/monitor/model/monitor_network.go
Normal file
@@ -0,0 +1,23 @@
|
|||||||
|
package model
|
||||||
|
|
||||||
|
// MonitorNetwork 监控_网络IO monitor_network
|
||||||
|
type MonitorNetwork struct {
|
||||||
|
// id
|
||||||
|
ID int64 `json:"id" gorm:"primaryKey"`
|
||||||
|
// 创建时间
|
||||||
|
CreateTime int64 `json:"createTime"`
|
||||||
|
// 网卡名
|
||||||
|
Name string `json:"name"`
|
||||||
|
// 上行
|
||||||
|
Up float64 `json:"up"`
|
||||||
|
// 下行
|
||||||
|
Down float64 `json:"down"`
|
||||||
|
// 网元ID
|
||||||
|
NeType string `json:"neType"`
|
||||||
|
// 网元类型
|
||||||
|
NeID string `json:"neId"`
|
||||||
|
}
|
||||||
|
|
||||||
|
func (MonitorNetwork) TableName() string {
|
||||||
|
return "monitor_network"
|
||||||
|
}
|
||||||
@@ -19,6 +19,15 @@ func Setup(router *gin.Engine) {
|
|||||||
// 启动时需要的初始参数
|
// 启动时需要的初始参数
|
||||||
InitLoad()
|
InitLoad()
|
||||||
|
|
||||||
|
// 服务器资源监控信息
|
||||||
|
monitorGroup := router.Group("/monitor")
|
||||||
|
{
|
||||||
|
monitorGroup.GET("/load",
|
||||||
|
// middleware.PreAuthorize(nil),
|
||||||
|
controller.NewMonitor.Load,
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
// 服务器服务信息
|
// 服务器服务信息
|
||||||
router.GET("/monitor/system-info",
|
router.GET("/monitor/system-info",
|
||||||
middleware.PreAuthorize(map[string][]string{"hasPerms": {"monitor:system:info"}}),
|
middleware.PreAuthorize(map[string][]string{"hasPerms": {"monitor:system:info"}}),
|
||||||
|
|||||||
33
src/modules/monitor/repository/monitor.go
Normal file
33
src/modules/monitor/repository/monitor.go
Normal file
@@ -0,0 +1,33 @@
|
|||||||
|
package repository
|
||||||
|
|
||||||
|
import "ems.agt/src/modules/monitor/model"
|
||||||
|
|
||||||
|
// IMonitor 监控服务资源相关信息 数据接口
|
||||||
|
type IMonitor interface {
|
||||||
|
// CreateMonitorBase 创建监控_基本信息
|
||||||
|
CreateMonitorBase(m model.MonitorBase) error
|
||||||
|
|
||||||
|
// DelMonitorBase 删除监控_基本信息
|
||||||
|
DelMonitorBase(ltTime int64) error
|
||||||
|
|
||||||
|
// SelectMonitorBase 查询监控_基本信息
|
||||||
|
SelectMonitorBase(query map[string]any) []model.MonitorBase
|
||||||
|
|
||||||
|
// BatchCreateMonitorIO 批量创建监控_IO
|
||||||
|
BatchCreateMonitorIO(ioList []model.MonitorIO) error
|
||||||
|
|
||||||
|
// DelMonitorIO 删除监控_IO
|
||||||
|
DelMonitorIO(ltTime int64) error
|
||||||
|
|
||||||
|
// SelectMonitorIO 查询监控_IO
|
||||||
|
SelectMonitorIO(query map[string]any) []model.MonitorIO
|
||||||
|
|
||||||
|
// BatchCreateMonitorNet 批量创建监控_网络
|
||||||
|
BatchCreateMonitorNet(netList []model.MonitorNetwork) error
|
||||||
|
|
||||||
|
// DelMonitorNet 删除监控_网络
|
||||||
|
DelMonitorNet(ltTime int64) error
|
||||||
|
|
||||||
|
// SelectMonitorNetwork 查询监控_网络
|
||||||
|
SelectMonitorNetwork(query map[string]any) []model.MonitorNetwork
|
||||||
|
}
|
||||||
103
src/modules/monitor/repository/monitor.impl.go
Normal file
103
src/modules/monitor/repository/monitor.impl.go
Normal file
@@ -0,0 +1,103 @@
|
|||||||
|
package repository
|
||||||
|
|
||||||
|
import (
|
||||||
|
"ems.agt/src/framework/datasource"
|
||||||
|
"ems.agt/src/framework/logger"
|
||||||
|
"ems.agt/src/modules/monitor/model"
|
||||||
|
"gorm.io/gorm"
|
||||||
|
)
|
||||||
|
|
||||||
|
// 实例化数据层 MonitorImpl 结构体
|
||||||
|
var NewMonitorImpl = &MonitorImpl{
|
||||||
|
db: datasource.DefaultDB,
|
||||||
|
}
|
||||||
|
|
||||||
|
// MonitorImpl 监控服务资源相关信息 数据层处理
|
||||||
|
type MonitorImpl struct {
|
||||||
|
// 数据库实例
|
||||||
|
db func() *gorm.DB
|
||||||
|
}
|
||||||
|
|
||||||
|
// CreateMonitorBase 创建监控_基本信息
|
||||||
|
func (r *MonitorImpl) CreateMonitorBase(m model.MonitorBase) error {
|
||||||
|
return r.db().Create(&m).Error
|
||||||
|
}
|
||||||
|
|
||||||
|
// DelMonitorBase 删除监控_基本信息
|
||||||
|
func (r *MonitorImpl) DelMonitorBase(ltTime int64) error {
|
||||||
|
return r.db().Where("create_time < ?", ltTime).Delete(&model.MonitorBase{}).Error
|
||||||
|
}
|
||||||
|
|
||||||
|
// SelectMonitorBase 查询监控_基本信息
|
||||||
|
func (r *MonitorImpl) SelectMonitorBase(query map[string]any) []model.MonitorBase {
|
||||||
|
var bases []model.MonitorBase
|
||||||
|
dbConn := r.db()
|
||||||
|
if query["neType"] != "" && query["neId"] != "" {
|
||||||
|
dbConn = dbConn.Where("ne_type = ? and ne_id = ?", query["neType"], query["neId"])
|
||||||
|
}
|
||||||
|
dbConn = dbConn.Where("create_time >= ? and create_time <= ?", query["startTime"], query["endTime"])
|
||||||
|
err := dbConn.Order("create_time desc").Find(&bases).Error
|
||||||
|
if err != nil {
|
||||||
|
logger.Errorf("SelectMonitorBase %v", err)
|
||||||
|
return bases
|
||||||
|
}
|
||||||
|
return bases
|
||||||
|
}
|
||||||
|
|
||||||
|
// BatchCreateMonitorIO 批量创建监控_IO
|
||||||
|
func (r *MonitorImpl) BatchCreateMonitorIO(ioList []model.MonitorIO) error {
|
||||||
|
return r.db().CreateInBatches(ioList, len(ioList)).Error
|
||||||
|
}
|
||||||
|
|
||||||
|
// DelMonitorIO 删除监控_IO
|
||||||
|
func (r *MonitorImpl) DelMonitorIO(ltTime int64) error {
|
||||||
|
return r.db().Where("create_time < ?", ltTime).Delete(&model.MonitorIO{}).Error
|
||||||
|
}
|
||||||
|
|
||||||
|
// SelectMonitorIO 查询监控_IO
|
||||||
|
func (r *MonitorImpl) SelectMonitorIO(query map[string]any) []model.MonitorIO {
|
||||||
|
var ios []model.MonitorIO
|
||||||
|
dbConn := r.db()
|
||||||
|
if query["name"] != "" {
|
||||||
|
dbConn = dbConn.Where("name = ?", query["name"])
|
||||||
|
}
|
||||||
|
if query["neType"] != "" && query["neId"] != "" {
|
||||||
|
dbConn = dbConn.Where("ne_type = ? and ne_id = ?", query["neType"], query["neId"])
|
||||||
|
}
|
||||||
|
dbConn = dbConn.Where("create_time >= ? and create_time <= ?", query["startTime"], query["endTime"])
|
||||||
|
err := dbConn.Order("create_time desc").Find(&ios).Error
|
||||||
|
if err != nil {
|
||||||
|
logger.Errorf("SelectMonitorIO %v", err)
|
||||||
|
return ios
|
||||||
|
}
|
||||||
|
return ios
|
||||||
|
}
|
||||||
|
|
||||||
|
// BatchCreateMonitorNet 批量创建监控_网络
|
||||||
|
func (r *MonitorImpl) BatchCreateMonitorNet(netList []model.MonitorNetwork) error {
|
||||||
|
return r.db().CreateInBatches(netList, len(netList)).Error
|
||||||
|
}
|
||||||
|
|
||||||
|
// DelMonitorNet 删除监控_网络
|
||||||
|
func (r *MonitorImpl) DelMonitorNet(ltTime int64) error {
|
||||||
|
return r.db().Where("create_time < ?", ltTime).Delete(&model.MonitorNetwork{}).Error
|
||||||
|
}
|
||||||
|
|
||||||
|
// SelectMonitorNetwork 查询监控_网络
|
||||||
|
func (r *MonitorImpl) SelectMonitorNetwork(query map[string]any) []model.MonitorNetwork {
|
||||||
|
var networks []model.MonitorNetwork
|
||||||
|
dbConn := r.db()
|
||||||
|
if query["name"] != "" {
|
||||||
|
dbConn = dbConn.Where("name = ?", query["name"])
|
||||||
|
}
|
||||||
|
if query["neType"] != "" && query["neId"] != "" {
|
||||||
|
dbConn = dbConn.Where("ne_type = ? and ne_id = ?", query["neType"], query["neId"])
|
||||||
|
}
|
||||||
|
dbConn = dbConn.Where("create_time >= ? and create_time <= ?", query["startTime"], query["endTime"])
|
||||||
|
err := dbConn.Order("create_time desc").Find(&networks).Error
|
||||||
|
if err != nil {
|
||||||
|
logger.Errorf("SelectMonitorNetwork %v", err)
|
||||||
|
return networks
|
||||||
|
}
|
||||||
|
return networks
|
||||||
|
}
|
||||||
14
src/modules/monitor/service/monitor.go
Normal file
14
src/modules/monitor/service/monitor.go
Normal file
@@ -0,0 +1,14 @@
|
|||||||
|
package service
|
||||||
|
|
||||||
|
// IMonitor 服务器系统相关信息 服务层接口
|
||||||
|
type IMonitor interface {
|
||||||
|
// RunMonitor 执行资源监控
|
||||||
|
RunMonitor()
|
||||||
|
|
||||||
|
// RunMonitorDataCancel 启动资源监控数据存储io/network通道 移除之前的chan上下文后在设置新的均值
|
||||||
|
// interval 采集的平均值(分钟)
|
||||||
|
RunMonitorDataCancel(removeBefore bool, interval float64)
|
||||||
|
|
||||||
|
// SelectMonitorInfo 查询监控资源信息
|
||||||
|
SelectMonitorInfo(query map[string]any) map[string]MonitorData
|
||||||
|
}
|
||||||
287
src/modules/monitor/service/monitor.impl.go
Normal file
287
src/modules/monitor/service/monitor.impl.go
Normal file
@@ -0,0 +1,287 @@
|
|||||||
|
package service
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
"strconv"
|
||||||
|
"time"
|
||||||
|
|
||||||
|
"ems.agt/src/framework/logger"
|
||||||
|
"ems.agt/src/modules/monitor/model"
|
||||||
|
"ems.agt/src/modules/monitor/repository"
|
||||||
|
systemService "ems.agt/src/modules/system/service"
|
||||||
|
"github.com/shirou/gopsutil/cpu"
|
||||||
|
"github.com/shirou/gopsutil/disk"
|
||||||
|
"github.com/shirou/gopsutil/load"
|
||||||
|
"github.com/shirou/gopsutil/net"
|
||||||
|
"github.com/shirou/gopsutil/v3/mem"
|
||||||
|
)
|
||||||
|
|
||||||
|
// 实例化服务层 MonitorImpl 结构体
|
||||||
|
var NewMonitorImpl = &MonitorImpl{
|
||||||
|
sysConfigService: systemService.NewSysConfigImpl,
|
||||||
|
monitorRepository: repository.NewMonitorImpl,
|
||||||
|
diskIO: make(chan []disk.IOCountersStat, 2),
|
||||||
|
netIO: make(chan []net.IOCountersStat, 2),
|
||||||
|
}
|
||||||
|
|
||||||
|
// MonitorImpl 服务器系统相关信息 服务层处理
|
||||||
|
type MonitorImpl struct {
|
||||||
|
// 参数配置服务
|
||||||
|
sysConfigService systemService.ISysConfig
|
||||||
|
// 监控服务资源数据信息
|
||||||
|
monitorRepository repository.IMonitor
|
||||||
|
// 磁盘网络IO 数据通道
|
||||||
|
diskIO chan ([]disk.IOCountersStat)
|
||||||
|
netIO chan ([]net.IOCountersStat)
|
||||||
|
}
|
||||||
|
|
||||||
|
// RunMonitor 执行资源监控
|
||||||
|
func (s *MonitorImpl) RunMonitor() {
|
||||||
|
var itemModel model.MonitorBase
|
||||||
|
itemModel.CreateTime = time.Now().UnixMilli()
|
||||||
|
totalPercent, _ := cpu.Percent(3*time.Second, false)
|
||||||
|
if len(totalPercent) == 1 {
|
||||||
|
itemModel.CPU = totalPercent[0]
|
||||||
|
}
|
||||||
|
cpuCount, _ := cpu.Counts(false)
|
||||||
|
|
||||||
|
loadInfo, _ := load.Avg()
|
||||||
|
itemModel.CPULoad1 = loadInfo.Load1
|
||||||
|
itemModel.CPULoad5 = loadInfo.Load5
|
||||||
|
itemModel.CPULoad15 = loadInfo.Load15
|
||||||
|
itemModel.LoadUsage = loadInfo.Load1 / (float64(cpuCount*2) * 0.75) * 100
|
||||||
|
|
||||||
|
memoryInfo, _ := mem.VirtualMemory()
|
||||||
|
itemModel.Memory = memoryInfo.UsedPercent
|
||||||
|
if err := s.monitorRepository.CreateMonitorBase(itemModel); err != nil {
|
||||||
|
logger.Errorf("CreateMonitorBase err: %v", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
// 将当前资源发送到chan中处理保存
|
||||||
|
s.loadDiskIO()
|
||||||
|
s.loadNetIO()
|
||||||
|
|
||||||
|
// 监控系统资源-保留天数
|
||||||
|
storeDays := s.sysConfigService.SelectConfigValueByKey("monitor.sysResource.storeDays")
|
||||||
|
if storeDays != "" {
|
||||||
|
storeDays, _ := strconv.Atoi(storeDays)
|
||||||
|
ltTime := time.Now().AddDate(0, 0, -storeDays).UnixMilli()
|
||||||
|
_ = s.monitorRepository.DelMonitorBase(ltTime)
|
||||||
|
_ = s.monitorRepository.DelMonitorIO(ltTime)
|
||||||
|
_ = s.monitorRepository.DelMonitorNet(ltTime)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *MonitorImpl) loadDiskIO() {
|
||||||
|
ioStat, _ := disk.IOCounters()
|
||||||
|
var diskIOList []disk.IOCountersStat
|
||||||
|
for _, io := range ioStat {
|
||||||
|
diskIOList = append(diskIOList, io)
|
||||||
|
}
|
||||||
|
s.diskIO <- diskIOList
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *MonitorImpl) loadNetIO() {
|
||||||
|
netStat, _ := net.IOCounters(true)
|
||||||
|
netStatAll, _ := net.IOCounters(false)
|
||||||
|
var netList []net.IOCountersStat
|
||||||
|
netList = append(netList, netStat...)
|
||||||
|
netList = append(netList, netStatAll...)
|
||||||
|
s.netIO <- netList
|
||||||
|
}
|
||||||
|
|
||||||
|
// monitorCancel 监控搜集IO/Network上下文
|
||||||
|
var monitorCancel context.CancelFunc
|
||||||
|
|
||||||
|
// RunMonitorDataCancel 启动资源监控数据存储io/network通道 移除之前的chan上下文后在设置新的均值
|
||||||
|
// interval 采集的平均值(分钟)
|
||||||
|
func (s *MonitorImpl) RunMonitorDataCancel(removeBefore bool, interval float64) {
|
||||||
|
// 是否取消之前的
|
||||||
|
if removeBefore {
|
||||||
|
monitorCancel()
|
||||||
|
}
|
||||||
|
|
||||||
|
// 上下文控制
|
||||||
|
ctx, cancel := context.WithCancel(context.Background())
|
||||||
|
monitorCancel = cancel
|
||||||
|
|
||||||
|
// chanl 通道进行存储数据
|
||||||
|
go s.saveIODataToDB(ctx, interval)
|
||||||
|
go s.saveNetDataToDB(ctx, interval)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *MonitorImpl) saveIODataToDB(ctx context.Context, interval float64) {
|
||||||
|
defer close(s.diskIO)
|
||||||
|
for {
|
||||||
|
select {
|
||||||
|
case <-ctx.Done():
|
||||||
|
return
|
||||||
|
case ioStat := <-s.diskIO:
|
||||||
|
select {
|
||||||
|
case <-ctx.Done():
|
||||||
|
return
|
||||||
|
case ioStat2 := <-s.diskIO:
|
||||||
|
var ioList []model.MonitorIO
|
||||||
|
timeMilli := time.Now().UnixMilli()
|
||||||
|
for _, io2 := range ioStat2 {
|
||||||
|
for _, io1 := range ioStat {
|
||||||
|
if io2.Name == io1.Name {
|
||||||
|
var itemIO model.MonitorIO
|
||||||
|
itemIO.CreateTime = timeMilli
|
||||||
|
itemIO.Name = io1.Name
|
||||||
|
if io2.ReadBytes != 0 && io1.ReadBytes != 0 && io2.ReadBytes > io1.ReadBytes {
|
||||||
|
itemIO.Read = int64(float64(io2.ReadBytes-io1.ReadBytes) / interval / 60)
|
||||||
|
}
|
||||||
|
if io2.WriteBytes != 0 && io1.WriteBytes != 0 && io2.WriteBytes > io1.WriteBytes {
|
||||||
|
itemIO.Write = int64(float64(io2.WriteBytes-io1.WriteBytes) / interval / 60)
|
||||||
|
}
|
||||||
|
|
||||||
|
if io2.ReadCount != 0 && io1.ReadCount != 0 && io2.ReadCount > io1.ReadCount {
|
||||||
|
itemIO.Count = int64(float64(io2.ReadCount-io1.ReadCount) / interval / 60)
|
||||||
|
}
|
||||||
|
writeCount := int64(0)
|
||||||
|
if io2.WriteCount != 0 && io1.WriteCount != 0 && io2.WriteCount > io1.WriteCount {
|
||||||
|
writeCount = int64(float64(io2.WriteCount-io1.WriteCount) / interval * 60)
|
||||||
|
}
|
||||||
|
if writeCount > itemIO.Count {
|
||||||
|
itemIO.Count = writeCount
|
||||||
|
}
|
||||||
|
|
||||||
|
if io2.ReadTime != 0 && io1.ReadTime != 0 && io2.ReadTime > io1.ReadTime {
|
||||||
|
itemIO.Time = int64(float64(io2.ReadTime-io1.ReadTime) / interval / 60)
|
||||||
|
}
|
||||||
|
writeTime := int64(0)
|
||||||
|
if io2.WriteTime != 0 && io1.WriteTime != 0 && io2.WriteTime > io1.WriteTime {
|
||||||
|
writeTime = int64(float64(io2.WriteTime-io1.WriteTime) / interval / 60)
|
||||||
|
}
|
||||||
|
if writeTime > itemIO.Time {
|
||||||
|
itemIO.Time = writeTime
|
||||||
|
}
|
||||||
|
ioList = append(ioList, itemIO)
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if err := s.monitorRepository.BatchCreateMonitorIO(ioList); err != nil {
|
||||||
|
logger.Errorf("BatchCreateMonitorIO err: %v", err)
|
||||||
|
}
|
||||||
|
s.diskIO <- ioStat2
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *MonitorImpl) saveNetDataToDB(ctx context.Context, interval float64) {
|
||||||
|
defer close(s.netIO)
|
||||||
|
for {
|
||||||
|
select {
|
||||||
|
case <-ctx.Done():
|
||||||
|
return
|
||||||
|
case netStat := <-s.netIO:
|
||||||
|
select {
|
||||||
|
case <-ctx.Done():
|
||||||
|
return
|
||||||
|
case netStat2 := <-s.netIO:
|
||||||
|
var netList []model.MonitorNetwork
|
||||||
|
timeMilli := time.Now().UnixMilli()
|
||||||
|
for _, net2 := range netStat2 {
|
||||||
|
for _, net1 := range netStat {
|
||||||
|
if net2.Name == net1.Name {
|
||||||
|
var itemNet model.MonitorNetwork
|
||||||
|
itemNet.CreateTime = timeMilli
|
||||||
|
itemNet.Name = net1.Name
|
||||||
|
|
||||||
|
if net2.BytesSent != 0 && net1.BytesSent != 0 && net2.BytesSent > net1.BytesSent {
|
||||||
|
itemNet.Up = float64(net2.BytesSent-net1.BytesSent) / 1024 / interval / 60
|
||||||
|
}
|
||||||
|
if net2.BytesRecv != 0 && net1.BytesRecv != 0 && net2.BytesRecv > net1.BytesRecv {
|
||||||
|
itemNet.Down = float64(net2.BytesRecv-net1.BytesRecv) / 1024 / interval / 60
|
||||||
|
}
|
||||||
|
netList = append(netList, itemNet)
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if err := s.monitorRepository.BatchCreateMonitorNet(netList); err != nil {
|
||||||
|
logger.Errorf("BatchCreateMonitorNet err: %v", err)
|
||||||
|
}
|
||||||
|
s.netIO <- netStat2
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// MonitorData 监控资源信息
|
||||||
|
type MonitorData struct {
|
||||||
|
Date []int64 `json:"date"`
|
||||||
|
Value []any `json:"value"`
|
||||||
|
}
|
||||||
|
|
||||||
|
// SelectMonitorInfo 查询监控资源信息
|
||||||
|
func (s *MonitorImpl) SelectMonitorInfo(query map[string]any) map[string]MonitorData {
|
||||||
|
infoType := query["type"]
|
||||||
|
startTimeMilli := query["startTime"]
|
||||||
|
endTimeMilli := query["endTime"]
|
||||||
|
neType := query["neType"]
|
||||||
|
neId := query["neId"]
|
||||||
|
name := query["name"]
|
||||||
|
|
||||||
|
// 返回数据
|
||||||
|
backdatas := map[string]MonitorData{}
|
||||||
|
|
||||||
|
// 基本信息
|
||||||
|
if infoType == "all" || infoType == "cpu" || infoType == "memory" {
|
||||||
|
rows := s.monitorRepository.SelectMonitorBase(map[string]any{
|
||||||
|
"startTime": startTimeMilli,
|
||||||
|
"endTime": endTimeMilli,
|
||||||
|
"neType": neType,
|
||||||
|
"neId": neId,
|
||||||
|
})
|
||||||
|
// 组装数据
|
||||||
|
var itemData MonitorData
|
||||||
|
for _, base := range rows {
|
||||||
|
itemData.Date = append(itemData.Date, base.CreateTime)
|
||||||
|
itemData.Value = append(itemData.Value, base)
|
||||||
|
}
|
||||||
|
backdatas["base"] = itemData
|
||||||
|
}
|
||||||
|
|
||||||
|
// 磁盘IO
|
||||||
|
if infoType == "all" || infoType == "io" {
|
||||||
|
rows := s.monitorRepository.SelectMonitorIO(map[string]any{
|
||||||
|
"startTime": startTimeMilli,
|
||||||
|
"endTime": endTimeMilli,
|
||||||
|
"neType": neType,
|
||||||
|
"neId": neId,
|
||||||
|
"name": name,
|
||||||
|
})
|
||||||
|
// 组装数据
|
||||||
|
var itemData MonitorData
|
||||||
|
for _, base := range rows {
|
||||||
|
itemData.Date = append(itemData.Date, base.CreateTime)
|
||||||
|
itemData.Value = append(itemData.Value, base)
|
||||||
|
}
|
||||||
|
backdatas["io"] = itemData
|
||||||
|
}
|
||||||
|
|
||||||
|
// 网络
|
||||||
|
if infoType == "all" || infoType == "network" {
|
||||||
|
rows := s.monitorRepository.SelectMonitorNetwork(map[string]any{
|
||||||
|
"startTime": startTimeMilli,
|
||||||
|
"endTime": endTimeMilli,
|
||||||
|
"neType": neType,
|
||||||
|
"neId": neId,
|
||||||
|
"name": name,
|
||||||
|
})
|
||||||
|
// 组装数据
|
||||||
|
var itemData MonitorData
|
||||||
|
for _, base := range rows {
|
||||||
|
itemData.Date = append(itemData.Date, base.CreateTime)
|
||||||
|
itemData.Value = append(itemData.Value, base)
|
||||||
|
}
|
||||||
|
backdatas["network"] = itemData
|
||||||
|
}
|
||||||
|
|
||||||
|
return backdatas
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user