From 605d8ff3bd03473dafb2ec02ad3580348df78c9c Mon Sep 17 00:00:00 2001 From: dushixiang Date: Sun, 30 Nov 2025 19:54:25 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96=E6=95=B0=E6=8D=AE=E6=8C=87?= =?UTF-8?q?=E6=A0=87=E7=9A=84=E5=AD=98=E5=82=A8=E5=92=8C=E6=9F=A5=E8=AF=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- internal/repo/metric_repo.go | 17 ++++++++++------- internal/service/metric_service.go | 29 +++++++++++++++++++++++++++-- 2 files changed, 37 insertions(+), 9 deletions(-) diff --git a/internal/repo/metric_repo.go b/internal/repo/metric_repo.go index 8660ca2..dfcc769 100644 --- a/internal/repo/metric_repo.go +++ b/internal/repo/metric_repo.go @@ -295,7 +295,8 @@ type AggregatedDiskMetric struct { Total uint64 `json:"total"` } -// GetDiskMetrics 获取聚合后的磁盘指标(始终返回聚合数据) +// GetDiskMetrics 获取聚合后的磁盘指标(返回预聚合的总和数据) +// 直接查询 mount_point=” 的预聚合记录 func (r *MetricRepo) GetDiskMetrics(ctx context.Context, agentID string, start, end int64, interval int) ([]AggregatedDiskMetric, error) { var metrics []AggregatedDiskMetric @@ -306,14 +307,14 @@ func (r *MetricRepo) GetDiskMetrics(ctx context.Context, agentID string, start, MAX(usage_percent) as max_usage, MAX(total) as total FROM disk_metrics - WHERE agent_id = ? AND timestamp >= ? AND timestamp <= ? + WHERE agent_id = ? AND timestamp >= ? AND timestamp <= ? AND mount_point = ? GROUP BY 1, mount_point - ORDER BY timestamp ASC, mount_point + ORDER BY timestamp ASC ` intervalMs := int64(interval * 1000) err := r.db.WithContext(ctx). - Raw(query, intervalMs, intervalMs, agentID, start, end). + Raw(query, intervalMs, intervalMs, agentID, start, end, ""). // 空字符串查询总和记录 Scan(&metrics).Error return metrics, err @@ -958,14 +959,16 @@ func (r *MetricRepo) GetMemoryMetricsAgg(ctx context.Context, agentID string, st return metrics, err } -// GetDiskMetricsAgg 从聚合表获取磁盘指标 +// GetDiskMetricsAgg 从聚合表获取磁盘指标(返回预聚合的总和数据) +// 直接查询 mount_point=” 的预聚合记录 func (r *MetricRepo) GetDiskMetricsAgg(ctx context.Context, agentID string, start, end int64, bucketSeconds int) ([]AggregatedDiskMetric, error) { var metrics []AggregatedDiskMetric err := r.db.WithContext(ctx). Table("disk_metrics_aggs"). Select("bucket_start as timestamp, mount_point, max_usage, total"). - Where("agent_id = ? AND bucket_seconds = ? AND bucket_start >= ? AND bucket_start < ?", agentID, bucketSeconds, start, end). - Order("bucket_start, mount_point"). + Where("agent_id = ? AND bucket_seconds = ? AND bucket_start >= ? AND bucket_start < ? AND mount_point = ?", + agentID, bucketSeconds, start, end, ""). // 空字符串查询总和记录 + Order("bucket_start"). Scan(&metrics).Error return metrics, err } diff --git a/internal/service/metric_service.go b/internal/service/metric_service.go index d46387b..cfc932b 100644 --- a/internal/service/metric_service.go +++ b/internal/service/metric_service.go @@ -90,8 +90,14 @@ func (s *MetricService) HandleMetricData(ctx context.Context, agentID string, me if err := json.Unmarshal(data, &diskDataList); err != nil { return err } - // 保存每个磁盘的数据 + + // 合并所有磁盘的数据用于保存总和 + var totalTotal, totalUsed, totalFree uint64 + var maxUsagePercent float64 + + // 保存每个磁盘的数据,同时累加总和 for _, diskData := range diskDataList { + // 保存单个磁盘数据 metric := &models.DiskMetric{ AgentID: agentID, MountPoint: diskData.MountPoint, @@ -107,8 +113,27 @@ func (s *MetricService) HandleMetricData(ctx context.Context, agentID string, me zap.String("agentID", agentID), zap.String("mountPoint", diskData.MountPoint)) } + + // 累加所有磁盘的数据 + totalTotal += diskData.Total + totalUsed += diskData.Used + totalFree += diskData.Free + if diskData.UsagePercent > maxUsagePercent { + maxUsagePercent = diskData.UsagePercent + } } - return nil + + // 保存合并后的总和数据(mount_point 字段设置为空字符串) + totalMetric := &models.DiskMetric{ + AgentID: agentID, + MountPoint: "", // 空字符串表示所有磁盘的合并数据 + Total: totalTotal, + Used: totalUsed, + Free: totalFree, + UsagePercent: maxUsagePercent, // 使用率取最大值 + Timestamp: now, + } + return s.metricRepo.SaveDiskMetric(ctx, totalMetric) case protocol.MetricTypeNetwork: // Network现在是数组,需要批量处理