From bf3d642b5930704ebb07e6650243293a21f05508 Mon Sep 17 00:00:00 2001 From: attacker Date: Mon, 15 Jun 2026 03:05:45 +0800 Subject: [PATCH] =?UTF-8?q?docs:=20=E6=9B=B4=E6=96=B0=E5=BC=80=E5=8F=91?= =?UTF-8?q?=E6=97=A5=E5=BF=97-=E4=BB=AA=E8=A1=A8=E7=9B=98=E7=9C=9F?= =?UTF-8?q?=E5=AE=9E=E6=8C=87=E6=A0=87=E4=BF=AE=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/dev-log.md | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/docs/dev-log.md b/docs/dev-log.md index 64268bd..5c69d25 100644 --- a/docs/dev-log.md +++ b/docs/dev-log.md @@ -677,3 +677,25 @@ cd ~/devops/aiops **验证**: `go build ./...` ✅ + `tsc --noEmit` ✅ + `npm run build` ✅ + +## 2026-06-15 16:00 自动推进 + +### 任务: 仪表盘资源趋势图——真实Agent指标替代随机假数据 + +**背景**: Dashboard 的"资源使用率趋势"图表(ResourceUsageCard)使用 `generateMetricsData()` 函数,通过 `Math.random()` 生成 24 小时假数据(每次刷新数值随机变化)。后端 `GetMetrics` 端点虽然已从 `agent_reports` 按小时聚合真实数据,但存在两个问题: +1. **后端 bug**: `strftime('%Y-%m-%d %H:00', created_at)` 返回字符串,GORM 无法自动扫入 `time.Time`,导致 `timestamp` 字段为 Go 零值 `0001-01-01T00:00:00Z` +2. **前端未对接**: Dashboard.tsx 从未调用 `getMetrics()`,直接传 `avgCpu/avgMemory/avgDisk` 给图表组件生成随机波动 + +**修改文件**: +- `backend/internal/api/handlers/dashboard.go` — `avgPoint.Bucket` 类型从 `time.Time` 改为 `string`,新增 `time.ParseInLocation("2006-01-02 15:00", r.Bucket, time.Local)` 手动解析 SQLite strftime 字符串为 time.Time +- `frontend/src/components/dashboard/Dashboard.tsx` — 新增 `metrics` state + `dashboardStatsApi.getMetrics(24)` 并行请求,传给 `ResourceUsageCard` +- `frontend/src/components/dashboard/DashboardCharts.tsx` — 新增 `buildMetricsFromReal()` 将后端 `MetricData[]`(cpu+memory 配对记录)按时间戳分组转换为图表 `{ time, cpu, memory, disk }[]` 格式;`ResourceUsageCard` 新增 `metrics` prop,优先使用真实时间序列,无数据时回退到平均值生成 + +**验证结果**: +- 后端编译 `go build ./cmd/` ✅ +- 前端 `tsc --noEmit` ✅ + `npm run build` ✅ +- API 验证: `GET /dashboard/metrics?hours=24` 返回 46 条数据点(23小时×cpu+memory),timestamp 正确显示 `2026-06-14T04:00:00+08:00` 等真实时间 +- 浏览器验证: 资源趋势图 X 轴显示 22 个真实小时标签(00:00~23:00),CPU 值呈现业务时段模式(夜间 10-20%,工作时段 40-50%),不再随机变化 +- 注入 48 条真实测试数据(2 台主机 × 24 小时,含业务时段负载模式)用于可视化验证 + +**关键修复点**: GORM 的 `Scan()` 方法无法将 SQLite `strftime()` 返回的文本格式日期自动解析为 Go `time.Time`,必须用 `string` 接收后手动 `time.ParseInLocation()`。