Agentive
ツールレビュー

Sentry × AI — エラー追跡とAI自動修正の統合

約5分で読めます

プロダクション環境でのエラー対応は、開発チームにとって最も時間を消費する作業の一つである。Sentryによるエラー追跡とAIによる自動修正を組み合わせることで、エラー検知から修正PRの生成までを数分で完了させるワークフローを構築できる。本記事では、Sentry SDKの導入からAI連携による自動修正パイプラインの構築まで、実践的な手順を解説する。

Sentryの基本設定とAI連携の全体像

Sentryは、アプリケーションで発生したエラーをリアルタイムにキャプチャし、スタックトレース、ユーザー環境、発生頻度などの情報を集約するエラー追跡プラットフォームである。AI連携により、このエラー情報をLLMに渡して原因分析と修正コードの自動生成が可能になる。

全体のワークフローは以下の通りである。

  1. エラー検知: Sentryがプロダクションエラーをキャプチャ
  2. Webhook通知: Sentry AlertがWebhookを発火
  3. コンテキスト収集: エラー情報とソースコードを取得
  4. AI分析: LLMがエラー原因を特定し修正案を生成
  5. PR作成: 修正コードでPull Requestを自動生成
// Sentry SDK初期化(Next.js例)
import * as Sentry from "@sentry/nextjs";

Sentry.init({
  dsn: process.env.SENTRY_DSN,
  tracesSampleRate: 1.0,
  environment: process.env.NODE_ENV,
  beforeSend(event) {
    // PIIをフィルタリング
    if (event.user) {
      delete event.user.email;
      delete event.user.ip_address;
    }
    return event;
  },
  integrations: [
    Sentry.replayIntegration({
      maskAllText: true,
      blockAllMedia: true,
    }),
  ],
});

Sentry Webhookとエラー情報の構造化

SentryのAlert Rulesを設定し、特定条件のエラーが発生した際にWebhookを発火させる。受信側では、エラー情報をAIが分析しやすい形式に構造化する。

// Sentry Webhook受信エンドポイント
import { Anthropic } from "@anthropic-ai/sdk";

interface SentryEvent {
  event_id: string;
  title: string;
  culprit: string;
  message: string;
  level: string;
  platform: string;
  exception?: {
    values: Array<{
      type: string;
      value: string;
      stacktrace?: {
        frames: Array<{
          filename: string;
          function: string;
          lineno: number;
          context_line: string;
          pre_context: string[];
          post_context: string[];
        }>;
      };
    }>;
  };
}

function structureErrorForAI(event: SentryEvent): string {
  const exception = event.exception?.values[0];
  const frames = exception?.stacktrace?.frames?.slice(-5) || [];

  return `
## エラー概要
- タイトル: ${event.title}
- 種別: ${exception?.type || "Unknown"}
- メッセージ: ${exception?.value || event.message}
- レベル: ${event.level}

## スタックトレース(直近5フレーム)
${frames.map((f) => `
### ${f.filename}:${f.lineno} (${f.function})
\`\`\`
${f.pre_context?.join("\n") || ""}
>>> ${f.context_line}
${f.post_context?.join("\n") || ""}
\`\`\`
`).join("\n")}
  `.trim();
}

Alert Rulesの最適な設定

すべてのエラーでAI修正を走らせるとコストが膨大になるため、以下の条件でフィルタリングすることを推奨する。

  • 初回発生エラーのみ: 新規Issueが作成されたタイミングで発火
  • 重大度フィルタ: errorまたはfatalレベルのみ対象
  • 頻度フィルタ: 1時間に10件以上発生したエラーを優先
  • 環境フィルタ: production環境のみ対象

AIによるエラー原因分析と修正コード生成

構造化したエラー情報をClaude APIに渡し、原因分析と修正コードを生成する。重要なのは、エラーの周辺コードも一緒に渡すことで、文脈を理解した修正を行わせる点である。

// AI修正生成パイプライン
async function generateFix(
  errorContext: string,
  sourceCode: string
): Promise<{ analysis: string; fix: string; filename: string }> {
  const client = new Anthropic();

  const response = await client.messages.create({
    model: "claude-sonnet-4-20250514",
    max_tokens: 4096,
    system: `あなたはシニアソフトウェアエンジニアです。
Sentryから報告されたエラーを分析し、修正コードを生成してください。

出力形式:
1. 原因分析(3行以内)
2. 修正コード(差分形式)
3. 修正対象ファイルパス

注意事項:
- 最小限の変更で修正すること
- 既存のテストが壊れない変更にすること
- エッジケースも考慮すること`,
    messages: [
      {
        role: "user",
        content: `## エラー情報\n${errorContext}\n\n## ソースコード\n${sourceCode}`,
      },
    ],
  });

  const text =
    response.content[0].type === "text" ? response.content[0].text : "";
  return parseFixResponse(text);
}

