概要
Jaeger は、分散サービス間のトランザクションをトレースするためのオープンソース・ソフトウェアです。複雑なマイクロサービス環境の監視とトラブルシューティングに使用されます。
分散トレースとは
分散トレースは、マイクロサービス間の複雑な相互作用におけるイベントのチェーン全体を表示および理解するための方法です。
先進的なクラウドネイティブ・ソフトウェア開発は、マイクロサービス、すなわち、それぞれが異なるコア機能を提供する独立したサービスに依存しています。ユーザーがアプリケーションでリクエストを作成すると、独立した多くのサービスが応答して結果を生成します。
アプリケーション内の 1 回の呼び出しで、互いに対話するさまざまなサービスをいくつも呼び出すことができます。開発者やエンジニアは、問題の発生時やリクエストの実行が遅い場合に、どのように問題を切り分けることができるでしょうか。すべての接続の状況を常に把握する方法が必要になります。
このような場合に役立つのが分散トレースです。多くの場合、分散トレースはサービスメッシュ (マイクロサービスを管理および監視する方法) の一部として実行されます。
Jaeger は、分散トレースを使用して、さまざまなマイクロサービスを介したリクエストのパスを追跡します。推測するのではなく、呼び出しのフローを視覚的に確認することができます。
トランザクションに関する情報が整理されると、デバッグと最適化に役立ちます。Jaeger のツールは、分散トランザクションを監視し、パフォーマンスとレイテンシーを最適化するとともに、問題解決の方法である根本原因分析 (RCA) を実行します。
Jaeger の仕組み
Jaeger は、分散システムからの「トレース」を収集、保存、視覚化し、リクエストがシステム内をどのように流れ、どこに時間が費やされ、どこでエラーが発生するのかについての知見を提供します。
Jaeger ではトレースを実行リクエストの表示単位とします。トレースは、システムを介したデータや実行パスを示します。
トレースは 1 つ以上のスパンで構成されます。スパンは、データベースクエリや HTTP リクエストなど、Jaeger における論理上の作業単位です。各スパンには、オペレーション名、開始時刻、および期間が含まれます。スパンはネストされ、順序が付けられます。
Jaeger のプロセス
Jaeger は、分散システム全体のオペレーションの実行をトレースし、特定のルーチンを Jaeger の複数のコンポーネントにタスク化することで機能します。
OpenTelemetry SDK はどのプログラミング言語でも使用でき、Jaeger や他のトレース・プラットフォームが理解できるフォーマットにエクスポートできます。
オペレーション開始後、Jaeger は次のプロセスを踏みます。
- Jaeger のトレースは、アプリケーションのインストルメント化から始まります。インストルメント化により、トレースを生成するためにアプリケーションのコードが変更されます。インストルメント化には、さまざまなプログラミング言語で利用可能な Jaeger クライアントライブラリを使用する手動インストルメンテーションと、OpenTracing や OpenTelemetry API をサポートするミドルウェアやフレームワークを使用する自動インストルメンテーションがあります。
- アプリケーションが実行されると、トレースはマイクロサービス全体でオペレーションの詳細な実行パスを提供します。各トレースは複数のスパンで構成されます。各スパンはオペレーション名、開始時刻、終了時刻、追加のコンテキストを提供する key-value ペアタグ (HTTP ステータスコード、エラーメッセージなど) などの情報を含みます。
- スパンを 1 つのトレースにリンクするために、Jaeger はリクエストとレスポンスの一部として、識別子とその他のトレースコンテキストをサービス間で渡します。これはコンテキスト・プロパゲーションとして知られています。各スパンとトレースには、リクエストプロセスの個々のコンポーネントをつなぎ合わせるようにする固有の ID があります。
- スパンは Jaeger クライアントライブラリを使って収集され、通常はアプリケーションと共に、または Kubernetes のような環境では DaemonSet としてデプロイされる Jaeger Agent に送られます。
- Jaeger Collector は Jaeger Agent からスパンを受け取り、バックエンドのデータベースに保存します。Jaeger は、Elasticsearch、Cassandra、Google Cloud Bigtable など複数のストレージオプションをサポートしているため、スケーラブルかつ柔軟なトレースデータの管理が実現します。
- Jaeger Query サービスは、トレースを検索して可視化するための UI を提供します。Jaeger UI は、開発者とオペレーターが個々のトレースの詳細を探索し、スパン階層とタイミングを視覚化し、システムの動作とパフォーマンスを分析できるようにします。
- Jaeger Console は、分散トレースデータを可視化し、レイテンシー問題、エラー分析、依存性分析、パフォーマンス最適化などの知見を得るためのユーザー・インタフェースです。
Jaeger のユースケース
Jaeger は、分散システムを通じてマイクロサービスとリクエストの動作に関する知見を提供します。そのため以下のことを提供できます。
- パフォーマンス最適化:Jaeger は、一連のマイクロサービス内で遅延が発生している場所をピンポイントで特定するだけでなく、サービスがどのように相互作用し、依存しているかを可視化し、リソースの割り当てを最適化できます。
- 根本原因分析:Jaeger は、サービス障害や予期せぬ結果をその発生源まで遡って追跡し、迅速な解決に繋げます。さらに Jaeger は監視システムと統合することができ、レイテンシーやエラー率の急上昇など異常なパターンが現れたときにチームに警告します。
- セキュリティとコンプライアンス:トレースはデータがシステム内をどのように流れるかを示すものであり、データの取り扱いや処理に関する規制要件を遵守する上で重要な監査証跡の役割を果たします。
- 開発とテスト:開発者はローカル環境で Jaeger トレースを実行することができ、アプリケーションをデプロイする前にエラーやレイテンシー、依存関係の問題を検出できます。
分散トレースと Red Hat
Red Hat® OpenShift® Observability は、OpenShift ベースのアプリケーションとインフラストラクチャのパフォーマンスおよび健全性についてユーザーが深い知見を得ることができる一連の包括的な可観測性機能です。Red Hat の可観測性スタックの機能の 1 つは分散トレースで、2024 年までは Jaeger が含まれていました。2024 年初頭、Red Hat は Jaeger と Elasticsearch を廃止し、Tempo Operator と OpenTelemetry の Red Hat ビルドに切り替えました。
OpenTelemetry の Red Hat ビルドは、Jaeger クライアントだけでなく、zipkin や OpenTelemetry Protocol (OTLP) など、さまざまなフォーマットのトレースを収集するのに使用できます。このコレクターはすべての可観測性信号の収集に使用できるため、これはほんの始まりに過ぎません。Red Hat の分散トレーシングの最新リリースには、数多くの機能強化が含まれています。スパンからの自動メトリクス生成の実装に加え、これらのメトリクスに基づくアラートの作成が可能になります。Prometheus スタックの統合を支援するため、Red Hat は Target Allocator コンポーネントをビルドに追加しました。これによりお客様は Prometheus のエンドポイントを簡単にスクレイピングし、効率的に管理および拡張することができます。
Tempo は、Jaeger 製品が提供する分散トレースストレージおよび可視化機能の代替品として機能します。大規模なデプロイメントだけでなく、分散トレースの実験や、大規模なトレースストレージを必要としないデプロイメントの迅速なトラブルシューティングのためのシンプルなローカルデプロイメントを容易にします。Tempo には Jaeger ユーザー・インタフェースが組み込まれているため、トレースのスムーズな視覚化が実現します。