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()`。