From c1acd8f5f065956ae2570e8f0493fde4e1af38ea Mon Sep 17 00:00:00 2001 From: ssongliu <73214554+ssongliu@users.noreply.github.com> Date: Thu, 25 May 2023 18:02:17 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E7=9B=91=E6=8E=A7=E5=A2=9E=E5=8A=A0?= =?UTF-8?q?=E6=95=B0=E6=8D=AE=E9=87=87=E9=9B=86=E9=97=B4=E9=9A=94=E8=AE=BE?= =?UTF-8?q?=E7=BD=AE=20(#1146)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- backend/app/dto/setting.go | 1 + backend/app/repo/setting.go | 28 ++++++ backend/{cron/job => app/service}/monitor.go | 43 ++++++--- backend/app/service/setting.go | 36 +++++++- backend/cron/cron.go | 28 ++++-- backend/global/global.go | 3 +- backend/init/migration/migrations/init.go | 3 + frontend/src/api/interface/setting.ts | 1 + frontend/src/lang/modules/en.ts | 1 + frontend/src/lang/modules/zh.ts | 1 + .../views/host/monitor/setting/days/index.vue | 89 +++++++++++++++++++ .../src/views/host/monitor/setting/index.vue | 87 +++++++++--------- .../host/monitor/setting/interval/index.vue | 89 +++++++++++++++++++ 13 files changed, 341 insertions(+), 69 deletions(-) rename backend/{cron/job => app/service}/monitor.go (77%) create mode 100644 frontend/src/views/host/monitor/setting/days/index.vue create mode 100644 frontend/src/views/host/monitor/setting/interval/index.vue diff --git a/backend/app/dto/setting.go b/backend/app/dto/setting.go index 9aeddbaa3..cc8484041 100644 --- a/backend/app/dto/setting.go +++ b/backend/app/dto/setting.go @@ -30,6 +30,7 @@ type SettingInfo struct { MFASecret string `json:"mfaSecret"` MonitorStatus string `json:"monitorStatus"` + MonitorInterval string `json:"monitorInterval"` MonitorStoreDays string `json:"monitorStoreDays"` MessageType string `json:"messageType"` diff --git a/backend/app/repo/setting.go b/backend/app/repo/setting.go index c2c9d286a..ea07b7adc 100644 --- a/backend/app/repo/setting.go +++ b/backend/app/repo/setting.go @@ -1,6 +1,8 @@ package repo import ( + "time" + "github.com/1Panel-dev/1Panel/backend/app/model" "github.com/1Panel-dev/1Panel/backend/global" "gorm.io/gorm" @@ -14,6 +16,13 @@ type ISettingRepo interface { Create(key, value string) error Update(key, value string) error WithByKey(key string) DBOption + + CreateMonitorBase(model model.MonitorBase) error + BatchCreateMonitorIO(ioList []model.MonitorIO) error + BatchCreateMonitorNet(ioList []model.MonitorNetwork) error + DelMonitorBase(timeForDelete time.Time) error + DelMonitorIO(timeForDelete time.Time) error + DelMonitorNet(timeForDelete time.Time) error } func NewISettingRepo() ISettingRepo { @@ -57,3 +66,22 @@ func (c *SettingRepo) WithByKey(key string) DBOption { func (u *SettingRepo) Update(key, value string) error { return global.DB.Model(&model.Setting{}).Where("key = ?", key).Updates(map[string]interface{}{"value": value}).Error } + +func (u *SettingRepo) CreateMonitorBase(model model.MonitorBase) error { + return global.DB.Create(&model).Error +} +func (u *SettingRepo) BatchCreateMonitorIO(ioList []model.MonitorIO) error { + return global.DB.CreateInBatches(ioList, len(ioList)).Error +} +func (u *SettingRepo) BatchCreateMonitorNet(ioList []model.MonitorNetwork) error { + return global.DB.CreateInBatches(ioList, len(ioList)).Error +} +func (u *SettingRepo) DelMonitorBase(timeForDelete time.Time) error { + return global.DB.Where("created_at < ?", timeForDelete).Delete(&model.MonitorBase{}).Error +} +func (u *SettingRepo) DelMonitorIO(timeForDelete time.Time) error { + return global.DB.Where("created_at < ?", timeForDelete).Delete(&model.MonitorIO{}).Error +} +func (u *SettingRepo) DelMonitorNet(timeForDelete time.Time) error { + return global.DB.Where("created_at < ?", timeForDelete).Delete(&model.MonitorNetwork{}).Error +} diff --git a/backend/cron/job/monitor.go b/backend/app/service/monitor.go similarity index 77% rename from backend/cron/job/monitor.go rename to backend/app/service/monitor.go index 8df90e176..b53495a45 100644 --- a/backend/cron/job/monitor.go +++ b/backend/app/service/monitor.go @@ -1,12 +1,13 @@ -package job +package service import ( + "fmt" "strconv" "time" "github.com/1Panel-dev/1Panel/backend/app/model" - "github.com/1Panel-dev/1Panel/backend/app/repo" "github.com/1Panel-dev/1Panel/backend/global" + "github.com/robfig/cron/v3" "github.com/shirou/gopsutil/v3/cpu" "github.com/shirou/gopsutil/v3/disk" "github.com/shirou/gopsutil/v3/load" @@ -14,14 +15,18 @@ import ( "github.com/shirou/gopsutil/v3/net" ) -type monitor struct{} +type MonitorService struct{} -func NewMonitorJob() *monitor { - return &monitor{} +type IMonitorService interface { + Run() } -func (m *monitor) Run() { - settingRepo := repo.NewISettingRepo() +func NewIMonitorService() IMonitorService { + return &MonitorService{} +} + +func (m *MonitorService) Run() { + fmt.Printf("开始采集数据了啊我 %s \n", time.Now().Format("2006-01-02 15:04:05")) monitorStatus, _ := settingRepo.Get(settingRepo.WithByKey("MonitorStatus")) if monitorStatus.Value == "disable" { return @@ -42,7 +47,7 @@ func (m *monitor) Run() { memoryInfo, _ := mem.VirtualMemory() itemModel.Memory = memoryInfo.UsedPercent - if err := global.DB.Create(&itemModel).Error; err != nil { + if err := settingRepo.CreateMonitorBase(itemModel); err != nil { global.LOG.Errorf("Insert basic monitoring data failed, err: %v", err) } @@ -55,9 +60,9 @@ func (m *monitor) Run() { } storeDays, _ := strconv.Atoi(MonitorStoreDays.Value) timeForDelete := time.Now().AddDate(0, 0, -storeDays) - _ = global.DB.Where("created_at < ?", timeForDelete).Delete(&model.MonitorBase{}).Error - _ = global.DB.Where("created_at < ?", timeForDelete).Delete(&model.MonitorIO{}).Error - _ = global.DB.Where("created_at < ?", timeForDelete).Delete(&model.MonitorNetwork{}).Error + _ = settingRepo.DelMonitorBase(timeForDelete) + _ = settingRepo.DelMonitorIO(timeForDelete) + _ = settingRepo.DelMonitorNet(timeForDelete) } func loadDiskIO() { @@ -91,7 +96,7 @@ func loadDiskIO() { } } } - if err := global.DB.CreateInBatches(ioList, len(ioList)).Error; err != nil { + if err := settingRepo.BatchCreateMonitorIO(ioList); err != nil { global.LOG.Errorf("Insert io monitoring data failed, err: %v", err) } } @@ -133,7 +138,19 @@ func loadNetIO() { } } - if err := global.DB.CreateInBatches(netList, len(netList)).Error; err != nil { + if err := settingRepo.BatchCreateMonitorNet(netList); err != nil { global.LOG.Errorf("Insert network monitoring data failed, err: %v", err) } } + +func StartMonitor(removeBefore bool, interval string) error { + if removeBefore { + global.Cron.Remove(cron.EntryID(global.MonitorCronID)) + } + monitorID, err := global.Cron.AddJob(fmt.Sprintf("@every %sm", interval), NewIMonitorService()) + if err != nil { + return err + } + global.MonitorCronID = int(monitorID) + return nil +} diff --git a/backend/app/service/setting.go b/backend/app/service/setting.go index 5c30cc4d1..6f9962da1 100644 --- a/backend/app/service/setting.go +++ b/backend/app/service/setting.go @@ -22,6 +22,7 @@ import ( "github.com/1Panel-dev/1Panel/backend/utils/ntp" "github.com/1Panel-dev/1Panel/backend/utils/ssl" "github.com/gin-gonic/gin" + "github.com/robfig/cron/v3" ) type SettingService struct{} @@ -72,9 +73,41 @@ func (u *SettingService) LoadTimeZone() ([]string, error) { } func (u *SettingService) Update(key, value string) error { + switch key { + case "MonitorStatus": + if value == "enable" && global.MonitorCronID == 0 { + interval, err := settingRepo.Get(settingRepo.WithByKey("MonitorInterval")) + if err != nil { + return err + } + if err := StartMonitor(false, interval.Value); err != nil { + return err + } + } + if value == "disable" && global.MonitorCronID != 0 { + global.Cron.Remove(cron.EntryID(global.MonitorCronID)) + global.MonitorCronID = 0 + } + case "MonitorInterval": + status, err := settingRepo.Get(settingRepo.WithByKey("MonitorStatus")) + if err != nil { + return err + } + if status.Value == "enable" && global.MonitorCronID != 0 { + if err := StartMonitor(true, value); err != nil { + return err + } + } + case "TimeZone": + if err := ntp.UpdateSystemTimeZone(value); err != nil { + return err + } + } + if err := settingRepo.Update(key, value); err != nil { return err } + switch key { case "ExpirationDays": timeout, _ := strconv.Atoi(value) @@ -86,9 +119,6 @@ func (u *SettingService) Update(key, value string) error { case "AllowIPs": global.CONF.System.AllowIPs = value case "TimeZone": - if err := ntp.UpdateSystemTimeZone(value); err != nil { - return err - } go func() { _, err := cmd.Exec("systemctl restart 1panel.service") if err != nil { diff --git a/backend/cron/cron.go b/backend/cron/cron.go index 19c6c7ed9..6fdf00c7d 100644 --- a/backend/cron/cron.go +++ b/backend/cron/cron.go @@ -15,19 +15,31 @@ import ( func Run() { nyc, _ := time.LoadLocation(common.LoadTimeZone()) - Cron := cron.New(cron.WithLocation(nyc), cron.WithChain(cron.Recover(cron.DefaultLogger)), cron.WithChain(cron.DelayIfStillRunning(cron.DefaultLogger))) - if _, err := Cron.AddJob("@every 5m", job.NewMonitorJob()); err != nil { - global.LOG.Errorf("can not add monitor corn job: %s", err.Error()) + global.Cron = cron.New(cron.WithLocation(nyc), cron.WithChain(cron.Recover(cron.DefaultLogger)), cron.WithChain(cron.DelayIfStillRunning(cron.DefaultLogger))) + + var ( + interval model.Setting + status model.Setting + ) + if err := global.DB.Where("key = ?", "MonitorStatus").Find(&status).Error; err != nil { + global.LOG.Errorf("load monitor status from db failed, err: %v", err) } - if _, err := Cron.AddJob("@daily", job.NewWebsiteJob()); err != nil { + if status.Value == "enable" { + if err := global.DB.Where("key = ?", "MonitorInterval").Find(&interval).Error; err != nil { + global.LOG.Errorf("load monitor interval from db failed, err: %v", err) + } + if err := service.StartMonitor(false, interval.Value); err != nil { + global.LOG.Errorf("can not add monitor corn job: %s", err.Error()) + } + } + + if _, err := global.Cron.AddJob("@daily", job.NewWebsiteJob()); err != nil { global.LOG.Errorf("can not add website corn job: %s", err.Error()) } - if _, err := Cron.AddJob("@daily", job.NewSSLJob()); err != nil { + if _, err := global.Cron.AddJob("@daily", job.NewSSLJob()); err != nil { global.LOG.Errorf("can not add ssl corn job: %s", err.Error()) } - Cron.Start() - - global.Cron = Cron + global.Cron.Start() var cronJobs []model.Cronjob if err := global.DB.Where("status = ?", constant.StatusEnable).Find(&cronJobs).Error; err != nil { diff --git a/backend/global/global.go b/backend/global/global.go index 6091693c5..3c629c692 100644 --- a/backend/global/global.go +++ b/backend/global/global.go @@ -20,5 +20,6 @@ var ( CACHE *badger_db.Cache Viper *viper.Viper - Cron *cron.Cron + Cron *cron.Cron + MonitorCronID int ) diff --git a/backend/init/migration/migrations/init.go b/backend/init/migration/migrations/init.go index ea9009977..055d8d16c 100644 --- a/backend/init/migration/migrations/init.go +++ b/backend/init/migration/migrations/init.go @@ -351,6 +351,9 @@ var AddBindAndAllowIPs = &gormigrate.Migration{ if err := tx.Create(&model.Setting{Key: "NtpSite", Value: "pool.ntp.org"}).Error; err != nil { return err } + if err := tx.Create(&model.Setting{Key: "MonitorInterval", Value: "1"}).Error; err != nil { + return err + } return nil }, } diff --git a/frontend/src/api/interface/setting.ts b/frontend/src/api/interface/setting.ts index c6112c6c8..0bbc1a5f5 100644 --- a/frontend/src/api/interface/setting.ts +++ b/frontend/src/api/interface/setting.ts @@ -29,6 +29,7 @@ export namespace Setting { mfaSecret: string; monitorStatus: string; + monitorInterval: number; monitorStoreDays: number; messageType: string; diff --git a/frontend/src/lang/modules/en.ts b/frontend/src/lang/modules/en.ts index d699c7f73..cce28ae84 100644 --- a/frontend/src/lang/modules/en.ts +++ b/frontend/src/lang/modules/en.ts @@ -699,6 +699,7 @@ const message = { network: 'Network', up: 'Up', down: 'Down', + interval: 'Interval(min)', }, terminal: { conn: 'connection', diff --git a/frontend/src/lang/modules/zh.ts b/frontend/src/lang/modules/zh.ts index 3e9143923..b5e4e0421 100644 --- a/frontend/src/lang/modules/zh.ts +++ b/frontend/src/lang/modules/zh.ts @@ -705,6 +705,7 @@ const message = { network: '网络', up: '上行', down: '下行', + interval: '采集间隔(分钟)', }, terminal: { conn: '连接', diff --git a/frontend/src/views/host/monitor/setting/days/index.vue b/frontend/src/views/host/monitor/setting/days/index.vue new file mode 100644 index 000000000..c4bd2b269 --- /dev/null +++ b/frontend/src/views/host/monitor/setting/days/index.vue @@ -0,0 +1,89 @@ + + diff --git a/frontend/src/views/host/monitor/setting/index.vue b/frontend/src/views/host/monitor/setting/index.vue index 64cca3e57..f16864120 100644 --- a/frontend/src/views/host/monitor/setting/index.vue +++ b/frontend/src/views/host/monitor/setting/index.vue @@ -8,30 +8,28 @@
- + - - + + + + + + + @@ -44,16 +42,19 @@ + + +