mcpField
S
sentry-cloudflare-sdk

sentry-cloudflare-sdk

github.com/getsentryクラウド・DevOps2722.7k 回インストール今日更新
リポジトリ

sentry-cloudflare-sdk について

sentry-cloudflare-sdk は、Cloudflare Workers、Pages および関連サービスへの Sentry 導入を案内するプロジェクト調査スキルです。Durable Objects、Queues、Workflows、Hono などの構成に応じて監視設定を説明します。

主な機能

  1. 01Cloudflare プロジェクト設定の検出
  2. 02Workers と Pages の導入案内
  3. 03トレーシングとエラー監視
  4. 04Durable Objects、Queues、Workflows の設定
  5. 05ソースマップのアップロード設定

活用シーン

  1. 01Cloudflare Worker への Sentry 導入
  2. 02スケジュール処理やキューハンドラーの監視
  3. 03Hono を使う Cloudflare Pages の Sentry 設定

インストール

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

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

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

同梱ファイル

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

references/
crons.md
durable-objects.md
error-monitoring.md
logging.md
tracing.md

詳細

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

Sentry Cloudflare SDK

Cloudflare プロジェクトをスキャンし、Workers、Pages、Durable Objects、Queues、Workflows、Hono 向けの Sentry の完全なセットアップを案内する、意見を反映したウィザードです。

このスキルを呼び出す場面

  • ユーザーが「Cloudflare Workers に Sentry を追加して」または Cloudflare プロジェクトで「Sentry をセットアップして」と依頼した場合
  • ユーザーが @sentry/cloudflare のインストールまたは設定を希望している場合
  • ユーザーが Cloudflare Workers または Pages のエラー監視、トレース、ログ、cron、AI 監視を希望している場合
  • ユーザーが withSentry、sentryPagesPlugin、instrumentDurableObjectWithSentry、instrumentD1WithSentry について質問した場合
  • ユーザーが Cloudflare 上の Durable Objects、Queues、Workflows、Scheduled ハンドラー、または Email ハンドラーの監視を希望している場合

注: 以下の SDK バージョンと API は、執筆時点の Sentry ドキュメント(@sentry/cloudflare v10.61.0)に基づいています。 実装前に、必ずこちらのドキュメントで確認してください。


フェーズ 1:検出

推奨を行う前に、以下のコマンドを実行してプロジェクトの内容を確認します。

# Detect Cloudflare project
ls wrangler.toml wrangler.jsonc wrangler.json 2>/dev/null

# Detect existing Sentry
cat package.json 2>/dev/null | grep -E '"@sentry/'

# Detect project type (Workers vs Pages)
ls functions/ functions/_middleware.js functions/_middleware.ts 2>/dev/null && echo "Pages detected"
cat wrangler.toml 2>/dev/null | grep -E 'main|pages_build_output_dir'

# Detect framework
cat package.json 2>/dev/null | grep -E '"hono"|"remix"|"astro"|"svelte"'

# Detect Durable Objects
cat wrangler.toml 2>/dev/null | grep -i 'durable_objects'

# Detect D1 databases
cat wrangler.toml 2>/dev/null | grep -i 'd1_databases'

# Detect Queues
cat wrangler.toml 2>/dev/null | grep -i 'queues'

# Detect Workflows
cat wrangler.toml 2>/dev/null | grep -i 'workflows'

# Detect Scheduled handlers (cron triggers)
cat wrangler.toml 2>/dev/null | grep -i 'crons\|triggers'

# Detect compatibility flags
cat wrangler.toml 2>/dev/null | grep -i 'compatibility_flags'
cat wrangler.jsonc 2>/dev/null | grep -i 'compatibility_flags'

# Detect AI/LLM libraries
cat package.json 2>/dev/null | grep -E '"openai"|"@anthropic-ai"|"ai"|"@google/generative-ai"|"@langchain"'

# Detect logging libraries
cat package.json 2>/dev/null | grep -E '"pino"|"winston"'

