mcpField
S
sentry-react-native-sdk

sentry-react-native-sdk

github.com/getsentry開発2724.1k 回インストール今日更新
リポジトリ

sentry-react-native-sdk について

React NativeやExpoのプロジェクトを調査し、Sentry SDKの設定を案内するスキルです。監視、トレース、リプレイ、プロファイリング、ログを扱い、プロジェクト種別に応じた手順を示します。

主な機能

  1. 01React NativeとExpoの構成を判別
  2. 02Sentryの可観測性機能を提案
  3. 03ウィザードによるインストールを案内
  4. 04ExpoとベアReact Nativeの手順を提示
  5. 05エラー監視とトレースを設定
  6. 06SDK設定を検証

活用シーン

  1. 01ExpoアプリにSentryを追加
  2. 02ベアReact NativeプロジェクトでSentryを設定
  3. 03モバイルのクラッシュと性能を監視

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/getsentry/sentry-for-ai --skill sentry-react-native-sdk

インストール後、Claude Code で/sentry-react-native-sdkを入力して読み込まれたか確認します。

同梱ファイル

SKILL.md と一緒にインストールされる参考資料やスクリプト。

references/
error-monitoring.md
expo-config-plugin.md
logging.md
profiling.md
session-replay.md
tracing.md
user-feedback.md

詳細

すべてのスキル > SDK のセットアップ > React Native SDK

Sentry React Native SDK

React Native または Expo プロジェクトをスキャンし、エラー監視、トレーシング、プロファイリング、セッションリプレイ、ロギングなど、Sentry のセットアップをすべて案内する、独自の方針を持つウィザードです。

このスキルを呼び出すタイミング

  • ユーザーが「React Native に Sentry を追加して」や、RN または Expo アプリで「Sentry をセットアップして」と依頼した場合
  • ユーザーが React Native でのエラー監視、トレーシング、プロファイリング、セッションリプレイ、ロギングを希望する場合
  • ユーザーが @sentry/react-native、モバイルのエラートラッキング、または Expo 向け Sentry に言及した場合
  • ユーザーが iOS/Android でネイティブクラッシュ、ANR、アプリのフリーズを監視したい場合

注: 以下の SDK バージョンと API は、執筆時点の Sentry のドキュメント(@sentry/react-native ≥6.0.0、推奨最小バージョン ≥8.0.0)を反映しています。 実装前に必ずdocs.sentry.io/platforms/react-native/で確認してください。


フェーズ 1:検出

推奨事項を提示する前に、次のコマンドを実行してプロジェクトを把握してください。

# Detect project type and existing Sentry
cat package.json | grep -E '"(react-native|expo|@expo|@sentry/react-native|sentry-expo)"'

# Distinguish Expo managed vs bare vs vanilla RN
ls app.json app.config.js app.config.ts 2>/dev/null
cat app.json 2>/dev/null | python3 -c "import sys,json; d=json.load(sys.stdin); print('Expo managed' if 'expo' in d else 'Bare/Vanilla')" 2>/dev/null

# Check Expo SDK version (important: Expo SDK 50+ required for @sentry/react-native)
cat package.json | grep '"expo"'

# Detect navigation library
grep -E '"(@react-navigation/native|react-native-navigation)"' package.json

# Detect state management (Redux → breadcrumb integration available)
grep -E '"(redux|@reduxjs/toolkit|zustand|mobx)"' package.json

# Check for existing Sentry initialization
grep -r "Sentry.init" src/ app/ App.tsx App.js _layout.tsx 2>/dev/null | head -5

# Detect Hermes (affects source map handling)
cat android/app/build.gradle 2>/dev/null | grep -i hermes
cat ios/Podfile 2>/dev/null | grep -i hermes

# Detect Expo Router
ls app/_layout.tsx app/_layout.js 2>/dev/null

# Detect backend for cross-link
ls backend/ server/ api/ 2>/dev/null
find . -maxdepth 3 \( -name "go.mod" -o -name "requirements.txt" -o -name "Gemfile" -o -name "package.json" \) 2>/dev/null | grep -v node_modules | head -10

確認する項目:

質問影響
package.json に expo があるか?Expo の方法(設定プラグイン+getSentryExpoConfig)か、ベア/標準 RN の方法か
Expo SDK が ≥50 か?@sentry/react-native を直接使用。古い場合は sentry-expo(レガシーのため使用しない)
app.json に "expo" キーがあるか?Managed Expo — ウィザードが最も簡単です。設定プラグインがネイティブ設定をすべて処理します
app/_layout.tsx があるか?Expo Router プロジェクト — 初期化を _layout.tsx に追加します
package.json に @sentry/react-native がすでにあるか?インストールを省略し、機能の設定に進みます
@react-navigation/native があるか?画面トラッキング用に reactNavigationIntegration を推奨します
react-native-navigation があるか?reactNativeNavigationIntegration(Wix)を推奨します
バックエンドのディレクトリが検出されたか?フェーズ 4 の関連リンクを表示します

フェーズ 2:推奨

確認した内容に基づいて、具体的な推奨事項を提示してください。自由回答形式の質問はせず、提案から始めます。

推奨(基本的なカバレッジ — 常にセットアップする項目):

  • ✅ エラー監視 — JS 例外、ネイティブクラッシュ(iOS+Android)、ANR、アプリのフリーズをキャプチャします
  • ✅ トレーシング — モバイルのパフォーマンスは重要です。ナビゲーション、アプリの起動、ネットワークリクエストを自動計測します
  • ✅ セッションリプレイ — モバイルのリプレイでは、ユーザーの問題をデバッグするためにスクリーンショットとタッチイベントをキャプチャします

