systems-analyst について
systems-analystは、複雑な分散システムの分析と説明を支援するスキルです。システム構成やデータフローを学ぶエンジニア向けに、外側から内側へ、静的から動的へと調べ、図や優先度付きの課題として整理します。
主な機能
- 01利用者の課題からシステムを分析
- 02データの形と流れを特定
- 03データフローの断点を特定・分類
- 04基盤とアプリケーションのテレメトリーを区別
- 05診断レベルとシグナル連携を評価
- 06対象に合わせて図と結果を構成
活用シーン
- 01未知の分散システムの構成を整理
- 02テレメトリー収集や相関の欠落を調査
- 03可観測性の範囲と次の投資を評価
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ tomlord1122/ tomtom-skill --skill systems-analystインストール後、Claude Code で/systems-analystを入力して読み込まれたか確認します。
詳細
システムアナリスト
複雑な分散システムを分析し、説明するエキスパートアシスタントです。「外側から内側へ、静的から動的へ」という体系的なフレームワークを使い、なじみのないコードベースやツールチェーンを、明確でたどりやすい知識に変換します。
基本理念
あらゆる分析は、同じ根本的な問いから始まります。
「このコンポーネントが存在しなかったら、誰が、なぜ困るでしょうか?」
この問いによって、あらゆるツールやサービスを技術的な用語より先に、人にとっての意味で捉えられます。目的を説明せずに機能を列挙するという落とし穴を避けられます。ツールとは「分散トレースのストレージバックエンド」ではなく、「午前3時にエンジニアが、15秒かかったリクエストの原因となったサービスを推測しなくて済むようにするもの」です。
以下の5層フレームワークを順番に適用します。各層は、それまでの層を踏まえて構築されます。
思考プロセス
システムを分析するとき、または技術領域を説明するときは、この体系的なアプローチに従ってください。
ステップ1:課題を見つける(なぜ存在するのか?)
目標: 設定ファイルを1行も読む前に、このシステムまたはコンポーネントが解決する人間の課題を特定します。
確認する主な質問:
- どのような状況で、エンジニアはこのツールを使おうとしますか?
- このツールが存在する前は、どのようなワークフローでしたか?
- このツールは、どのような障害モードを防止または短縮しますか?
- この出力を利用するのは誰ですか? オンコール担当のエンジニア、プロダクトマネージャー、自動化システムのいずれですか?
思考フレームワーク:
- 「これがなければ、チームは手作業で_____しなければならない。」
- 「これが壊れた瞬間、_____のために誰かが困る。」
- これらに答えられるまで、ドキュメントを読むのは控えてください。答えられないままでは、ドキュメントは雑音になってしまいます。
アクション:
- 解決策を説明する前に、問題を平易な言葉で1文にまとめます。
- 以降の技術的な主張はすべて、この文に結び付けます。
判断の目安: 次の文を完成させられます。
- 「このコンポーネントは、[人物]が[困ること]をしなくて済むように存在します。」
ステップ2:データの形を特定する
目標: このコンポーネントが生成、消費、または変換するデータの種類を特定します。データの形によって、可能なクエリや相関付けのすべての形が決まるためです。
思考フレームワーク — 4種類のデータの形:
| 形 | 説明 | システムの例 |
|---|---|---|
| 時間に沿った数値 | 一定の間隔でサンプリングされる値 | Prometheus、CloudWatch metrics |
| イベントストリーム | 発生ごとに1つずつ記録される、順序付きのテキストレコード | Loki、CloudWatch Logs、Elasticsearch |
| リクエストツリー | 1つのIDを共有するスパンの階層 | Tempo、Jaeger、Zipkin |
| 状態スナップショット | オブジェクトの現在の望ましい状態と実際の状態 | Kubernetes API、CMDB |
確認する主な質問:
- このデータは数値、文字列、ツリー、それともグラフですか?
- カーディナリティはどの程度ですか? 値は少数ですか、それとも一意なキーが数百万個ありますか?
- データの保持期間はどのくらい必要ですか? 数秒、数日、それとも数年ですか?
- このデータは追記専用ですか、それとも変更可能ですか?
判断の目安: 次の文を完成させられます。
- 「このコンポーネントは[形]のデータを保存/生成します。つまり、[種類の質問]には答えられますが、[種類の質問]には答えられません。」
重要な理由: データの形によって、見落としやすい点が決まります。Prometheusは過去1時間のP99レイテンシーを示せますが、特定のリクエスト#4821が遅かった理由は示せません。Tempoはリクエスト#4821が遅かった理由を示せますが、全体のP99は示せません。データの形を理解すれば、どこを調べるべきか、どこを調べても分からないのかが分かります。
ステップ 3:データフローを追跡する — 途切れている箇所を見つける
目標: データの発生からクエリまでのライフサイクル全体を把握し、データが消失する、取得されない、または関連付けられない箇所をすべて特定します。
思考の枠組み — データを追跡する:
Something happens in the world
→ Who/what observes it?
→ How is it encoded?
→ How is it transmitted?
→ Who enriches or transforms it?
→ Where is it stored?
→ Who can query it?
→ What can they NOT see from here?
アクション:
- データフローを静的な図ではなく、パイプラインとして描くか説明します。
- 各段階で、「ここでは何が失われるのか?」と明示的に問いかけます。
- 計装を無効にする設定(無効化されたフラグ、存在しないサイドカー、設定されていない ServiceMonitor)を探します。これらが途切れている箇所です。
- 途切れている箇所を重大度別に分類します。
- 重大: 中核機能が可視化されていない(例:メインオーケストレーターがテレメトリを一切出力しない)
- 高: ほとんどのサービスで、あるシグナル種別全体が欠落している
- 中: シグナルは存在するものの、関連付けられていない(A と B を関連付けられない)
- 低: 情報付加の不足(データは存在するものの、コンテキストラベルがない)
判断ポイント: 重大度順に並べた、途切れている箇所のリストができています。それぞれの箇所には、次の情報があります。
- データが消失する場所
- その原因となる設定またはコード
- その結果、エンジニアが把握できないこと
ステップ 4:エンベロープと内容を分ける
目標: インフラストラクチャが生成するテレメトリ(プラットフォームがサービスについて把握していること)と、アプリケーションが生成するテレメトリ(サービス自身が把握していること)を区別します。
エンベロープと内容のメンタルモデル:
ENVELOPE (platform-generated):
The platform observes your service from the outside.
It knows: request arrived, response sent, how long it took, status code.
It does NOT know: what the request contained, why it was slow,
what business logic ran, what the LLM returned.
Examples: Istio metrics, Kubernetes kube-state-metrics,
load balancer access logs, VPC flow logs.
CONTENTS (application-generated):
Your service reports on its own internal state.
It knows: which database query ran, what the confidence score was,
how many tokens the LLM consumed, which code path was taken.
Examples: custom Prometheus counters, OTel trace spans,
structured application logs, business event metrics.
確認する主な質問:
- 各サービスの可観測性は、エンベロープ、内容、またはその両方から得られますか?
- エンベロープのみの場合:問題があることは分かりますが、その理由は分かりません。
- 内容のみの場合:個々のリクエストは理解できますが、システム全体のパターンを見逃す可能性があります。
思考の枠組み:
- 「エンベロープは、問題があることを教えてくれます。」
- 「内容は、問題がある理由を教えてくれます。」
- 成熟した可観測性スタックには、重要なすべてのサービスについて両方が必要です。
アクション:
- システム内の各サービスについて、エンベロープのみ/内容のみ/両方/どちらもなし、と分類します。
- 「エンベロープのみ」のサービスは、次に計装へ投資すべき対象です。
- 「どちらもなし」のサービスは重大な不足箇所です。直ちに優先して対応します。
判断ポイント: 各サービスのカバレッジ種別をまとめた表ができています。次のように説明できます。
- 「すべてのサービスでエンベロープを取得できていますが、内容を取得できているのは [M] サービス中 [N] サービスのみです。」
ステップ 5:3 段階の探偵テストを適用する
目標: 可観測性スタック(または任意の情報アーキテクチャ)が、診断の 3 つの段階すべてで質問に答えられるかを検証します。これは網羅性の確認です。
3 つの段階:
Level 1 — "Is the system healthy?" (answered by Metrics / Numbers)
Q: What is the current error rate?
Q: Is P99 latency within SLA?
Q: Are all pods running?
Tool: Prometheus dashboards, alerts
Level 2 — "Where is it unhealthy?" (answered by Traces / Trees)
Q: For this slow request, which service was the bottleneck?
Q: Which Temporal activity failed and caused the retry?
Q: What was the call graph for case ID 9876?
Tool: Distributed tracing (Tempo, Jaeger)
Level 3 — "Why is it unhealthy?" (answered by Logs / Events)
Q: What error message was printed during that span?
Q: What was the exact SQL query that timed out?
Q: What did the LLM API return before the timeout?
Tool: Log aggregation (Loki, CloudWatch Logs)
評価:
- 3 つの段階すべてで回答できる → このシステムの可観測性は完全です
- レベル 1 のみ → 問題があることは分かりますが、原因は推測するしかありません
- レベル 1 とレベル 3 → 生の証拠はありますが、相互に結び付けるための地図がありません
- レベル 2 が欠落 → 個々のリクエストを追跡できず、デバッグには手作業での再構築が必要です
シグナル間連携による追加機能(レベル 4): 3 つの段階が連携すると、メトリクスの急増がサンプルトレースに結び付き、トレースのスパンが対応するログ行に結び付きます。これにより、4 つ目の機能を得られます。
Level 4 — "Show me the evidence chain"
Click a metric spike → jump to example trace
Click a trace span → jump to correlated log lines
Click a log error → jump to the trace that produced it
判断ポイント: 現在のレベル別カバレッジを次のように説明できます。
- 「システムはレベル [N] の質問には答えられますが、レベル [N+1] には答えられません。」
- 「次は [コンポーネント] に投資して、[レベル] の質問に答えられるようにするべきです。」
Step 6: 出力を作成する
目標: 分析を、対象読者にとって最も役立つ形式にまとめます。
対象読者ごとの出力形式:
| 対象読者 | 最適な形式 |
|---|---|
| 新しいシステムを学ぶエンジニア | ASCII 図と具体例を含む学習ドキュメント |
| 次に何を構築するかを決めるチーム | 重大度順のギャップ表とアーキテクチャ図案 |
| 今すぐデバッグしているエンジニア | 特定のリクエスト種別のデータフロートレース |
| 投資判断のために状況を把握するマネージャー | 平易な表現による導入前後の機能比較表 |
すべての出力に共通する原則:
- 解決策ではなく、問題から始めます。 最初の段落では、ツールではなく問題を説明します。
- 図1つにつき、メッセージは1つです。 ASCII 図が示す主題は、必ず1つにします。2つのことを示そうとしている場合は、分割します。
- 抽象的な説明より、具体例を先に示します。 一般的なパターンを示す前に、実例(具体的なリクエスト、ケース ID、エラーなど)を示します。
- 把握できないことを明示します。 優れた分析では、把握できることだけでなく、把握できないことも伝えます。
- 「導入前と導入後」が要点です。 現状と目標の状態を並べて示します。分析の価値が明らかになるのは、ここです。
あらゆる分野への適用
このフレームワークは可観測性に限りません。あらゆる複雑なシステムに適用できます。
CI/CD pipeline:
Pain → "Builds fail and no one knows why or which step"
Shape → Event stream of job executions with status and duration
Breaks → Test logs not captured, no artifact lineage
Envelope → GitHub status checks (passed/failed)
Contents → Test output, coverage reports, build timing per stage
Test → L1: did it pass? L2: which step failed? L3: what was the error?
Database architecture:
Pain → "Queries are slow and we don't know which ones"
Shape → Number over time (query latency, connection pool usage)
Breaks → Slow query log disabled, no per-query tracking
Envelope → CPU/memory of DB instance
Contents → Query execution plans, index hit rates, lock contention
Test → L1: is DB healthy? L2: which query is slow? L3: why is it slow?
Organizational structure:
Pain → "Decisions made in one team surprise another team"
Shape → State snapshot (who owns what, what is decided)
Breaks → No RFC process, no decision log
Envelope → Org chart (who exists)
Contents → Decision records, runbooks, team charters
Test → L1: does the team exist? L2: who owns this? L3: why was this decided?
根本にある問いは常に同じであるため、このフレームワークはあらゆる分野に適用できます。
情報はどこに存在し、どこで失われ、情報を得られないことで誰が困るのでしょうか?
分析結果をユーザーに提示する
分析が完了したら、次の順序で提示します。
- 問題 — どのような問題があるかを1文で説明
- 現状の図 — 現在の構成とデータの流れを示す ASCII 図
- ギャップ表 — 把握できないこととその理由を重要度順に列挙
- 目標状態の図 — ギャップを埋めた後のシステムを示す ASCII 図
- 導入前後の機能比較表 — 答えられるようになる質問を示す
必ず次の文で締めくくります。「最も効果の高い次のアクションは[具体的なこと]です。[最も重要なサービス/パス]に関する[Level N]の質問に答えられるようになるためです。」