Jaeger とは
Jaeger は、マイクロサービスと呼ばれる相互接続されたソフトウェアコンポーネントの問題をモニタリングおよびトラブルシューティングするために使用できるソフトウェアです。複数のマイクロサービスが相互に通信して、1 つのソフトウェア機能を実行します。デベロッパーは Jaeger を使用して、これらのマイクロサービスのインタラクションにおける一連のイベントを視覚化し、問題が発生したときに問題を切り分けます。Jaeger は、一連のマイクロサービスのインタラクションを通じてリクエストのパスをたどる (トレースする) ため、Jaeger Tracing とも呼ばれます。
Jaeger が重要な理由
これまでのソフトウェア設計はモノリシックで、いくつかの機能が 1 つのコードベースにまとめられていました。例えば、食品注文アプリを設計するために、食品メニュー、レストラン、および支払いシステムがすべて 1 つのソフトウェアユニットにまとめられていました。このタイプのソフトウェア設計により、ソリューションがより複雑になり、保守が困難になりました。デベロッパーが 1 つの領域でコードを変更すると、システム全体に影響が及ぶため、変更管理は長くて退屈なプロセスになります。この問題を解決するために、アーキテクチャ設計はよりモジュール化されました。
マイクロサービス
最新のアプリケーションは、マイクロサービスと呼ばれる小さな独立した単位の集まりとして機能します。例えば、最新の食品注文アプリは、次の部分で構成されている可能性があります。
- 顧客がどこにいるかを検出する位置情報サービス
- 注文を収集してレストランに送信するサービス
- いくつかの支払いオプションを持つ支払いゲートウェイ
各マイクロサービスは独立したアプリケーションとして機能し、独自のデータベースとロジックにアクセスできます。マイクロサービスは、ウェブアプリケーションのように、リクエストとレスポンスを使用して相互に通信します。マイクロサービス基盤システムは、分散システムとも呼ばれます。
マイクロサービスアーキテクチャのトラブルシューティング
マイクロサービスの複雑な動作のため、分散システムの問題を調査することは困難です。例えば、モジュラーアプリで食品を注文すると、さまざまなマイクロサービスへの複数のリクエストがトリガーされる場合があります。これらのリクエストは同時に独立して発生する可能性があり、連続している必要はありません。食品の注文で問題が発生した場合、デベロッパーは原因となったマイクロサービスを特定する必要があります。従来の問題追跡アプローチでは、リクエストの全体像の一部しか得られないため、マイクロサービスのトラブルシューティングが面倒になります。
Jaeger は、一連のイベント全体を可視化して明確にするために IT チームが使用するソフトウェアツールです。問題をより迅速に解決し、カスタマーエクスペリエンスを向上させることができます。
Jaeger の用途
デベロッパーは Jaeger を使用して、いくつかの異なる方法で分散システムのパフォーマンスを向上させます。いくつかの例を以下に示します。
分散トランザクションのモニタリング
Jaeger には、マイクロサービス間のデータ移動をモニタリングする機能があります。デベロッパーは、ユーザーエクスペリエンスが悪化する前に、問題を検出して解決するためのプロアクティブなアプローチを取ることができます。
レイテンシーの最適化
Jaeger アナリティクスは、アプリケーションの速度を低下させるマイクロサービスのボトルネックを特定できます。デベロッパーは Jaeger を使用してマイクロサービスの動作を検査し、それらを高速化する方法を見つけます。
根本原因の分析
マイクロサービスアーキテクチャでは、1 つの問題が他の問題を引き起こす可能性があります。デベロッパーは Jaeger を使用して、アプリケーションに関連する一連の問題の発生点を見つけることができます。
サービス依存分析
サービスの依存関係とは、アプリケーションが実行するために複数のコンポーネントに依存していることを意味します。例えば、ナビゲーションアプリは、モバイルアプリの位置情報サービスに依存しています。デベロッパーは Jaeger を使用して、さまざまなマイクロサービス間の複雑な関係を理解します。
分散コンテキストの伝播
分散コンテキスト伝搬は、アプリケーションがデータとともに記述情報を渡す方法です。これは、デベロッパーがマイクロサービスのパフォーマンスを全体として評価するのに役立ちます。例えば、Jaeger は注文リクエストに顧客の名前をタグ付けして、デベロッパーがリクエストパスを特定の顧客に関連付けることができるようにします。
Jaeger の仕組み
Jaeger は分散トレースの原則に基づいて動作し、OpenTracing フレームワークを使用します。
分散トレース
分散トレースは、マイクロサービス間の一連のイベントをモニタリングするソフトウェア手法です。すべての接続を追跡し、チャートとグラフを提供して、アプリケーション内のリクエストパスを視覚化します。Jaeger は分散トレースツールとして、各リクエストに一意の識別子を割り当て、特定のサービスがリクエストを処理するときに情報を収集することで、リクエストの動きを追跡します。
OpenTracing
OpenTracing は、最新のソフトウェアシステム全体で正確なターンキー分散トレースを実現するための標準を提供する、オープンソースまたは無料で利用できるフレームワークです。例えば、マイクロサービス間を移動するモニタリング対象情報の構造を定義するための共通の標準を提供します。Jaeger は OpenTracing を使用して、マイクロサービスデータを収集、保存、管理、分析、および視覚化するための完全なソリューションを提供します。
OpenTracing データモデル
OpenTracing データモデルは、さまざまなコンポーネントからのデータを接続するための基本的な定義を示します。使用する 2 つの主な用語は、span と trace です。
スパン
スパンは、分散トレーシングシステムで実行される作業の単一の論理単位です。各スパンには次のコンポーネントがあります。
- オペレーション名
- 開始時間と終了時間
- デベロッパーがスパンを分析するのに役立つタグまたは値
- マイクロサービスが生成するメッセージを保存するログ
- スパンコンテキストまたはスパンの追加説明
トレース
トレースは、同じプロセスに属する 1 つ以上のスパンのコレクションです。特定の時間内に発生するイベントを表します。同じトレースに属するスパンは、同じトレース ID を共有します。例えば、顧客が食品を注文したときに生成されるトレースは、次のスパンになります。
- 顧客が注文を送信
- 支払いを処理
- 注文リストをレストランに送信
- 食品をピックアップ
- 食品を配達
Jaeger のコンポーネントとは
Jaeger 分散トレースプラットフォームは、次のコンポーネントで構成されています。
Jaeger クライアント
Jaeger クライアントには、Go、JavaScript、Java、Python、Ruby、PHP などのプログラミング言語で OpenTracing API の言語固有の実装が含まれています。
デベロッパーはこれらの API を使用して、分散トレース用のソースコードを記述せずに Jaeger スパンを作成します。
Jaeger エージェント
Jaeger エージェントは、バックグラウンドで継続的に実行され、他のプロセスが必要とする機能を実行するネットワークデーモンまたはプロセスです。クライアントがユーザーデータグラムプロトコル (UDP) を介して送信するスパンをリッスンします。UDP は、アプリケーションがネットワークを介してメッセージを交換できるようにする通信方法の一種です。
エージェントは、Amazon Elastic Kubernetes Service などのコンテナ環境でクライアントに接続します。エージェントグループはバッチでスパンを作成し、コレクターに送信します。これにより、トレース情報を Jaeger バックエンドに積極的に送信することなく、アプリケーションを実行できます。
Jaeger コレクター
Jaeger コレクターは、Jaeger コレクターからトレースを取得するソフトウェアコンポーネントです。トレースをチェック、処理し、データベースに保存します。
ストレージ
Jaeger トレースシステムは、スパンを受け取り、それらを永続的なストレージバックエンドまたはデータベースに保存します。永続ストレージとは、コンピュータの電源がオフになっても、保存されたデータがそのまま残ることを意味します。例えば、デベロッパーは AWS OpenSearch Service を、スパンを保存および受け入れるための永続ストレージとして使用します。
インジェスター
Jaeger をデプロイする 1 つの方法は、トレースデータを Kafka に送信することです。Kafka は、アプリケーションが情報のストリームを保存および取得するための分散システムです。インジェスターは、Kafka からトレースデータを読み取り、それを個別に保存するモジュールです。
クエリ
クエリサービスは、データベースからトレース情報を取得します。デベロッパーはクエリを使用して、特定の時間、タグ、期間、および操作を含むトレースを見つけます。
Jaeger コンソール
Jaeger Console は、トレースの表示と分析に使用できるユーザーインターフェイスを備えたソフトウェアプログラムです。トレースデータをグラフやチャートで表示します。
デベロッパーによる Jaeger の使用方法
デベロッパーはアプリケーションを構築するとき、Jaeger クライアントライブラリを使用してスパンを作成します。プログラムにコードを追加してトレースデータを生成することにより、インストルメント化されたアプリケーションと呼ばれるものを作成します。インストルメント化されたアプリケーションは、次のものを自動的に生成します。
- スパンID、トレース ID、タグ、ログ、およびスパンコンテキストを含むスパン
- すべてのリクエストのトレース
デベロッパーは Jaeger コンソールを使用して、この分散トレーシングデータを検索、フィルタリング、視覚化、および分析します。Jaeger UI ソフトウェアを使用して、プロセスの所要時間、エラー、マイクロサービスからのログなどの詳細情報を確認できます。
Jaeger サンプリング戦略とは
インストルメント化されたアプリケーションは、アプリケーションの実行中は常にトレースデータを自動的に送信します。このトレースデータを使用して、アプリケーションのパフォーマンスを測定できます。テレメトリデータとも呼ばれます。Jaeger バックエンドが過剰なテレメトリーデータで圧倒されるのを防ぐために、Jaeger 実装でサンプリング戦略を設定することにより、フィルタリングまたはサンプリングできます。以下にいくつかのサンプリング戦略を示します。
- コンスタントサンプリングでは、すべてのタイプのトレースで同じ数のサンプルが収集されます。
- 確率的サンプリングは、一定の割合に達するまでサンプルをランダムに収集します。
- レート制限サンプリングは、毎秒特定の数のサンプルを取得します。
- アダプティブサンプリングは、サンプルレートを自動的に調整して、特定の期間の多数のトレースを実現します。
AWS App Mesh とは何ですか?
AWS App Mesh は、マイクロサービスベースの分散システムをより簡単に管理できるように、重い作業を行うサービスメッシュまたはソフトウェアインフラストラクチャです。AWS App Mesh は次のことを行います。
- アプリケーションにエンドツーエンドの一貫した可視性と高可用性を提供します。
- 各サービスを設定して、テレメトリーデータをエクスポートし、アプリケーション全体で一貫した通信制御ロジックを実装します。
- デベロッパーが安全なクラウドアプリケーションを構築できるように、ネットワークトラフィック制御を提供します。
AWS App Mesh は、分散トレースのニーズに対応するスタンドアロンソリューションとして使用できます。また、マイクロサービス通信をモニタリング、ログ、またはトレースするために使用する Jaeger のような、いくつかの非 AWS サードパーティーのツールをサポートしています。
今すぐ AWS アカウントを作成し、App Mesh で Jaeger を使い始めましょう。