mcpField
S
sentry-svelte-sdk

sentry-svelte-sdk

github.com/getsentry開発25312 回インストール35 週間前に更新
リポジトリ

sentry-svelte-sdk について

sentry-svelte-sdk は、Svelte と SvelteKit のプロジェクトをスキャンし、フレームワークのバージョンや構成に応じて Sentry の設定を案内するスキルです。クライアントとサーバーのエラー監視に加え、トレーシング、セッションリプレイ、ログの設定にも対応します。

主な機能

  1. 01Svelte と SvelteKit の構成を検出
  2. 02バージョンに応じて設定手順を選択
  3. 03クライアントとサーバーの監視を設定
  4. 04トレーシングとセッションリプレイを追加
  5. 05ログとソースマップのアップロードを案内

活用シーン

  1. 01SvelteKit アプリに Sentry を設定
  2. 02Svelte アプリにエラー監視を追加
  3. 03ユーザー操作のセッションリプレイを有効化
  4. 04Sentry イベントやソースマップの問題を調査

インストール

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

$npx skills add https://github.com/getsentry/sentry-agent-skills --skill sentry-svelte-sdk

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

同梱ファイル

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

references/
error-monitoring.md
logging.md
session-replay.md
tracing.md

詳細

Sentry Svelte SDK

プロジェクトをスキャンし、Svelte と SvelteKit 向けの Sentry のセットアップを完了できるよう案内する、独自のウィザードです。

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

  • Svelte/SvelteKit アプリに「Sentry を追加」または「Sentry をセットアップ」したいとユーザーが尋ねた場合
  • Svelte または SvelteKit でエラー監視、トレーシング、セッションリプレイ、ロギングを利用したい場合
  • @sentry/svelte、@sentry/sveltekit、または Svelte 向け Sentry SDK に言及した場合

注: 以下の SDK バージョンと API は、執筆時点の最新の Sentry ドキュメント(@sentry/sveltekit ≥10.8.0、SvelteKit ≥2.31.0)を反映しています。 実装前に必ずドキュメントで確認してください。


フェーズ 1:検出

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

# Detect framework type
cat package.json | grep -E '"svelte"|"@sveltejs/kit"|"@sentry/svelte"|"@sentry/sveltekit"'

# Check for SvelteKit indicators
ls svelte.config.js svelte.config.ts vite.config.ts vite.config.js 2>/dev/null

# Check SvelteKit version (determines which setup pattern to use)
cat package.json | grep '"@sveltejs/kit"'

# Check if Sentry is already installed
cat package.json | grep '"@sentry/'

# Check existing hook files
ls src/hooks.client.ts src/hooks.client.js src/hooks.server.ts src/hooks.server.js \
   src/instrumentation.server.ts 2>/dev/null

# Detect logging libraries (Node side)
cat package.json | grep -E '"pino"|"winston"|"consola"'

# Detect if there's a backend (Go, Python, Ruby, etc.) in adjacent directories
ls ../backend ../server ../api 2>/dev/null
cat ../go.mod ../requirements.txt ../Gemfile 2>/dev/null | head -3

確認すること:

質問影響
package.json に @sveltejs/kit があるか?SvelteKit 向けか、通常の Svelte 向けかを判断します
SvelteKit ≥2.31.0 か?モダン(instrumentation.server.ts)か、レガシー設定かを判断します
@sentry/sveltekit がすでにあるか?インストールを省略し、機能設定に直接進みます
vite.config.ts があるか?Vite プラグインによるソースマップのアップロードが可能です
バックエンドディレクトリが見つかったか?フェーズ 4 の関連付けの提案を行います

フェーズ 2:提案

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

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

  • ✅ エラー監視 — 常に推奨します。クライアントとサーバーの未処理エラーを自動で捕捉します
  • ✅ トレーシング — SvelteKit ではクライアント側のナビゲーションスパンとサーバー側のリクエストスパンの両方があるため、常に推奨します
  • ✅ セッションリプレイ — ユーザー向けの SvelteKit アプリに推奨します(クライアント側のみ)

