トップ OSS紹介 Jaeger

Jaeger

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

バージョンアップ情報

Jaeger情報

Jaegerとは

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

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

分散トレーシングの概要に関しては、OpenTracingについて学んでおくと理解が早いですが、主要な用語として、

  • スパン
  • トレース

の2つがあります。この関係性を示すのが以下の図となります。

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

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

それぞれの役割は以下の通りです。

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バックエンドは、単一障害点なく、業務のニーズに合わせて拡張できるように設計されている。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)メトリクスとして可視化し、統計的に顕著なリクエスト/エラー率やレイテンシーを持つサービスやオペレーションをハイライトします。

類似プロダクト

類似の機能を持った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を参照ください。

ユースケース

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

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

動作環境

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

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

  • macOS
  • Linux
  • Windows

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

Jaegerのライセンス

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

製品ダウンロード

オープンソース年間サポートサービス

OpenStandiaではOSSを安心してご利用いただけるように、オープンソース年間サポートサービスをご提供しております。
サポートしているOSSは下記ページをご参照ください。

お気軽にお問い合わせください

関連OSS

  • OpenTelemetry

    OpenTelemetry

    OpenTelemetryは、分散アプリケーションのトレーシングとメトリクス収集のための統一的な規格化とAPIを提供するオープンソースプロジェクトです。

  • Prometheus
    サポート対象

    Prometheus

    プロメテウス。GO言語で書かれたオープンソースのモニタリングツールです。

  • Logstash

    Logstash

    ログスタッシュ。Elastic社により開発された、データ収集ツールです。

  • Fluentd
    サポート対象

    Fluentd

    フルエントディ。様々なデバイスやシステムからログ収集を行い、NoSQLデータベースやテキストなど様々フォーマットに変換・格納するログコネクタです。

オープンソースに関する様々な課題、OpenStandiaがまるごと解決します。
下記コンテンツも
あわせてご確認ください。