# Check for companion frontend
ls frontend/ web/ client/ 2>/dev/null
cat package.json 2>/dev/null | grep -E '"react"|"vue"|"svelte"|"next"'

確認する項目:

質問影響
Workers と Pages のどちらですか?使用するラッパー(withSentry と sentryPagesPlugin)が決まります
Hono フレームワークを使用していますか?よりすっきりと統合できる、単独の @sentry/hono パッケージ(v10.55.0 以降)を推奨します
@sentry/cloudflare はすでにインストールされていますか?インストールを省略し、機能の設定に進みます
Durable Objects は設定されていますか?instrumentDurableObjectWithSentry を推奨します
D1 データベースはバインドされていますか?withSentry は D1 バインディングを自動計測するため(v10.57.0 以降)、手動でのラップは不要です
Queues は設定されていますか?withSentry はキューハンドラーを自動計測します
Workflows は設定されていますか?instrumentWorkflowWithSentry を推奨します
Cron トリガーは設定されていますか?withSentry は scheduled ハンドラーを自動計測します。Crons の監視を推奨します
nodejs_als または nodejs_compat フラグは設定されていますか?必須 — SDK には AsyncLocalStorage が必要です
AI/LLM ライブラリを使用していますか?AI 監視のインテグレーションを推奨します
連携するフロントエンドはありますか?フェーズ 4 のクロスリンクを実行します

フェーズ 2:提案

調査結果に基づいて、具体的な推奨案を提示します。自由回答形式の質問はせず、まず提案を示してください。

推奨(基本的なカバー範囲):

  • ✅ エラー監視 — 常に推奨します。fetch、scheduled、queue、email、Durable Object の各ハンドラーで捕捉されない例外を記録します
  • ✅ トレーシング — HTTP リクエストスパン、アウトバウンド fetch のトレーシング、D1 クエリスパンを自動で記録します

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

  • ⚡ ロギング — Sentry.logger.* による構造化ログです。ログ検索が必要な場合に推奨します
  • ⚡ Crons — 実行されなかった、または失敗したスケジュールジョブを検出します。cron トリガーが設定されている場合に推奨します
  • ⚡ D1 インストルメンテーション — クエリスパンとブレッドクラムを自動で記録します。D1 がバインドされている場合に推奨します
  • ⚡ Durable Objects — DO メソッドのエラーとスパンを自動で記録します。DO が設定されている場合に推奨します
  • ⚡ Workflows — ワークフローのステップのスパンを自動で作成します。Workflows が設定されている場合に推奨します
  • ⚡ AI 監視 — Vercel AI SDK、OpenAI、Anthropic、LangChain に対応します。AI ライブラリが検出された場合に推奨します

推奨ロジック:

機能次の場合に推奨します
エラー監視常に — 欠かせない基本機能です
トレーシング常に — HTTP リクエストのトレーシングとアウトバウンド fetch は大きな価値があります
ロギングアプリで構造化ログの検索、またはログとトレースの関連付けが必要な場合
Cronswrangler.toml で cron トリガーが設定されている場合
D1 インストルメンテーションD1 データベースのバインディングがある場合
Durable ObjectsDurable Object のバインディングが設定されている場合
WorkflowsWorkflow のバインディングが設定されている場合
AI 監視アプリで Vercel AI SDK、OpenAI、Anthropic、または LangChain を使用している場合
メトリクスアプリでカスタムカウンター、ゲージ、または分布が必要な場合

次のように提案します。「エラー監視とトレーシングの設定をおすすめします。D1 インストルメンテーションと Crons の監視も追加しましょうか?」


フェーズ 3:設定方法の案内

オプション 1:ソースマップウィザード

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

npx @sentry/wizard@latest -i sourcemaps

これによりソースマップのアップロードが設定され、本番環境のスタックトレースに読みやすいコードが表示されます。SDK の初期化は設定されないため、実際の SDK の設定には、引き続き以下のオプション 2 に従う必要があります。