オプション(可観測性の強化):

  • ⚡ プロファイリング — iOS での CPU プロファイリング(JS プロファイリングはクロスプラットフォーム対応)。本番環境でもオーバーヘッドは低くなっています
  • ⚡ ロギング — Sentry.logger.* による構造化ログ。トレースと関連付けて全体像を把握できます
  • ⚡ ユーザーフィードバック — アプリからユーザーが送信したバグレポートを直接収集します

推奨の判断基準:

機能次の場合に推奨
エラー監視常に — あらゆるモバイルアプリに欠かせない基本機能です
トレーシングモバイルでは常に — アプリの起動、ナビゲーション、ネットワークの遅延が重要です
セッションリプレイユーザー向けの本番アプリ。ユーザーから報告された問題を視覚的にデバッグできます
プロファイリングパフォーマンスが重視される画面、起動時間への懸念、本番環境でのパフォーマンス調査がある場合
ロギングアプリが構造化ロギングを使用する場合、または Sentry でログとトレースを関連付けたい場合
ユーザーフィードバックユーザーから送信されたバグレポートを収集したいベータ版または顧客向けアプリ

提案:「お使いの [Expo Managed/ベア RN] アプリには、エラー監視+トレーシング+セッションリプレイのセットアップをおすすめします。プロファイリングとロギングも追加しますか?」


フェーズ 3:ガイド

セットアップ方法を選択する
プロジェクトの種類推奨されるセットアップ複雑さ
Expo マネージド(SDK 50 以降)ウィザード CLI、または設定プラグインを使った手動セットアップ低 — ウィザードがすべて実行します
Expo bare(SDK 50 以降)ウィザード CLI を推奨中 — iOS/Android の設定を処理します
Vanilla React Native(0.69 以降)ウィザード CLI を推奨中 — Xcode と Gradle の設定を処理します
Expo SDK <50sentry-expo(レガシー)を使用レガシーのドキュメントを参照

方法 A:ウィザード CLI(すべてのプロジェクトタイプで推奨)

この操作はご自身で実行する必要があります — ウィザードはログイン用のブラウザーを開き、エージェントでは対応できない対話型の入力を求めます。以下をコピーしてターミナルに貼り付けてください:

npx @sentry/wizard@latest -i reactNative

ログイン、組織/プロジェクトの選択、SDK のインストール、ネイティブ設定、ソースマップのアップロード、Sentry.init() を処理します。作成または変更されるファイルは次のとおりです:

ファイル操作目的
package.json@sentry/react-native をインストールしますコア SDK
metro.config.js@sentry/react-native/metro シリアライザーを追加しますソースマップの生成
app.json@sentry/react-native/expo プラグインを追加します(Expo のみ)ネイティブビルド用の設定プラグイン
App.tsx / _layout.tsxSentry.init() と Sentry.wrap() を追加しますSDK の初期化
ios/sentry.properties組織/プロジェクト/トークンを保存しますiOS のソースマップと dSYM のアップロード
android/sentry.properties組織/プロジェクト/トークンを保存しますAndroid のソースマップのアップロード
android/app/build.gradleSentry Gradle プラグインを追加しますAndroid のソースマップと ProGuard
ios/[AppName].xcodeproj「Bundle RN」ビルドフェーズをラップし、dSYM のアップロードを追加しますiOS のシンボルのアップロード
.env.localSENTRY_AUTH_TOKEN認証トークン(.gitignore に追加してください)

完了したら、戻って検証に進んでください。

ウィザードをスキップする場合は、プロジェクトの種類に応じて、以下の方法 B または C(手動セットアップ)に進んでください。


パス B:手動 — Expo Managed(SDK 50+)

ステップ 1 — インストール

npx expo install @sentry/react-native

ステップ 2 — metro.config.js

const { getSentryExpoConfig } = require("@sentry/react-native/metro");
const config = getSentryExpoConfig(__dirname, {
  // Auto-wrap Expo Router ErrorBoundary exports at build time (SDK ≥8.17.0)
  autoWrapExpoRouterErrorBoundary: true,
});
module.exports = config;

metro.config.js がまだ存在しない場合:

npx expo customize metro.config.js
# Then replace contents with the above

Metro 設定オプション:

オプション型デフォルト目的
autoWrapExpoRouterErrorBoundarybooleanfalseビルド時に export { ErrorBoundary } from 'expo-router' を Sentry で自動的にラップします(SDK ≥8.17.0)。手動でラップせずに、ルートごとの ErrorBoundary に到達したエラーをキャプチャします
annotateReactComponentsbooleanfalseエラーのコンテキストをより適切に把握できるよう、コンポーネント名を挿入します
includeWebReplaybooleantrueWeb リプレイバンドルを含めます(ネイティブ専用アプリでは false に設定します)
includeWebFeedbackbooleantrueWeb フィードバックバンドルを含めます(ネイティブ専用アプリでは false に設定します)
enableSourceContextInDevelopmentbooleantrue開発ビルドでソースコンテキストを有効にします

ステップ 3 — app.json — Expo 設定プラグインを追加する

{
  "expo": {
    "plugins": [
      [
        "@sentry/react-native/expo",
        {
          "url": "https://sentry.io/",
          "project": "YOUR_PROJECT_SLUG",
          "organization": "YOUR_ORG_SLUG",
          "disableAutoUpload": false
        }
      ]
    ]
  }
}

注記: ネイティブビルドでは、環境変数として SENTRY_AUTH_TOKEN を設定してください。バージョン管理には絶対にコミットしないでください。

プラグインオプション:

オプション型デフォルト目的
urlstring"https://sentry.io/"Sentry インスタンスの URL
projectstring—プロジェクトのスラッグ
organizationstring—組織のスラッグ
disableAutoUploadbooleanfalseローカルビルド中のソースマップと dSYM のアップロードをスキップします(SDK ≥8.13.0)

ステップ 4 — Sentry を初期化する

