fix: dashboard metrics 慢查询优化(index+UNIX_TIMESTAMP分组) + 批量升级版本号修复
This commit is contained in:
1 parent
c515f6ed03
commit
20f64e3851
5 files changed
+222
-19
No files matched your search
@@ -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},
|
||||
|
||||
Reference in new issue
Block a user