任意(可観測性の強化):

  • ⚡ ロギング — Sentry.logger.* による構造化ログです。アプリでサーバー側のロギングを使用している場合や、ログとトレースの相関が必要な場合に推奨します

推奨の判断基準:

機能推奨する条件
エラー監視常に — 必須の基本機能です
トレーシングSvelteKit では常に(クライアント+サーバー)。通常の Svelte では API 呼び出しを行う場合
セッションリプレイユーザー向けアプリ、ログインフロー、またはチェックアウトページがある場合
ロギングアプリですでにサーバー側のロギングを使用している場合、または構造化ログの検索が必要な場合

次のように提案してください:「エラー監視+トレーシング+セッションリプレイのセットアップをおすすめします。構造化ロギングも追加しますか?」


フェーズ 3:案内

セットアップ方法の判断
プロジェクトパッケージセットアップの複雑さ
SvelteKit(≥2.31.0)@sentry/sveltekit5 ファイルを作成/変更
SvelteKit(<2.31.0)@sentry/sveltekit3 ファイル(hooks.server.ts で初期化)
通常の Svelte(@sveltejs/kit なし)@sentry/svelteエントリーポイント 1 つ

方法 A:SvelteKit(推奨 — モダン、≥2.31.0)
オプション 1:ウィザード(推奨)
npx @sentry/wizard@latest -i sveltekit

ウィザードでは、ログイン、組織/プロジェクトの選択、認証トークンのセットアップを対話形式で進められるため、トークンを手動で作成する必要はありません。その後、SDK をインストールし、必要なファイル(クライアント/サーバーフック、Vite プラグイン設定)をすべて作成して、ソースマップのアップロードを設定し、確認用の /sentry-example-page を追加します。実行後は検証に進んでください。

オプション 2:手動セットアップ

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

npm install @sentry/sveltekit --save

ステップ 2 — svelte.config.js — インストルメンテーションを有効化

import adapter from "@sveltejs/adapter-auto";

const config = {
  kit: {
    adapter: adapter(),
    experimental: {
      instrumentation: { server: true },
      tracing: { server: true },
    },
  },
};

export default config;

ステップ 3 — src/instrumentation.server.ts — サーバー側の初期化(起動時に 1 回実行)

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

Sentry.init({
  dsn: process.env.SENTRY_DSN,
  environment: process.env.SENTRY_ENVIRONMENT,
  release: process.env.SENTRY_RELEASE,

  sendDefaultPii: true,
  tracesSampleRate: 1.0,    // lower to 0.1–0.2 in production
  enableLogs: true,
});

ステップ 4 — src/hooks.client.ts — クライアント側の初期化

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

Sentry.init({
  dsn: import.meta.env.PUBLIC_SENTRY_DSN ?? import.meta.env.VITE_SENTRY_DSN,
  environment: import.meta.env.MODE,

  sendDefaultPii: true,
  tracesSampleRate: 1.0,

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

  replaysSessionSampleRate: 0.1,
  replaysOnErrorSampleRate: 1.0,
  enableLogs: true,
});

export const handleError = Sentry.handleErrorWithSentry();

ステップ 5 — src/hooks.server.ts — サーバーフック(モダンな設定ではここで初期化しません)

import * as Sentry from "@sentry/sveltekit";
import { sequence } from "@sveltejs/kit/hooks";

export const handleError = Sentry.handleErrorWithSentry();

// sentryHandle() instruments incoming requests and creates root spans
export const handle = Sentry.sentryHandle();

// If you have other handle functions, compose with sequence():
// export const handle = sequence(Sentry.sentryHandle(), myAuthHandle);

ステップ 6 — vite.config.ts — ソースマップ(SENTRY_AUTH_TOKEN が必要)

import { sveltekit } from "@sveltejs/kit/vite";
import { sentrySvelteKit } from "@sentry/sveltekit";
import { defineConfig } from "vite";