Expo Router の場合(app/_layout.tsx):

import { Stack } from "expo-router";
import { isRunningInExpoGo } from "expo";
import * as Sentry from "@sentry/react-native";

Sentry.init({
  dsn: process.env.EXPO_PUBLIC_SENTRY_DSN ?? "YOUR_SENTRY_DSN",
  sendDefaultPii: true,

  // Tracing
  tracesSampleRate: 1.0, // lower to 0.1–0.2 in production

  // Profiling
  profilesSampleRate: 1.0,

  // Session Replay
  replaysOnErrorSampleRate: 1.0,
  replaysSessionSampleRate: 0.1,

  // Logging (SDK ≥7.0.0)
  enableLogs: true,

  // Session Replay
  integrations: [
    Sentry.mobileReplayIntegration(),
  ],

  enableNativeFramesTracking: !isRunningInExpoGo(), // slow/frozen frames

  environment: __DEV__ ? "development" : "production",
});

function RootLayout() {
  return <Stack />;
}

export default Sentry.wrap(RootLayout);

注記: Expo Router はナビゲーショントラッキングを自動的に処理します。Expo Router プロジェクトでは Sentry.NavigationContainer のラッパーは不要です。ナビゲーションのスパンは自動的にキャプチャされます。

Expo Router の ErrorBoundary 設定(SDK ≥8.16.0)

Expo Router のルートごとの ErrorBoundary は、デフォルトでレンダリングエラーを握りつぶします。明示的にキャプチャしない限り、Sentry はエラーを認識できません。方法は 2 つあります。

  1. 自動ラップ(推奨、SDK ≥8.17.0) — metro.config.js で autoWrapExpoRouterErrorBoundary: true を有効にします(上記参照)。Babel プラグインがすべてのルートファイル内の export { ErrorBoundary } from 'expo-router' を自動的に書き換えます。

  2. 手動ラップ — 各ルートファイルで自分で境界をラップします。

    // app/_layout.tsx (or any route file)
    import { ErrorBoundary as ExpoErrorBoundary } from 'expo-router';
    import * as Sentry from '@sentry/react-native';
    
    export const ErrorBoundary = Sentry.wrapExpoRouterErrorBoundary(ExpoErrorBoundary);
    

どちらの方法でも、境界に到達したエラーをルートコンテキスト(route.name、route.path、route.params)とともにキャプチャし、アクティブなナビゲーションスパンにエラーのタグを付け、ブレッドクラムを出力します。具体的なパスとパラメーターには sendDefaultPii が適用されます。

標準的な Expo の場合(App.tsx):

import { isRunningInExpoGo } from "expo";
import * as Sentry from "@sentry/react-native";

Sentry.init({
  dsn: process.env.EXPO_PUBLIC_SENTRY_DSN ?? "YOUR_SENTRY_DSN",
  sendDefaultPii: true,
  tracesSampleRate: 1.0,
  profilesSampleRate: 1.0,
  replaysOnErrorSampleRate: 1.0,
  replaysSessionSampleRate: 0.1,
  enableLogs: true,
  integrations: [
    Sentry.mobileReplayIntegration(),
  ],
  enableNativeFramesTracking: !isRunningInExpoGo(),
  environment: __DEV__ ? "development" : "production",
});

function App() {
  return (
    <Sentry.NavigationContainer>
      {/* your navigation here */}
    </Sentry.NavigationContainer>
  );
}

export default Sentry.wrap(App);

パス C:手動 — Bare React Native(0.69+)

ステップ 1 — インストール

npm install @sentry/react-native --save
cd ios && pod install

ステップ 2 — metro.config.js

const { getDefaultConfig } = require("@react-native/metro-config");
const { withSentryConfig } = require("@sentry/react-native/metro");

const config = getDefaultConfig(__dirname);
module.exports = withSentryConfig(config, {
  // Set to false to exclude @sentry-internal/replay from the native bundle (web only).
  // includeWebReplay: true,
  // Set to false to exclude @sentry-internal/feedback from the native bundle (web only).
  // includeWebFeedback: true,
  // Auto-wrap Expo Router ErrorBoundary exports at build time (SDK ≥8.17.0, Expo Router only)
  // autoWrapExpoRouterErrorBoundary: true,
});

ステップ 3 — iOS:Xcode のビルドフェーズを変更する

Xcode で ios/[AppName].xcodeproj を開きます。**「Bundle React Native code and images」**ビルドフェーズを見つけ、スクリプトの内容を次のように置き換えます。

# RN 0.81.1+
set -e
WITH_ENVIRONMENT="../node_modules/react-native/scripts/xcode/with-environment.sh"
SENTRY_XCODE="../node_modules/@sentry/react-native/scripts/sentry-xcode.sh"
/bin/sh -c "$WITH_ENVIRONMENT $SENTRY_XCODE"

ステップ 4 — iOS:「Upload Debug Symbols to Sentry」ビルドフェーズを追加する

Xcode で新しい Run Script ビルドフェーズを追加します(バンドルフェーズの後):

/bin/sh ../node_modules/@sentry/react-native/scripts/sentry-xcode-debug-files.sh

ステップ 5 — iOS:ios/sentry.properties

defaults.url=https://sentry.io/
defaults.org=YOUR_ORG_SLUG
defaults.project=YOUR_PROJECT_SLUG
auth.token=YOUR_ORG_AUTH_TOKEN

ステップ 6 — Android:android/app/build.gradle

android {} ブロックの前に追加します。

apply from: "../../node_modules/@sentry/react-native/sentry.gradle.kts"

注記: SDK ≥8.13.0 では sentry.gradle.kts(Kotlin DSL)を使用します。古い SDK では sentry.gradle(Groovy)を使用してください。どちらも後方互換性があります。

