fix: dashboard metrics 慢查询优化(index+UNIX_TIMESTAMP分组) + 批量升级版本号修复

This commit is contained in:
attacker committed 2026-06-24 14:27:58 +00:00
1 parent c515f6ed03
commit 20f64e3851
5 files changed
+222 -19

No files matched your search

+8 -12
View File
@@ -294,28 +294,24 @@ func (h *DashboardHandler) GetMetrics(c *gin.Context) {
}
}
// 从 agent_reports 表查最近 N 小时的真实数据(MySQL 聚合)
// 从 agent_reports 表查最近 N 小时的真实数据(整数分组,可用索引)
since := time.Now().Add(-time.Duration(hours) * time.Hour)
type avgPoint struct {
Bucket string
AvgCPU float64
AvgMem float64
BucketTS int64
AvgCPU float64
AvgMem float64
}
var rows []avgPoint
h.db.Model(&models.AgentReport{}).
Select("DATE_FORMAT(report_time, '%Y-%m-%d %H:00') as bucket, ROUND(AVG(cpu_usage),2) as avg_cpu, ROUND(AVG(mem_usage),2) as avg_mem").
Select("UNIX_TIMESTAMP(report_time) DIV 3600 as bucket_ts, ROUND(AVG(cpu_usage),2) as avg_cpu, ROUND(AVG(mem_usage),2) as avg_mem").
Where("report_time >= ?", since).
Group("bucket").
Order("bucket ASC").
Group("bucket_ts").
Order("bucket_ts ASC").
Scan(&rows)
var metrics []models.MetricData
for _, r := range rows {
// 手动解析 SQLite strftime 字符串为 time.Time(GORM 无法自动转换) // Logan.Li
ts, err := time.ParseInLocation("2006-01-02 15:00", r.Bucket, time.Local)
if err != nil {
ts = time.Now()
}
ts := time.Unix(r.BucketTS*3600, 0)
metrics = append(metrics,
models.MetricData{Name: "cpu", Value: r.AvgCPU, Timestamp: ts},
models.MetricData{Name: "memory", Value: r.AvgMem, Timestamp: ts},