forked from wrenn/wrenn
- New sandbox_metrics_snapshots table sampled every 10s (60-day retention) - Background MetricsSampler goroutine wired into control plane startup - GET /v1/sandboxes/stats?range=5m|1h|6h|24h|30d endpoint with adaptive polling intervals; reserved CPU/RAM uses ceil(paused/2) formula - StatsPanel component: 4 stat cards + 2 Chart.js line charts (straight lines, integer y-axis for running count, dual-axis for CPU/RAM) - Range filter persisted in URL query param; polls update data silently (no blink — loading state only shown on initial mount) - Split /dashboard/capsules into /list and /stats sub-routes with shared layout; capsuleRunningCount store syncs badge across routes - CreateCapsuleDialog extracted as reusable component
19 lines
579 B
SQL
19 lines
579 B
SQL
-- +goose Up
|
|
|
|
CREATE TABLE sandbox_metrics_snapshots (
|
|
id BIGSERIAL PRIMARY KEY,
|
|
team_id TEXT NOT NULL,
|
|
sampled_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
|
|
running_count INTEGER NOT NULL,
|
|
vcpus_reserved INTEGER NOT NULL,
|
|
memory_mb_reserved INTEGER NOT NULL
|
|
);
|
|
|
|
-- All queries filter on team_id first then range-scan sampled_at.
|
|
CREATE INDEX idx_metrics_snapshots_team_time
|
|
ON sandbox_metrics_snapshots (team_id, sampled_at DESC);
|
|
|
|
-- +goose Down
|
|
|
|
DROP TABLE sandbox_metrics_snapshots;
|