ステップ 7 — Android:android/sentry.properties

defaults.url=https://sentry.io/
defaults.org=YOUR_ORG_SLUG
defaults.project=YOUR_PROJECT_SLUG
auth.token=YOUR_ORG_AUTH_TOKEN

ステップ 8 — Sentry を初期化する(App.tsx またはエントリーポイント)

import * as Sentry from "@sentry/react-native";

Sentry.init({
  dsn: "YOUR_SENTRY_DSN",
  sendDefaultPii: true,
  tracesSampleRate: 1.0,
  profilesSampleRate: 1.0,
  replaysOnErrorSampleRate: 1.0,
  replaysSessionSampleRate: 0.1,
  enableLogs: true,
  integrations: [
    Sentry.mobileReplayIntegration(),
  ],
  enableNativeFramesTracking: true,
  environment: __DEV__ ? "development" : "production",
});

function App() {
  return (
    <Sentry.NavigationContainer>
      {/* your navigation here */}
    </Sentry.NavigationContainer>
  );
}

export default Sentry.wrap(App);

クイックリファレンス:フル機能の Sentry.init()

すべての機能を有効にした、推奨される初期設定です。

import * as Sentry from "@sentry/react-native";

Sentry.init({
  dsn: "YOUR_SENTRY_DSN",
  sendDefaultPii: true,

  // Tracing — lower to 0.1–0.2 in high-traffic production
  tracesSampleRate: 1.0,

  // Profiling — runs on a subset of traced transactions
  profilesSampleRate: 1.0,

  // Session Replay — always capture on error, sample 10% of all sessions
  replaysOnErrorSampleRate: 1.0,
  replaysSessionSampleRate: 0.1,

  // Logging — enable Sentry.logger.* API
  enableLogs: true,

  // Integrations — mobile replay is opt-in
  integrations: [
    Sentry.mobileReplayIntegration({
      maskAllText: true,   // masks text by default for privacy
      maskAllImages: true,
    }),
  ],

  // Native frames tracking (disable in Expo Go)
  enableNativeFramesTracking: true,

  // Environment
  environment: __DEV__ ? "development" : "production",

  // Release — set from CI or build system
  // release: "[email protected]+1",
  // dist: "1",
});

// REQUIRED: Wrap root component to capture React render errors
export default Sentry.wrap(App);
アプリ起動の正確性 — Sentry.appLoaded()(SDK ≥8.x)

ルートコンポーネントのマウント後にアプリが重要な非同期処理を行う場合(設定の取得や認証の完了待ちなど)は、その処理が完了した時点で Sentry.appLoaded() を呼び出してください。これにより、Sentry にアプリ起動の実際の終了を通知し、アプリ起動時間をより正確に測定できます。

// Call after async initialization is complete, e.g., in a useEffect or after a loading screen:
useEffect(() => {
  fetchConfig().then(() => {
    Sentry.appLoaded();  // marks the end of the app startup phase
  });
}, []);

Sentry.appLoaded() を呼び出さない場合、SDK がアプリ起動の終了を自動で推定します。


ナビゲーションのセットアップ — React Navigation(v5+)

推奨:Sentry.NavigationContainer ラッパーを使用(SDK ≥8.13.0)

NavigationContainer のドロップイン置換で、ナビゲーションのトラッキングを自動的に設定します。

import * as Sentry from "@sentry/react-native";

// Replace NavigationContainer with Sentry.NavigationContainer
<Sentry.NavigationContainer>
  <Stack.Navigator>
    {/* your screens */}
  </Stack.Navigator>
</Sentry.NavigationContainer>

これだけで完了です。ラッパーは次の処理を自動で行います。

  • reactNavigationIntegration を作成します
  • ナビゲーションコンテナーの参照を登録します
  • ナビゲーションイベントのパンくずリストを記録します(SDK ≥8.13.0)
  • 画面ごとの初回表示までの時間(TTID)をトラッキングします

別の方法:手動でセットアップ(SDK <8.13.0 またはカスタム設定の場合)

import { reactNavigationIntegration } from "@sentry/react-native";
import { NavigationContainer, createNavigationContainerRef } from "@react-navigation/native";

const navigationIntegration = reactNavigationIntegration({
  enableTimeToInitialDisplay: true,   // track TTID per screen
  routeChangeTimeoutMs: 1_000,        // max wait for route change to settle
  ignoreEmptyBackNavigationTransactions: true,
});

// Add to Sentry.init integrations array
Sentry.init({
  integrations: [navigationIntegration],
  // ...
});

// In your component:
const navigationRef = createNavigationContainerRef();

<NavigationContainer
  ref={navigationRef}
  onReady={() => {
    navigationIntegration.registerNavigationContainer(navigationRef);
  }}
>
ナビゲーションのセットアップ — Wix React Native Navigation
import * as Sentry from "@sentry/react-native";
import { Navigation } from "react-native-navigation";

Sentry.init({
  integrations: [Sentry.reactNativeNavigationIntegration({ navigation: Navigation })],
  // ...
});

ルートコンポーネントをラップする

ルートコンポーネントは必ずラップしてください。これにより、React のエラーバウンダリーが有効になり、コンポーネントツリーのレベルで発生したクラッシュが確実に記録されます。

export default Sentry.wrap(App);

合意した機能ごとの手順

機能を一つずつ確認します。それぞれのリファレンスファイルを読み込み、手順に従ってから、次に進む前に検証してください。

