mcpField
S
signals-scout-apm

signals-scout-apm

github.com/posthogクラウド・DevOps7656 回インストール今日更新
リポジトリ

signals-scout-apm について

OpenTelemetry のトレースを調査し、検証済みのサービスや操作の回帰を報告する APM スキルです。エラー率とレイテンシを1週間前と比較し、トラフィック変動によるノイズを除外します。

主な機能

  1. 01先週とのサービス状態の比較
  2. 02エラー率とレイテンシ変化の調査
  3. 03トレースとエラーシグネチャの確認
  4. 04サービスのトラフィック急減の検出
  5. 05過去の調査を記録して重複を防止

活用シーン

  1. 01操作のエラー率上昇の調査
  2. 02トレースからレイテンシ回帰を特定
  3. 03トレース送信が止まったサービスの調査

MCP 対応

APM と scout の MCP ツールで、トレースの状態、集計、サンプル、レポート、調査メモを扱います。

インストール

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

$npx skills add https://github.com/posthog/skills --skill signals-scout-apm

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

同梱ファイルreferences/performance-issues.md

詳細

翻訳後に原文が更新されています。最新の内容は原文をご確認ください。

Signals scout: 分散トレーシング(APM)

APM に特化したスカウトです。このチームの OpenTelemetry トレースデータから、エラー率の急変、レイテンシの悪化、新たなエラーシグネチャ、依存先の障害、サービスのトラフィック急減など、意味のあるリグレッションを見つけ、基準を満たす場合に限ってレポートを提出してください。何も報告しない実行も正当な結果です。既知のリグレッションを再報告するくらいなら、何も報告しないほうがよいでしょう。

レポートはレポートチャネル(scout-emit-report / scout-edit-report)から直接作成します。調査を済ませているため、弱いシグナルをパイプラインに送ってクラスタリングさせるのではなく、各レポートを最初から最後まで一貫して担当します。その分、基準は高くなります。局所的で検証済みの RED リグレッションで、人間が受信トレイで見つけたら対応するはずの、単独でも成立する項目として自信を持てる場合に限ってレポートを提出してください。受信トレイで追跡中のリグレッションが依然として進行している場合は、新規レポートではなく編集です。ハーネスのプロンプトには、レポートチャネルの完全な契約(フィールド、ステータスのマッピング、レビュアーへの振り分け、重複排除、編集ルール)が記載されています。この本文では APM 固有の指針のみを補足します。

対象は APM/分散トレーシングであり、AI オブザーバビリティでもログでもありません。 $ai_* イベント(AI オブザーバビリティ担当のスカウトの領域)とログストリーム(ログ担当のスカウトの領域)は無視してください。

判別の基準は、リクエスト量が安定している状況で、各オペレーション自身の 7 日前のベースラインと比較した、(サービス、オペレーション)ごとの RED リグレッションの「率」です。生の合計数ではありません。 エラー「率」(error_count / count)と p95「レイテンシ」がシグナルです。トラフィックに連動して動く生のエラー数や生のスパン数はノイズです。トラフィックが 3 倍に増え、それに連動してエラー数も 3 倍になった場合、それはトラフィック量の変化であり、リグレッションではありません。このパターンをしっかり理解してください。これがすべてであり、最もよくある誤検知は「生の合計数が変動した」です。

簡単な終了判定:APM は使われていますか?

スケジュール実行は、<precheck_result> ブロックから始まることがあります。このブロックは、過去 24 時間以内に少なくとも 1 つのスパンが到着しており、APM が使われていることを示します。ブロックがある場合は、この確認を省略して全実行に進んでください。

APM スパンは分析イベントストリームではなく、専用のスパンストアに保存されます。そのため、scout-project-profile-get の top_events には表示されません。確認には APM ツールを使ってください。

  • apm-services-list が空(スパンを送信したサービスがない)、かつ
  • 過去 24 時間の apm-spans-count が約 0

→ このチームは分散トレーシングを使っていません。スクラッチパッドに次のエントリを 1 つ記録してください。

  • key: not-in-use:apm
  • content: 簡潔なメモ(「{timestamp} に確認、apm-services-list は空、24 時間のスパン数は 0」)

