2026-04 Vendure Sentry Event Policy¶
背景¶
Vendure の監視では、これまで Sentry が主に「未処理例外の受け皿」として使われていた。 しかし実際の障害は、以下の 3 種類が混在する。
- Node / Nest / GraphQL で未処理に近い例外
- アプリが処理継続可能な運用異常
- 業務上は失敗だが API としては正常応答になる業務エラー
GraphQL resolver 例外や createAssets のような multipart upload 失敗は、
HTTP 500 や process crash に必ずしも変換されないため、Sentry の自動捕捉だけでは
監視面が不完全になる。
方針¶
Vendure の Sentry surface は、以下の 3 区分を正本とする。
1. unexpected_exception¶
- 予期しない例外
- 例:
- resolver / service 内の throw
- process crash
- startup 中の未処理例外
- Sentry 送信:
captureException- level は
error - 運用:
- 原則として issue 化対象
2. operational_failure¶
- アプリが検知・処理したが、運用上は異常な状態
- 例:
- schema drift 検知
- startup canary failure
- drift check 自体の失敗
- 外形監視の失敗
- Sentry 送信:
captureIssue(... kind: "operational_failure")- level は既定で
error - 同じ語彙で Sentry metric も残す
- 運用:
- deploy / startup / infrastructure triage の主対象
3. business_error¶
- 業務仕様として返る失敗結果で、HTTP / GraphQL transport は成功する
- 例:
MimeTypeError- validation result union
- permission / precondition failure のうち product 上重要なもの
- Sentry 送信:
captureIssue(... kind: "business_error")- level は既定で
warning - 運用:
- 全件送信しない
- 重要導線だけを明示的に対象化する
要件¶
- Vendure の observability helper は、上記 3 区分を API 上で明示できること。
- GraphQL resolver 例外は
unexpected_exceptionとして Sentry に送ること。 - startup canary / schema drift のような handled failure は
operational_failureとして送ること。 business_errorは無差別送信を禁止し、重要導線のみ opt-in で送ること。- event 側の tag は
issue_kindを必須とし、triage での検索キーに使えること。 - handled failure は、必要に応じて event と metric を同時に残せること。
初期適用範囲¶
今回の適用対象は以下とする。
- GraphQL resolver exception capture
- startup dashboard API canary failure
- schema drift detected / check failed
createAssetsのMimeTypeErrorをbusiness_errorとして送信- order / payment / fulfillment の状態遷移系 mutation の主要 union error を curated allowlist で送信
上記以外の business error は、まず canary / 回帰テストで再発防止を優先し、その上で本番 request path へ段階的に opt-in する。
Inbound noise drop policy (Errors quota 節約)¶
@ritsubi/utils の sanitizeAndFilterSentryEvent (および React Dashboard の同等関数) は、各サーフェスの beforeSend から呼ばれ、以下のイベントを Sentry に送信する前に drop する。これにより Errors quota を節約しつつ、issue_kind: business_error を持つ curated event は影響を受けない。
- ブラウザ拡張由来のスタックフレーム / メッセージ (
chrome-extension://等) - Next.js framework control flow (
REDIRECT,HTTP_ERROR_FALLBACK_404) - 既知ノイズメッセージ:
AbortError,Failed to fetch,Load failed,NetworkError when attempting to fetch resource,ResizeObserver loop limit exceeded,ResizeObserver loop completed with undelivered notifications,Non-Error promise rejection captured,The user aborted a request,The operation was aborted - bot / 監視 User-Agent (
bot,crawler,spider,uptime,healthcheck,monitor,previewの case-insensitive 一致) - 期待される HTTP 4xx (
400/401/403/404/409/422) —event.contexts.response.status_code/event.tags.{status_code,statusCode,"http.status_code"}/event.exception.values[*].mechanism.data.status_codeのいずれかから判定 - escape:
event.tags.issue_kind === "business_error"の curated event は status に関わらず drop しない
ランダム sampleRate は導入しない (低頻度の重要エラーを失わないため)。staging / preview は production と同じ Sentry project に送信し、environment タグで区別する。
非対象¶
- すべての GraphQL
errors/ union result を自動で Sentry 送信すること - すべての validation error を issue 化すること
- browser / WordPress / Storefront の event policy をこの文書で統合すること
それらは別 surface の要件として個別に管理する。