機能リファレンス読み込むタイミング
エラー監視${SKILL_ROOT}/references/error-monitoring.md常に(基本設定)
トレーシングとパフォーマンス${SKILL_ROOT}/references/tracing.mdモバイルでは常に(アプリ起動、ナビゲーション、ネットワーク)
プロファイリング${SKILL_ROOT}/references/profiling.mdパフォーマンスが重要な本番アプリ
セッションリプレイ${SKILL_ROOT}/references/session-replay.mdユーザー向けアプリ
ロギング${SKILL_ROOT}/references/logging.md構造化ログ/ログとトレースの相関付け
ユーザーフィードバック${SKILL_ROOT}/references/user-feedback.mdユーザーからのレポートの収集
Expo Config Plugin${SKILL_ROOT}/references/expo-config-plugin.md@sentry/react-native/expo プラグインの設定

機能ごとに、Read ${SKILL_ROOT}/references/<feature>.md を読み、手順に正確に従って、動作を検証してください。


設定リファレンス

Sentry.init() の主なオプション
オプション型デフォルト用途
dsnstring—必須です。 プロジェクトの DSN です。空の場合、SDK は無効になります。環境変数:SENTRY_DSN
environmentstring—例:"production"、"staging"。環境変数:SENTRY_ENVIRONMENT
releasestring—アプリのバージョンです。例:"[email protected]+42"。環境変数:SENTRY_RELEASE
diststring—ビルド番号/バリアント識別子(最大 64 文字)です。環境変数:SENTRY_DIST
sendDefaultPiibooleanfalsePII(IP アドレス、Cookie、ユーザーデータ)を含めます
sampleRatenumber1.0エラーイベントのサンプリング率(0.0~1.0)
maxBreadcrumbsnumber100イベントごとのパンくずの最大数
attachStacktracebooleantrueメッセージにスタックトレースを自動的に添付します
attachScreenshotbooleanfalseエラー発生時にスクリーンショットをキャプチャします(SDK ≥4.11.0)
screenshotobject—スクリーンショットのマスクを詳細に設定します。attachScreenshot: true の場合のみ有効です。以下の スクリーンショットのマスクオプション を参照してください
attachViewHierarchybooleanfalseJSON 形式のビュー階層を添付ファイルとして添付します
debugbooleanfalseSDK の詳細な出力です。本番環境では絶対に使用しないでください
enabledbooleantrueSDK 全体を無効にします(テスト時など)
ignoreErrorsstring[] | RegExp[]—これらのパターンに一致するエラーを破棄します
ignoreTransactionsstring[] | RegExp[]—これらのパターンに一致するトランザクションを破棄します
maxCacheItemsnumber30オフライン時にキャッシュするエンベロープの最大数
defaultIntegrationsbooleantrueすべてのデフォルトインテグレーションを無効にするには、false に設定します
integrationsarray | function—インテグレーションを追加またはフィルタリングします
スクリーンショットのマスクオプション

attachScreenshot: true の場合、Sentry.init() 内の screenshot キーに指定します。

Sentry.init({
  attachScreenshot: true,
  screenshot: {
    maskAllText: true,       // default: true — mask all text nodes
    maskAllImages: true,     // default: true — mask all images
    maskedViewClasses: ['com.mapbox.maps.MapView'],    // always mask these native view classes
    unmaskedViewClasses: ['com.example.SafeView'],     // always show these native view classes
  },
});
サブオプション型デフォルト用途
maskAllTextbooleantrueスクリーンショット内のすべてのテキストノードをマスクします
maskAllImagesbooleantrueスクリーンショット内のすべての画像をマスクします
maskedViewClassesstring[][]常にマスクするネイティブビューのクラス名(Android/iOS)
unmaskedViewClassesstring[][]常に表示するネイティブビューのクラス名(Android/iOS)
トレーシングオプション
オプション型デフォルト用途
tracesSampleRatenumber0トランザクションのサンプリング率(0~1)。開発環境では 1.0 を使用します
tracesSamplerfunction—トランザクションごとのサンプリングです。tracesSampleRate を上書きします
tracePropagationTargets(string | RegExp)[][/.*/]分散トレーシングヘッダーを付与する API URL を指定します
profilesSampleRatenumber0プロファイリングのサンプリング率(トレースされたトランザクションに適用)
ネイティブ/モバイルのオプション
オプション型デフォルト目的
enableNativebooleantrueJS のみ(ネイティブ SDK なし)にするには false に設定します
enableNativeCrashHandlingbooleantrueネイティブの重大なクラッシュを捕捉します(iOS/Android)
enableNativeFramesTrackingboolean—遅いフレーム/フリーズしたフレームを追跡します。Expo Go では無効にしてください
enableWatchdogTerminationTrackingbooleantrueOOM による強制終了を検出します(iOS)
enableAppHangTrackingbooleantrueアプリのハングを検出します(iOS、tvOS、macOS)
appHangTimeoutIntervalnumber2アプリのハングと判定するまでの秒数(iOS)
enableAutoPerformanceTracingbooleantrueパフォーマンス計測を自動で設定します
enableNdkScopeSyncbooleantrueJava→NDK のスコープ同期(Android)
attachThreadsbooleanfalseクラッシュ時にすべてのスレッドを自動で添付します(Android)
attachAllThreadsbooleanfalse捕捉したすべてのイベントに、すべてのスレッドの完全なスタックトレースを添付します(iOS のみ。Cocoa SDK ≥9.9.0 が必要)
autoInitializeNativeSdkbooleantrueネイティブ SDK を手動で初期化するには false に設定します
onReadyfunction—ネイティブ SDK の初期化後に実行するコールバック
enableTurboModuleTrackingbooleanfalse実験的機能。 クラッシュの帰属特定とモジュールごとのスパン計測のために、ネイティブの TurboModule パフォーマンスロガーをインストールします。RN 0.75 以降の新アーキテクチャのみ対応。旧アーキテクチャでは何も行いません(SDK ≥8.17.0)
セッションとリリースの健全性に関するオプション
オプション型デフォルト目的
autoSessionTrackingbooleantrueセッションを追跡します(クラッシュのないユーザー/セッション)
sessionTrackingIntervalMillisnumber30000セッション終了までのバックグラウンド時間(ミリ秒)
リプレイのオプション
オプション型デフォルト目的
replaysSessionSampleRatenumber0記録する全セッションの割合
replaysOnErrorSampleRatenumber0記録するエラー発生セッションの割合
ロギングのオプション(SDK ≥7.0.0)
オプション型目的
enableLogsbooleanSentry.logger.* API を有効にします
enableAutoConsoleLogsbooleanenableLogs: true の場合に console.* の呼び出しを自動で捕捉します。手動の Sentry.logger.* のみを使用するには false に設定します(SDK ≥8.14.0、デフォルト:true)
beforeSendLogfunction送信前にログをフィルタリング/変更します
logsOrigin'native' | 'js' | 'all'ログの送信元をフィルタリングします(SDK ≥7.7.0)
フックのオプション
オプション型目的
beforeSend(event, hint) => event | nullJS エラーイベントを変更/破棄します。⚠️ ネイティブのクラッシュには適用されません
beforeSendTransaction(event) => event | nullトランザクションイベントを変更/破棄します
beforeBreadcrumb(breadcrumb, hint) => breadcrumb | null保存前にパンくずを処理します
onNativeLog(log: { level, component, message }) => voidネイティブ SDK のログメッセージを捕捉し、JS コンソールに転送します。debug: true の場合のみ実行されます
環境変数
変数用途備考
SENTRY_DSNデータソース名dsn オプションからフォールバックします
SENTRY_AUTH_TOKENソースマップと dSYM のアップロード絶対にコミットしないでください — CI シークレットを使用してください
SENTRY_ORG組織のスラッグウィザードとビルドプラグインで使用されます
SENTRY_PROJECTプロジェクトのスラッグウィザードとビルドプラグインで使用されます
SENTRY_RELEASEリリース識別子release オプションからフォールバックします
SENTRY_DISTディストリビューション識別子dist オプションからフォールバックします
SENTRY_ENVIRONMENT環境名environment オプションからフォールバックします
SENTRY_DISABLE_AUTO_UPLOADソースマップのアップロードをスキップローカルビルド中は true に設定します
EXPO_PUBLIC_SENTRY_DSNDSN 用の Expo パブリック環境変数クライアントバンドルに埋め込んでも安全です
SENTRY_EAS_BUILD_CAPTURE_SUCCESSEAS ビルドフック:ビルド成功をキャプチャEAS シークレットで true に設定します
SENTRY_EAS_BUILD_TAGSEAS ビルドフック:追加タグの JSON例:{"team":"mobile"}
デフォルトのインテグレーション(自動で有効化)