完了したら、SDK の設定を行うためにオプション 2 に進んでください。

注: フレームワーク SDK(Next.js、SvelteKit)とは異なり、Cloudflare 専用のウィザード連携はありません。sourcemaps ウィザードではソースマップのアップロード設定のみを行います。


オプション 2:手動設定
前提条件:互換性フラグ

SDK には AsyncLocalStorage が必要です。Wrangler の設定に次のフラグのいずれか 1 つを追加してください。

wrangler.toml:

compatibility_flags = ["nodejs_als"]
# or: compatibility_flags = ["nodejs_compat"]

wrangler.jsonc:

{
  "compatibility_flags": ["nodejs_als"]
}

nodejs_als は軽量で、AsyncLocalStorage のみを有効にします。コードでほかの Node.js API も必要な場合は、nodejs_compat を使用してください。

インストール
npm install @sentry/cloudflare
Workers の設定

ハンドラーを withSentry でラップします。これにより、fetch、scheduled、queue、email、tail の各ハンドラーが自動的にインストルメントされます。

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

export default Sentry.withSentry(
  (env: Env) => ({
    dsn: env.SENTRY_DSN,
    tracesSampleRate: 1.0,
    enableLogs: true,
    dataCollection: {
      // To disable sending user data and HTTP bodies, uncomment the lines below. For more info visit:
      // https://docs.sentry.io/platforms/javascript/guides/cloudflare/configuration/options/#dataCollection
      // userInfo: false,
      // httpBodies: [],
    },
  }),
  {
    async fetch(request, env, ctx) {
      return new Response("Hello World!");
    },
  } satisfies ExportedHandler<Env>,
);

要点:

  • 第 1 引数は env を受け取るコールバックです。これを使って SENTRY_DSN などのシークレットを読み取ります
  • SDK は DSN、環境、リリース、デバッグ、トンネル、トレースのサンプルレートを env から自動的に読み取ります(環境変数を参照)
  • withSentry はエクスポートされたすべてのハンドラーをラップするため、scheduled、queue などを個別にラップする必要はありません
Pages の設定

ミドルウェアとして sentryPagesPlugin を使用します。

// functions/_middleware.ts
import * as Sentry from "@sentry/cloudflare";

export const onRequest = Sentry.sentryPagesPlugin((context) => ({
  dsn: context.env.SENTRY_DSN,
  tracesSampleRate: 1.0,
  enableLogs: true,
  dataCollection: {
    // To disable sending user data and HTTP bodies, uncomment the lines below. For more info visit:
    // https://docs.sentry.io/platforms/javascript/guides/cloudflare/configuration/options/#dataCollection
    // userInfo: false,
    // httpBodies: [],
  },
}));

複数のミドルウェアを連結する場合:

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

export const onRequest = [
  // Sentry must be first
  Sentry.sentryPagesPlugin((context) => ({
    dsn: context.env.SENTRY_DSN,
    tracesSampleRate: 1.0,
  })),
  // Add more middlewares here
];

wrapRequestHandler を直接使用する場合(Cloudflare Pages 上の SvelteKit などのフレームワーク向け):

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

export const handle = ({ event, resolve }) => {
  return Sentry.wrapRequestHandler(
    {
      options: {
        dsn: event.platform.env.SENTRY_DSN,
        tracesSampleRate: 1.0,
      },
      request: event.request,
      context: event.platform.ctx,
    },
    () => resolve(event),
  );
};
Cloudflare Workers 上の Hono

推奨(v10.55.0 以降): Hono アプリにはスタンドアロンの @sentry/hono パッケージを使用してください。

npm install @sentry/hono @sentry/cloudflare

@sentry/cloudflare パッケージはピア依存関係であり、@sentry/hono とバージョンを一致させる必要があります。

import { Hono } from "hono";
import { sentry } from "@sentry/hono/cloudflare";

type Bindings = { SENTRY_DSN: string };

