signals-scout-apm について
OpenTelemetry の分散トレースを使うチーム向けの APM 調査スキルです。7 日前の基準とサービスや操作の状態を比較し、検証済みの回帰だけを報告し、既存報告の編集にも対応します。
主な機能
- 01現在のデータを7日前の基準と比較
- 02エラー率と p95 レイテンシの回帰を特定
- 03新しいエラー署名や依存先の障害を調査
- 04サービスのトラフィック急減を検知
- 05検証済みレポートの作成・編集
活用シーン
- 01リクエスト量が一定のまま増えたエラーを特定
- 02サービスや操作のレイテンシ回帰を調査
- 03スパン送信が止まったサービスを追跡
- 04継続的なパフォーマンス上の無駄を点検
MCP 対応
APM MCP ツールでサービスの健全性、スパン、トレース、属性を調べ、レポートツールで調査結果を作成・編集します。
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ posthog/ ai-plugin --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 です。
- key
pattern:apm:baseline-{service}-{operation}— 「checkout/POST /orders:この曜日・時間帯(2026-06-21)の p95 は約420ms、エラー率は約0.3%、リクエスト数は約1.2k req/h」 - key
dedupe:apm:{service}:{operation}— 「payments/charge で p95 の回帰を検出(320ms→1.4s、件数は約800/hで横ばい)。開始は2026-06-21 14:00 UTC。次回も高止まりしていればレポートを編集し、約400ms未満に戻っていれば復旧として扱う。」 - key
noise:apm:{service}— 「frontend/GET /healthz:高頻度のレディネスプローブなので無視すること。デプロイ時間帯の p95 の急上昇は1バケット以内に回復するため、2バケット以上継続しない限り報告しない。」 - key
report:apm:{service}:{operation}— このオペレーションの回帰(エラー率、p95、トラフィックの急減)について提出したレポートのreport_id。次回は重複して提出するのではなく、append_evidenceで編集するために使います。 - key
reviewer:apm:{service}— サービスの担当者(小文字の GitHub ログイン名のみ)。レポートをより迅速に担当者へ振り分けるために使います。
判断する
一般的なレポートの処理方法――最初に受信箱を検索する(report:apm:{service}:{operation} ポインターを使い、なければ inbox-reports-list でサービス/オペレーションを指定して検索する。latency のような広い語句では検索しない)、編集するか新規作成するか、ステータスのルール、レビュアーへの振り分け、冪等ではない重複の扱い、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 スキルを活用してください。