mcpField
S
sentry-react-sdk

sentry-react-sdk

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

sentry-react-sdk について

React プロジェクトを調査し、Sentry の導入とエラー監視、トレース、セッションリプレイの設定を案内するスキルです。React のバージョンやルーター、Redux、ビルドツールに応じて手順を調整します。

主な機能

  1. 01React のバージョンと既存設定の検出
  2. 02ルーター・Redux・ビルドツールの識別
  3. 03SDK の導入と初期化の案内
  4. 04エラー監視・トレース・リプレイの設定
  5. 05ソースマップのアップロード設定

活用シーン

  1. 01React アプリへの Sentry 導入
  2. 02React Router または TanStack Router のトレース設定
  3. 03Redux アプリへの状態監視連携の追加

インストール

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

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

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

同梱ファイル

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

references/
error-monitoring.md
logging.md
profiling.md
react-features.md
session-replay.md
tracing.md

詳細

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

Sentry React SDK

React プロジェクトをスキャンし、Sentry の完全なセットアップを案内する、意見を取り入れたウィザードです。

このスキルを使うタイミング

  • ユーザーが React アプリへの「Sentry の追加」や「Sentry のセットアップ」を依頼した場合
  • ユーザーが React でのエラー監視、トレーシング、セッションリプレイ、プロファイリング、またはロギングを希望している場合
  • ユーザーが @sentry/react、React Sentry SDK、または Sentry のエラーバウンダリーについて言及した場合
  • ユーザーが React Router v5/v6/v7 の非フレームワークモードのナビゲーション、Redux の状態、またはコンポーネントのパフォーマンスを監視したい場合

プロジェクトが @sentry/react-router を使用する React Router の Framework mode の場合は、このスキルではなく sentry-react-router-framework-sdk を使用してください。

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


フェーズ 1:検出

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

# Detect React version
cat package.json | grep -E '"react"|"react-dom"'

# Check for existing Sentry
cat package.json | grep '"@sentry/'

# Detect router and framework mode hints
cat package.json | grep -E '"react-router-dom"|"react-router"|"@react-router/"|"@tanstack/react-router"|"@sentry/react-router"'

# Detect state management
cat package.json | grep -E '"redux"|"@reduxjs/toolkit"'

# Detect build tool
ls vite.config.ts vite.config.js webpack.config.js craco.config.js 2>/dev/null
cat package.json | grep -E '"vite"|"react-scripts"|"webpack"'

# Detect logging libraries
cat package.json | grep -E '"pino"|"winston"|"loglevel"'

# Check for companion backend in adjacent directories
ls ../backend ../server ../api 2>/dev/null
cat ../go.mod ../requirements.txt ../Gemfile ../pom.xml 2>/dev/null | head -3

確認事項:

質問影響
React 19 以降ですか?reactErrorHandler() フックのパターンを使用します
React 19 未満ですか?Sentry.ErrorBoundary を使用します
@sentry/react はすでに導入されていますか?インストールを省略し、機能設定に進みます
React Router の Framework mode を示す要素(@sentry/react-router、@react-router/*)はありますか?sentry-react-router-framework-sdk を使用します
react-router-dom は v5/v6/v7 のどれですか?使用するルーターインテグレーションが決まります
@tanstack/react-router はありますか?tanstackRouterBrowserTracingIntegration() を使用します
Redux を使用していますか?createReduxEnhancer() を推奨します
Vite が検出されましたか?sentryVitePlugin でソースマップを設定します
CRA(react-scripts)ですか?CRACO の @sentry/webpack-plugin でソースマップを設定します
バックエンドのディレクトリが見つかりましたか?フェーズ 4 で関連情報を提案します

フェーズ 2:推奨

確認結果に基づいて、具体的な推奨事項を提示します。自由回答形式の質問は避け、提案を先に示してください。

推奨(基本的なカバレッジ):

  • ✅ エラー監視 — 常に推奨します。未処理のエラー、React のエラーバウンダリー、React 19 のフックをキャプチャします
  • ✅ トレーシング — React SPA では、ページ読み込み、ナビゲーション、API 呼び出しのトレーシングが有用です
  • ✅ セッションリプレイ — ユーザー向けアプリに推奨します。エラー発生時のセッションを記録します

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

  • ⚡ ロギング — Sentry.logger.* による構造化ログです。構造化ログの検索が必要な場合に推奨します
  • ⚡ プロファイリング — JS Self-Profiling API を使用します(⚠️ 実験的機能です。クロスオリジン分離ヘッダーが必要です)

推奨ロジック:

機能推奨する条件
エラー監視常に — 必須の基本機能です
トレーシングReact SPA では常に — ページ読み込みとナビゲーションのスパンは非常に有用です
セッションリプレイユーザー向けアプリ、ログインフロー、またはチェックアウトページ
ロギング構造化ログの検索やログとトレースの相関が必要なアプリ
プロファイリングパフォーマンスが重要なアプリ。サーバーが Document-Policy: js-profiling ヘッダーを送信する場合

React 固有の追加項目:

  • React 19 が検出された場合 → createRoot に reactErrorHandler() を設定します
  • React Router v5/v6/v7 の非フレームワークモードが検出された場合 → 対応するルーターインテグレーションを設定します(フェーズ 3 を参照)
  • React Router の Framework mode が検出された場合 → sentry-react-router-framework-sdk に切り替えます
  • Redux が検出された場合 → Redux ストアに createReduxEnhancer() を追加します
  • Vite が検出された場合 → 読みやすいスタックトレースに不可欠なソースマップ用に sentryVitePlugin を設定します

次のように提案します:「エラー監視+トレーシング+セッションリプレイのセットアップをおすすめします。ロギングやプロファイリングも追加しましょうか?」


フェーズ 3:案内

インストール
npm install @sentry/react --save
src/instrument.ts を作成する

Sentry は、ほかのコードが実行される前に初期化する必要があります。専用のサイドカーファイルに Sentry.init() を記述します。

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

Sentry.init({
  dsn: import.meta.env.VITE_SENTRY_DSN, // Adjust per build tool (see table below)
  environment: import.meta.env.MODE,
  release: import.meta.env.VITE_APP_VERSION, // inject at build time

  dataCollection: {
    // To disable sending user data and HTTP bodies, uncomment the lines below. For more info visit:
    // https://docs.sentry.io/platforms/javascript/guides/react/configuration/options/#dataCollection
    // userInfo: false,
    // httpBodies: [],
  },

  integrations: [
    Sentry.browserTracingIntegration(),
    Sentry.replayIntegration({
      maskAllText: true,
      blockAllMedia: true,
    }),
  ],

  // Tracing
  tracesSampleRate: 1.0, // lower to 0.1–0.2 in production
  tracePropagationTargets: ["localhost", /^https:\/\/yourapi\.io/],

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

  enableLogs: true,
});

ビルドツール別の DSN 環境変数:

ビルドツール変数名コード内でのアクセス方法
ViteVITE_SENTRY_DSNimport.meta.env.VITE_SENTRY_DSN
Create React AppREACT_APP_SENTRY_DSNprocess.env.REACT_APP_SENTRY_DSN
カスタム webpackSENTRY_DSNprocess.env.SENTRY_DSN
エントリーポイントの設定

エントリーファイルで instrument.ts を最初の import として読み込みます。

// src/main.tsx (Vite) or src/index.tsx (CRA/webpack)
import "./instrument";              // ← MUST be first

import { StrictMode } from "react";
import { createRoot } from "react-dom/client";
import App from "./App";

createRoot(document.getElementById("root")!).render(
  <StrictMode>
    <App />
  </StrictMode>
);
React のバージョンに応じたエラーハンドリング

React 19 以降 — createRoot で reactErrorHandler() を使用します。

import { reactErrorHandler } from "@sentry/react";

createRoot(document.getElementById("root")!, {
  onUncaughtError: reactErrorHandler(),
  onCaughtError: reactErrorHandler(),
  onRecoverableError: reactErrorHandler(),
}).render(<App />);

React 19 未満 — アプリを Sentry.ErrorBoundary でラップします。

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

createRoot(document.getElementById("root")!).render(
  <Sentry.ErrorBoundary fallback={<p>Something went wrong</p>} showDialog>
    <App />
  </Sentry.ErrorBoundary>
);

独立してエラーを捕捉するサブツリー(ルートセクション、ウィジェットなど)には、<Sentry.ErrorBoundary> を使用します。

ルーターとの統合

使用するルーターに対応した統合を設定します(フレームワークモード以外)。

ルーター統合備考
React Router v7reactRouterV7BrowserTracingIntegrationreact-router の useEffect、useLocation、useNavigationType、createRoutesFromChildren、matchRoutes
React Router v6reactRouterV6BrowserTracingIntegrationreact-router-dom の useEffect、useLocation、useNavigationType、createRoutesFromChildren、matchRoutes
React Router v5reactRouterV5BrowserTracingIntegrationルートを withSentryRouting(Route) でラップします
TanStack RoutertanstackRouterBrowserTracingIntegration(router)ルーターインスタンスを渡します。フックは不要です
ルーターなし/カスタムbrowserTracingIntegration()URL パスでトランザクションに名前を付けます

React Router v6/v7 の設定:

// in instrument.ts integrations array:
import React from "react";
import {
  createRoutesFromChildren, matchRoutes,
  useLocation, useNavigationType,
} from "react-router-dom"; // or "react-router" for v7
import * as Sentry from "@sentry/react";
import { reactRouterV6BrowserTracingIntegration } from "@sentry/react";
import { createBrowserRouter } from "react-router-dom";

// Option A — createBrowserRouter (recommended for v6.4+):
const sentryCreateBrowserRouter = Sentry.wrapCreateBrowserRouterV6(createBrowserRouter);
const router = sentryCreateBrowserRouter([...routes]);

// Option B — createBrowserRouter for React Router v7:
// const sentryCreateBrowserRouter = Sentry.wrapCreateBrowserRouterV7(createBrowserRouter);

// Option C — integration with hooks (v6 without data APIs):
Sentry.init({
  integrations: [
    reactRouterV6BrowserTracingIntegration({
      useEffect: React.useEffect,
      useLocation,
      useNavigationType,
      matchRoutes,
      createRoutesFromChildren,
    }),
  ],
});

TanStack Router の設定:

import { tanstackRouterBrowserTracingIntegration } from "@sentry/react";

// Pass your TanStack router instance:
Sentry.init({
  integrations: [tanstackRouterBrowserTracingIntegration(router)],
});
Redux との統合(検出された場合)
import * as Sentry from "@sentry/react";
import { configureStore } from "@reduxjs/toolkit";

const store = configureStore({
  reducer: rootReducer,
  enhancers: (getDefaultEnhancers) =>
    getDefaultEnhancers().concat(Sentry.createReduxEnhancer()),
});
ソースマップの設定(強く推奨)

ソースマップがない場合、スタックトレースには圧縮されたコードが表示されます。ビルドプラグインを設定し、ソースマップを自動的にアップロードします。

Vite(vite.config.ts):

import { defineConfig } from "vite";
import react from "@vitejs/plugin-react";
import { sentryVitePlugin } from "@sentry/vite-plugin";

export default defineConfig({
  build: { sourcemap: "hidden" },
  plugins: [
    react(),
    sentryVitePlugin({
      org: process.env.SENTRY_ORG,
      project: process.env.SENTRY_PROJECT,
      authToken: process.env.SENTRY_AUTH_TOKEN,
    }),
  ],
});

Create React App(CRACO 経由):

npm install @craco/craco @sentry/webpack-plugin --save-dev
// craco.config.js
const { sentryWebpackPlugin } = require("@sentry/webpack-plugin");

module.exports = {
  webpack: {
    plugins: {
      add: [
        sentryWebpackPlugin({
          org: process.env.SENTRY_ORG,
          project: process.env.SENTRY_PROJECT,
          authToken: process.env.SENTRY_AUTH_TOKEN,
        }),
      ],
    },
  },
};

SENTRY_ORG/SENTRY_PROJECT/SENTRY_AUTH_TOKEN はビルド時の値です。認証トークンは秘密情報です(絶対にコミットしないでください)。トークンの作成方法と CI への組み込み方法については、sentry-source-maps を参照してください。

合意した各機能について

機能を1つずつ進めます。参照ファイルを読み込み、手順に従い、次に進む前に動作を確認します。

機能参照先読み込むタイミング
エラーモニタリング${SKILL_ROOT}/references/error-monitoring.md常に(ベースライン)
トレーシング${SKILL_ROOT}/references/tracing.mdSPA のナビゲーション/API 呼び出しのトレースを行う場合
セッションリプレイ${SKILL_ROOT}/references/session-replay.mdユーザー向けアプリの場合
ロギング${SKILL_ROOT}/references/logging.md構造化ログ検索/ログとトレースの連携を行う場合
プロファイリング${SKILL_ROOT}/references/profiling.mdパフォーマンスが重要なアプリの場合
React の機能${SKILL_ROOT}/references/react-features.mdRedux、コンポーネント追跡、ソースマップ、統合カタログを扱う場合

機能ごとに、Read ${SKILL_ROOT}/references/<feature>.md を実行し、手順に正確に従って、動作を確認します。


設定リファレンス

主な Sentry.init() オプション
オプション型デフォルト備考
dsnstring—必須です。 空の場合、SDK は無効になります
environmentstring"production"例:"staging"、"development"
releasestring—例:"[email protected]" または Git SHA — エラーをリリースに関連付けます
dataCollectionobject設定しない場合は保守的自動収集されるカテゴリ(userInfo、cookies、httpHeaders、httpBodies、queryParams、genAI)を細かく制御します。省略すると、SDK は sendDefaultPii(デフォルトは false)にフォールバックします。このオブジェクトを渡すと({} の場合も含む)、未設定のカテゴリは許可するデフォルトに切り替わります。カテゴリごとに無効化できます。
tracesSampleRatenumber—0~1。開発環境では 1.0、本番環境では 0.1–0.2
tracesSamplerfunction—トランザクションごとのサンプリング。サンプルレートより優先されます
tracePropagationTargets(string|RegExp)[]—分散トレーシングヘッダーを付与する送信先 URL
replaysSessionSampleRatenumber—記録する全セッションの割合
replaysOnErrorSampleRatenumber—記録するエラー発生セッションの割合
enableLogsbooleanfalseSentry.logger.* API を有効にします
attachStacktracebooleanfalsecaptureMessage() の呼び出しにスタックトレースを付加します
maxBreadcrumbsnumber100イベントごとに保存するパンくずの数
debugbooleanfalseSDK の詳細な出力をコンソールに表示します
tunnelstring—広告ブロッカーを回避するためのプロキシ URL
dataCollection オプション(SDK ≥10.57.0)

SDK が収集するデータを細かく制御します。収集はデフォルトで有効(機密値はサニタイズされます)です。カテゴリごとに無効化できます。

フィールド型デフォルト備考
userInfobooleantrueユーザー ID、メールアドレス、IP アドレスを収集します
cookiesboolean | { allow: string[] } | { deny: string[] }trueCookie の収集とフィルタリング。true = すべての Cookie(機密キーはフィルタリングされます)
httpHeaders.requestboolean | { allow: string[] } | { deny: string[] }trueHTTP リクエストヘッダーの収集
httpHeaders.responseboolean | { allow: string[] } | { deny: string[] }trueHTTP レスポンスヘッダーの収集
queryParamsboolean | { allow: string[] } | { deny: string[] }trueクエリパラメーターの収集とフィルタリング
httpBodiesHttpBodyCollectionTarget[]["incomingRequest", "outgoingRequest", "incomingResponse", "outgoingResponse"]リクエスト/レスポンス本文を収集します。オプション:'incomingRequest'、'outgoingRequest'、'incomingResponse'、'outgoingResponse'
genAI.inputsbooleantrueAI モデルへの入力を記録します(AI モニタリング用)
genAI.outputsbooleantrueAI モデルの出力を記録します(AI モニタリング用)
stackFrameVariablesbooleantrueスタックフレーム内のローカル変数の値を取得します
frameContextLinesnumber5スタックフレーム周辺のソースコードのコンテキスト行数

例: 特定の Cookie とヘッダーのみを許可します。

Sentry.init({
  dataCollection: {
    cookies: { allow: ['session', 'user_id'] },
    httpHeaders: {
      request: { allow: ['authorization', 'x-request-id'] },
      response: { deny: ['set-cookie'] },
    },
  },
});
React 互換性マトリックス
React バージョンエラー処理方法SDK の最小バージョン
React 19+createRoot での reactErrorHandler()@sentry/react ≥8.0.0
React 16–18Sentry.ErrorBoundary コンポーネント@sentry/react ≥7.0.0
React 16componentDidCatch クラス境界@sentry/react ≥6.0.0

検証

テストイベントを発生させて、Sentry がデータを受信していることを確認します。

// Add a temporary test button anywhere in your app
import * as Sentry from "@sentry/react";

function SentryTest() {
  return (
    <>
      <button onClick={() => { throw new Error("Sentry React test error"); }}>
        Test Error
      </button>
      <button onClick={() => Sentry.captureMessage("Sentry test message", "info")}>
        Test Message
      </button>
    </>
  );
}

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

  • Issues → 数秒以内にエラーが表示されます
  • Traces → ページ読み込みとナビゲーションのトランザクションが表示されます
  • Replays → ページを操作した後にセッションの記録が表示されます
  • Logs → ログ記録が有効な場合、構造化ログのエントリが表示されます

何も表示されない場合は、Sentry.init() で debug: true を設定し、ブラウザーのコンソールを確認してください。


フェーズ 4:相互リンク

React のセットアップが完了したら、Sentry の設定がない関連バックエンドがないか確認します。

ls ../backend ../server ../api ../go ../python 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
cat ../pom.xml 2>/dev/null | grep '<artifactId>' | head -3

バックエンドが見つかり、Sentry が設定されていない場合は、該当するスキルを提案します。

検出されたバックエンド提案するスキル
Go(go.mod)sentry-go-sdk
Python(requirements.txt、pyproject.toml)sentry-python-sdk
Ruby(Gemfile)sentry-ruby-sdk
Java(pom.xml、build.gradle)@sentry/java を使用してください。詳しくは docs.sentry.io/platforms/java/ をご覧ください。
Node.js(Express、Fastify)@sentry/node を使用してください。詳しくは docs.sentry.io/platforms/javascript/guides/express/ をご覧ください。

トラブルシューティング

問題解決策
イベントが表示されないdebug: true を設定し、DSN を確認して、ブラウザーのコンソールで SDK エラーを確認します
ソースマップが機能しない本番モードでビルドします(npm run build)。SENTRY_AUTH_TOKEN が設定されていることを確認します
圧縮されたスタックトレースが表示されるソースマップがアップロードされていません。プラグイン設定と認証トークンを確認します
instrument.ts が最初に実行されないエントリーファイルで、React/アプリのインポートより前に読み込まれていることを確認します
React 19 のエラーが捕捉されない3 つすべての createRoot オプションに reactErrorHandler() が渡されていることを確認します
React <19 のエラーが捕捉されない<Sentry.ErrorBoundary> がコンポーネントツリーを囲んでいることを確認します
ルーターのトランザクション名が <unknown> になる使用しているルーターのバージョンに対応するルーター統合を追加します
tracePropagationTargets が一致しない正規表現のエスケープを確認します。デフォルトは localhost と DSN のオリジンのみです
セッションリプレイが記録されないreplayIntegration() が初期化処理に含まれていることを確認し、replaysSessionSampleRate を確認します
Redux のアクションがブレッドクラムに表示されないストアのエンハンサーに Sentry.createReduxEnhancer() を追加します
広告ブロッカーによってイベントが破棄されるtunnel: "/sentry-tunnel" を設定し、サーバー側のリレーエンドポイントを追加します
リプレイのストレージコストが高いreplaysSessionSampleRate を下げ、replaysOnErrorSampleRate: 1.0 は維持します
プロファイリングが機能しないドキュメントのレスポンスに Document-Policy: js-profiling ヘッダーが設定されていることを確認します

コメント