const app = new Hono<{ Bindings: Bindings }>();

// Initialize Sentry middleware as early as possible
app.use(
  sentry(app, (env) => ({
    dsn: env.SENTRY_DSN,
    tracesSampleRate: 1.0,
  })),
);

app.get("/", (ctx) => ctx.json({ message: "Hello" }));

app.get("/error", () => {
  throw new Error("Test error");
});

export default app;

sentry() ミドルウェアは、エラーを自動的にキャプチャし、ルートパターンを使ってトランザクションスパンを作成します。

従来の方法(非推奨): withSentry を使って @sentry/cloudflare を使用する方法も引き続き機能しますが、honoIntegration は非推奨です。

import { Hono } from "hono";
import * as Sentry from "@sentry/cloudflare";

const app = new Hono();

app.get("/", (ctx) => ctx.json({ message: "Hello" }));

export default Sentry.withSentry(
  (env: Env) => ({
    dsn: env.SENTRY_DSN,
    tracesSampleRate: 1.0,
  }),
  app,
);
SENTRY_DSN シークレットの設定

DSN は Cloudflare のシークレットとして保存し、ハードコードしないでください。

# Local development: add to .dev.vars
echo 'SENTRY_DSN="https://[email protected]/0"' >> .dev.vars

# Production: set as a secret
npx wrangler secret put SENTRY_DSN

Env 型にバインディングを追加します。

interface Env {
  SENTRY_DSN: string;
  // ... other bindings
}
ソースマップの設定

ソースマップを使用すると、本番環境のスタックトレースを読みやすくできます。ほとんどの Cloudflare プロジェクトは Wrangler 経由で Vite を使ってビルドするため、Sentry Vite プラグインを組み込み、ビルド時にマップをアップロードするようにします。

npm install @sentry/vite-plugin --save-dev
import { defineConfig } from "vite";
import { sentryVitePlugin } from "@sentry/vite-plugin";

export default defineConfig({
  build: {
    sourcemap: true,
  },
  plugins: [
    sentryVitePlugin({
      org: "___ORG_SLUG___",
      project: "___PROJECT_SLUG___",
      authToken: process.env.SENTRY_AUTH_TOKEN,
    }),
  ],
});

SENTRY_AUTH_TOKEN はビルド時のシークレットです。トークンの作成方法と CI への組み込み方については、sentry-source-maps を参照してください。上記の npx @sentry/wizard@latest -i sourcemaps というショートカットを使うと、この設定を自動化できます。


リリースの自動検出

SDK は Cloudflare のバージョンメタデータバインディングを使って、リリースバージョンを自動的に検出できます。

wrangler.toml:

[version_metadata]
binding = "CF_VERSION_METADATA"

リリースの優先順位(高い順):

  1. Sentry.init() に渡される release オプション
  2. SENTRY_RELEASE 環境変数
  3. CF_VERSION_METADATA.id バインディング

合意した機能ごとに

対応するリファレンスファイルを読み込み、その手順に従ってください。

機能リファレンスファイル読み込むタイミング
エラーモニタリングreferences/error-monitoring.md常に(基本)— 未処理の例外、手動キャプチャ、スコープ、情報の付加
トレーシングreferences/tracing.mdHTTP リクエストのトレーシング、送信 fetch スパン、D1 クエリスパン、分散トレーシング
ロギングreferences/logging.mdSentry.logger.* による構造化ログ、ログとトレースの相関
Cronreferences/crons.mdスケジュールされたハンドラーのモニタリング、withMonitor、チェックイン API
Durable Objectsreferences/durable-objects.mdDurable Object クラスに計測機能を組み込み、エラーキャプチャとスパンを有効化

機能ごとに、リファレンスファイルを読み、手順に正確に従い、次に進む前に検証してください。


設定リファレンス