以下のインテグレーションは自動的に有効化されます。設定は不要です。

インテグレーション機能
ReactNativeErrorHandlers未処理の JS 例外と Promise の拒否を捕捉します
Releaseすべてのイベントにリリース/dist を付加します
Breadcrumbsコンソールログ、HTTP リクエスト、ユーザー操作をパンくずとして記録します
HttpClientHTTP リクエスト/レスポンスのパンくずを追加します
DeviceContextデバイス/OS/バッテリー情報をイベントに付加します
AppContextアプリのバージョン、バンドル ID、メモリ情報を付加します
CultureContextロケールとタイムゾーンを付加します
Screenshotエラー発生時にスクリーンショットをキャプチャします(attachScreenshot: true の場合)
ViewHierarchyビュー階層を付加します(attachViewHierarchy: true の場合)
NativeLinkedErrorsJS エラーを対応するネイティブクラッシュに関連付けます
TurboModuleContextクラッシュ時のコンテキストで TurboModule の呼び出しを追跡します。ネイティブクラッシュの原因を高レベルの RN モジュールとメソッド(例:RNSentry.captureEnvelope)に関連付けます
オプトインのインテグレーション
インテグレーション有効化方法
mobileReplayIntegration()integrations 配列に追加します
reactNavigationIntegration()integrations 配列に追加します
reactNativeNavigationIntegration()integrations 配列に追加します(Wix 専用)
feedbackIntegration()integrations 配列に追加します(ユーザーフィードバックウィジェット。ネイティブの振動検出に対応する enableShakeToReport をサポートします)
deeplinkIntegration()integrations 配列に追加します(ディープリンク URL をパンくずとして自動的にキャプチャします。オプトイン)
turboModuleContextIntegration()デフォルト — RNSentry TurboModule を自動的に追跡します。必要に応じて { modules: [...] } で設定し、カスタム TurboModule を追跡できます
カスタム TurboModule の追跡

TurboModuleContext インテグレーションはデフォルトで有効になっており、組み込みの RNSentry TurboModule を自動的に追跡します。独自のカスタム TurboModule を追跡するには、インテグレーションを明示的に設定します。

import * as Sentry from "@sentry/react-native";
import { NativeModules } from "react-native";

Sentry.init({
  dsn: "YOUR_DSN",
  integrations: [
    Sentry.turboModuleContextIntegration({
      modules: [
        {
          name: "MyCustomModule",
          module: NativeModules.MyCustomModule,
          // Optional: skip specific methods to avoid tracking overhead
          skipMethods: ["addListener", "removeListeners"],
        },
      ],
    }),
  ],
});

追跡対象の TurboModule メソッド呼び出し内でネイティブクラッシュが発生すると、クラッシュレポートにモジュール名とメソッド名を含む contexts.turbo_module が記録されるため、クラッシュの原因となった RN API 呼び出しを正確に特定しやすくなります。

連打の検出(TouchEventBoundary)

TouchEventBoundary(アプリのルートをラップします)には、連打を検出する機能が組み込まれています。ユーザーが 1 秒以内に同じ要素を 3 回以上タップすると、ui.multiClick パンくずが出力され、リプレイのタイムラインに表示されます。props で設定できます。

