diff --git a/internal/app.go b/internal/app.go index 2bfb8e7..073d5f2 100644 --- a/internal/app.go +++ b/internal/app.go @@ -358,8 +358,8 @@ func startMetricsMonitoring(ctx context.Context, components *AppComponents, logg continue } - // 提取 CPU、内存、磁盘使用率 - var cpuUsage, memoryUsage, diskUsage float64 + // 提取 CPU、内存、磁盘使用率、网速 + var cpuUsage, memoryUsage, diskUsage, networkSpeed float64 if latest.CPU != nil { cpuUsage = latest.CPU.UsagePercent @@ -373,8 +373,13 @@ func startMetricsMonitoring(ctx context.Context, components *AppComponents, logg diskUsage = latest.Disk.AvgUsagePercent } + if latest.Network != nil { + // 网速 = (发送速率 + 接收速率) / 1024 / 1024 (转换为 MB/s) + networkSpeed = float64(latest.Network.TotalBytesSentRate+latest.Network.TotalBytesRecvRate) / 1024 / 1024 + } + // 检查告警规则 - if err := components.AlertService.CheckMetrics(ctx, agent.ID, cpuUsage, memoryUsage, diskUsage); err != nil { + if err := components.AlertService.CheckMetrics(ctx, agent.ID, cpuUsage, memoryUsage, diskUsage, networkSpeed); err != nil { logger.Error("检查告警规则失败", zap.String("agentId", agent.ID), zap.Error(err)) } } diff --git a/internal/models/alert.go b/internal/models/alert.go index a0ad785..bbd3999 100644 --- a/internal/models/alert.go +++ b/internal/models/alert.go @@ -30,9 +30,10 @@ type AlertRules struct { DiskThreshold float64 `json:"diskThreshold"` // 磁盘使用率阈值(0-100) DiskDuration int `json:"diskDuration"` // 持续时间(秒) - // 网络断开告警配置 - NetworkEnabled bool `json:"networkEnabled"` // 是否启用网络断开告警 - NetworkDuration int `json:"networkDuration"` // 持续时间(秒) + // 网络告警配置 + NetworkEnabled bool `json:"networkEnabled"` // 是否启用网络告警 + NetworkThreshold float64 `json:"networkThreshold"` // 网速阈值(MB/s) + NetworkDuration int `json:"networkDuration"` // 持续时间(秒) // HTTPS 证书告警配置 CertEnabled bool `json:"certEnabled"` // 是否启用证书告警 diff --git a/internal/service/alert_service.go b/internal/service/alert_service.go index cb23a71..d062fc7 100644 --- a/internal/service/alert_service.go +++ b/internal/service/alert_service.go @@ -84,7 +84,7 @@ func (s *AlertService) ListAlertRecords(ctx context.Context, agentID string, lim } // CheckMetrics 检查指标并触发告警 -func (s *AlertService) CheckMetrics(ctx context.Context, agentID string, cpu, memory, disk float64) error { +func (s *AlertService) CheckMetrics(ctx context.Context, agentID string, cpu, memory, disk, networkSpeed float64) error { // 获取全局告警配置 globalConfigs, err := s.alertRepo.FindEnabledByAgentID(ctx, "global") if err != nil { @@ -117,6 +117,11 @@ func (s *AlertService) CheckMetrics(ctx context.Context, agentID string, cpu, me if config.Rules.DiskEnabled { s.checkAlert(ctx, &config, &agent, "disk", disk, config.Rules.DiskThreshold, config.Rules.DiskDuration, now) } + + // 检查网速告警 + if config.Rules.NetworkEnabled { + s.checkAlert(ctx, &config, &agent, "network", networkSpeed, config.Rules.NetworkThreshold, config.Rules.NetworkDuration, now) + } } return nil @@ -298,7 +303,11 @@ func (s *AlertService) buildAlertMessage(state *models.AlertState) string { case "disk": alertTypeName = "磁盘使用率" case "network": - alertTypeName = "网络连接" + return fmt.Sprintf("网速持续%d秒超过%.2fMB/s,当前值%.2fMB/s", + state.Duration, + state.Threshold, + state.Value, + ) case "cert": return fmt.Sprintf("HTTPS证书剩余天数%.0f天,低于阈值%.0f天", state.Value, state.Threshold) case "service": diff --git a/web/src/pages/Settings/AlertSettings.tsx b/web/src/pages/Settings/AlertSettings.tsx index 4cc3510..ce1976a 100644 --- a/web/src/pages/Settings/AlertSettings.tsx +++ b/web/src/pages/Settings/AlertSettings.tsx @@ -41,6 +41,7 @@ const AlertSettings = () => { diskThreshold: 85, diskDuration: 60, networkEnabled: false, + networkThreshold: 100, networkDuration: 60, certEnabled: true, certThreshold: 30, @@ -103,9 +104,10 @@ const AlertSettings = () => { {/*告警规则*/} {[ - {key: 'cpu', title: 'CPU 告警规则', thresholdLabel: 'CPU 使用率阈值 (%)'}, - {key: 'memory', title: '内存告警规则', thresholdLabel: '内存使用率阈值 (%)'}, - {key: 'disk', title: '磁盘告警规则', thresholdLabel: '磁盘使用率阈值 (%)'}, + {key: 'cpu', title: 'CPU 告警规则', thresholdLabel: 'CPU 使用率阈值 (%)', max: 100}, + {key: 'memory', title: '内存告警规则', thresholdLabel: '内存使用率阈值 (%)', max: 100}, + {key: 'disk', title: '磁盘告警规则', thresholdLabel: '磁盘使用率阈值 (%)', max: 100}, + {key: 'network', title: '网速告警规则', thresholdLabel: '网速阈值 (MB/s)', max: 10000}, ].map((rule) => ( @@ -128,7 +130,7 @@ const AlertSettings = () => { > diff --git a/web/src/types/index.ts b/web/src/types/index.ts index 24a0e9b..7fb2312 100644 --- a/web/src/types/index.ts +++ b/web/src/types/index.ts @@ -406,6 +406,7 @@ export interface AlertRules { diskThreshold: number; diskDuration: number; networkEnabled: boolean; + networkThreshold: number; // 网速阈值(MB/s) networkDuration: number; certEnabled: boolean; // HTTPS 证书告警开关 certThreshold: number; // 证书剩余天数阈值(天)