📖

「オブザーバビリティ・エンジニアリング」を読んだ

2023/10/02に公開

はじめに

正直、「オブザーバビリティ」と聞いて、「モニタリングのエイリアス」くらいにしか思っていませんでした。しかし実際にオブザーバビリティ・エンジニアリングを読んで、それらは全く異なるものであり、オブザーバビリティの考え方は、現代のシステムにおいてとても有用なものだと理解しましたので、読書感想文的に書きたいと思います。

書籍の概要

この書籍は、オブザーバビリティの基本から応用に至るまでを幅広く網羅しています。オブザーバビリティを語る上で、SLO やエラーバジェットなど、SRE に関連する知識が度々登場しますが、それらの事前知識がなくても読み進められるように書かれており、オブザーバビリティを全くわかっていないところから学べる書籍だと思います。

下記が目次です。

目次

第Ⅰ部 オブザーバビリティへの道

1章 オブザーバビリティとは?
1.1 オブザーバビリティの数学的定義
1.2 オブザーバビリティのソフトウェアシステムへの適用
1.3 ソフトウェアにおけるオブザーバビリティについての誤解
1.4 なぜ今オブザーバビリティが重要なのか?
1.4.1 これは本当にベストな方法なのでしょうか?
1.4.2 なぜメトリクスとモニタリングでは不十分なのか?
1.5 メトリクスを用いたデバッグとオブザーバビリティの比較
1.5.1 カーディナリティの役割
1.5.2 ディメンションの役割
1.6 オブザーバビリティを用いたデバッギング
1.7 オブザーバビリティは現代のシステムのためにある
1.8 まとめ

2章 オブザーバビリティとモニタリングにおけるデバッグ方法の違い
2.1 モニタリングデータのデバッグへの活用方法
2.1.1 ダッシュボードを使用する際のトラブルシューティング方法
2.1.2 直感によるトラブルシューティングの限界
2.1.3 従来のモニタリングは基本的にリアクティブである
2.2 オブザーバビリティがより良いデバッグを可能にする理由
2.3 まとめ

3章 オブザーバビリティを用いないスケーリングからの教訓
3.1 Parseの紹介
3.2 Parseでのスケーリング
3.3 現代のシステムへの進化
3.4 現代的な実践に向けた進化
3.5 Parseにおけるプラクティスの変革
3.6 まとめ

4章 オブザーバビリティとDevOps、SRE、クラウドネイティブとの関連性
4.1 クラウドネイティブ、DevOps、SREクイックリファレンス
4.2 オブザーバビリティ:デバッグの昔と今
4.3 オブザーバビリティがDevOpsとSREのプラクティスを強化する
4.4 まとめ

第Ⅱ部 オブザーバビリティの基礎

5章 構造化イベントはオブザーバビリティの構成要素である
5.1 構造化イベントを使ってデバッグする
5.2 構成要素としてのメトリクスの限界
5.3 構成要素としての従来のログの限界
5.3.1 非構造化ログ
5.3.2 構造化ログ
5.4 デバッグに役立つイベントのプロパティ
5.5 まとめ

6章 イベントをトレースにつなぐ
6.1 分散トレースとその重要性
6.2 トレースの構成要素
6.3 トレースを地道に計装する
6.4 トレーススパンへのカスタムフィールドの追加
6.5 イベントをトレースにつなぐ
6.6 まとめ

7章 OpenTelemetryを使った計装
7.1 入門計装
7.2 オープンな計装標準
7.3 コードベースの例を用いた計装
7.3.1 自動計装から始める
7.3.2 カスタム計装を追加する
7.3.3 計装データをバックエンドシステムに送信する
7.4 まとめ

8章 オブザーバビリティを実現するためのイベント解析
8.1 既知の状態からのデバッグ
8.2 第一原理からのデバッグ
8.2.1 コア分析ループの使用
8.2.2 コア分析ループの総当り部分の自動化
8.3 AIOpsの誤解を招く約束
8.4 まとめ