何も報告せず終了します。このエントリは今後の実行を効率化しますが、確認を省略するものではありません。後続の実行でも、信頼する前に apm-services-list(または apm-spans-count)を 1 回呼び出します。この再確認が「数秒でのショートサーキット」であり、エントリの記録後にチームが APM を導入したことを検知します。対象が空のままなら、同じキーで再実行するとタイムスタンプが冪等に更新されます。スパンが現れた時点で、次の実行ではエントリを書き換えるか削除し、全実行に進みます。メモリだけを根拠に終了してはいけません。

実行の進め方

以下の動きを繰り返してください。有用でないものは省略し、有用なものは再確認します。実際のクエリ形式、kind/status_code の列挙値、トレース解析スクリプトについては、同梱の exploring-apm-traces スキルを活用し、ここで独自に導き出そうとしないでください。

状況を把握する

実行のコールドスタート時に、低コストで確認できる読み取りは3つあります。

  • scout-scratchpad-search(text=apm)— 過去の APM 実行から得られた、継続的に活用できる指針です。pattern:、noise:、addressed:、dedupe:、report:、または reviewer: のプレフィックスが付いたエントリーから、操作ごとの基準値、通常の状態、すでに表面化した内容、除外すべきもの(デプロイ時間帯、ヘルスチェックのエンドポイント、再試行が発生しやすい依存関係)、どのレポートがリグレッションを扱っているか、サービスの担当者が誰かを確認できます。
  • scout-runs-list(過去7日間)— 過去の APM 実行で何が見つかり、何が除外されたかを確認します。概要をざっと読み、詳しく調べる価値のあるものだけ scout-runs-retrieve で取得してください。
  • apm-services-list — 現在のサービス一覧です。過去の実行の基準値メモリにあったサービスが現在は存在しない場合、それ自体が調査候補となります(下記のトラフィック急減を参照)。
  • inbox-reports-list(ordering=-updated_at、search=対象のサービスまたは操作)— 受信トレイにある既存のレポートです。レポートチャネルで作成した自分のレポートは、元となるシグナルが source_product=signals_scout(apm ではありません)で保存されるため、source_product=apm で絞り込まないでください。作成したレポートがすべて見つからなくなります。以前報告した操作でリグレッションが発生した場合、新規レポートではなく編集してください。作成前に inbox-reports-retrieve で最も近い一致を取得してください。
判別エンジン

1回の呼び出しで、すべての操作について季節性を合わせた基準値を取得できます。

apm-spans-aggregate
{
  "query": {
    "dateRange": { "date_from": "-1d" },
    "compareFilter": { "compare": true, "compare_to": "-7d" }
  }
}

results は直近24時間、compare はその1週間前の同じ24時間を示し、どちらも (service_name, name) ごとに1行で、count、error_count、p50_duration_nano、p95_duration_nano が含まれます。2つの配列を (service_name, name) で結合し、操作ごとに次の値を計算してください。

  • エラー率 error_count / count(現在と7日前)
  • p95レイテンシ p95_duration_nano(現在と7日前)
  • リクエスト量 count(現在と7日前。分母のガードに使用)

負荷の高いサービスでは数百もの操作が返されます(ペイロードは100KBを超え、ハーネスによってファイルに保存されます)。**目視で確認せず、プログラムで処理してください。**操作を差分順に並べ、率が変化した一方で count が約2倍以内に収まっているものだけを残します(これが、実際のリグレッションと量の変動を区別するガードです)。count が少ない操作では、パーセンタイルを安定して算出するにはサンプル数が少なすぎます(除外条件を参照)。プロジェクト全体を一度に取得するのではなく、1回の実行につき数個のサービスに範囲を絞ってください。

プロファイルの形状
パターン通常の意味
error_count が増加し、count も比例して増加(率はほぼ一定)トラフィックの急増 — リグレッションではないため除外する
error_count が増加し、count はほぼ一定(エラー率が上昇)実際のエラーリグレッション — 優先して調査する
p95 が大幅に上昇し、count はほぼ一定レイテンシのリグレッション — 調査する
p95 と count がともに急上昇高負荷時の飽和 — 調査するが、確度は低め
新しい (service, name) でエラーが発生し、7日前の行がない新しいコードパス/最近のデプロイ — 調査する
基準値メモリにあったサービスで、現在のスパンがほぼ0トラフィックの急減(計測の破損または障害)— 調査する