export default defineConfig({
  plugins: [
    // sentrySvelteKit MUST come before sveltekit()
    sentrySvelteKit({
      org: process.env.SENTRY_ORG,
      project: process.env.SENTRY_PROJECT,
      authToken: process.env.SENTRY_AUTH_TOKEN,
    }),
    sveltekit(),
  ],
});

.env に追加します(コミットしないでください)。

SENTRY_AUTH_TOKEN=sntrys_...
SENTRY_ORG=my-org-slug
SENTRY_PROJECT=my-project-slug

パス B:SvelteKit Legacy(2.31.0 未満、または @sentry/sveltekit 10.8.0 未満)

instrumentation.server.ts と svelte.config.js の変更はスキップします。代わりに、Sentry.init() を hooks.server.ts に直接記述します:

// src/hooks.server.ts (legacy — init goes here)
import * as Sentry from "@sentry/sveltekit";

Sentry.init({
  dsn: process.env.SENTRY_DSN,
  tracesSampleRate: 1.0,
  enableLogs: true,
});

export const handleError = Sentry.handleErrorWithSentry();
export const handle = Sentry.sentryHandle();

hooks.client.ts と vite.config.ts はモダンパスと同じです。


パス C:プレーンな Svelte(SvelteKit なし)

インストール:

npm install @sentry/svelte --save

エントリーポイント(src/main.ts または src/main.js)で、アプリをマウントする前に設定します:

import * as Sentry from "@sentry/svelte";
import App from "./App.svelte";

Sentry.init({
  dsn: import.meta.env.VITE_SENTRY_DSN,
  environment: import.meta.env.MODE,

  sendDefaultPii: true,

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

  tracesSampleRate: 1.0,
  tracePropagationTargets: ["localhost", /^https:\/\/yourapi\.io/],
  replaysSessionSampleRate: 0.1,
  replaysOnErrorSampleRate: 1.0,
  enableLogs: true,
});

const app = new App({ target: document.getElementById("app")! });
export default app;

任意:Svelte コンポーネントのトラッキング(すべてのコンポーネントにトラッキングを自動挿入します):

// svelte.config.js
import { withSentryConfig } from "@sentry/svelte";

export default withSentryConfig(
  { compilerOptions: {} },
  { componentTracking: { trackComponents: true } }
);

合意した各機能について

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

機能リファレンス読み込むタイミング
エラーモニタリング${SKILL_ROOT}/references/error-monitoring.md常に(基本設定)
トレーシング${SKILL_ROOT}/references/tracing.mdAPI 呼び出し/分散トレーシングが必要な場合
セッションリプレイ${SKILL_ROOT}/references/session-replay.mdユーザー向けアプリの場合
ロギング${SKILL_ROOT}/references/logging.md構造化ログ/ログとトレースの相関が必要な場合

各機能について:Read ${SKILL_ROOT}/references/<feature>.md を読み、手順に厳密に従って、動作を検証します。


SvelteKit ファイルの概要

ファイル用途モダンレガシー
src/instrumentation.server.tsサーバーの Sentry.init() — 起動時に一度実行✅ 必須❌
src/hooks.client.tsクライアントの Sentry.init() + handleError✅ 必須✅ 必須
src/hooks.server.tshandleError + sentryHandle()(init なし)✅ 必須✅ ここで init
svelte.config.jsexperimental.instrumentation.server を有効化✅ 必須❌
vite.config.tsソースマップ用の sentrySvelteKit() プラグイン✅ 推奨✅ 推奨
.envSENTRY_AUTH_TOKEN、SENTRY_ORG、SENTRY_PROJECT✅ ソースマップ用✅ ソースマップ用

設定リファレンス

