mirror of
https://github.com/Significant-Gravitas/AutoGPT.git
synced 2026-04-08 03:00:28 -04:00
### Changes 🏗️ Adds `autogpt_platform/analytics/` — 14 SQL view definitions that expose production data safely through a locked-down `analytics` schema. **Security model:** - Views use `security_invoker = false` (PostgreSQL 15+), so they execute as their owner (`postgres`), not the caller - `analytics_readonly` role only has access to `analytics.*` — cannot touch `platform` or `auth` tables directly **Files:** - `backend/generate_views.py` — does everything; auto-reads credentials from `backend/.env` - `analytics/queries/*.sql` — 14 documented view definitions (auth, user activity, executions, onboarding funnel, cohort retention) --- ### Running locally (dev) ```bash cd autogpt_platform/backend # First time only — creates analytics schema, role, grants poetry run analytics-setup # Create / refresh views (auto-reads backend/.env) poetry run analytics-views ``` ### Running in production (Supabase) ```bash cd autogpt_platform/backend # Step 1 — first time only (run in Supabase SQL Editor as postgres superuser) poetry run analytics-setup --dry-run # Paste the output into Supabase SQL Editor and run # Step 2 — apply views (use direct connection host, not pooler) poetry run analytics-views --db-url "postgresql://postgres:PASSWORD@db.<ref>.supabase.co:5432/postgres" # Step 3 — set password for analytics_readonly so external tools can connect # Run in Supabase SQL Editor: # ALTER ROLE analytics_readonly WITH PASSWORD 'your-password'; ``` --- ### Checklist 📋 #### For code changes: - [x] I have clearly listed my changes in the PR description - [x] I have made a test plan - [x] I have tested my changes according to the test plan: - [x] Setup + views applied cleanly on local Postgres 15 - [x] `analytics_readonly` can `SELECT` from all 14 `analytics.*` views - [x] `analytics_readonly` gets `permission denied` on `platform.*` and `auth.*` directly --------- Co-authored-by: Otto (AGPT) <otto@agpt.co>
46 lines
1.8 KiB
SQL
46 lines
1.8 KiB
SQL
-- =============================================================
|
|
-- View: analytics.user_onboarding
|
|
-- Looker source alias: ds68 | Charts: 3
|
|
-- =============================================================
|
|
-- DESCRIPTION
|
|
-- One row per user onboarding record. Contains the user's
|
|
-- stated usage reason, selected integrations, completed
|
|
-- onboarding steps and optional first agent selection.
|
|
-- Full history (no date filter) since onboarding happens
|
|
-- once per user.
|
|
--
|
|
-- SOURCE TABLES
|
|
-- platform.UserOnboarding — Onboarding state per user
|
|
--
|
|
-- OUTPUT COLUMNS
|
|
-- id TEXT Onboarding record UUID
|
|
-- createdAt TIMESTAMPTZ When onboarding started
|
|
-- updatedAt TIMESTAMPTZ Last update to onboarding state
|
|
-- usageReason TEXT Why user signed up (e.g. 'work', 'personal')
|
|
-- integrations TEXT[] Array of integration names the user selected
|
|
-- userId TEXT User UUID
|
|
-- completedSteps TEXT[] Array of onboarding step enums completed
|
|
-- selectedStoreListingVersionId TEXT First marketplace agent the user chose (if any)
|
|
--
|
|
-- EXAMPLE QUERIES
|
|
-- -- Usage reason breakdown
|
|
-- SELECT "usageReason", COUNT(*) FROM analytics.user_onboarding GROUP BY 1;
|
|
--
|
|
-- -- Completion rate per step
|
|
-- SELECT step, COUNT(*) AS users_completed
|
|
-- FROM analytics.user_onboarding
|
|
-- CROSS JOIN LATERAL UNNEST("completedSteps") AS step
|
|
-- GROUP BY 1 ORDER BY users_completed DESC;
|
|
-- =============================================================
|
|
|
|
SELECT
|
|
id,
|
|
"createdAt",
|
|
"updatedAt",
|
|
"usageReason",
|
|
integrations,
|
|
"userId",
|
|
"completedSteps",
|
|
"selectedStoreListingVersionId"
|
|
FROM platform."UserOnboarding"
|