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".
This commit is contained in:
goon-foss 2026-08-23 21:25:44 +02:00
parent c9fa6edc6d
commit 3c8bcada84

View file

@ -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<string, string> {
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,