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; // 证书剩余天数阈值(天)