From 3b6f9ee4fe10c1bca5f52c840f2506a7de7e204d Mon Sep 17 00:00:00 2001 From: BilalG1 Date: Tue, 9 Sep 2025 19:22:02 -0700 Subject: [PATCH] fix metrics queries (#880) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ---- > [!IMPORTANT] > Fixes handling of `isAnonymous` field in metrics queries by using `COALESCE` to default null values to 'false' in `route.tsx`. > > - **Behavior**: > - Fixes handling of `isAnonymous` field in metrics queries by using `COALESCE` to default null values to 'false'. > - Affects `loadUsersByCountry`, `loadDailyActiveUsers`, and `loadRecentlyActiveUsers` functions in `route.tsx`. > - **Functions**: > - `loadUsersByCountry`: Updates query condition to use `COALESCE` for `isAnonymous`. > - `loadDailyActiveUsers`: Updates query condition to use `COALESCE` for `isAnonymous`. > - `loadRecentlyActiveUsers`: Updates query condition to use `COALESCE` for `isAnonymous`. > > This description was created by [Ellipsis](https://www.ellipsis.dev?ref=stack-auth%2Fstack-auth&utm_source=github&utm_medium=referral) for b3ad2194304928c64612045e00dea9f3e518c3f0. You can [customize](https://app.ellipsis.dev/stack-auth/settings/summaries) this summary. It will automatically update as commits are pushed. ## Review by RecurseML _🔍 Review performed on [9318e2b..b3ad219](https://github.com/stack-auth/stack-auth/compare/9318e2b6ce47bbca5bc524cf8fd75e7ea0d7ee28...b3ad2194304928c64612045e00dea9f3e518c3f0)_ ✨ No bugs found, your code is sparkling clean
✅ Files analyzed, no issues (1) • `apps/backend/src/app/api/latest/internal/metrics/route.tsx`
[![Need help? Join our Discord](https://img.shields.io/badge/Need%20help%3F%20Join%20our%20Discord-5865F2?style=plastic&logo=discord&logoColor=white)](https://discord.gg/n3SsVDAW6U) ## Summary by CodeRabbit * **Bug Fixes** * Corrected handling of anonymous users in analytics: records missing an isAnonymous flag are now treated as non-anonymous when anonymous users are excluded. * Impacts country breakdown, daily active users, and recently active metrics; overall total users unchanged. * Expect slightly higher non-anonymous counts and more consistent reporting across these metrics. Co-authored-by: Konsti Wohlwend --- apps/backend/src/app/api/latest/internal/metrics/route.tsx | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/apps/backend/src/app/api/latest/internal/metrics/route.tsx b/apps/backend/src/app/api/latest/internal/metrics/route.tsx index c3088faf8..6ef762fc2 100644 --- a/apps/backend/src/app/api/latest/internal/metrics/route.tsx +++ b/apps/backend/src/app/api/latest/internal/metrics/route.tsx @@ -27,7 +27,7 @@ async function loadUsersByCountry(tenancy: Tenancy, includeAnonymous: boolean = ON "Event"."endUserIpInfoGuessId" = eip.id WHERE '$user-activity' = ANY("systemEventTypeIds"::text[]) AND "data"->>'projectId' = ${tenancy.project.id} - AND (${includeAnonymous} OR NOT "data"->>'isAnonymous' = 'true') + AND (${includeAnonymous} OR COALESCE("data"->>'isAnonymous', 'false') != 'true') AND COALESCE("data"->>'branchId', 'main') = ${tenancy.branchId} AND "countryCode" IS NOT NULL ORDER BY "userId", "eventStartedAt" DESC @@ -87,7 +87,7 @@ async function loadDailyActiveUsers(tenancy: Tenancy, now: Date, includeAnonymou daily_users AS ( SELECT DATE_TRUNC('day', "eventStartedAt") AS "day", - COUNT(DISTINCT CASE WHEN (${includeAnonymous} OR "data"->>'isAnonymous' = 'false') THEN "data"->'userId' ELSE NULL END) AS "dau" + COUNT(DISTINCT CASE WHEN (${includeAnonymous} OR COALESCE("data"->>'isAnonymous', 'false') != 'true') THEN "data"->'userId' ELSE NULL END) AS "dau" FROM "Event" WHERE "eventStartedAt" >= ${now}::date - INTERVAL '30 days' AND '$user-activity' = ANY("systemEventTypeIds"::text[]) @@ -146,7 +146,7 @@ async function loadRecentlyActiveUsers(tenancy: Tenancy, includeAnonymous: boole ) as rn FROM "Event" WHERE "data"->>'projectId' = ${tenancy.project.id} - AND (${includeAnonymous} OR NOT "data"->>'isAnonymous' = 'true') + AND (${includeAnonymous} OR COALESCE("data"->>'isAnonymous', 'false') != 'true') AND COALESCE("data"->>'branchId', 'main') = ${tenancy.branchId} AND '$user-activity' = ANY("systemEventTypeIds"::text[]) )