<Sentry.TouchEventBoundary
  enableRageTapDetection={true}   // default: true — set false to disable
  rageTapThreshold={3}            // taps required to trigger (default: 3)
  rageTapTimeWindow={1000}        // detection window in ms (default: 1000)
>
  <App />
</Sentry.TouchEventBoundary>
本番環境の設定

本番環境にリリースする前に、サンプルレートを下げ、設定を強化してください。

Sentry.init({
  dsn: process.env.EXPO_PUBLIC_SENTRY_DSN,
  environment: __DEV__ ? "development" : "production",

  // Trace 10–20% of transactions in high-traffic production
  tracesSampleRate: __DEV__ ? 1.0 : 0.1,

  // Profile 100% of traced transactions (profiling is always a subset of tracing)
  profilesSampleRate: 1.0,

  // Replay all error sessions, sample 5% of normal sessions
  replaysOnErrorSampleRate: 1.0,
  replaysSessionSampleRate: __DEV__ ? 1.0 : 0.05,

  // Set release and dist for accurate source map lookup
  release: "my-app@" + Application.nativeApplicationVersion,
  dist: String(Application.nativeBuildVersion),

  // Disable debug logging in production
  debug: __DEV__,
});

ソースマップとデバッグシンボル

ソースマップとデバッグシンボルを使うと、難読化されたスタックトレースを読みやすくできます。正しく設定すると、Sentry でエラーが発生したソースコードの正確な行を確認できます。認証トークンと CI の一般的な設定については、sentry-source-maps を参照してください。React Native 固有のアップロード方法は以下のとおりです。

アップロードの仕組み
プラットフォームアップロードするものタイミング
iOS(JS)ソースマップ(.map ファイル)Xcode ビルド中
iOS(ネイティブ)dSYM バンドルXcode アーカイブ/Xcode Cloud 中
Android(JS)ソースマップ + Hermes .hbc.mapGradle ビルド中
Android(ネイティブ)Proguard マッピング + NDK .so ファイルGradle ビルド中
Expo:自動アップロード

@sentry/react-native/expo 設定プラグインは、ネイティブビルド用のアップロードフックを自動的に設定します。ソースマップは eas build と expo run:ios/android(リリース)中にアップロードされます。

SENTRY_AUTH_TOKEN=sntrys_... npx expo run:ios --configuration Release
手動アップロード(bare RN)

ソースマップを手動でアップロードする必要がある場合は、次のようにします。

npx sentry-cli sourcemaps upload \
  --org YOUR_ORG \
  --project YOUR_PROJECT \
  --release "[email protected]+1" \
  ./dist

EAS ビルドフック

Expo Application Services(EAS)のビルドを Sentry で監視します。SDK には sentry-eas-build-on-complete、sentry-eas-build-on-error、sentry-eas-build-on-success の 3 つのバイナリフックが付属しており、ビルドイベントを Sentry のエラーまたはメッセージとして記録します。

手順 1 — package.json にフックを登録する

{
  "scripts": {
    "eas-build-on-complete": "sentry-eas-build-on-complete"
  }
}

eas-build-on-complete を使うと、失敗と(任意で)成功の両方を 1 つのフックで記録できます。個別に制御したい場合は、代わりに eas-build-on-error または eas-build-on-success を別々に使用します。

手順 2 — EAS シークレットに SENTRY_DSN を設定する

eas secret:create --name SENTRY_DSN --value "https://[email protected]/..."

フックはビルド環境から SENTRY_DSN を読み取ります。アプリと同じ .env は共有しません。

任意の環境変数:

変数用途
SENTRY_EAS_BUILD_CAPTURE_SUCCESStrue に設定すると、成功したビルドも記録します(デフォルト:エラーのみ)
SENTRY_EAS_BUILD_TAGS追加タグを指定する JSON オブジェクト。例:{"team":"mobile","channel":"production"}
SENTRY_EAS_BUILD_ERROR_MESSAGEビルド失敗時のカスタムエラーメッセージ
SENTRY_EAS_BUILD_SUCCESS_MESSAGEビルド成功時のカスタムメッセージ

仕組み: フックスクリプトは EAS の npm ライフサイクルフックです。EAS はビルドプロセスの最後に、eas-build-on-* に一致する package.json スクリプトを呼び出します。スクリプトは @expo/env、.env、または .env.sentry-build-plugin から環境変数を読み込みます。環境内にすでに設定されている EAS シークレットは上書きしません。


検証

セットアップ後、Sentry がイベントを受信していることを確認します。

// Quick test — throws and Sentry.wrap(App) catches it
<Button
  title="Test Sentry Error"
  onPress={() => {
    throw new Error("My first Sentry error!");
  }}
/>

// Or capture manually
<Button
  title="Test Sentry Message"
  onPress={() => {
    Sentry.captureMessage("Sentry test message", "info");
  }}
/>

Sentry ダッシュボードを確認します:

  • Issues → 数秒以内にテストエラーが表示されます
  • Traces → 子スパンを持つ「main」トランザクションを探します
  • Replays → アプリの操作後にセッション録画が表示されます(ネイティブビルドのみ。Expo Go では利用できません)
  • Logs → enableLogs: true の場合、構造化ログエントリーが表示されます

⚠️ Expo Go の制限: ネイティブクラッシュ、セッションリプレイ、スローフレーム/フリーズフレーム、TTID、TTFD はネイティブビルド(eas build または expo run)でのみ動作します。Expo Go は JS のみのモードで実行されます。警告を避けるには、enableNativeFramesTracking: !isRunningInExpoGo() を設定してください。

