diff --git a/dashboard/js/grid.js b/dashboard/js/grid.js index 076e5ea..1e2f2ef 100644 --- a/dashboard/js/grid.js +++ b/dashboard/js/grid.js @@ -124,7 +124,7 @@ const Grid = (() => { function refresh(agents) { agents.forEach(a => { if (!_agents.has(a.id)) { - _agents.set(a.id, { agent: a, metrics: null }); + _agents.set(a.id, { agent: a, metrics: a.last_metrics || null }); } else { _agents.get(a.id).agent = a; } diff --git a/server/db/db.go b/server/db/db.go index d14f36e..8993227 100644 --- a/server/db/db.go +++ b/server/db/db.go @@ -128,6 +128,53 @@ func (d *DB) GetAgents() ([]models.Agent, error) { return agents, nil } +func (d *DB) GetLastMetrics(agentID string) (*models.AgentMetrics, error) { + var cpu, temperature *float64 + var memUsed, memFree, memTotal, hddUsed, hddFree, hddTotal *int64 + var uptime, netRX, netTX *int64 + var smartPassed, smartTemp, smartRealloc, smartHours, smartWear *int64 + + err := d.conn.QueryRow(` + SELECT cpu_percent, memory_used, memory_free, memory_total, + hdd_used, hdd_free, hdd_total, + uptime, network_rx, network_tx, temperature, + smart_passed, smart_temp, smart_realloc, smart_hours, smart_wear + FROM metrics WHERE agent_id = ? ORDER BY ts DESC LIMIT 1`, agentID). + Scan(&cpu, &memUsed, &memFree, &memTotal, + &hddUsed, &hddFree, &hddTotal, + &uptime, &netRX, &netTX, &temperature, + &smartPassed, &smartTemp, &smartRealloc, &smartHours, &smartWear) + if err == sql.ErrNoRows { + return nil, nil + } + if err != nil { + return nil, err + } + m := &models.AgentMetrics{ + CPUPercent: cpu, + MemoryUsed: memUsed, + MemoryFree: memFree, + MemoryTotal: memTotal, + HDDUsed: hddUsed, + HDDFree: hddFree, + HDDTotal: hddTotal, + Uptime: uptime, + NetworkRX: netRX, + NetworkTX: netTX, + Temperature: temperature, + } + if smartPassed != nil { + m.Smart = &models.SmartMetrics{ + Passed: *smartPassed == 1, + Temperature: smartTemp, + ReallocatedSectors: smartRealloc, + PowerOnHours: smartHours, + WearLevel: smartWear, + } + } + return m, nil +} + func (d *DB) GetMetricsHistory(agentID string, from, to int64) ([]map[string]interface{}, error) { rows, err := d.conn.Query(` SELECT ts, cpu_percent, memory_used, memory_total, hdd_used, hdd_total diff --git a/server/handlers/agents.go b/server/handlers/agents.go index d9a37a1..1708320 100644 --- a/server/handlers/agents.go +++ b/server/handlers/agents.go @@ -15,6 +15,9 @@ func AgentsHandler(database *db.DB) http.HandlerFunc { http.Error(w, err.Error(), 500) return } + for i := range agents { + agents[i].LastMetrics, _ = database.GetLastMetrics(agents[i].ID) + } w.Header().Set("Content-Type", "application/json") json.NewEncoder(w).Encode(agents) }