Sentry.init() のオプション
オプション型デフォルト備考
dsnstring—必須です。設定されていない場合は、env.SENTRY_DSN から自動的に読み取ります
tracesSampleRatenumber—0~1。開発環境では1.0、本番環境では低い値を推奨します
tracesSamplerfunction—動的サンプリング関数です。tracesSampleRate と同時には指定できません
dataCollectionobject設定しない場合は保守的SDK が収集するデータ(userInfo、httpBodies など)を制御します。省略した場合は sendDefaultPii(デフォルトは false)にフォールバックします。このオブジェクトを渡すと({} の場合も含む)、許可的なデフォルト設定が有効になります。データ収集リファレンスを参照してください
sendDefaultPiibooleanfalseレガシーなオプションです。収集するデータの制御には dataCollection を推奨します
enableLogsbooleanfalseSentry Logs 製品を有効にします
environmentstring自動設定されていない場合は、env.SENTRY_ENVIRONMENT から読み取ります
releasestring自動CF_VERSION_METADATA.id または SENTRY_RELEASE から検出されます
debugbooleanfalse設定されていない場合は、env.SENTRY_DEBUG から読み取ります。SDK の動作をコンソールに記録します
tunnelstring—設定されていない場合は、env.SENTRY_TUNNEL から読み取ります
beforeSendfunction—エラーイベントの送信前にフィルタリングまたは変更します
beforeSendTransactionfunction—トランザクションイベントの送信前にフィルタリングまたは変更します
beforeSendLogfunction—ログエントリの送信前にフィルタリングまたは変更します
tracePropagationTargets(string|RegExp)[]すべての URLトレースヘッダーを付与する送信リクエストを制御します
skipOpenTelemetrySetupbooleanfalseOpenTelemetry 互換トレーサーをオプトアウトします
instrumentPrototypeMethodsboolean | string[]falseDurable Object:RPC スパン用にプロトタイプメソッドを計測します
データ収集リファレンス
dataCollection: {
  // To disable sending user data and HTTP bodies, uncomment the lines below. For more info visit:
  // https://docs.sentry.io/platforms/javascript/configuration/options/#dataCollection
  // userInfo: false,
  // httpBodies: [],
},
環境変数(env から読み取り)

SDK は、以下の環境変数を Cloudflare の env オブジェクトから自動的に読み取ります。

変数用途
SENTRY_DSNSentry の初期化に使用する DSN
SENTRY_RELEASEリリースバージョン文字列
SENTRY_ENVIRONMENT環境名(production、staging)
SENTRY_TRACES_SAMPLE_RATEトレースのサンプルレート(浮動小数点数として解析)
SENTRY_DEBUGデバッグモードを有効化("true" / "1")
SENTRY_TUNNELイベントのプロキシに使用するトンネル URL
CF_VERSION_METADATACloudflare バージョンメタデータバインディング(リリースを自動検出)
デフォルトのインテグレーション

以下は getDefaultIntegrations() によって自動的に登録されます。

インテグレーション用途
dedupeIntegrationイベントの重複を防止します(Workflows では無効)
inboundFiltersIntegration種類、メッセージ、URL に基づいてイベントをフィルタリングします
functionToStringIntegration元の関数名を保持します
linkedErrorsIntegrationエラーの cause チェーンをたどります
fetchIntegration送信 fetch() 呼び出しをトレースし、パンくずリストを作成します
honoIntegrationv10.55.0 で非推奨 — 代わりに @sentry/hono パッケージを使用してください。Hono の onError 例外を自動的に捕捉します
requestDataIntegrationリクエストデータをイベントに付加します
consoleIntegrationconsole.* 呼び出しをパンくずリストとして捕捉します

検証

セットアップ後、Sentry が動作していることを確認します。

// Add temporarily to your fetch handler, then remove
export default Sentry.withSentry(
  (env: Env) => ({
    dsn: env.SENTRY_DSN,
    tracesSampleRate: 1.0,
  }),
  {
    async fetch(request, env, ctx) {
      throw new Error("Sentry test error — delete me");
    },
  } satisfies ExportedHandler<Env>,
);

