🐡

Observability Engineeringのまとめ

2023/03/05に公開

はじめに

こんにちは。このブログでは、オライリーのObservability Engineeringという本について、簡単に要約します。この本は、可観測性という概念を大規模なソフトウェア管理にどのように適用するかを解説したものです。可観測性とは、システムの内部状態を外部出力から推測できる程度のことを指します。可観測性が高いシステムは、デバッグやメンテナンスが容易であり、信頼性やパフォーマンスも向上します。

https://learning.oreilly.com/library/view/observability-engineering/9781492076438/

本書では、以下の項目について詳しく説明しています。

  • 複雑なクラウドネイティブアプリケーションとシステムを提供する際に可観測性を実践することの価値
  • 可観測性がソフトウェア開発ライフサイクル全体に与える影響
  • さまざまな機能チームがサービスレベル目標で可観測性を使用する方法と理由
  • 将来のエンジニアが今日書いたコードを理解するのに役立つコードをインストルメント化する方法
  • コンテキストアウェアなシステムのデバッグとメンテナンスのための高品質コードを生成する方法
  • データが豊富な分析がとらえどころのない問題のデバッグにどのように役立つか

それでは、それぞれの項目について見ていきましょう。

複雑なクラウドネイティブアプリケーションとシステムを提供する際に可観測性を実践することの価値

クラウドネイティブアプリケーションとは、クラウド環境で動作するように設計されたアプリケーションです。クラウドネイティブアプリケーションは、マイクロサービスやコンテナ、オーケストレーションツールなどを利用して、柔軟で拡張可能で耐障害性が高いシステムを構築します。

しかし、これらの技術は同時に複雑さや不確実さも増加させます。例えば、

  • サービス間やコンポーネント間の依存関係や通信が多くなります。
  • クラウドプロバイダーから提供されるインフラストラクチャやサービスは随時変更される可能性があります。
  • 分散トレーシングやログ収集などの監視手段が必要です。
  • 異常事象やパフォーマンス低下などの原因究明が困難です。

これらの課題に対処するためには、可観測性を高める必要があります。可観測性を高めることで、システム全体や各サービス・コンポーネント・インフラストラクチャの状態や動作を可視化できます。

本書では、可観測性を実現するために必要な要素として、メトリクス、ログ、トレースの3つを紹介しています。これらはそれぞれ、

  • メトリクス:システムの状態やパフォーマンスを定量的に表す数値データです。例えば、CPU使用率やレイテンシーなどがあります。

  • ログ:システムのイベントやアクティビティを時系列に記録したテキストデータです。例えば、エラーメッセージやアクセスログなどがあります。

  • トレース:システム内で発生するリクエストや処理の流れを追跡したデータです。例えば、サービス間の呼び出し関係やレイテンシーなどがあります。

これらの要素を組み合わせて利用することで、より深い洞察力や分析力を得ることができます。

可観測性がソフトウェア開発ライフサイクル全体に与える影響

可観測性は、ソフトウェア開発ライフサイクル全体に影響します。本書では、以下のようなプロセスにおいて可観測性が重要な役割を果たすことを説明しています。

  • 設計:可観測性は、システムの設計段階から考慮する必要があります。設計時に可観測性に関する要件や目標を明確にすることで、後々の実装や運用における課題やコストを削減できます。

  • 開発:可観測性は、開発者がコードを書く際にも重要です。開発者はコード内でメトリクスやログやトレースを生成することで、システムの可観測性を高めることができます。また、開発者は可観測性のデータを利用して、コードの品質やパフォーマンスを改善することもできます。

  • テスト:可観測性は、テスト段階でも有効です。テスト時に可観測性のデータを収集することで、システムの挙動やパフォーマンスを検証することができます。また、テスト時に発見した問題やバグを可観測性のデータを使って解決することもできます。

  • デプロイ:可観測性は、デプロイ段階でも重要です。デプロイ時に可観測性のデータを監視することで、システムの稼働状況やパフォーマンスを確認することができます。また、デプロイ時に発生した問題や障害を可観測性のデータを使って迅速に対処することもできます。

  • 運用:可観測性は、運用段階でも不可欠です。運用時に可観測性のデータを分析することで、システムの状態やパフォーマンスを把握することができます。また、運用時に発生した問題や障害を可観測性のデータを使って原因究明や解決策探索に役立てることもできます。

さまざまな機能チームがサービスレベル目標で可観測性を使用する方法と理由

サービスレベル目標(SLO)とは、システムが提供すべき品質や信頼性などの目標値です。SLOはサービスレベル指標(SLI)という数値的な指標で表されます。例えば、

  • 可用率:システムが正常に稼働している時間の割合
  • レイテンシー:システムがリクエストに応答するまでにかかる時間
  • エラー率:システムがエラーを返すリクエストの割合

