フロントエンドが500エラーを投げる。stack traceはReactコンポーネントを指す。本当の問題は3つ先のサービスにあり、リークしているバックグラウンドジョブによって使い果たされたデータベース接続プールにある。

trace waterfallをクリックして進み、タイムスタンプを相関させ、コミット履歴を読むこともできる。あるいは、SentryのSeerに任せることもできる。trace、エラー、コードを読み込み、何が壊れたかを教えてくれるLLM駆動のデバッグエージェントだ。

Seerはこれが得意だ。千里眼ではない。この2つの言明の間の隔たりが、この記事のテーマだ。

statistical debuggingが実際に何を意味するか

statistical debuggingは、多くの実行にわたるパターンを使用してバグを特定する。従来のデバッガーは1回の実行を示す。statistical approachesは分布を見る:どの関数が一緒に失敗するか、どのtraceがエラーと相関するか、どのコミットがクラッシュの急増の前にあったか。

Sentryは統計的な部分を長年行ってきた。Seerはそのデータの上に因果関係を推論するLLMを追加する。統計を代替するわけではない。それを解釈するのだ。

Seerは無から根本原因を幻覚させない。あなたが見るのと同じtraceとstack traceを見るが、数秒で数千のspanを読み込み、codebaseと相関させる。

Seerがspanに溺れずにtraceを読む方法

distributed traceは数千のspanを含むことがある。それらすべてをLLMのcontext windowに入れることは混乱の元だ。モデルは無関係な詳細にこだわり、信号を見逃す。

Sentryは凝縮されたtrace treeを構築することでこれを解決する。すべてのspanの代わりに、Seerはtransactionの階層を見る。spanを意味のある単位にグループ化するservice boundariesだ。このtreeは、どのtransactionがどの他のtransactionを呼び出したか、どれだけ時間がかかったか、内部でエラーが発生したかを示す。

概念的にraw traceがどのように見えるかを以下に示す。

GET /api/checkout
├── POST /payment-service/process
│   ├── SELECT * FROM orders
│   └── UPDATE inventory
├── GET /user-service/profile
│   └── SELECT * FROM users WHERE id = ?
└── POST /notification-service/email
    └── SMTP send

Seerはタイミングとエラーステータスが注釈付けされたこのtreeを受け取る。チェックアウトリクエストが3つのダウンストリームサービスを呼び出したことを見る。要求しない限り、個々のデータベースクエリはすべて見るわけではない。

重要な言葉は「要求しない限り」だ。Seerにはツールがある。treeが支払いサービスが問題だと示唆すれば、そのtransaction内の完全なspan、IDで関連付けられたエラーイベント、またはCPU profilesを取得できる。次に何を見るかを決定する。

このagentic approachが、「このtraceをChatGPTに貼り付ける」とSeerが実際に行うことの違いだ。チャットボットは1回きりだ。Seerはループを持つ:観察、推論、さらなるデータの取得、再推論。

Seerが解決するために構築されたクロスサービス問題

trace以前、Seer(当時はAutofixと呼ばれていた)はstack tracesとbreadcrumbsに依存していた。これはモノリスには機能した。分散システムには機能しなかった。

フロントエンドの500エラーを考えてみよう。stack traceはfetch呼び出しを指す。traceがなければ、Seerはフロントエンドが壊れたと結論付けるだろう。traceがあれば、フロントエンドがAPIゲートウェイを呼び出し、APIゲートウェイが認証サービスを呼び出し、証明書がローテーションされたためにトークン検証エラーを投げたことを見る。

Sentryの自社チームも内部的にこれに遭遇した。SentryのバックエンドとSeerのマイクロサービスの間の認証問題が数日間続いていた。trace treeと両方のリポジトリーへのアクセスを与えられたSeerは、根本原因を特定し、両方のサービスでpull requestを作成した。

それが約束だ。落とし穴はセットアップにある。

Seerがあなたを助けるために必要なもの

Seerがうまく機能するには3つのものが必要だ。

1. 接続されたtrace

サービスがdistributed tracingのない異なるSentryプロジェクトを使用している場合、Seerはtrace treeではなく孤立したエラーを見る。各サービスにSentry SDKがあり、trace header propagationが必要だ。

Pythonでの例:

import sentry_sdk

sentry_sdk.init(
    dsn="https://your-dsn.ingest.sentry.io/project-id",
    traces_sample_rate=0.1,  # Adjust for your volume
)

クロスサービスの伝搬については、SDKがサポート対象のHTTPクライアント上でsentry-tracebaggageヘッダーを自動的に読み書きする。独自のクライアントを使用する場合は、手動でヘッダーを添付する:

from sentry_sdk import continue_trace

headers = {}
continue_trace(headers).apply_to_request(headers)
response = my_custom_http_client.get(
    "http:// downstream-service/api",
    headers=headers,
)

これがなければ、Seerはフロントエンドとバックエンドのエラーを無関係なインシデントとして見る。trace treeは形成されない。

2. 接続されたコード

Seerはtraceと実装を相関させるためにcodebaseを検索する。これにはGitHub integrationと、リポジトリーをSentryプロジェクトにマッピングすることが必要だ。Seerはzipファイルやローカルパスからコードを読むことはできない。

3. 十分な信号

