forked from wrenn/wrenn
108 lines
4.3 KiB
SQL
108 lines
4.3 KiB
SQL
-- name: InsertMetricsSnapshot :exec
|
|
INSERT INTO sandbox_metrics_snapshots (team_id, running_count, vcpus_reserved, memory_mb_reserved)
|
|
VALUES ($1, $2, $3, $4);
|
|
|
|
-- name: GetLiveMetrics :one
|
|
-- Reads directly from sandboxes for accurate real-time current values.
|
|
-- CPU reserved = running + starting only (paused VMs release CPU).
|
|
-- RAM reserved = running + starting + sum(ceil(each_paused/2)) (per-VM ceiling).
|
|
SELECT
|
|
(COUNT(*) FILTER (WHERE status IN ('running', 'starting')))::INTEGER AS running_count,
|
|
(COALESCE(SUM(vcpus) FILTER (WHERE status IN ('running', 'starting')), 0))::INTEGER AS vcpus_reserved,
|
|
(COALESCE(SUM(memory_mb) FILTER (WHERE status IN ('running', 'starting')), 0)
|
|
+ COALESCE(SUM(CEIL(memory_mb::NUMERIC / 2)) FILTER (WHERE status = 'paused'), 0))::INTEGER AS memory_mb_reserved
|
|
FROM sandboxes
|
|
WHERE team_id = $1;
|
|
|
|
-- name: GetPeakMetrics :one
|
|
SELECT
|
|
COALESCE(MAX(running_count), 0)::INTEGER AS peak_running_count,
|
|
COALESCE(MAX(vcpus_reserved), 0)::INTEGER AS peak_vcpus,
|
|
COALESCE(MAX(memory_mb_reserved), 0)::INTEGER AS peak_memory_mb
|
|
FROM sandbox_metrics_snapshots
|
|
WHERE team_id = $1
|
|
AND sampled_at > NOW() - INTERVAL '30 days';
|
|
|
|
-- name: PruneOldMetrics :exec
|
|
DELETE FROM sandbox_metrics_snapshots
|
|
WHERE sampled_at < NOW() - INTERVAL '60 days';
|
|
|
|
-- name: InsertSandboxMetricPoint :exec
|
|
INSERT INTO sandbox_metric_points (sandbox_id, tier, ts, cpu_pct, mem_bytes, disk_bytes)
|
|
VALUES ($1, $2, $3, $4, $5, $6)
|
|
ON CONFLICT (sandbox_id, tier, ts) DO NOTHING;
|
|
|
|
-- name: GetSandboxMetricPoints :many
|
|
SELECT ts, cpu_pct, mem_bytes, disk_bytes
|
|
FROM sandbox_metric_points
|
|
WHERE sandbox_id = $1 AND tier = $2 AND ts >= $3
|
|
ORDER BY ts ASC;
|
|
|
|
-- name: DeleteSandboxMetricPoints :exec
|
|
DELETE FROM sandbox_metric_points
|
|
WHERE sandbox_id = $1;
|
|
|
|
-- name: DeleteSandboxMetricPointsByTier :exec
|
|
DELETE FROM sandbox_metric_points
|
|
WHERE sandbox_id = $1 AND tier = $2;
|
|
|
|
-- name: PruneSandboxMetricPoints :exec
|
|
-- Remove metric points older than 30 days for destroyed sandboxes.
|
|
DELETE FROM sandbox_metric_points
|
|
WHERE ts < EXTRACT(EPOCH FROM NOW() - INTERVAL '30 days')::BIGINT;
|
|
|
|
-- name: DeleteMetricsSnapshotsByTeam :exec
|
|
DELETE FROM sandbox_metrics_snapshots WHERE team_id = $1;
|
|
|
|
-- name: DeleteMetricPointsByTeam :exec
|
|
DELETE FROM sandbox_metric_points
|
|
WHERE sandbox_id IN (SELECT id FROM sandboxes WHERE team_id = $1);
|
|
|
|
-- name: SampleSandboxMetrics :many
|
|
-- Aggregates per-team resource usage from the live sandboxes table.
|
|
-- Groups by all teams that have any sandbox row (including stopped) so that
|
|
-- zero-value snapshots are recorded when all capsules are stopped, keeping the
|
|
-- time-series charts continuous rather than trailing off into empty space.
|
|
-- CPU reserved = running + starting only (paused VMs release CPU).
|
|
-- RAM reserved = running + starting + sum(ceil(each_paused/2)) (per-VM ceiling).
|
|
SELECT
|
|
team_id,
|
|
(COUNT(*) FILTER (WHERE status IN ('running', 'starting')))::INTEGER AS running_count,
|
|
(COALESCE(SUM(vcpus) FILTER (WHERE status IN ('running', 'starting')), 0))::INTEGER AS vcpus_reserved,
|
|
(COALESCE(SUM(memory_mb) FILTER (WHERE status IN ('running', 'starting')), 0)
|
|
+ COALESCE(SUM(CEIL(memory_mb::NUMERIC / 2)) FILTER (WHERE status = 'paused'), 0))::INTEGER AS memory_mb_reserved
|
|
FROM sandboxes
|
|
GROUP BY team_id;
|
|
|
|
-- name: GetTeamsWithSnapshots :many
|
|
SELECT DISTINCT team_id
|
|
FROM sandbox_metrics_snapshots
|
|
WHERE sampled_at > NOW() - INTERVAL '93 days';
|
|
|
|
-- name: ComputeDailyUsageForDay :one
|
|
SELECT
|
|
COALESCE(SUM(vcpus_reserved * 10.0 / 60.0), 0)::NUMERIC(18,4) AS cpu_minutes,
|
|
COALESCE(SUM(memory_mb_reserved * 10.0 / 60.0), 0)::NUMERIC(18,4) AS ram_mb_minutes
|
|
FROM sandbox_metrics_snapshots
|
|
WHERE team_id = $1
|
|
AND sampled_at >= $2
|
|
AND sampled_at < $3;
|
|
|
|
-- name: UpsertDailyUsage :exec
|
|
INSERT INTO daily_usage (team_id, day, cpu_minutes, ram_mb_minutes)
|
|
VALUES ($1, $2, $3, $4)
|
|
ON CONFLICT (team_id, day) DO UPDATE
|
|
SET cpu_minutes = EXCLUDED.cpu_minutes,
|
|
ram_mb_minutes = EXCLUDED.ram_mb_minutes;
|
|
|
|
-- name: GetDailyUsage :many
|
|
SELECT day, cpu_minutes, ram_mb_minutes
|
|
FROM daily_usage
|
|
WHERE team_id = $1
|
|
AND day >= $2
|
|
AND day <= $3
|
|
ORDER BY day ASC;
|
|
|
|
-- name: DeleteDailyUsageByTeam :exec
|
|
DELETE FROM daily_usage WHERE team_id = $1;
|