Jaegerの概要
Jaeger (イェーガー)は、GoogleのDapperやOpenZipkinを参考にUber Technologies社によって開発され、その後オープンソース化されたGo言語の分散トレーシングシステムです。
従来のモノリシックで開発されたアプリケーションとは異なり、マイクロサービスを複数呼び出して、1つの大きなリクエスト実現するようなアプリケーションの場合、それぞれのマイクロサービスの処理の流れや依存関係の把握、処理遅延箇所の特定、障害発生時のトラブルシューティングが非常に難しくなりました。この問題を解決するために生まれたのが分散トレーシングシステムです。
Jaeger
はOpenTracingと互換性のあるデータモデルを持ち、各種言語(Go、Java、Node.js、Python、C++)用の計測ライブラリを提供します。複数ある分散トレーシングシステムの中では、唯一CNCFの卒業プロジェクトであり、今後のさらなる展開が期待されるOSSです。
分散トレーシングの概要に関しては、OpenTracingについて学んでおくと理解が早いですが、主要な用語として、
・スパン
・トレース
の2つがあります。この関係性を示すのが以下の図となります。
出典:https://www.jaegertracing.io/docs/1.37/architecture/
スパンは、操作名、操作開始時刻、操作時間などを保持する作業の論理単位を表します。複数のスパンはネストされ、その関連を順序付けることができます。一方、トレースはシステムを通るデータ/実行パスのことであり、各スパンの有向非巡回グラフ(上図の左側のグラフ)として表すことができます。
Jaegerのコンポーネントの構成(all-in-oneバイナリでの例)については、以下の図の通りとなります。
出典:https://www.jaegertracing.io/docs/1.37/architecture/
それぞれの役割は以下の通りです。
jaeger-client | アプリケーションに組み込まれたクライアントライブラリ(複数の言語に対応)により、リクエストの受信ごとにスパンが作成され、分散トレーシングに必要なコンテキスト情報(トレースID、スパンID、baggage)が付加されます。サンプリング数の調整もここで行われます。作成されたスパンはバックエンドスレッドにより、UDP経由でjaeger-agentに送信されます。 |
---|---|
jaeger-agent | jaeger-clientからのスパンを受信するデーモンです。ホストおよびコンテナに配備されます。こちらもバッチ処理により、jaeger-collectorにトレースをpushします。 |
jaeger-collector | jaeger-agentからトレースを受け取り、検証、インデックス付与および変換を行った後、ストレージに格納します。ストレージとしては、現在はCassandra、Elasticsearch、Kafka(中間バッファ)をサポートします。 |
jaeger-query | ストレージからスパン、トレースを参照して、Web UIを表示するためのサービスです。 |
Jaegerの主な特徴
分散システムの監視およびトラブルシューティング | マイクロサービス化された分散システムにおいて、以下のようなモニタリングやトラブルシュートに利用できる。 ・分散コンテキスト伝播 ・分散トランザクションモニター ・根本原因分析 ・サービス依存関係分析 ・パフォーマンス/応答遅延の最適化 |
---|---|
高拡張性 | Jaegerバックエンドは、単一障害点なく、業務のニーズに合わせて拡張できるように設計されている。Uberでの事例では、あるJaeger環境は1日数十億のスパンの処理を実現している。 |
OpenTracinとOpenTelemetrygのネイティブサポート | Jaegerバックエンド、Web UI、計測ライブラリは、OpenTracing標準をサポートするために0からデザインされている。 ・スパン間の参照によるツリーだけではない有向非巡回グラフ (DAG)としてトレースを表現 ・強型付けされたスパンタグや、構造化ログをサポート ・baggageによる一般的な分散コンテキスト伝播メカニズムをサポート v1.35 以降、Jaegerバックエンドは、ネイティブのOpenTelemetry Protocol (OTLP)で OpenTelemetry SDK からトレース データを受信できる。 |
多数のバックエンドストレージに対応 | Jaegerではトレースストレージバックエンドとして、2つのメジャーなNoSQLデータベース(Cassandra 3.4+、Elasticsearch 5.x/6.x/7.x)をサポートしている。 また、コミュニティでは、ScyllaDB、InfluxDB、Amazon DynamoDB、Logz.ioなどのデータベースへの対応が進行中である。 |
モダンなWeb UI | Jaeger の Web UIは、Reactのような有名なオープンソースフレームワークを使ったJavascriptにより実装されている。大量のデータを効率的に扱えるようになったv 1.0では、そのいくつかのパフォーマンス改善により、数万のスパンがあるトレースを表示できるようになった。 |
Cloud Native対応 | Jaegerバックエンドは、複数のDockerイメージとしても配布される。そのバイナリではコマンドラインや、環境変数、複数のフォーマット(yamlやtomlなど)の設定ファイルによる様々な設定方法をサポートする。Kubernetesクラスタへのデプロイは、Kubernetes operator、Kubernetes templatesおよび、Helm chartによって、アシストされる。 |
Prometheusメトリックに対応 | すべてのJaegerバックエンドコンポーネントは、デフォルトでPrometheusメトリック(他のメトリックバックエンドもサポート)を公開する。ログはGo言語の構造化ロギングライブラリである zapを利用して、標準出力に書き込まれる。 |
Zipkinとの下位互換性 | 先進的な機能を利用するためにはJaegerクライアントライブラリを利用することが推奨されるが、すでにZipkinライブラリを使用した計測環境が構成されている場合には、すべてのコードを書き換えなくてもよい。 Jaegerは、HTTP経由でのZipkinフォーマット(Thrift、JSON v1/v2、Protobuf)のスパンを受け取ることによるZipkinとの後方互換性を提供する。Zipkinバックエンドからの切り替えは、Zipkinライブラリから通信ルートをJaegerバックエンドに向けるだけです。 |
トポロジーグラフ |
JeagerのUIは、System ArchitectureとDeep Dependency Graphの 2 種類のサービスグラフをサポートする。 例としてA-B-Cのグラフの場合、 System ArchitectureにはAとBの間とBとCの間にはネットワークの呼び出しを含むいくつかのトレースが存在しますが、A-B-Cの完全なチェーントレースはありません。 つまり、AがCに依存しているとはいえません。また、このグラフのノード粒度はサービスのみでサービスエンドポイントは含まれていません。 一方でDeep DependencyGraphではAがCに推移的な依存関係をもっています。一つのグラフは焦点となるサービスを持っており、そのサービスを通過する経路のみを表示し、 ノード粒度をサービスとサービスエンドポイントの間で変更することが可能です。 |
サービスパフォーマンスモニタリング | スパンデータをRED(Requests,Errors,Duration)メトリクスとして可視化し、統計的に顕著なリクエスト/エラー率やレイテンシーを持つサービスやオペレーションをハイライトします。 |
Jaegerのユースケース
分散トレーシングシステムとしてのJaegerの主なユースケースは以下の通りです。
- 分散トランザクションの監視
- パフォーマンスとレイテンシーの最適化
- 根本原因分析
- サービス依存性の分析
- 分散コンテキストの伝搬
Jaegerの動作環境
ソースから動作させる場合には、Go 1.11以上がインストールされている必要がある。
公式サイトでは、以下のOSに対応したバイナリが用意されている。
- macOS
- Linux
- Windows
また、Docker Hubには、Jaeger UI、collector、query、agent、インメモリストレージを含むall-in-oneイメージや、それぞれの個別のDockerイメージが提供されている。
Jaegerと類似性のあるOSS
類似の機能を持ったOSSでは、Zipkin、Skywalkingがあります。それぞれの機能差異は以下の通りです。
Jaeger | Zipkin | Skywalking | ||
---|---|---|---|---|
クライアントライブラリ対応言語(※) | C# | 〇 | 〇 | × |
C++ | 〇 | △ | × | |
Go | 〇 | 〇 | △ | |
Java | 〇 | 〇 | 〇 | |
JavaScript | × | 〇 | × | |
LUA | × | △ | 〇 | |
.NET | × | × | △ | |
Node.js | 〇 | 〇 | △ | |
PHP | △ | 〇 | △ | |
Python | 〇 | △ | 〇 | |
Ruby | △ | 〇 | × | |
Scala | △ | 〇 | × | |
対応フォーマット | Zipkin v1/v2 | 〇 | 〇 | 〇 |
Jaeger フォーマット | 〇 | × | 〇 | |
Skywalkingフォーマット | × | × | 〇 | |
テレメトリ送信(トランスポート)方式 | gRPC | 〇 | × | 〇 |
HTTP | 〇 | 〇 | 〇 | |
Kafka | × | 〇 | × | |
Scribe | × | 〇 | × | |
対応ストレージ | Cassandra | 〇 | 〇 | × |
Elasticsearch | 〇 | 〇 | 〇 | |
H2 | × | × | 〇 | |
MySQL | × | 〇 | 〇 | |
TiDB | × | × | 〇 | |
Kafka (中間バッファ) |
〇 | 〇 | × |
△: Official ではないが、Unofficial として存在
(※) クライアントライブラリの言語によっても提供される機能に差があるため、詳細は以下のURLを参照ください。
https://www.jaegertracing.io/docs/1.37/client-features/
Jaegerのライセンス
Jaegerは、Apache2.0ライセンスです。Apache License(アパッチ・ライセンス)のコードが使用されていることの明記を条件に、ソースコードの自由な改変と公開が認められています。
参考情報
Jaegerのサポート
NRIではお客様のご要望に応じて様々な支援ができるサービスをご用意しました。
詳細は下記ページをご確認ください。