@sentry/react-native en Expo SDK 57 - inicialización, mapas de fuentes, salud de versión y migas de navegación conectadas para compilaciones EAS. Este cookbook asume que ya entiendes la pila de señales de Observability Basics.
El asistente agrega configuración del plugin Metro, ganchos nativos y pasos de compilación de EAS. Para configuración manual, fija las versiones compatibles con RN 0.86:
# Después de que se complete la compilación EAS, los ganchos de sentry-expo / wizard suben:# - Mapas de fuentes de Hermes (JS)# - Símbolos de depuración para fotogramas nativos (dSYM de iOS, NDK de Android si se usa)eas build --platform all --profile production
3. Migas de navegación (Expo Router)
import { useEffect } from "react";import { usePathname } from "expo-router";import * as Sentry from "@sentry/react-native";export function useSentryRouteBreadcrumb() { const pathname = usePathname(); useEffect(() => { Sentry.addBreadcrumb({ category: "navigation", message: pathname, level: "info", }); Sentry.setTag("route", pathname); }, [pathname]);}
Bootstrap completo con contexto de sesión, alcance de usuario consciente de autenticación e integración de límite de error.
// src/observability/sentry.tsimport * as Sentry from "@sentry/react-native";import * as Application from "expo-application";import * as Updates from "expo-updates";export function initSentry() { const version = Application.nativeApplicationVersion ?? "0.0.0"; const build = Application.nativeBuildVersion ?? "0"; Sentry.init({ dsn: process.env.EXPO_PUBLIC_SENTRY_DSN, environment: process.env.EXPO_PUBLIC_APP_ENV, release: `${version}+${build}`, dist: Updates.updateId ?? build, enableAutoSessionTracking: true, enableNative: true, enableNativeCrashHandling: true, tracesSampleRate: __DEV__ ? 1.0 : 0.15, integrations: [ Sentry.reactNativeTracingIntegration(), ], });}export function setSentryUser(userId: string | null) { if (userId) { Sentry.setUser({ id: userId }); } else { Sentry.setUser(null); }}export function captureWithContext(error: unknown, context?: Record<string, unknown>) { Sentry.withScope((scope) => { if (context) scope.setContext("extra", context); Sentry.captureException(error); });}
// app/_layout.tsximport { useEffect } from "react";import { Stack } from "expo-router";import * as Sentry from "@sentry/react-native";import { initSentry, setSentryUser } from "@/observability/sentry";import { useSentryRouteBreadcrumb } from "@/observability/useSentryRouteBreadcrumb";import { useAuth } from "@/features/auth/useAuth";initSentry();function RootLayout() { const { userId } = useAuth(); useSentryRouteBreadcrumb(); useEffect(() => { setSentryUser(userId); }, [userId]); return ( <Sentry.ErrorBoundary fallback={<CrashFallback />}> <Stack /> </Sentry.ErrorBoundary> );}function CrashFallback() { return null; // tu interfaz de recuperación}export default Sentry.wrap(RootLayout);
// Empareja con cierre de sesión de autenticación - limpia el alcance del usuario// setSentryUser(null) al cerrar sesión - ver ../auth-session/mobile-auth-basics/
Sentry Release Health rastrea sesiones y tasas sin fallos por release + environment.
// Las sesiones comienzan automáticamente con enableAutoSessionTracking: true// Terminan al fallar o en segundo plano más allá de sessionTrackingIntervalMillis (por defecto 30s)Sentry.init({ // ... enableAutoSessionTracking: true, sessionTrackingIntervalMillis: 30000,});
Compara sesiones sin fallos entre entornos production y preview
Una OTA deficiente aparece como una caída en el mismo lanzamiento nativo con una nueva dist