9章 オブザーバビリティとモニタリングの関係
9.1 モニタリングが適した場所
9.2 オブザーバビリティが適した場所
9.3 考察: システム vsソフトウェア
9.4 組織的なニーズを把握する
9.4.1 例外: 無視できないインフラストラクチャのモニタリング
9.4.2 実際の例
9.5 まとめ

第Ⅲ部 チームのためのオブザーバビリティ

10章 オブザーバビリティへの取り組みをチームへ適用する
10.1 コミュニティグループに参加する
10.2 最大の問題点から始める
10.3 作るより買う
10.4 計装を繰り返し完成させる
10.5 既存の努力を活用する機会を探す
10.6 最後のひと押しに備える
10.7 まとめ

11章 オブザーバビリティ駆動開発
11.1 テスト駆動開発
11.2 開発サイクルにおけるオブザーバビリティ
11.3 デバッグする場所を決定する
11.4 マイクロサービス時代のデバッグ
11.5 計装でオブザーバビリティを駆動する
11.6 オブザーバビリティをシフトレフトする
11.7 オブザーバビリティを活用してソフトウェアデリバリーを高速化する
11.8 まとめ

12章 サービスレベル目標の信頼性向上への活用
12.1 従来のモニタリング手法では危険なアラート疲れが発生する
12.2 しきい値アラートは既知の未知のみに対応している
12.3 ユーザー体験が道しるべ
12.4 サービスレベル目標とはなにか?
12.4.1 SLOによる信頼性の高いアラート
12.4.2 SLOベースアラートに向けた文化の変化:ケーススタディ
12.5 まとめ

13章 SLOベースのアラートへの対応とデバッグ
13.1 エラーバジェットが枯渇するまえにアラートを出す
13.2 時間をスライディングウィンドウとして捉える
13.3 バーン予想アラート作成のための予測
13.3.1 エラーバジェットを使い果たすとどうなるか
13.4 オブザーバビリティデータ vs時系列データ: どちらをSLOに使用するか
13.5 まとめ

14章 オブザーバビリティとソフトウェアサプライチェーン
14.1 なぜSlackにはオブザーバビリティが必要なのか
14.2 計装:共有クライアントライブラリとディメンション
14.3 ケーススタディ:サプライチェーンの運用
14.3.1 ツールによるコンテキストの理解
14.3.2 アクション可能なアラートの組み込み
14.3.3 何が変わったのかを理解する
14.4 まとめ

第Ⅳ部 大規模なオブザーバビリティ

15章 投資収益性: 作るか、それとも買うか
15.1 オブザーバビリティのROIをどう分析するか
15.2 独自構築にかかる本当のコスト
15.2.1 「フリー」ソフトウェアの隠れたコスト
15.2.2 独自構築の利点
15.2.3 独自構築のリスク
15.3 ソフトウェアを買うときの本当のコスト
15.3.1 商用ソフトウェアの隠れた財務的コスト
15.3.2 商用ソフトウェアの隠れた非金銭的コスト
15.3.3 商用ソフトウェアを購入するメリット
15.3.4 商用ソフトウェアを購入するリスク
15.4 買うか作るかは二者択一ではない
15.5 まとめ

16章 効率的なデータストア
16.1 オブザーバビリティの機能要件
16.1.1 時系列データベースはオブザーバビリティに欠ける
16.1.2 その他のデータストアの可能性
16.1.3 データストレージ戦略
16.2 事例: HoneycombのRetrieverの導入事例
16.2.1 時間によるデータの分割
16.2.2 セグメント内の列ごとのデータ格納
16.2.3 クエリーのワークロードを実行する
16.2.4 トレースのクエリー
16.2.5 リアルタイムでデータをクエリーする
16.2.6 階層化でリーズナブルに
16.2.7 並列処理で高速化
16.2.8 高カーディナリティへの対応
16.2.9 スケーリング戦略と耐久性戦略
16.2.10 効率的なデータストアを自前で構築する際の注意点
16.3 まとめ

