From 3c8bcada848492491abeda25219693750b809df3 Mon Sep 17 00:00:00 2001 From: goon-foss Date: Sun, 23 Aug 2026 21:25:44 +0200 Subject: [PATCH] feat(mobile): otaguj w Sentry, ktora paczke JS odpalil uzytkownik Bez tego kazdy crash jest nie do zinterpretowania: `release` bierze sie z `app.json` i przy publikacji OTA sie NIE zmienia, wiec raport sprzed poprawki wyglada identycznie jak raport po niej. Konkret: GOON-1S (crash na `maintainVisibleContentPosition`) wrocil jako regressed, a propa nie ma w zrodle od 1e6be19 i nie ustawia go zadna biblioteka. Nie dalo sie rozstrzygnac, czy poprawka nie dziala, czy to ogon starych instalacji. Grep po bundlu tez nie pomaga, bo Hermes trzyma jeden egzemplarz kazdego napisu, a ta nazwa siedzi w samym React Native. Cztery tagi: id paczki (albo `embedded` gdy leci bundle z APK), data jej publikacji, runtime i flaga awaryjnego startu. Ta ostatnia rozroznia "user siedzi na starym kodzie" od "paczka OTA nie dala sie zaladowac i apka sie cofnela". --- mobile/App.tsx | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/mobile/App.tsx b/mobile/App.tsx index bc320c6..3dc79cb 100644 --- a/mobile/App.tsx +++ b/mobile/App.tsx @@ -54,8 +54,31 @@ const SENTRY_ENV = process.env.EXPO_PUBLIC_SENTRY_ENVIRONMENT || (Constants.expoConfig?.extra?.sentryEnvironment as string | undefined) || 'production'; +/** + * Którą paczkę JS realnie odpalił użytkownik. Bez tego KAŻDY crash jest nie do + * zinterpretowania: `release` bierze się z `app.json` i przy publikacji OTA się NIE + * zmienia, więc raport sprzed poprawki wygląda identycznie jak raport po niej. + * Przy GOON-1S (crash na `maintainVisibleContentPosition`) nie dało się rozstrzygnąć, + * czy poprawka nie działa, czy to ogon starych instalacji. + */ +function otaTags(): Record { + try { + return { + ota_update: Updates.isEmbeddedLaunch ? 'embedded' : Updates.updateId ?? 'unknown', + ota_created: Updates.createdAt?.toISOString() ?? 'embedded', + ota_runtime: Updates.runtimeVersion ?? 'unknown', + // Awaryjny start = paczka OTA nie dała się załadować i apka cofnęła się do tej + // wbudowanej w APK. Inaczej wygląda to jak zwykły start na starym kodzie. + ota_emergency: Updates.isEmergencyLaunch ? 'yes' : 'no', + }; + } catch { + return { ota_update: 'unavailable' }; + } +} + if (SENTRY_DSN) { Sentry.init({ + initialScope: { tags: otaTags() }, dsn: SENTRY_DSN, environment: SENTRY_ENV, // 0.1 = 10% sesji ma full performance trace. Free tier ma 10k transactions/mies,