Spaces:
Running
Running
| -- Dashboard summary table + pg_cron hourly refresh | |
| -- Run this in the Supabase SQL Editor | |
| -- 1. Create the summary table (single row, updated hourly) | |
| CREATE TABLE IF NOT EXISTS dashboard_summary ( | |
| id text PRIMARY KEY DEFAULT 'current', | |
| updated_at timestamptz DEFAULT now(), | |
| total_tokens_saved bigint DEFAULT 0, | |
| total_cost_saved numeric DEFAULT 0, | |
| total_requests int DEFAULT 0, | |
| unique_instances int DEFAULT 0, | |
| active_days int DEFAULT 0, | |
| daily_stats jsonb DEFAULT '[]'::jsonb, | |
| hourly_stats jsonb DEFAULT '[]'::jsonb, | |
| top_instances jsonb DEFAULT '[]'::jsonb, | |
| os_breakdown jsonb DEFAULT '{}'::jsonb, | |
| version_breakdown jsonb DEFAULT '{}'::jsonb | |
| ); | |
| -- 2. RLS: anon can SELECT (public dashboard), only postgres can write | |
| ALTER TABLE dashboard_summary ENABLE ROW LEVEL SECURITY; | |
| CREATE POLICY "Public read access" ON dashboard_summary | |
| FOR SELECT USING (true); | |
| -- 3. The aggregation function (called by pg_cron) | |
| CREATE OR REPLACE FUNCTION refresh_dashboard_summary() | |
| RETURNS void AS $$ | |
| DECLARE | |
| _daily jsonb; | |
| _hourly jsonb; | |
| _top jsonb; | |
| _os jsonb; | |
| _versions jsonb; | |
| _total_tokens bigint; | |
| _total_cost numeric; | |
| _total_requests int; | |
| _unique_instances int; | |
| _active_days int; | |
| BEGIN | |
| -- Daily totals: MAX per instance per day (beacon is cumulative), then SUM across instances | |
| WITH instance_daily AS ( | |
| SELECT | |
| instance_id, | |
| created_at::date AS day, | |
| MAX(COALESCE(tokens_saved, 0)) AS tokens_saved, | |
| MAX(COALESCE(cost_saved_usd, 0)) AS cost_saved, | |
| MAX(COALESCE(requests, 0)) AS requests | |
| FROM proxy_telemetry_v2 | |
| GROUP BY instance_id, created_at::date | |
| ), | |
| daily_agg AS ( | |
| SELECT | |
| day, | |
| SUM(tokens_saved) AS tokens_saved, | |
| SUM(cost_saved)::numeric(12,2) AS cost_saved, | |
| SUM(requests) AS requests, | |
| COUNT(DISTINCT instance_id) AS instances | |
| FROM instance_daily | |
| GROUP BY day | |
| ORDER BY day | |
| ) | |
| SELECT | |
| COALESCE(jsonb_agg(jsonb_build_object( | |
| 'date', day, | |
| 'tokens_saved', tokens_saved, | |
| 'cost_saved', cost_saved, | |
| 'requests', requests, | |
| 'instances', instances | |
| ) ORDER BY day), '[]'::jsonb), | |
| COALESCE(SUM(tokens_saved), 0), | |
| COALESCE(SUM(cost_saved), 0), | |
| COALESCE(SUM(requests), 0), | |
| COUNT(DISTINCT day) | |
| INTO _daily, _total_tokens, _total_cost, _total_requests, _active_days | |
| FROM daily_agg; | |
| -- Hourly totals: last 48 hours, MAX per instance per hour, then SUM across instances | |
| WITH instance_hourly AS ( | |
| SELECT | |
| instance_id, | |
| date_trunc('hour', created_at) AS hour, | |
| MAX(COALESCE(tokens_saved, 0)) AS tokens_saved, | |
| MAX(COALESCE(cost_saved_usd, 0)) AS cost_saved, | |
| MAX(COALESCE(requests, 0)) AS requests | |
| FROM proxy_telemetry_v2 | |
| WHERE created_at >= now() - interval '48 hours' | |
| GROUP BY instance_id, date_trunc('hour', created_at) | |
| ), | |
| hourly_agg AS ( | |
| SELECT | |
| hour, | |
| SUM(tokens_saved) AS tokens_saved, | |
| SUM(cost_saved)::numeric(12,2) AS cost_saved, | |
| SUM(requests) AS requests, | |
| COUNT(DISTINCT instance_id) AS instances | |
| FROM instance_hourly | |
| GROUP BY hour | |
| ORDER BY hour | |
| ) | |
| SELECT COALESCE(jsonb_agg(jsonb_build_object( | |
| 'hour', to_char(hour, 'YYYY-MM-DD HH24:MI'), | |
| 'tokens_saved', tokens_saved, | |
| 'cost_saved', cost_saved, | |
| 'requests', requests, | |
| 'instances', instances | |
| ) ORDER BY hour), '[]'::jsonb) | |
| INTO _hourly | |
| FROM hourly_agg; | |
| -- Unique instances | |
| SELECT COUNT(DISTINCT instance_id) INTO _unique_instances FROM proxy_telemetry_v2; | |
| -- Top 20 instances by total tokens saved | |
| WITH instance_totals AS ( | |
| SELECT | |
| instance_id, | |
| SUM(max_tokens) AS tokens_saved, | |
| SUM(max_cost)::numeric(12,2) AS cost_saved, | |
| MAX(os) AS os, | |
| MAX(version) AS version | |
| FROM ( | |
| SELECT | |
| instance_id, | |
| created_at::date, | |
| MAX(COALESCE(tokens_saved, 0)) AS max_tokens, | |
| MAX(COALESCE(cost_saved_usd, 0)) AS max_cost, | |
| MAX(os) AS os, | |
| MAX(headroom_version) AS version | |
| FROM proxy_telemetry_v2 | |
| GROUP BY instance_id, created_at::date | |
| ) sub | |
| GROUP BY instance_id | |
| ORDER BY tokens_saved DESC | |
| LIMIT 20 | |
| ) | |
| SELECT COALESCE(jsonb_agg(jsonb_build_object( | |
| 'instance_id', LEFT(instance_id, 8), | |
| 'tokens_saved', tokens_saved, | |
| 'cost_saved', cost_saved, | |
| 'os', SPLIT_PART(COALESCE(os, '?'), ' ', 1), | |
| 'version', version | |
| ) ORDER BY tokens_saved DESC), '[]'::jsonb) | |
| INTO _top | |
| FROM instance_totals; | |
| -- OS breakdown | |
| SELECT COALESCE(jsonb_object_agg(os_name, cnt), '{}'::jsonb) | |
| INTO _os | |
| FROM ( | |
| SELECT SPLIT_PART(COALESCE(os, '?'), ' ', 1) AS os_name, COUNT(*) AS cnt | |
| FROM proxy_telemetry_v2 | |
| GROUP BY os_name | |
| ) sub; | |
| -- Version breakdown | |
| SELECT COALESCE(jsonb_object_agg(COALESCE(headroom_version, '?'), cnt), '{}'::jsonb) | |
| INTO _versions | |
| FROM ( | |
| SELECT headroom_version, COUNT(*) AS cnt | |
| FROM proxy_telemetry_v2 | |
| GROUP BY headroom_version | |
| ) sub; | |
| -- Upsert the single summary row | |
| INSERT INTO dashboard_summary (id, updated_at, total_tokens_saved, total_cost_saved, | |
| total_requests, unique_instances, active_days, daily_stats, hourly_stats, | |
| top_instances, os_breakdown, version_breakdown) | |
| VALUES ('current', now(), _total_tokens, _total_cost, _total_requests, | |
| _unique_instances, _active_days, _daily, _hourly, _top, _os, _versions) | |
| ON CONFLICT (id) DO UPDATE SET | |
| updated_at = EXCLUDED.updated_at, | |
| total_tokens_saved = EXCLUDED.total_tokens_saved, | |
| total_cost_saved = EXCLUDED.total_cost_saved, | |
| total_requests = EXCLUDED.total_requests, | |
| unique_instances = EXCLUDED.unique_instances, | |
| active_days = EXCLUDED.active_days, | |
| daily_stats = EXCLUDED.daily_stats, | |
| hourly_stats = EXCLUDED.hourly_stats, | |
| top_instances = EXCLUDED.top_instances, | |
| os_breakdown = EXCLUDED.os_breakdown, | |
| version_breakdown = EXCLUDED.version_breakdown; | |
| END; | |
| $$ LANGUAGE plpgsql; | |
| -- 4. Run it once to populate | |
| SELECT refresh_dashboard_summary(); | |
| -- 5. Enable pg_cron extension (if not already) | |
| CREATE EXTENSION IF NOT EXISTS pg_cron; | |
| -- 6. Schedule hourly refresh (runs at minute 7 to avoid :00 congestion) | |
| SELECT cron.schedule( | |
| 'refresh-dashboard', | |
| '7 * * * *', | |
| 'SELECT refresh_dashboard_summary()' | |
| ); | |
| -- Verify the schedule | |
| SELECT * FROM cron.job; | |