17章 安価で十分な精度にするためのサンプリング戦略
17.1 データ収集の精度を上げるためのサンプリング
17.2 サンプリング手法の使い分け
17.2.1 一定確率サンプリング
17.2.2 直近のリクエスト量に応じたサンプリング
17.2.3 イベントの内容(キー)に基づくサンプリング
17.2.4 過去データの手法とキーの手法を組み合わせる
17.2.5 動的サンプリングでのオプションの選択
17.2.6 いつトレースのサンプリングを判定するか
17.3 サンプリング戦略をコードに置き換える
17.3.1 ベースとなる例
17.3.2 固定割合サンプリング
17.3.3 サンプル割合を記録する
17.3.4 一貫したサンプリング
17.3.5 目標割合サンプリング
17.3.6 複数の静的サンプリング割合を持つ
17.3.7 キーと目標割合を組み合わせたサンプリング
17.3.8 任意数のキーに対応する動的サンプリング割合について
17.3.9 すべてをまとめる:キー、目標割合、ヘッドとテイルを全部つかってサンプリングする
17.4 まとめ

18章 パイプラインによるテレメトリー管理
18.1 テレメトリーパイプラインの属性
18.1.1 ルーティング
18.1.2 セキュリティとコンプライアンス
18.1.3 ワークロードの分離
18.1.4 データバッファリング
18.1.5 キャパシティ管理
18.1.6 データのフィルタリングと補強
18.1.7 データ変換
18.1.8 データの品質と一貫性を確保する
18.2 テレメトリーパイプラインの管理:解剖学
18.3 テレメトリーパイプラインの管理における課題
18.3.1 性能
18.3.2 正確性
18.3.3 可用性
18.3.4 信頼性
18.3.5 分離
18.3.6 データ鮮度
18.4 事例: Slackでのテレメトリー管理
18.4.1 メトリクスの集計
18.4.2 ログおよびトレースイベント
18.5 オープンソースの代替
18.6 テレメトリーパイプラインの管理:構築と購入の比較
18.7 まとめ

第Ⅴ部 オブザーバビリティの文化を拡大する

19章 オブザーバビリティのビジネス事例
19.1 変革をもたらすためのリアクティブなアプローチ
19.2 オブザーバビリティの投資対効果
19.3 変化を導入するためのプロアクティブなアプローチ
19.4 オブザーバビリティをプラクティスとして導入する
19.5 適切なツールを使う
19.5.1 計装
19.5.2 データの保持と分析
19.5.3 チームでツールを使い始める
19.6 オブザーバビリティが十分であることを確認する
19.7 まとめ

20章 オブザーバビリティの利害関係者と協力者
20.1 非エンジニアリング的なオブザーバビリティの必要性の認識
20.2 オブザーバビリティの協力者を作る実践
20.2.1 カスタマーサポートチーム
20.2.2 カスタマーサクセスチームと製品チーム
20.2.3 営業チームと役員
20.3 オブザーバビリティツールとビジネスインテリジェンスツールの使い分け
20.3.1 クエリー実行時間
20.3.2 精度
20.3.3 最新性
20.3.4 構造
20.3.5 時間枠
20.3.6 エフェメラリティ
20.4 オブザーバビリティとBIツールの併用による実践的な使い方
20.5 まとめ

21章 オブザーバビリティ成熟度モデル
21.1 成熟度モデルについてのノート
21.2 オブザーバビリティに成熟度モデルが必要な理由
21.3 オブザーバビリティ成熟度モデルについて
21.4 OMMで参照されるケイパビリティ
21.4.1 システム障害にレジリエンスで対応する
21.4.2 高品質なコードをデリバリーする
21.4.3 複雑さと技術的負債に立ち向かう
21.4.4 予測可能なケイデンスでリリースする
21.4.5 ユーザーのふるまいを理解する
21.5 あなたの組織でオブザーバビリティ成熟度モデルを使う
21.6 まとめ