デプロイしてルートを実行し、Sentry Issues ダッシュボードを確認します。エラーは約30秒以内に表示されます。

検証チェックリスト:

確認項目方法
エラーの捕捉fetch ハンドラー内で例外をスローし、Sentry で確認します
トレーシングの動作Performance タブで HTTP スパンを確認します
ソースマップの動作スタックトレースに読みやすいファイル名と行番号が表示されることを確認します
D1 スパン(設定した場合)D1 クエリを実行し、db.query スパンを確認します
スケジュール監視(設定した場合)cron を実行し、Crons ダッシュボードを確認します

フェーズ 4:相互リンク

Cloudflare のセットアップが完了したら、関連サービスがあるか確認します。

# Check for companion frontend
ls frontend/ web/ client/ ui/ 2>/dev/null
cat package.json 2>/dev/null | grep -E '"react"|"vue"|"svelte"|"next"|"astro"'

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

フロントエンドが見つかった場合は、対応する SDK スキルを提案します。

検出されたフロントエンド提案するスキル
Reactsentry-react-sdk
Next.jssentry-nextjs-sdk
Svelte/SvelteKitsentry-svelte-sdk
Vue/Nuxtdocs.sentry.io/platforms/javascript/guides/vue/ を参照

別のディレクトリにバックエンドが見つかった場合:

検出されたバックエンド提案するスキル
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-sdk

フロントエンドとバックエンドをリンクされた Sentry プロジェクトで接続すると、分散トレーシングが可能になります。これは、ブラウザー、Cloudflare Worker、バックエンド API にまたがるスタックトレースを、1 つのトレースビューで確認できる機能です。


トラブルシューティング

問題原因解決策
イベントが表示されないDSN が設定されていない、または debug: false によってエラーが非表示になっている初期化オプションで一時的に debug: true を設定します。wrangler secret list で SENTRY_DSN シークレットが設定されていることを確認します
AsyncLocalStorage is not defined互換性フラグが不足しているwrangler.toml の compatibility_flags に nodejs_als または nodejs_compat を追加します
スタックトレースに圧縮されたコードが表示されるソースマップがアップロードされていない@sentry/vite-plugin を設定するか、npx @sentry/wizard -i sourcemaps を実行します。CI で SENTRY_AUTH_TOKEN を確認します
短時間で終了するリクエストでイベントが失われるWorker が終了する前に SDK のフラッシュが行われていないwithSentry または sentryPagesPlugin でハンドラーをラップします。これらは ctx.waitUntil() を使ってフラッシュします
Hono のエラーが捕捉されないHono アプリが計測されていない@sentry/hono/cloudflare を使います。sentry ミドルウェアをインポートし、app.use(sentry(app, options)) を呼び出します
Durable Object のエラーが見つからないDO クラスが計測されていないSentry.instrumentDurableObjectWithSentry() でクラスをラップします。references/durable-objects.md を参照してください
D1 クエリでスパンが作成されないハンドラーが withSentry でラップされていない、または env 以外のバインディングにクエリしているenv 上の D1 バインディングは withSentry によって自動計測されます(v10.57.0 以降)。手動でのラップは不要です(instrumentD1WithSentry は非推奨です)。すべてのクエリメソッド(prepare、batch、exec、withSession)は v10.61.0 以降でトレースされます
スケジュールされたハンドラーが監視されないハンドラーが withSentry でラップされていないexport default Sentry.withSentry(...) で、エクスポートされたハンドラーオブジェクト全体をラップしていることを確認します
リリースが自動検出されないCF_VERSION_METADATA バインディングが設定されていないwrangler.toml に binding = "CF_VERSION_METADATA" を含む [version_metadata] を追加します
Workflows でイベントが重複する重複排除インテグレーションがステップの失敗をフィルタリングしているSDK は Workflows の重複排除を自動的に無効にします。instrumentWorkflowWithSentry を使っていることを確認します

コメント