Jaeger とは?

Jaeger

Jaeger

NRIのOpenStandiaが提供するJaeger最新情報

OSSの保守サポートサービスの内容はこちら OSSの導入については、こちらのフォームからお問い合わせ下さい OSS全般の事例紹介はこちら

Jaegerバージョンアップ情報

すべてを見る

更新日:2022-10-18

Jaegerの概要

Jaeger (イェーガー)は、GoogleのDapperやOpenZipkinを参考にUber Technologies社によって開発され、その後オープンソース化されたGo言語の分散トレーシングシステムです。
従来のモノリシックで開発されたアプリケーションとは異なり、マイクロサービスを複数呼び出して、1つの大きなリクエスト実現するようなアプリケーションの場合、それぞれのマイクロサービスの処理の流れや依存関係の把握、処理遅延箇所の特定、障害発生時のトラブルシューティングが非常に難しくなりました。この問題を解決するために生まれたのが分散トレーシングシステムです。

Jaeger はOpenTracingと互換性のあるデータモデルを持ち、各種言語(Go、Java、Node.js、Python、C++)用の計測ライブラリを提供します。複数ある分散トレーシングシステムの中では、唯一CNCFの卒業プロジェクトであり、今後のさらなる展開が期待されるOSSです。

分散トレーシングの概要に関しては、OpenTracingについて学んでおくと理解が早いですが、主要な用語として、
・スパン
・トレース
の2つがあります。この関係性を示すのが以下の図となります。

Jaegerの概要1

出典:https://www.jaegertracing.io/docs/1.37/architecture/

スパンは、操作名、操作開始時刻、操作時間などを保持する作業の論理単位を表します。複数のスパンはネストされ、その関連を順序付けることができます。一方、トレースはシステムを通るデータ/実行パスのことであり、各スパンの有向非巡回グラフ(上図の左側のグラフ)として表すことができます。

Jaegerのコンポーネントの構成(all-in-oneバイナリでの例)については、以下の図の通りとなります。

Jaegerの概要2

出典: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を表示するためのサービスです。

TOPに戻る

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)メトリクスとして可視化し、統計的に顕著なリクエスト/エラー率やレイテンシーを持つサービスやオペレーションをハイライトします。

TOPに戻る

Jaegerのユースケース

分散トレーシングシステムとしてのJaegerの主なユースケースは以下の通りです。

  • 分散トランザクションの監視
  • パフォーマンスとレイテンシーの最適化
  • 根本原因分析
  • サービス依存性の分析
  • 分散コンテキストの伝搬

TOPに戻る

Jaegerの動作環境

ソースから動作させる場合には、Go 1.11以上がインストールされている必要がある。

公式サイトでは、以下のOSに対応したバイナリが用意されている。

  • macOS
  • Linux
  • Windows

また、Docker Hubには、Jaeger UI、collector、query、agent、インメモリストレージを含むall-in-oneイメージや、それぞれの個別のDockerイメージが提供されている。

TOPに戻る

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/

TOPに戻る

Jaegerのライセンス

Jaegerは、Apache2.0ライセンスです。Apache License(アパッチ・ライセンス)のコードが使用されていることの明記を条件に、ソースコードの自由な改変と公開が認められています。

TOPに戻る

参考情報

TOPに戻る

Jaegerのサポート

NRIではお客様のご要望に応じて様々な支援ができるサービスをご用意しました。
詳細は下記ページをご確認ください。

TOPに戻る

OpenStandiaに関する
資料請求・お問い合わせはこちら

  • 資料請求
  • お問い合わせ

※定期的にメンテナンスを実施しておりますが、一部情報が古い場合がございます。ご了承ください。

  • OpenStandiaサポート対象オープンソース|50種類以上のOSSのサポートをご提供します。
  • 人気midPoint
  • 人気Keycloak
  • 注目MongoDB
  • ForgeRock AM(OpenAM)
  • ForgeRock IDM(OpenIDM)
  • MongoDB
  • Postfix
  • Apache HTTP Server
  • ZABBIX
  • PostgreSQL
  • Apache Struts
  • Apache Kafka
  • Apache Hadoop
  • Apache Spark
  • Spring Framework
  • Apache Tomcat
  • Solr
  • iBATIS
  • DRBD
  • MySQL
  • JBoss
  • Ruby on Rails
  • Jaspersoft
  • OpenLDAP
  • Apache log4j
  • Apache Subversion
  • ForgeRock DS(OpenDJ)
  • Pacemaker
  • Samba
  • Red Hat Enterprise Linux
  • Nginx
  • BIND
  • Dovecot
  • Pentaho
  • sendmail
  • Courier-IMAP
  • ForgeRock DS(OpenDJ)
  • Heartbeat
  • Hibernate
  • Hinemos
  • MyBatis
  • MySQL Cluster
  • Apache Axis2
  • Squid
  • OpenSSO