SLOはさまざまな機能チームが共通の言語として使用します。例えば、

  • 開発チーム:SLOは開発チームがコードやアーキテクチャを設計する際のガイドラインとなります。開発チームはSLOを満たすために必要なメトリクスやログやトレースをコード内で生成することができます。また、開発チームはSLOを測定するために可観測性のデータを利用することができます。

  • テストチーム:SLOはテストチームがシステムの品質や信頼性を検証する際の基準となります。テストチームはSLOを達成するために必要なテストケースやシナリオを作成することができます。また、テストチームはSLOを評価するために可観測性のデータを利用することができます。

  • 運用チーム:SLOは運用チームがシステムの状態やパフォーマンスを監視する際の目安となります。運用チームはSLOに応じて必要なアラートやダッシュボードを設定することができます。また、運用チームはSLOに影響する問題や障害に対応するために可観測性のデータを利用することができます。

将来のエンジニアが今日書いたコードを理解するのに役立つコードをインストルメント化する方法

将来のエンジニアが今日書いたコードを理解するために役立つコードインストルメント化とは何でしょうか?インストルメント化とは、コード内にメトリクスやトレースやログなど可視化したい情報を収集・送信・保存・表示するための処理やライブラリー・ツール・プラットフォーム等々 を組み込むことです。インストルメント化されたコードは、

  • システム内部状態(変数値等) を外部出力(メトリクス等) から推測し易くします。

  • システム間またはサービス間 の依存関係 や通信状況 を明確化します。

  • システム動作時 の振る舞いや問題発生時の状況を記録します。

コンテキストアウェアなシステムのデバッグとメンテナンスのための高品質コードを生成する方法

インストルメント化されたコードは、将来のエンジニアがシステムを理解しやすくするだけでなく、現在のエンジニアも自分のコードに対するフィードバックを得ることができます。インストルメント化は、コードの品質や信頼性を向上させるために重要なプラクティスです。

では、どのようにしてインストルメント化された高品質なコードを生成することができるでしょうか?本書では、以下のようなヒントやガイドラインを紹介しています。

  • インストルメント化は開発プロセスの初期段階から考えること。後から追加するよりも効率的で効果的です。

  • インストルメント化はビジネスやユーザーにとって重要な指標や目標に沿って行うこと。無駄な情報やノイズを避けることができます。

  • インストルメント化はチーム内で共通の規約や基準に従って行うこと。可読性や一貫性を保つことができます。
    インストルメント化はテストやレビューを行うこと。バグや欠陥を防ぐことができます。

  • インストルメント化は常に改善し続けること。システムや要件が変化するにつれて、必要な情報も変わります。

データが豊富な分析がとらえどころのない問題のデバッグにどのように役立つか

最後に、データが豊富な分析がとらえどころのない問題のデバッグにどう役立つかについて説明します。データが豊富な分析とは、システムから収集したメトリクスやトレースやログなどのデータを統計的・視覚的・探索的・予測的・因果的 な手法で分析することです 。データが豊富な分析は、

  • システム全体 のパフォーマンス や健康状態 を定量的 に評価 することができます。
  • 個々 のリクエスト やイベント の流れ や関係性 を可視化 することができます。
  • 任意 の情報 やエラー を時系列 で確認 することができます。
  • 異常値 や外れ値 を検出 し、その原因 を特定 することができます。
  • パターン や相関関係 を発見 し、その影響 を予測 することができます。
    これらの分析結果は、システム内部状態(変数値等) を外部出力(メトリクス等)から推測し易くします。また、システム間またはサービス間 の依存関係 や通信状況 を明確化します。さらに、システム動作時 の振る舞い や問題発生時 の状況 を記録します。

これらの情報は、エンジニアがシステムを理解し、デバッグやメンテナンスを効率的に行うことができます。

まとめ

本書では、データが豊富な分析を行うためのツールやテクニックについても紹介しています。例えば、

  • ダッシュボード:メトリクスやトレースやログなどのデータをグラフやチャートなどで表示するツール。システムの状態や動向を一目で把握することができます。

  • アラート:システムに異常が発生したときに通知するツール。問題に早期に対処することができます。

  • ノートブック:データをコードやテキストや画像などで記録し、共有・再利用・再現 することができるツール。分析プロセスや結果をドキュメント化することができます。

以上、オライリーのObservability Engineeringという本について簡単に要点をまとめました。この本は、大規模なソフトウェアシステムを管理するための可観測性の概念と実践について解説しています。

それでは、可観測性の世界へと一緒に旅立ちましょう。🚀

GitHubで編集を提案

Discussion