diff --git a/backend/app/model/monitor.go b/backend/app/model/monitor.go index d788d3579..1207c98af 100644 --- a/backend/app/model/monitor.go +++ b/backend/app/model/monitor.go @@ -14,14 +14,7 @@ type MonitorBase struct { type MonitorIO struct { BaseModel - Name string `json:"name"` - ReadCount uint64 `json:"readCount"` - WriteCount uint64 `json:"writeCount"` - ReadTime uint64 `json:"readTime"` - WriteTime uint64 `json:"writeTime"` - ReadByte uint64 `gorm:"type:decimal(32)" json:"readByte"` - WriteByte uint64 `gorm:"type:decimal(32)" json:"writeByte"` - + Name string `json:"name"` Read uint64 `json:"read"` Write uint64 `json:"write"` Count uint64 `json:"count"` @@ -30,9 +23,7 @@ type MonitorIO struct { type MonitorNetwork struct { BaseModel - Name string `json:"name"` - BytesSent uint64 `gorm:"type:decimal(32)" json:"bytesSent"` - BytesRecv uint64 `gorm:"type:decimal(32)" json:"bytesRecv"` - Up float64 `gorm:"type:float" json:"up"` - Down float64 `gorm:"type:float" json:"down"` + Name string `json:"name"` + Up float64 `gorm:"type:float" json:"up"` + Down float64 `gorm:"type:float" json:"down"` } diff --git a/backend/cron/job/monitor.go b/backend/cron/job/monitor.go index a416115b3..be27e9cb4 100644 --- a/backend/cron/job/monitor.go +++ b/backend/cron/job/monitor.go @@ -43,80 +43,11 @@ func (m *monitor) Run() { itemModel.Memory = memoryInfo.UsedPercent if err := global.DB.Create(&itemModel).Error; err != nil { - global.LOG.Debugf("Insert basic monitoring data failed, err: %v", err) + global.LOG.Errorf("Insert basic monitoring data failed, err: %v", err) } - ioStat, _ := disk.IOCounters() - for _, v := range ioStat { - var itemIO model.MonitorIO - itemIO.Name = v.Name - itemIO.ReadCount = v.ReadCount - itemIO.WriteCount = v.WriteCount - itemIO.ReadByte = v.ReadBytes - itemIO.WriteByte = v.WriteBytes - itemIO.ReadTime = v.ReadTime - itemIO.WriteTime = v.WriteTime - var aheadData model.MonitorIO - if err := global.DB.Where("name = ?", v.Name).Order("created_at").Find(&aheadData).Error; err != nil { - _ = global.DB.Create(&itemIO) - continue - } - stime := time.Since(aheadData.CreatedAt).Seconds() - itemIO.Read = uint64(float64(v.ReadBytes-aheadData.ReadByte) / stime) - itemIO.Write = uint64(float64(v.WriteBytes-aheadData.WriteByte) / stime) - - itemIO.Count = uint64(float64(v.ReadCount-aheadData.ReadCount) / stime) - writeCount := uint64(float64(v.WriteCount-aheadData.WriteCount) / stime) - if writeCount > itemIO.Count { - itemIO.Count = writeCount - } - - itemIO.Time = uint64(float64(v.ReadTime-aheadData.ReadTime) / stime) - writeTime := uint64(float64(v.WriteTime-aheadData.WriteTime) / stime) - if writeTime > itemIO.Time { - itemIO.Time = writeTime - } - if err := global.DB.Create(&itemIO).Error; err != nil { - global.LOG.Debugf("Insert io monitoring data failed, err: %v", err) - } - } - - netStat, _ := net.IOCounters(true) - for _, v := range netStat { - var itemNet model.MonitorNetwork - var aheadData model.MonitorNetwork - itemNet.Name = v.Name - itemNet.BytesSent = v.BytesSent - itemNet.BytesRecv = v.BytesRecv - if err := global.DB.Where("name = ?", v.Name).Order("created_at").Find(&aheadData).Error; err != nil { - _ = global.DB.Create(&itemNet) - continue - } - stime := time.Since(aheadData.CreatedAt).Seconds() - itemNet.Up = float64(v.BytesSent-aheadData.BytesSent) / 1024 / stime - itemNet.Down = float64(v.BytesRecv-aheadData.BytesRecv) / 1024 / stime - if err := global.DB.Create(&itemNet).Error; err != nil { - global.LOG.Debugf("Insert network monitoring data failed, err: %v", err) - } - } - netStatAll, _ := net.IOCounters(false) - if len(netStatAll) != 0 { - var itemNet model.MonitorNetwork - var aheadData model.MonitorNetwork - itemNet.Name = netStatAll[0].Name - itemNet.BytesSent = netStatAll[0].BytesSent - itemNet.BytesRecv = netStatAll[0].BytesRecv - if err := global.DB.Where("name = ?", netStatAll[0].Name).Order("created_at").Find(&aheadData).Error; err != nil { - _ = global.DB.Create(&itemNet) - return - } - stime := time.Since(aheadData.CreatedAt).Seconds() - itemNet.Up = float64(netStatAll[0].BytesSent-aheadData.BytesSent) / 1024 / stime - itemNet.Down = float64(netStatAll[0].BytesRecv-aheadData.BytesRecv) / 1024 / stime - if err := global.DB.Create(&itemNet).Error; err != nil { - global.LOG.Debugf("Insert network all monitoring data failed, err: %v", err) - } - } + go loadDiskIO() + go loadNetIO() MonitorStoreDays, err := settingRepo.Get(settingRepo.WithByKey("MonitorStoreDays")) if err != nil { @@ -128,3 +59,75 @@ func (m *monitor) Run() { _ = global.DB.Where("created_at < ?", timeForDelete).Delete(&model.MonitorIO{}).Error _ = global.DB.Where("created_at < ?", timeForDelete).Delete(&model.MonitorNetwork{}).Error } + +func loadDiskIO() { + ioStat, _ := disk.IOCounters() + + time.Sleep(60 * time.Second) + + ioStat2, _ := disk.IOCounters() + for _, io2 := range ioStat2 { + for _, io1 := range ioStat { + if io2.Name == io1.Name { + var itemIO model.MonitorIO + itemIO.Name = io1.Name + itemIO.Read = uint64(float64(io2.ReadBytes-io1.ReadBytes) / 60) + itemIO.Write = uint64(float64(io2.WriteBytes-io1.WriteBytes) / 60) + + itemIO.Count = uint64(float64(io2.ReadCount-io1.ReadCount) / 60) + writeCount := uint64(float64(io2.WriteCount-io1.WriteCount) / 60) + if writeCount > itemIO.Count { + itemIO.Count = writeCount + } + + itemIO.Time = uint64(float64(io2.ReadTime-io1.ReadTime) / 60) + writeTime := uint64(float64(io2.WriteTime-io1.WriteTime) / 60) + if writeTime > itemIO.Time { + itemIO.Time = writeTime + } + if err := global.DB.Create(&itemIO).Error; err != nil { + global.LOG.Errorf("Insert io monitoring data failed, err: %v", err) + } + break + } + } + } +} + +func loadNetIO() { + netStat, _ := net.IOCounters(true) + netStatAll, _ := net.IOCounters(false) + + time.Sleep(60 * time.Second) + + netStat2, _ := net.IOCounters(true) + for _, net2 := range netStat2 { + for _, net1 := range netStat { + if net2.Name == net1.Name { + var itemNet model.MonitorNetwork + itemNet.Name = net1.Name + itemNet.Up = float64(net2.BytesSent-net1.BytesSent) / 1024 / 60 + itemNet.Down = float64(net2.BytesRecv-net1.BytesRecv) / 1024 / 60 + if err := global.DB.Create(&itemNet).Error; err != nil { + global.LOG.Errorf("Insert network monitoring data failed, err: %v", err) + } + break + } + } + } + netStatAll2, _ := net.IOCounters(false) + for _, net2 := range netStatAll2 { + for _, net1 := range netStatAll { + if net2.Name == net1.Name { + var itemNet model.MonitorNetwork + itemNet.Name = net1.Name + itemNet.Up = float64(net2.BytesSent-net1.BytesSent) / 1024 / 60 + itemNet.Down = float64(net2.BytesRecv-net1.BytesRecv) / 1024 / 60 + if err := global.DB.Create(&itemNet).Error; err != nil { + global.LOG.Errorf("Insert network all monitoring data failed, err: %v", err) + } + break + } + } + } +} diff --git a/frontend/src/views/setting/snapshot/index.vue b/frontend/src/views/setting/snapshot/index.vue index 4c96260d2..62f2b3093 100644 --- a/frontend/src/views/setting/snapshot/index.vue +++ b/frontend/src/views/setting/snapshot/index.vue @@ -67,7 +67,7 @@ - +