必ず最新の完全なバケット/ウィンドウを評価してください。現在の時間がまだ完了していない場合、トラフィック量の減少と p95 の低下が常に表示されます。

調査する

注目すべきパターンです。出発点として使い、チェックリストとしては扱わないでください。

エラー率の回帰

識別エンジンから、count がほぼ一定のままエラー率が大幅に上昇した操作を見つけます。開始時点を確認するには、サービス/操作でフィルターした apm-spans-sparkline で合計数を取得し、同じ呼び出しに statusCodes: [2] を指定してエラー数を取得します。バケットごとのエラー率はエラー数/合計数です。比率が跳ね上がったバケットが発生時点です。代表的な失敗トレースを取得するには、status_code = 2 フィルターと orderBy: "duration" を指定して query-apm-spans を実行し、trace_id を取得してから apm-trace-get を実行します。エラースパンの attributes マップから exception.type/exception.message を直接確認します。parent_span_id をたどり、そこに至ったリクエスト経路を確認します。query-apm-spans はデフォルトでルートスパンのみを対象にします(rootSpans: true)。そのため、回帰した操作が子スパン(DB または Client 呼び出し)の場合、flatSpans: true(および rootSpans: false)を設定してください。そうしないと、status_code = 2 と操作フィルターの組み合わせに一致するものがなくなります。集計で回帰を検出できても、確認用のサンプルを取得できません。

レイテンシ p95 の回帰

count が安定しているのに p95_duration_nano が上昇した操作を見つけます。原因を特定するには、apm-spans-tree で(parent, child)ごとのエッジを確認し、calls_per_parent_invocation を見て、呼び出しあたりの処理が遅くなった子と、親あたりの呼び出し回数が増えただけの子を区別します。低速なサンプルトレースでは、スパンを self_time_nano で並べ替えます。自己時間に大きな差がある親は、遅い子ではなく、計装されていない処理を示しています。apm-spans-duration-histogram で二つ目の山や太いテールが確認できる場合は、切り分ける価値のある別個の低速な母集団が存在します。duration フィルターで絞り込めます。ただし、このヒストグラムがバケット化するのはルートスパンの所要時間のみです(ルートスコープは常に適用されます)。そのため、ルート操作のレイテンシに限って使用し、子スパンの回帰には代わりに apm-spans-tree と query-apm-spans(flatSpans: true)を使用してください。

同じサービス内の複数の操作(または同じサブシステムを共有する操作。例:一連の DB スパンやクエリエンジンスパン)が同じ時間帯にまとめて回帰した場合、これは N 件の別々の検出事項ではなく、一つの上流の原因(デプロイ、依存先の遅延、リソースの飽和)です。クラスターとして認識し、操作を根拠として挙げたうえで、共有する原因を記したレポートを一つだけ作成してください。操作ごとにレポートを作成しないでください。

新たなエラーシグネチャ/失敗している依存先

操作(または別のサービスを呼び出す、下流の Client 種別のスパン)で新たにエラーが発生したケースです。エラーセット(status_code = 2)に絞り、候補となるキー(server.address、http.response.status_code、db.system、service.version)で apm-attribute-breakdown を実行します。エラーセットに絞った内訳から分かるのは問題のある母集団のみなので、実際のシグネチャと、単にあらゆる場所に存在する値とを区別できません。**同じ内訳を status_code フィルターなしでもう一度実行し、割合を比較してください。**エラーの約 95% を占める一方で、トラフィック全体では割合が小さい値がシグネチャです。エラーとトラフィックの両方で約 95% を占める値は、単なるトラフィック量を反映しているだけです。エラーの大半を占める一方で、トラフィックの大半は占めない service.version は、不良デプロイを示しています。

サービストラフィックの急減

apm-services-list とサービスごとの apm-spans-sparkline をベースラインの記録と比較します。安定したスパン量を出力していたサービスが約 0 まで減少している場合、計装の中断または停止です(キャプチャが急減する場合のトレース側に相当します。スパンは遡って記録されません)。現在のバケットが未完了なだけの状態を急減と誤認しないようにしてください。少なくとも 2 つの完了済みバケットにわたって減少していることを確認します。

