オブザーバビリティとは ― 監視との違いとメトリクス・ログ・トレース
CPUも
オブザーバビリティとは、外に出るデータから中の状態を調べられる度合い
CPU使用率もエラー率も正常なのに、注文の画面だけが遅いと問い合わせが来ることがあります。オブザーバビリティは、こんなときに原因を調べられるかどうかを表す言葉です。システムが外に出すデータから、中で起きていることを理解できる度合いを指し、日本語では可観測性と呼びます。
処理を複数のサービスに分けたマイクロサービスでは、1つの画面の裏で多くのサービスが動きます。どれか1つが遅いだけで画面全体が遅くなるのに、サーバごとの数値を見ても、どの処理が原因かまでは分かりません。「ここはオブザーバビリティが足りない」と言われたら、原因を調べる材料が足りないという意味です。
材料になるのは、メトリクス・ログ・トレースの3種類のデータです。それぞれ得意な問いが違うので、組み合わせて原因を絞ります。アプリのコードがこれらのデータを出すようにすることを計装と呼びます。アプリが出していないデータは、ツールを入れても集まりません。
監視との違いは、決めた項目を見張るか、想定外の問いにも答えられるか
監視は、あらかじめ決めた指標を集めて見張り、異常があれば知らせる活動です。CPU使用率が90%を超えたら通知する、といった決まりを先に作っておきます。見つけられるのは、基本的に先に想定しておいた問題です。
オブザーバビリティは、想定していなかった問題でも、あとから問いを立てて調べられる性質です。対象の画面や商品、時間帯を変えながらデータを絞り込めれば、原因に近づけます。言葉のもとは制御工学で、外に見える出力から内部の状態をどれだけ推定できるかを表します。
2つは対立するものではありません。監視はシステムを見張る活動で、オブザーバビリティはシステムの性質です。異常に気づくには監視が要り、その原因を調べるときにオブザーバビリティが効きます。
| 観点 | 監視 | オブザーバビリティ |
|---|---|---|
| 何を | システムを | 調べられる |
| 対象の | 先に | 想定していなかった |
| 主に | いま異常が | なぜ |
| 準備する | 指標と | アプリが |
| 例 | CPU使用率が | 注文だけが |
監視の具体的な仕組みは、対象によって変わります。ネットワーク機器の数値を集める代表はSNMPで、機器のログを1か所に集める代表はSyslogです。AWSでメトリクス・ログ・アラームをまとめて使うなら、Amazon CloudWatchがあります。
メトリクス・ログ・トレースの3本柱は、得意な問いが違う
1つのリクエストが、注文サービス、在庫サービス、データベースを順に通る例で比べます。次の図は、3種類のデータがそれぞれ何を記録するかを、この流れに重ねたものです。
| 種類 | 記録する | 分かる | 分からない |
|---|---|---|---|
| メトリクス | 一定の | いつから、 | 個々の |
| ログ | 時刻の | その | ほかの |
| トレース | 1つの | どの | 全体の |
この3つを3本柱と呼ぶ文書は多くあります。ただ、クラウド向けのオープンソースを支える団体CNCFの白書は、3つを常に同時にそろえる必要はないとして、主要なシグナルと呼んでいます。費用を考えて、メトリクスとログを中心にし、トレースは必要なときだけ使う組み合わせも挙げています。
メトリクスは、一定の時間で集計した数値
メトリクスは一定の時間で集計した数値で、エラー率、CPU使用率、1秒あたりのリクエスト数などがあります。リクエストが増えてもデータの量は増えないので、費用を見積もりやすく、変化をグラフですぐに確かめられます。その代わり、集計すると個々のリクエストの情報は消えます。
何から測るかに迷ったら、GoogleのSREの本がゴールデンシグナルとして挙げる4つの指標が目安になります。
- 遅延:リクエストの処理にかかる時間
- トラフィック:システムにかかる需要の量。Webなら1秒あたりのHTTPリクエスト数
- エラー:失敗したリクエストの割合
- サチュレーション:メモリなどの資源が、どれだけ埋まっているか
遅延は平均だけで判断しないようにします。同じ本は、平均が100ミリ秒のサービスでも、リクエストの1%が5秒かかることがあると書いています。そこで、速い順に並べて99%の位置にくる値を見ます。この値を99パーセンタイルと呼びます。
ログは、時刻の付いた個々の出来事の記録
ログは、ある時刻に何が起きたかを1件ずつ残した記録です。エラーの内容や処理した件数のような、細かい事情まで書けます。ただし、リクエストを示すIDを書いていないログからは、それがどのリクエストの一部なのか分かりません。
ログは、項目の名前と値を決まった形で書いておくと調べやすくなります。この形のログを構造化ログと呼び、項目を指定して検索や集計ができます。オープンソースの仕組みOpenTelemetryの文書も、構造化ログを勧めています。条件に挙げているのは、JSONで書くことより、項目の名前と型が一定であることです。
トレースは、1つのリクエストがたどった道筋の記録
トレースは、1つのリクエストが通ったサービスと、それぞれの処理にかかった時間の記録です。どこで時間を使ったかが分かるので、遅さの場所を絞るときに役立ちます。その代わり、1つのトレースから分かるのは1件のリクエストのことだけで、全体の傾向は見えません。
分散トレーシングは、トレースIDで1つのリクエストを追う方法
分散トレーシングは、複数のサービスをまたぐ1つのリクエストを追う方法です。各サービスは、処理の1単位ごとに名前と開始・終了の時刻を記録します。この1単位をスパンと呼び、1つのリクエストのスパンを集めたものがトレースです。
スパンをつなげる目印が、トレースIDです。最初のサービスがIDを作り、次のサービスを呼ぶときに渡します。受け取ったサービスは同じトレースIDで自分のスパンを作り、呼び出し元のスパンを親として記録します。
HTTPでは、このIDをヘッダに入れて渡します。形式はWebの標準化団体W3CがTrace Contextとして勧告していて、次のように書きます。
traceparent: 00-0af7651916cd43dd8448eb211c80319c-b7ad6b7169203331-01
2つ目の32桁がトレースIDで、3つ目の16桁が呼び出し元のスパンのIDです。集めたスパンを時間の軸に並べると、どこで時間を使ったかが分かります。
同じトレースIDをログにも書いておくと、トレースからそのリクエストのログだけを取り出せます。OpenTelemetryのSDKは、この関連付けを自動で行えます。トレースとログを1つのIDで行き来できるので、場所を絞ってから理由を確かめられます。
動かして確かめる:遅い画面の原因を3本柱でたどる
注文の画面が遅いという問い合わせを例に、原因を探します。3つの問いそれぞれで、どのデータを見れば答えが出るかを選びます。3問目には、構造化ログの実例も出てきます。
- 1いつから、
どの 機能が 遅くなったのか 手がかりが 見つかりました 13:50 → 14:10 の変化 (応答時間は 99パーセンタイル) - 注文APIの
応答時間 - 0.3秒 → 3.2秒
- 商品一覧APIの
応答時間 - 0.2秒 → 0.2秒
- エラー率
- 0.1% → 0.1%
- CPU使用率
- 40% → 42%
14時ごろから、注文APIだけが 遅くなっています。 どの 処理で 時間を 使っているかは、 まだ 分かりません。 この問いには 答えが 出ません ログは1件ずつの 出来事の 記録です。 遅くなった 時刻を 知るには、 多くの 行を 集計する ことになります。 エラーも 増えていないので、 エラーの ログを 探しても 手が かりは 出ません。 この問いには 答えが 出ません トレースはリクエスト1件の 記録です。 1件を 開いても、 いつから 遅いのかは 分かりません。 多くの リクエストの 変化を 見るには、 集計した 数値の ほうが 向いています。 - 注文APIの
- 2注文APIの
どの 処理で 時間を 使っているのか この問いには 答えが 出ません メトリクスは多くの リクエストを まとめた 数値です。 サービスごとの 数値から 在庫サービスが 怪しいとは 分かりますが、 その 中の どの 処理で 時間を 使ったかは 分かりません。 この問いには 答えが 出ません 注文サービスのログには、 注文の 受付と 完了が 残っているだけです。 ほかの サービスの ログは 別々に 記録されていて、 どこから 読めば よいかが 分かりません。 手がかりが 見つかりました 遅かったリクエスト1件の スパン - 注文API
- 3.2秒
- 認証サービス
- 0.02秒
- 在庫サービス
- 3.1秒
- データベースへの
問い合わせ - 3.0秒
- 決済サービス
- 0.05秒
3.2秒のうち3.0秒は、 在庫サービスから データベースへの 問い合わせです。 なぜ 遅いのかは、 スパンの 時間だけでは 分かりません。 - 3データベースへの
問い合わせは、 なぜ 遅いのか この問いには 答えが 出ません データベースのCPU使用率は 45%で、 ふだんと 変わりません。 問い合わせ全体を 集計した 数値には、 1種類の SQLの 遅さが 埋もれています。 手がかりが 見つかりました { "time": "14:03:21", "service": "inventory", "version": "2.4.0", "trace_id": "0af76519", "level": "WARN", "msg": "slow query", "duration_ms": 3012, "rows_scanned": 1200000 }トレースIDで絞ると、 この リクエストの ログが 見つかります。 この SQLは 120万行を 読んでいました。 ログに 出ている 2.4.0は、 14時に リリースした 版です。 この問いには 答えが 出ません スパンから分かるのは、 問い合わせに 3.0秒かかった ことまでです。 読んだ 行数のような 細かい 事情は、 スパンに 記録していなければ 分かりません。
調べる順番は決まりではありません。ただ、範囲の広いデータから狭いデータへ進むと、読むデータの量を減らせます。画面が遅い場合は、いつから・どこで・なぜ、の順に絞っていくと迷いません。
アラートは、原因ではなく利用者への影響で鳴らす
CPU使用率が90%を超えたら通知する、のように原因の側で通知を作ると、利用者が困っていないときにも鳴ります。調べても問題がない通知が続くと、担当者は通知を読み飛ばすようになります。GoogleのSREの本は、通知が多すぎると本物の通知まで無視され、障害が長引くと書いています。この状態を通知疲れと呼びます。
通知は、利用者への影響が出ているかどうかで鳴らします。SREの本は、これを症状と原因の区別として説明しています。応答が遅いのは症状で、CPUの過負荷はその原因の1つです。症状で人を呼び、原因は呼ばれたあとで3本柱を使って調べます。
利用者への影響を数字で表すのが、SLOとエラーバジェットです。SLOを使う通知では、エラーバジェットを使う速さを見ます。この速さをバーンレートと呼び、1なら期間の終わりにちょうど使い切る速さです。Googleのワークブックは、30日のSLOの出発点として次の組み合わせを挙げています。
| 見る | エラーバジェットを | バーンレート | 通知の |
|---|---|---|---|
| 1時間 | 2% | 14.4 | 担当者を |
| 6時間 | 5% | 6 | 担当者を |
| 3日 | 10% | 1 | チケットを |
SLOが99.9%なら、バーンレート14.4はエラー率1.44%が続く状態です。この速さでは、30日分のエラーバジェットを約2日で使い切ります。一時的な小さな揺れでは鳴らさず、放っておけない速さのときだけ人を呼ぶための決め方です。値はサービスに合わせて調整します。
OpenTelemetryは、データの作り方と送り方をそろえる標準の仕組み
ツールごとに計装の方法が違うと、ツールを替えるたびにコードを直すことになります。OpenTelemetryは、メトリクス・ログ・トレースの作り方と送り方をそろえるオープンソースの仕組みです。特定の製品に依らないので、同じデータを別のツールへ送れます。
OpenTelemetryそのものは、データの保存先ではありません。保存と画面の表示は、JaegerやPrometheusのようなオープンソースのツールや、商用の製品に任せます。OpenTracingとOpenCensusが統合してできたCNCFのプロジェクトです。2026年5月に、CNCFの成熟度の最上位であるGraduatedになりました。
導入は、構造化ログ、メトリクス、トレースの順に進める
一度にすべてをそろえる必要はありません。手間の少ないものから進めるなら、次の順番が目安になります。すでにある仕組みによって、順番は入れ替わります。
- ログを構造化ログにして、時刻・サービス名・処理の結果などの項目をそろえる
- 4つの指標をメトリクスとして集め、SLOを決めて通知を作る
- サービスどうしの呼び出しがある部分に、トレースを入れる
- ログにトレースIDを書き、ログとトレースを行き来できるようにする
1つのサービスで完結するアプリなら、1と2でも多くの調査ができます。トレースはリクエストの数だけ増えるので、一部だけを残すサンプリングを使います。OpenTelemetryの文書は、成功して遅くもないリクエストが大半なら、すべてのトレースは要らないと説明しています。
OpenTelemetryには、コードを変えずにデータを出す自動計装の仕組みもあります。Kubernetesは、ログの収集や監視の方式を決めていません。コンテナで動かすアプリでは、データを集めて保存する先を別に用意します。
参考にした資料
- Google「Site Reliability Engineering」Chapter 6 Monitoring Distributed Systems
- Google「The Site Reliability Workbook」Chapter 5 Alerting on SLOs
- OpenTelemetry「What is OpenTelemetry?」
- OpenTelemetry「Observability primer」
- OpenTelemetry「Context propagation」
- OpenTelemetry「Logs」
- OpenTelemetry「Sampling」
- W3C「Trace Context」(2021年11月の勧告)
- CNCF「Observability」(用語集)
- CNCF TAG Observability「Observability Whitepaper」
- CNCF「OpenTelemetry」(プロジェクトの成熟度)
- Kubernetes「Overview」
練習問題(全6問)
正解:システムが
オブザーバビリティ
正解:監視は
2つは
正解:メトリクス
メトリクスは
正解:サービスを
最初の
正解:利用者への
原因の
正解:メトリクス・ログ・トレースの
OpenTelemetryは、
選んでから「採点する」を押すと、解説つきで答え合わせができます。