オブザーバビリティ(メトリクス・ログ・トレース)
システムの「中で何が起きているか」を、外から出る信号だけで推測できる状態にすること。メトリクス・ログ・トレースの3本柱で“未知の不具合”まで追えるようにする。
- 1.オブザーバビリティ=外から取れる出力(メトリクス・ログ・トレース)だけで、内部状態を説明できる状態。
- 2.3本柱の役割分担:メトリクス=「何かおかしい」、ログ=「何が起きた」、トレース=「どこで遅い/失敗した」。
- 3.監視は“想定した異常を見張る”、オブザーバビリティは“想定外も調べられる”。分散システムほど後者が効く。
元々は制御工学の言葉で、「出力を観測すれば内部状態を推定できるか」という性質を指します。ソフトウェアでは、コードに手を入れて再デプロイしなくても、すでに出している信号だけで未知の問題を調査できるか がオブザーバビリティの高さです。
なぜ必要か:分散システムは「中が見えない」
1台のサーバで動くモノリスなら、ログを tail して CPU を眺めれば、だいたい状況はつかめました。ところが今は、
- リクエスト1本が 複数のマイクロサービス を横断する
- コンテナは 数分で生まれて消える(落ちた頃にはもうログを出した実体がいない)
- 「遅い」と言われても、どのサービスのどの処理が原因か が一目で分からない
こうなると「サーバにログインして調べる」が成立しません。だからこそ、各サービスが自分の状態を信号として外に出し続け、それを後から突き合わせて調査する設計が要る——これがオブザーバビリティの動機です。
3本柱:メトリクス・ログ・トレース
それぞれ得意分野が違い、補完しあって初めて全体像が見えます。
メトリクス(Metrics)
一定間隔で記録される 数値の時系列 データ。CPU使用率、リクエスト数、エラー率、レイテンシのp95など。
- 集計済みで軽いので、長期間ためても安価
- ダッシュボードやアラートの土台(「エラー率が5%超えたら通知」)
- ただし「何かがおかしい」は分かっても、個別の原因までは分からない
ログ(Logs)
いつ・何が起きたか を記録した、時刻つきのイベント列。エラーメッセージ、注文ID、スタックトレースなど。
- 1件ずつの詳細が分かる(「注文 #1234 が在庫チェックで失敗」)
- 量が多くコストもかさむので、構造化ログ(JSON等)にして検索・集計できる形にするのが定石
- 「何が起きたか」は分かるが、サービスをまたいだ1リクエストの流れは追いにくい
トレース(分散トレース / Traces)
1本のリクエストが複数サービスを通る経路全体 を、所要時間つきで記録したもの。
- リクエストに trace ID を付け、各処理区間を span として連結する
- 「どのサービスの・どの処理で・何ミリ秒かかったか」が見える=ボトルネックの特定に直結
- 「どこで遅い/失敗したか」を答えるのが役割
強いのは横断です。アラート(メトリクス)→ 該当 trace ID でリクエスト経路を特定(トレース)→ その span の詳細ログを読む(ログ)、と一気通貫で辿れる状態が理想。trace ID を全ログ・全シグナルに付与しておくのがその鍵です。
3本柱の比較
| 観点 | メトリクス | ログ | トレース |
|---|---|---|---|
| 形 | 数値の時系列 | 時刻つきイベント | リクエストの経路(span) |
| 答える問い | 何かおかしい? | 何が起きた? | どこで遅い/失敗した? |
| 粒度 | 集計済み(粗い) | 1イベント単位(細かい) | 1リクエスト単位(横断) |
| コスト/量 | 安い・長期保持向き | 多い・かさみやすい | 中(サンプリングで調整) |
| 主な用途 | ダッシュボード・アラート | 原因の特定・監査 | ボトルネック特定・依存把握 |
モニタリング(監視)との違い
混同されがちですが、視点が違います。
- モニタリング=あらかじめ決めた指標を見張り、既知の異常に気づく(「CPUが90%を超えたら通知」)。"Known unknowns"(起こると分かっている問題)への備え。
- オブザーバビリティ=事前に質問を決めていなくても、出ている信号を後から掘って調べられる性質。"Unknown unknowns"(予想していなかった問題)にも対応できる。
よくある誤解。Prometheus や監視SaaSを導入しただけでオブザーバビリティが手に入るわけではありません。何を計測し、どんな属性(ユーザID・エンドポイント等)を付け、信号同士をどう繋ぐか という設計が本体です。ダッシュボードがあっても「想定外の障害を後から追えない」なら、可観測性は低いままです。
モニタリングはオブザーバビリティの一部、と捉えると整理できます。監視で「異常」に気づき、可観測性で「原因」を掘る、という関係です。具体的な指標設計は /devops/sre-slo/ の SLI/SLO と一緒に考えると効きます。
つまずきポイント
- ログだけで戦おうとする:サービス横断の遅延はログの grep では追えない。リクエストの流れはトレース、傾向はメトリクスに任せる。
- trace ID を伝播していない:サービス境界で trace ID を渡さないと span が繋がらず、トレースが“途切れた点”だらけになる。
- 何でも全部ログに出す:コスト爆発とノイズ増加で、肝心なログが埋もれる。サンプリングと構造化で「後で集計・検索できる形」に絞る。
- 計測の入れ方がバラバラ:サービスごとに独自フォーマットだと突き合わせ不能。OpenTelemetry のような共通規格で、メトリクス・ログ・トレースを統一的に収集するのが今の定番。
ユーザIDやリクエストIDのように 値の種類が膨大な属性(高カーディナリティ) は、メトリクスのラベルにすると基盤を圧迫します。一方で「特定の1ユーザだけ失敗」のような問題を後から掘るには、その属性がイベント側(ログ/トレース)に付いていることが効きます。どの信号に何の属性を載せるかが設計の勘所。
イメージをつかむ
メトリクスでアラートが鳴ってから原因に辿り着くまでの流れの一例です。
# 1) メトリクスで異変に気づく(Prometheus のクエリ例)
# 直近5分の 5xx エラー率
sum(rate(http_requests_total{status=~"5.."}[5m]))
/ sum(rate(http_requests_total[5m]))
# 2) 該当時間帯の失敗リクエストから trace ID を拾う(構造化ログを検索)
# 例: {"level":"error","trace_id":"abc123","msg":"checkout failed"}
# 3) その trace ID でリクエスト経路を開く → どの span で時間/失敗が出たか確認
# checkout(120ms) → inventory(15ms) → payment(2,400ms ← ここ) ...
メトリクスが「何かおかしい」、トレースが「payment サービスで遅い」、ログが「決済APIがタイムアウトした」——3つが揃って初めて「原因はここ」と言い切れます。
メトリクス収集の具体的な仕組みは /devops/tools/prometheus/ を、信頼性目標との結びつきは /devops/sre-slo/ を参照してください。
DevOps/インフラ Article
オブザーバビリティ(メトリクス・ログ・トレース)を実務で読む
TL;DRは入口です。実際に選ぶ・使う段階では、何を解決するか、何と比較するか、導入後にどこで詰まるかまで見る必要があります。
解決すること
オブザーバビリティ
比較で見る軸
難易度: intermediate / カテゴリ: DevOps/インフラ / タグ数: 4
導入後に効く点
3本柱の役割分担:メトリクス=「何かおかしい」、ログ=「何が起きた」、トレース=「どこで遅い/失敗した」。
先に潰すリスク
用語だけ覚えても、設計・実装・運用でどこに効くかを確認しないと判断を誤る。
- 難易度
- intermediate
- カテゴリ
- DevOps/インフラ
- タグ数
- 4
判断チェックリスト
- 自社の用途が「オブザーバビリティ / 監視」に近いか確認する。
- 強みである「オブザーバビリティ=外から取れる出力(メトリクス・ログ・トレース)だけで、内部状態を説明できる状態。」が本当に評価軸になるか確認する。
- 注意点の「用語だけ覚えても、設計・実装・運用でどこに効くかを確認しないと判断を誤る。」を運用で吸収できるか確認する。
- 公開値や仕様値は、対象プラン・対象機種・対象リージョンまで確認する。
- 既存システム、ID、ネットワーク、監視、バックアップとの接続方法を先に洗い出す。
- 小さく試してから、本番移行、権限設計、障害時手順、コスト監視を決める。