観測しながらメモリに保存する

今後の実行で役立つ情報を観測したら、その都度スクラッチパッドに記録してください。キーの接頭辞でカテゴリを示します — pattern: / noise: / addressed: / dedupe:。ドメインラベルは apm です。

  • キー pattern:apm:baseline-{service}-{operation} — 「checkout/POST /orders:p95 は約420ms、エラー率は約0.3%、この曜日・時間帯のリクエスト数は約1.2k req/h(2026-06-21)」
  • キー dedupe:apm:{service}:{operation} — 「payments/charge で p95 の回帰を検出(320ms→1.4s、件数は約800/h で横ばい)。開始は 2026-06-21 14:00 UTC。次回の実行時も高止まりしていればレポートを編集し、約400ms未満に戻っていれば復旧として扱う。」
  • キー noise:apm:{service} — 「frontend/GET /healthz:高頻度のレディネスプローブなので無視する。デプロイ時間帯の p95 の一時的な上昇は1バケット以内に回復するため、2バケット以上継続しない限り報告しない。」
  • キー report:apm:{service}:{operation} — この操作の回帰(エラー率、p95、トラフィックの急減)について提出したレポートの report_id。次回はレポートを重複して作成するのではなく、これを編集して新しい時間枠の情報を append_evidence で追加します。
  • キー reviewer:apm:{service} — サービスの担当者を示す解決済みのオーナー(小文字の GitHub ログイン名のみ)。レポートをより迅速に担当者へ回せます。
判断する

汎用的なレポートの仕組み — まず受信箱を検索する方法(report:apm:{service}:{operation} ポインターを使い、それがなければ、latency のような広い単語ではなく、特定のサービス/操作で inbox-reports-list を検索する)、編集するか新規作成するか、ステータスのルール、レビュアーへのルーティング、再試行と実行をまたぐ重複排除のルール、priority / repository フィールド — は、ハーネスのプロンプトおよび authoring-scouts → references/report-contract.md に記載されています。ここで再導出しないでください。このセクションでは、その上に重ねる APM の判断のみを説明します。

  • 編集:その操作を追跡する有効なレポートがすでにある場合に行います — エラー率の上昇が続いている、p95 が高止まりしている、サービスが引き続き停止している場合です。回帰が継続している場合、実行をまたいでレポートは1件にまとめます。継続を確認する新しい完全なバケットは再エスカレーションであり、新しい前後の数値を append_evidence で追加します。毎回新しいレポートを作成するのではありません。
  • 新規作成:その回帰を対象とする有効なレポートがない場合に行います。報告に値する所見には、具体的な (service, operation)、前後の数値(率または p95 と、変動のない分母)、発生開始バケットの日付、トラフィック量による説明を除外できる変化の形状を記載し、クエリ結果を evidence に含めます。回帰した系列は charts で添付します — 率または p95 と、変動のないリクエスト量を併記し、分母が安定したまま率が変化したことを確認できるようにします。原因をまだ特定していないことは、人的対応が必要な理由にはなりません。(service, operation) とエラーまたはレイテンシの変化の形状を示せば、エージェントが調査を始められるため、actionability=immediately_actionable を設定し、その操作を提供する repository を指定します。どのリポジトリか判断できない場合はフィールドを省略し、選択プロセスで特定できるようにします。次のステップが人にしか判断できない場合 — 自分たちが管理していない依存関係、キャパシティやコストのトレードオフなど — は actionability=requires_human_input を設定し、要約に必要な判断を記載します。優先度:多数のリクエストに影響するアクティブなエラー率の回帰は P1、影響範囲が限定されたレイテンシの回帰は P2、単一の依存関係に限られる操作またはトラフィックの少ない操作は P3 です。
  • 相関する操作を1件のレポートにまとめます。 1つのサービス/サブシステム内の複数の操作が同時に回帰した場合は、操作ごとではなく共通の原因について1件のレポートを提出します。同じ遅いデプロイについて6件のレポートが受信箱に並ぶのはノイズです。
  • 記録する:実際に発生しているものの報告の基準に満たない場合、引き継ぐ価値がある場合(新しいベースラインや、監視が必要な一時的な変動など)、または除外した項目とその理由を残す場合です。
  • noise: / addressed: / dedupe: エントリ、または既存の受信箱のレポートですでにカバーされており、重要な変化がなければ、スキップして1行のメモを残します。