auto-instrumentされたHTTP spanだけのtraceは、サービスAがサービスBを呼び出したことをSeerに教える。しかし、その間にどのようなビジネスロジックが発生したかは教えない。custom spansは重要だ。

from sentry_sdk import start_span

def process_payment(order_id):
    with start_span(op="payment.process", description="Validate and charge"):
        validate_order(order_id)
        charge_customer(order_id)

これらがなければ、SeerはHTTPリクエストとデータベースクエリの間にブラックボックスを見る。

誰もマーケティングコピーに載せないトレードオフ

Seerには実際の限界があり、Sentryはそれについてかなり誠実だ。

精度は高いが、100%ではない。

Sentryは94.5%の根本原因特定率を報告している。つまり、おおよそ20件に1件は誤診されるということだ。高深刻度のインシデントについては、修正をデプロイする前に人間がSeerの結論を検証する必要がある。

実行ごとにお金がかかる。

Seerの実行は根本原因分析あたり約1ドルかかり、月額サブスクリプションも必要だ。自動スキャンは1件あたり0.003ドルと安い。毎日数十件の問題を処理するチームにとって、これは積み上がる。自動化の閾値は注意深く設定する必要がある。

見えないものは修正できない。

traceが1%でサンプリングされていて、バグが残りの99%にしか現れない場合、Seerはそれを見つけられない。根本原因がSentryにtraceを送信しないサードパーティサービスにある場合、Seerは壁にぶつかる。問題がエラーを投げない論理的バグである場合、Seerは決して発動しない。

LLMはまだいくつかの種類の推論が苦手だ。

Microsoftの研究は、ほとんどの開発者が疑っていることを確認した:AIエージェントは問題の局在化には長けるが、原因が症状から遠い場合の根本原因分析には苦労する。時間を超えた因果関係、特に競合状態や状態破損においては、依然として難しい。

Seerが輝くときとスキップすべきとき

Seerは以下の場合に試す価値がある。

  • 複数のサービスにわたる接続されたtraceを持つ分散システムである
  • 問題はSentryが捉えた明確なエラーイベントを含む
  • 根本原因はおそらく自分たちのコードにあり、サードパーティの依存関係ではない
  • traceのボリュームが十分にあり、手動での調査が面倒になっている

以下の場合はスキップすべきだ。

  • サービス間でtraceが接続されていない
  • 問題が断続的で、traceにめったに捉えられない
  • アクティブなインシデントに対して1分未満の解決が必要である(Seerの実行には数分かかる)
  • 根本原因はほぼ間違いなくインフラであり、コードではない

実際に試す方法

すでに有料のSentryプランを利用している場合、Seerは14日間のトライアルとして利用できる。

  1. Sentryの組織設定でGitHubを接続する
  2. Seerの設定でリポジトリーをSentryプロジェクトにマッピングする
  3. SDKでtracingが有効になっており、traces_sample_rateが設定されていることを確認する
  4. 任意のissueを開き、Find Root Causeをクリックする

自動実行の場合、停止ポイントを設定する。ほとんどのチームはStop after Root Causeから始める。精度を信頼できるようになったら、解決策の提案やpull requestの作成を任せることができる。

CursorやClaude Codeを使用している場合、IDEのチャットからSentryのMCP serverを介して直接Seerを呼び出すことができる。

正直な結論

Seerは凝縮されたtrace treeを構築し、オンデマンドで詳細なデータを取得し、codebase全体で推論することで、trace内の根本原因を見つけることができる。接続された、適切に計測された分散システムにとって、それは本当に役立つ。Sentryの自社エンジニアも、クロスサービスの問題で数日分のデバッグ時間を節約している。

自分のシステムを理解することの代替ではない。traceとコードを読める、非常に速くて非常に博学なインターンであり、時々間違ったサービスのせいにすることもある。調査を加速するために使い、排除するために使うのではない。

traceがクリーンで接続されており、有用なspanで満ちているなら、Seerはおそらく感動させてくれるだろう。そうでなければ、まずtraceを修正する。計測する手間を惜しんだものを、どのLLMもデバッグできない。


FAQ

Seerはself-hosted Sentryで動作するか?

いいえ。Seerはsentry.ioを必要とするクラウドサービスだ。LLMエージェントを実行し、テレメトリにアクセスするためにSentry自身のインフラに依存する。self-hostedインスタンスはSeerにアクセスできない。

SeerはPythonとJavaScript以外の言語のtraceも分析できるか?

はい。SeerはSentryからtrace dataを読み込み、言語固有の生のテレメトリではない。traceを生成するSentry SDKで計測されたサービスならどれでも、Seerに入力できる。コード分析ステップにはGitHub integrationが必要だが、これはどの言語でも機能する。

Seerが根本原因を間違えた場合どうなるか?

分析中にフィードバックを提供でき、Seerはそれを取り入れる。最終出力は、コード変更が適用されたりPRが作成されたりする前に、常に人間の承認が必要だ。明示的に設定しない限り、何も自動的に出荷されない。

これはstack traceをClaudeやChatGPTに貼り付けるだけと何が違うのか?

チャットボットは、貼り付けたものを含む単一のcontext windowを得る。Seerは、完全なtrace tree、関連付けられたエラー、CPU profiles、codebaseにアクセスできるagentic loopを持つ。推論しながらさらにデータを取得でき、実際のコードを読むことでシステムの構造を知っている。