Expo Router

Learn how to use Sentry's Expo Router instrumentation.

Sentry's React Native SDK package ships with instrumentation for Expo Router. This allows you to see the performance of your navigation transitions and the errors that occur during them. This page will guide you through setting up the instrumentation and configuring it to your needs.

The code snippet below shows how to initialize the instrumentation.

app/_layout.tsx
Copied
import React from "react";
import { Slot, useNavigationContainerRef } from "expo-router";
import Constants, { ExecutionEnvironment } from "expo-constants";
import * as Sentry from "@sentry/react-native";

const navigationIntegration = Sentry.reactNavigationIntegration({
  enableTimeToInitialDisplay:
    Constants.executionEnvironment === ExecutionEnvironment.StoreClient, // Only in native builds, not in Expo Go.
});

Sentry.init({
  dsn: "https://examplePublicKey@o0.ingest.sentry.io/0",
  // Set tracesSampleRate to 1.0 to capture 100% of transactions for tracing.
  // We recommend adjusting this value in production.
  tracesSampleRate: 1.0,
  integrations: [navigationIntegration],
  enableNativeFramesTracking:
    Constants.executionEnvironment === ExecutionEnvironment.StoreClient, // Only in native builds, not in Expo Go.
});

function RootLayout() {
  const ref = useNavigationContainerRef();
  React.useEffect(() => {
    if (ref) {
      navigationIntegration.registerNavigationContainer(ref);
    }
  }, [ref]);

  return <Slot />;
}

export default Sentry.wrap(RootLayout);

You can configure the instrumentation by passing an options object to the constructor:

Copied
Sentry.reactNavigationIntegration({
  enableTimeToInitialDisplay: true, // default: false
  routeChangeTimeoutMs: 1000, // default: 1000
  ignoreEmptyBackNavigationTransactions: true, // default: true
});

This option specifies how long the instrumentation will wait for the route to mount after a change has been initiated before the transaction is discarded. The default value is 1_000.

This option will enable automatic measuring of the time to initial display for each route. To learn more see Time to Initial Display. The default value is false.

This ensures that transactions that are from routes that've been seen and don't have any spans, are not being sampled. This removes a lot of clutter, making it so that most back navigation transactions are now ignored. The default value is true.

  • Slow and Frozen frames, Time To Initial Display and Time To Full Display are only available in native builds, not in Expo Go.
Help improve this content
Our documentation is open source and available on GitHub. Your contributions are welcome, whether fixing a typo (drat!) or suggesting an update ("yeah, this would be better").