何も表示されない場合:

  1. debug: true を設定します。SDK のログが Metro コンソールに出力されます
  2. DSN が正しいことと、Sentry プロジェクトが存在することを確認します
  3. ルートコンポーネントに Sentry.wrap(App) が適用されていることを確認します
  4. ネイティブクラッシュの場合は、リリースビルドを作成します(デバッグモードでのクラッシュは転送されない場合があります)

フェーズ 4:相互リンク

React Native のセットアップが完了したら、Sentry のカバレッジが不足しているバックエンドまたは Web フロントエンドがないか確認します。

# Adjacent backend directories
ls ../backend ../server ../api 2>/dev/null
cat ../go.mod 2>/dev/null | head -3
cat ../requirements.txt ../pyproject.toml 2>/dev/null | head -3
cat ../Gemfile 2>/dev/null | head -3
ls ../backend/package.json ../server/package.json 2>/dev/null

# Web frontend in same or sibling repo
ls ../web ../frontend ../dashboard 2>/dev/null
cat ../web/package.json ../frontend/package.json 2>/dev/null | grep -E '"react"|"svelte"|"next"'

# Check for OpenTelemetry (for distributed tracing interop)
grep -r "opentelemetry" ../backend/go.mod ../server/requirements.txt 2>/dev/null

Sentry が導入されていないバックエンドまたは Web フロントエンドがある場合、対応するスキルを提案します。

検出対象提案するスキル
Go バックエンド(go.mod)sentry-go-sdk
Python バックエンド(requirements.txt、pyproject.toml)sentry-python-sdk
Ruby バックエンド(Gemfile)sentry-ruby-sdk
Node.js バックエンド(Express、Fastify など)@sentry/node — docs.sentry.io/platforms/javascript/guides/express/ を参照してください
React / Next.js Websentry-react-sdk
Svelte / SvelteKit Websentry-svelte-sdk

分散トレーシングのセットアップ — バックエンドのスキルを追加する場合は、React Native で tracePropagationTargets を設定して、トレースコンテキストを API に伝播させます。

Sentry.init({
  tracePropagationTargets: [
    "localhost",
    /^https:\/\/api\.yourapp\.com/,
  ],
  // ...
});

これにより、モバイルのトランザクションが Sentry のウォーターフォールビューでバックエンドのトレースにリンクされます。


トラブルシューティング

問題解決策
Sentry にイベントが表示されないdebug: true を設定し、Metro/Xcode コンソールで SDK のエラーを確認します。DSN が正しいことを確認してください
pod install が失敗するcd ios && pod install --repo-update を実行します。CocoaPods のバージョンを確認してください
Sentry スクリプト追加後に iOS ビルドが失敗する「Bundle React Native code and images」スクリプトが追加ではなく置き換えられていることを確認してください
sentry.gradle.kts 追加後に Android ビルドが失敗するbuild.gradle の android {} ブロックより前に apply from の行があることを確認します。SDK <8.13.0 では sentry.gradle を使用してください
Android Gradle 8 以降との互換性の問題sentry-android-gradle-plugin ≥4.0.0 を使用します。SDK 内の sentry.gradle のバージョンを確認してください
ソースマップがアップロードされないsentry.properties に有効な auth.token があることを確認します。ビルドログで sentry-cli の出力を確認してください
Sentry でソースマップが解決されないSentry.init() の release と dist が、アップロードされたバンドルのメタデータと一致していることを確認してください
Hermes のソースマップが機能しないHermes は .hbc.map を出力します。Gradle プラグインがこれを自動的に処理します。sentry.gradle が適用されていることを確認してください
セッションリプレイが記録されないネイティブビルドを使用する必要があります(Expo Go では不可)。integrations に mobileReplayIntegration() があることを確認してください
リプレイに空白または黒い画面が表示されるmaskAllText / maskAllImages の設定がプライバシー要件に合っていることを確認してください
遅いフレームやフリーズしたフレームが追跡されないenableNativeFramesTracking: true を設定し、ネイティブビルドを使用していることを確認してください(Expo Go では不可)
TTID / TTFD が表示されないネイティブビルドで reactNavigationIntegration() に enableTimeToInitialDisplay: true を設定する必要があります
Sentry 追加後にアプリの起動時にクラッシュするネイティブの初期化エラーが原因と考えられます。Xcode / Logcat のログを確認してください。切り分けるには enableNative: false を試してください
Expo SDK 49 以前sentry-expo(旧パッケージ)を使用してください。@sentry/react-native には Expo SDK 50 以降が必要です
isRunningInExpoGo のインポートエラーexpo パッケージからインポートしてください:import { isRunningInExpoGo } from "expo"
Xcode ビルド中に Node が見つからないXcode のビルドフェーズに export NODE_BINARY=$(which node) を追加するか、シンボリックリンクを作成します:ln -s $(which node) /usr/local/bin/node
Expo Go でネイティブ機能に関する警告が表示されるisRunningInExpoGo() ガードを使用します:enableNativeFramesTracking: !isRunningInExpoGo()
ネイティブクラッシュで beforeSend が呼び出されないこれは想定どおりです。beforeSend がインターセプトするのは JS レイヤーのエラーのみで、ネイティブクラッシュは対象外です
Android 15 以降(16KB ページサイズ)でクラッシュする@sentry/react-native を ≥6.3.0 にアップグレードしてください
ダッシュボードのトランザクション数が多すぎるtracesSampleRate を 0.1 に下げるか、tracesSampler を使ってヘルスチェックを除外してください
アプリバンドルで SENTRY_AUTH_TOKEN が公開されるSENTRY_AUTH_TOKEN はビルド時のアップロード専用です。Sentry.init() に渡さないでください
EAS Build:Sentry の認証トークンがないSENTRY_AUTH_TOKEN を EAS シークレットとして設定します:eas secret:create --name SENTRY_AUTH_TOKEN

コメント