締めくくり

評価したサービス/操作、作成または編集したレポート、記憶に残した内容(ベースライン、突発的な変動)、除外した内容(トラフィック量の追跡による急増、デプロイ時の一時的な変動、開発用サービス)を、1段落でまとめます。「確認したが、重要なことは見つからなかった」も立派な結果です。別途「実行メタデータ」のメモを残す必要はありません。この要約がすでにその役割を果たします。

除外条件(スキップするもの)

  • 生の件数を追跡するトラフィック。 エラー数またはスパン数がリクエストの count と連動して増加している(レートはほぼ一定)場合は、回帰ではなくトラフィック量の変化です。これは誤検出の主な原因です。まず確認してください。
  • デプロイ時の一時的な変動。 p95 またはエラーが1バケットだけ急増し、その後自然に回復する場合です。noise:/pattern: エントリーに記録し、完全なバケットで2つ以上にわたって持続する場合にのみ報告します。
  • 高いが安定しているエラーベースライン。 ある操作のエラー率が両方のウィンドウで同じ高い水準(例:現在も1週間前も約98%)であれば、新たな回帰ではなく、既存のベースラインです。pattern:/noise: のメモに一度だけ記録し、実行のたびに再報告しないでください。注目すべきシグナルは絶対値ではなく、エラー率の 上昇 です。
  • 開発/テスト用サービス。 service.name またはリソース属性(deployment.environment、env)が dev/local/test/staging のサービスです。評価する前に除外してください。
  • ヘルスチェック/レディネスエンドポイント。 /health、/healthz、/ready、/livez などは、トラフィック量が多く、シグナルは弱いエンドポイントです。メモで許可リストに登録してください。
  • コールドスタート/低トラフィックによるノイズ。 count がごく小さい操作での p95 の上昇(安定したパーセンタイルを算出するには n が少なすぎる)は、通常、コールドスタートまたは単一の低速トレースであり、傾向ではありません。
  • 一時的なクライアントの再試行。 エラーになった Client スパンがあっても、最終的に親が成功している(再試行に成功している)場合は、失敗率自体が上昇していない限り報告しないでください。
  • 単一トレースの異常。 ウィンドウ内で再発していない、1件だけの低速またはエラーのトレースです。
  • メモですでに扱っている既知の上流プロバイダー/DB エラー。 レートまたはパターンに有意な変化があった場合にのみ再報告してください。

迷った場合は、レポートを提出するのではなく、メモに記録してください。

MCP ツール

直接利用(読み取り専用):apm-services-list、apm-spans-aggregate、apm-spans-sparkline、apm-spans-tree、apm-spans-duration-histogram、apm-attribute-breakdown、apm-attributes-list、apm-attribute-values-list、apm-spans-count、query-apm-spans、apm-trace-get。

受信箱とレビュアーへの割り当て(手順は authoring-scouts → references/report-contract.md を参照):

  • inbox-reports-list / inbox-reports-retrieve — 受信箱にすでにあるレポートです。重複を作成せずに編集できるよう、作成前に確認してください。
  • inbox-report-artefacts-list — 比較対象となるレポートの成果物ログです。レビュアーの前例を確認できます。
  • scout-members-list — 実行中のメンバー一覧です。サービスオーナーを suggested_reviewers に割り当てる際に使用します。

ハーネスレベル:scout-project-profile-get、scout-scratchpad-search、scout-runs-list、scout-runs-retrieve、scout-emit-report / scout-edit-report(レポートの作成/編集。レポートチャネルの仕様はハーネスのプロンプトを参照)、scout-scratchpad-remember、scout-scratchpad-forget。クエリの形式、kind/status_code の列挙値、トレース解析スクリプトについては、同梱の exploring-apm-traces スキルを活用してください。

コメント