22章 ここからどこへ
22.1 オブザーバビリティ、当時と今
22.2 追加の資料
22.3 オブザーバビリティの行方についての予測

学び・感想

そもそもですが、オブザーバビリティとは、システム内部の状態を外部から観察して理解するための手法です。これには、ログやトレースなどのデータが活用され、システムのパフォーマンスや問題をリアルタイムで把握し、素早く対処することを可能にします。

オブザーバビリティに対してモニタリングは、ユーザーからより遠いところの、アプリケーションというよりシステムに近しい部分の状態を把握するためのもの、と言えそうです。よくあるモニタリングの手法としては、CPUやメモリの利用状況を監視し、一定の値を超えたらアラートを上げる、というものがあると思います。これでは実際にどのユーザーがどのように困っているのかはわかりません。さらに、このやり方では誤報が多発します。そうなると人はそれらのアラートを無視し始め、最終的には「それは無視して良いアラート」などといった言葉が使われ始めたりします。また、このようなやり方では、既知の未知しか判断できないため、新たなインシデントが起こると、新たなアラートが追加されます。これは認知負荷を増大させます。
対して、オブザーバビリティを活用すると、未知の未知がわかるようになります。そしてそこから得られる情報は、ユーザーが具体的にどんな状況で、何に困っているのかを把握するための具体的なヒントとなり得ます。

本書では、オブザーバビリティを備えたシステムは下記のようなものと書かれています。これらを満たすには、ただのモニタリングでは難しそうです。

  • アプリケーションの内部構造を理解する
  • 今まで見たことのない、予測できないことが起こったとしても、アプリケーションがどのようなシステム状態に陥っているかを理解する
  • 外部ツールを使って観測し、調査することで内部システム状態を理解する
  • 新たにコードを改修することなく、内部状態を理解する

現代ではクラウドベンダーが提供するマネージドなサービスの利用も増えているため、モニタリングを必要とするパターンはさらに少なっている印象です。ただ一方で、自身で大半のインフラを用意しているようなサービスでは、まだまだモニタリングは必要かと思います。

また、この書籍の中では、実際にオブザーバビリティの考え方を活かす上で必須となる、テレメトリーに関して、Go言語での実装例を交えて説明されています。ここでは、特定のベンダーへの依存を極力作らなくて済むよう、オープンソースの OpenTelemetry の利用が推奨されています。実装例を活用することで、実務でも活かせるのではないかと思います。

次に、冒頭にも書きましたが、書籍ではオブザーバビリティを説明する上で必要となる SRE のプラクティスについても触れています。SLO、エラーバジェットなどの概念や、スライディングウィンドウの考え方などは知っていましたが、改めて勉強になりました。

さらに、オブザーバビリティを導入することになった場合、その後話題に上がりそうな「自分たちで実装するか、既存のサービスに課金するか」問題についても記載されています。実際に企業内でディスカッションされそうな内容が書かれており、導入を計画するときに参考になりそうです。

まとめ

オブザーバビリティは、現代の複雑なシステムを効果的に運用するための技術です。これまでのモニタリングの枠を超え、システムを維持・向上させるためのアプローチとして注目を集めています。特に、クラウドネイティブな環境やマイクロサービスアーキテクチャにおいて、その価値はますます高まっているように思います。
この書籍を通じて、オブザーバビリティの基礎と実践的な方法についての理解が深まりました。システムの安全性とパフォーマンスを向上させ、ビジネスに貢献するためには、学ぶべき知識だと思います。
当然ではありますが、この記事に記載したものは書籍のほんの一部であり、深い理解を得るには実際に書籍を読む必要があるかと思いますので、一読をお勧めします。
まだまだ私も十分な知識を得られたわけではないため、引き続き学んでいこうと思います。

Discussion