修正の品質を担保する仕組み

AIが生成した修正コードをそのままマージするのは危険である。以下のガードレールを設ける。

  • 自動テスト実行: PRを作成した後、CIで既存テストを実行
  • 差分サイズ制限: 変更行数が50行を超える場合は人間レビュー必須
  • ラベル付与: ai-generated-fixラベルを付けてトラッキング
  • 自動マージ禁止: すべてのAI修正PRは人間承認を必須とする

GitHub連携による自動PR生成

エラー分析結果をもとに、修正ブランチの作成からPR生成までを自動化する。GitHub APIを使い、ブランチ作成、ファイル更新、PR作成を一連のフローで実行する。

// GitHub PR自動生成
import { Octokit } from "@octokit/rest";

async function createFixPR(
  fix: { analysis: string; fix: string; filename: string },
  sentryIssueUrl: string
): Promise<string> {
  const octokit = new Octokit({ auth: process.env.GITHUB_TOKEN });
  const owner = "your-org";
  const repo = "your-repo";
  const branchName = `fix/sentry-auto-${Date.now()}`;

  // mainブランチの最新SHAを取得
  const { data: ref } = await octokit.git.getRef({
    owner, repo, ref: "heads/main",
  });

  // 修正ブランチを作成
  await octokit.git.createRef({
    owner, repo,
    ref: `refs/heads/${branchName}`,
    sha: ref.object.sha,
  });

  // 修正ファイルをコミット
  const { data: file } = await octokit.repos.getContent({
    owner, repo, path: fix.filename, ref: "main",
  });

  await octokit.repos.createOrUpdateFileContents({
    owner, repo,
    path: fix.filename,
    message: `fix: auto-fix Sentry error\n\nSentry Issue: ${sentryIssueUrl}`,
    content: Buffer.from(fix.fix).toString("base64"),
    sha: (file as any).sha,
    branch: branchName,
  });

  // PRを作成
  const { data: pr } = await octokit.pulls.create({
    owner, repo,
    title: `[AI Auto-Fix] ${fix.analysis.split("\n")[0]}`,
    body: `## AI分析結果\n${fix.analysis}\n\n## Sentry Issue\n${sentryIssueUrl}\n\n---\n*このPRはAIによって自動生成されました。マージ前に必ずコードレビューを行ってください。*`,
    head: branchName,
    base: "main",
  });

  return pr.html_url;
}

エラーパターン別の対応戦略

すべてのエラーを同じように扱うのではなく、パターンに応じた対応戦略を定義することで、AI修正の精度とコスト効率が向上する。

TypeErrorとReferenceError

未定義プロパティへのアクセスやnull参照エラーは、AIが最も得意とする修正対象である。スタックトレースから原因箇所を特定し、Optional ChainingやNullish Coalescingを使った修正を高精度で生成できる。

APIレート制限エラー

429エラーの場合、コード修正ではなくリトライロジックの追加やキャッシュ戦略の導入を提案させる。

データベース接続エラー

接続プール枯渇やタイムアウトなどのインフラ起因エラーは、コード修正ではなく設定変更やスケーリングの提案に留めるべきである。

運用メトリクスとコスト管理

AI自動修正のROIを測定するため、以下のメトリクスを継続的に追跡する。

メトリクス測定方法目標値
MTTR(平均修復時間)エラー検知からPRマージまで30分以下
AI修正採用率マージされたAI PRの割合60%以上
誤修正率CIで失敗したAI PRの割合10%以下
API費用/修正Claude API利用料の平均$0.50以下
人的工数削減AI導入前後の対応時間比較70%削減

ベストプラクティスとアンチパターン

推奨事項

  1. 段階的導入: まずは特定のエラータイプ(TypeError等)のみをAI修正対象とし、精度を確認しながら拡大する
  2. コンテキストの充実: エラー情報だけでなく、関連するテストコードやドキュメントもAIに渡すことで修正精度が向上する
  3. フィードバックループ: マージされた修正とリジェクトされた修正のデータを蓄積し、プロンプトの改善に活用する
  4. アラート疲れの防止: AI修正PRが大量に生成されるとレビュー負荷が増すため、優先度に基づいた制限を設ける

アンチパターン

  • AI修正を自動マージする(人間レビューを省略しない)
  • すべてのエラーにAI修正を適用する(コスト爆発の原因になる)
  • エラーのグルーピングを設定せずに運用する(重複修正が発生する)

関連記事

A

Agentive 編集部

AIエージェントを実際に使い倒す個人開発者。サイト制作の自動化を実践しながら、その知見を発信しています。