主な Sentry.init() オプション
オプション型デフォルト備考
dsnstring—必須。 環境変数を使用します。空の場合、SDK は無効になります
environmentstring"production"例:"staging"、"development"
releasestring—例:"[email protected]" または git SHA
sendDefaultPiibooleanfalseIP アドレスとリクエストヘッダーを含めます
tracesSampleRatenumber—0~1。開発環境では 1.0、本番環境では 0.1–0.2 を使用します
tracesSamplerfunction—トランザクションごとのサンプリング。tracesSampleRate を上書きします
tracePropagationTargets(string|RegExp)[]—分散トレーシングヘッダーを送信する URL
replaysSessionSampleRatenumber—記録する全セッションの割合(クライアントのみ)
replaysOnErrorSampleRatenumber—記録するエラーセッションの割合(クライアントのみ)
enableLogsbooleanfalseSentry.logger.* API を有効にします
beforeSendLogfunction—送信前にログをフィルタリング/変更します
debugbooleanfalseコンソールに詳細な SDK 出力を表示します
サーバー専用オプション(instrumentation.server.ts/hooks.server.ts)
オプション型備考
serverNamestringサーバーイベントに付与するホスト名タグ
includeLocalVariablesbooleanスタックフレームにローカル変数を追加します
shutdownTimeoutnumberプロセス終了前にイベントをフラッシュするまでの時間(ミリ秒、デフォルト:2000)
アダプターの互換性
アダプターサポート状況
@sveltejs/adapter-auto / adapter-vercel(Node)✅ 完全対応
@sveltejs/adapter-node✅ 完全対応
@sveltejs/adapter-cloudflare⚠️ 部分対応 — 追加のセットアップが必要
Vercel Edge Runtime❌ 非対応

検証

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


<script>
  import * as Sentry from "@sentry/sveltekit";
</script>

<button onclick={() => { throw new Error("Sentry client test"); }}>
  Test Client Error
</button>

<button onclick={() => Sentry.captureMessage("Sentry test message", "info")}>
  Test Message
</button>
// src/routes/sentry-test/+server.ts
export const GET = () => {
  throw new Error("Sentry server test");
};

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

  • Issues → 両方のエラーが数秒以内に表示されます
  • Traces → ルートベースのトランザクションを探します
  • Replays → ページを操作した後にセッションの記録が表示されます
  • Logs → 構造化ログエントリーが表示されます(ロギングが有効な場合)

何も表示されない場合は、Sentry.init() で debug: true を設定し、ブラウザーまたはサーバーのコンソールで SDK の出力を確認します。


フェーズ 4:相互リンク

Svelte/SvelteKit のセットアップが完了したら、Sentry のカバレッジが不足している関連バックエンドがないか確認します。

# Look for backend in adjacent directories
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

Sentry が設定されていないバックエンドがある場合は、対応するスキルを提案します。

検出されたバックエンド提案するスキル
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/ を参照してください

トラブルシューティング

問題解決策
イベントが表示されないdebug: true を設定し、DSN を確認して、ブラウザーのコンソールで SDK のエラーを確認します
ソースマップが機能しないnpm run build を実行します(dev ではなく)。SENTRY_AUTH_TOKEN が設定されていることを確認します
サーバーエラーが捕捉されないhandleErrorWithSentry() が hooks.server.ts からエクスポートされていることを確認します
クライアントエラーが捕捉されないhandleErrorWithSentry() が hooks.client.ts からエクスポートされていることを確認します
セッションリプレイが記録されないreplayIntegration() がクライアントの初期化にのみ含まれていることを確認します(サーバーには含めないでください)
sentryHandle() と他のハンドラーが連結されないsequence(Sentry.sentryHandle(), myHandle) でラップします
広告ブロッカーによってイベントがブロックされるtunnel: "/sentry-tunnel" を設定し、サーバー側のリレーエンドポイントを追加します
SvelteKit のインストルメンテーションが有効にならないsvelte.config.js で experimental.instrumentation.server: true が設定されていることを確認します
Cloudflare アダプターの問題アダプター固有の注意事項について、docs.sentry.io/platforms/javascript/guides/sveltekit/ を参照してください
wrapLoadWithSentry / wrapServerLoadWithSentry のエラーこれらは古いラッパーです。削除してください。≥10.8.0 では sentryHandle() がロード関数を自動的にインストルメントします

コメント