このトピックでは、Jaegerクライアントを使用してSimple Log ServiceをJaegerに接続する方法について説明します。
背景情報
コンテナとサーバーレスプログラミング方法は、ソフトウェアの配信と展開の効率を向上させます。 次のセクションでは、アプリケーションアーキテクチャの変更について説明します。
アプリケーションアーキテクチャは、単一システムベースからマイクロサービスベースに変更されます。 ビジネスロジックは、マイクロサービス間の呼び出しと要求に変わります。
リソースに関しては、従来のサーバーは徐々に仮想リソースに変わります。

これまでの弾性アーキテクチャと標準アーキテクチャの変更は、O&Mと診断にさらに多くの課題をもたらします。 この課題に対処するために、アリババクラウドは、集中型ロギングシステム、集中型メトリクスシステム、分散型トレースシステムなど、さまざまな開発および運用 (DevOps) 指向の診断および分析システムを開発した。
Alibaba Cloudは、OpenTracingリンクのトレースに使用されるXTraceも提供しています。 XTraceはJaegerと同様に機能します。 詳細については、次をご参照ください: XTraceを使用します。
ロギング、メトリック、およびトレースシステムの機能
ロギングシステムは、個別のイベントを記録する。
例えば、ロギングシステムは、アプリケーションのデバッグまたはエラー情報を記録する。 情報を使用して問題をトラブルシューティングできます。
メトリクスシステムは、集約可能なデータを記録する。
たとえば、キューの深さをメトリックとして定義し、要素がキューに追加またはキューから削除されたときにメトリックを更新できます。 カウンターを作成して、HTTPリクエストの数を数えることもできます。
トレースシステムは、要求範囲の情報を記録する。
例えば、トレースシステムは、リモートプロシージャコール (RPC) の実行プロセスおよび期間を記録する。 トレースシステムでは、システムのパフォーマンスの問題を効率的にトラブルシューティングすることもできます。

上の図は、Peter BourgonのWebサイトからのものです。
上記の説明に基づいて、既存のシステムを分類できます。 たとえば、Zipkinシステムをトレースカテゴリに分類できます。 Prometheusシステムをメトリクスカテゴリに分類できます。 プロメテウスは最初はメトリクスシステムに焦点を当てており、将来的にはより多くのトレース機能と統合される可能性があります。 ただし、プロメテウスがロギング機能と統合される可能性は低いです。 Elasticsearch、Logstash、Kibana (ELK) 、Alibaba Cloud Simple Log Serviceシステムをロギングカテゴリに分類できます。 ELKおよびSimple Log Serviceシステムは、他のシステムの機能と継続的に統合され、前の図に示すように、すべてのシステムの共通部分に向かって進んでいます。
詳細については、ウェブサイトのPeter Bourgonをご覧ください。 以下のセクションでは、トレースシステムについて説明します。
Tracing
次のトレースシステムが広く使用されています。
Dapper (Google): すべてのトレーサーの基礎
StackDriver Trace (Google)
Zipkin (Twitter)
AppDash (Go)
EagleEye (Taobao)
Ditecting (Apsara分散ファイルシステムおよびAlibaba Cloudサービス)
Yuntu (Antグループ)
strace (Shenma)
X-ray (AWS)
分散トレーシングシステムは急速に多くのバリエーションに発展しました。 ほとんどの場合、分散トレースシステムは次のコアステップに基づいて機能します。
コード追跡
データストレージ
クエリ表示
次の図は、分散呼び出しのライフサイクルを示しています。 クライアントがリクエストを開始すると、リクエストはまずロードバランサーに送信されます。 次に、リクエストは認証および課金サービスによって処理されます。 要求されたリソースが割り当てられ、プロビジョニングされる。 ライフサイクルの終わりに、システムは要求の結果を返します。
ほとんどの場合、分散トレースシステムはデータを収集して保存した後、タイムラインを含む時系列グラフを使用してトレースを表示します。 ただし、データ収集中、収集ログとユーザーコードのビジネスロジックは深く統合され、異なるシステムのAPIは互換性がありません。 これにより、トレースシステムを切り替えるときに問題が発生する可能性があります。 
OpenTracing
異なる分散トレーシングシステム間のAPI互換性の問題を防ぐために、OpenTracing仕様が開発されています。 OpenTracing は、軽量の標準化レイヤーで、 アプリケーション / クラスライブラリと、トレーシングまたはログ分析プログラムの中間に位置します。 詳細については、「OpenTracing」をご参照ください。
利点
OpenTracingは、Cloud Native Computing Foundation (CNCF) のメンバーであり、グローバル分散トレースシステムの標準概念とデータ標準を提供しています。
OpenTracingは、プラットフォームに中立なAPIとベンダーに中立なAPIを提供します。 これにより、開発者はトレースシステムを効率的に追加または切り替えることができます。
データモデル:
OpenTracingでは、スパンはトレースの主要なビルディングブロックです。 トレースは、複数のスパンで構成される有向非巡回グラフ (DAG) と見なされます。 Span 間の関係は参照と呼ばれます。 8つのスパンで構成されるトレースの例を次に示します。
単一のトレース内のスパン間の因果関係の
Causal relationships between spans in a single trace [Span A] ←←←(the root span) | +------+------+ | | [Span B] [Span C] ←←←(ChildOf: Span C is a child node of Span A.) | | [Span D] +---+-------+ | | [Span E] [Span F] >>> [Span G] >>> [Span H] ↑ ↑ ↑ (FollowsFrom: Span G is invoked after Span F is invoked.)タイムラインベースの時系列チャートは、より直感的な方法でトレースを表示できます。 例:
単一のトレース内のスパン間の時間関係の
Time relationships between spans in a single trace ––|–––––––|–––––––|–––––––|–––––––|–––––––|–––––––|–––––––|–> time [Span A···················································] [Span B··············································] [Span D··········································] [Span C········································] [Span E·······] [Span F··] [Span G··] [Span H··]各スパンには、次のオブジェクトが含まれます。
操作名
操作の開始タイムスタンプ。
操作の終了タイムスタンプ。
スパンタグのセット。 スパンタグはキーと値のペアです。 キーと値のペアでは、キーは文字列である必要があり、値は文字列、ブール値、または数値のいずれかです。
スパンログのセット。 ログには、キーと値のペアとタイムスタンプが含まれます。 キーと値のペアでは、キーは文字列である必要があり、値は任意のデータ型にすることができます。 ただし、一部のOpenTracingトレーサーはすべてのデータ型をサポートしない場合があります。
SpanContextで指定されたスパンのコンテキスト。 各コンテキストには、次の情報が含まれます。
現在のトレースステータス。トレースIDまたはスパンIDを指定できます。 OpenTracingトレーサーは、指定されたスパンに基づいてプロセス境界を越えて現在のトレースステータスを送信する必要があります。
キーと値のペアである手荷物アイテムは、トレースに含まれます。 キーと値のペアは、プロセス境界を越えて送信する必要があります。
参照は、ゼロまたは複数の関連スパン間の関係を示します。 関係は、SpanContextによって指定されるコンテキストに基づいてスパン間で確立される。
OpenTracingデータモデルの詳細については、「OpenTracingデータモデル」をご参照ください。
すべてのOpenTracing実装の詳細については、「OpenTracing」をご参照ください。 JaegerとZipkinが広く使われています。 詳細については、「Jaeger」および「Zipkin」をご参照ください。
Jaeger
Jaegerは、Uberが提供するオープンソースの分散トレースシステムです。 JaegerはOpenTracing APIと互換性があります。 
上の図は、JAEGER公式Webサイトからのものです。
Jaegerには次のコンポーネントが含まれています。
jaeger-client: OpenTracing仕様に準拠した言語固有のSDKを実装します。 アプリケーションがAPI操作を呼び出してデータを書き込むと、クライアントライブラリは、アプリケーションで指定されたサンプリングポリシーに基づいてトレース情報をjaeger-agentコンポーネントに送信します。
jaeger-agent: UDPポートを監視するネットワークデーモンとして機能します。 jaeger-agentコンポーネントは、スパンデータを受信し、そのスパンデータをjaeger-collectorコンポーネントにバッチで送信します。 jaeger-agentは、すべてのホストにデプロイされる基本コンポーネントです。 jaeger-agentは、jaeger-collectorコンポーネントからクライアントライブラリを切り離します。 この場合、クライアントライブラリはデータをルーティングしたり、jaeger-collectorコンポーネントを検出したりできません。
jaeger-collector: jaeger-agentコンポーネントからデータを受け取り、そのデータをデータストアに書き込みます。 jaeger-collectorはステートレスなコンポーネントです。 任意の数のjaeger-collectorコンポーネントを実行できます。
データストア: Apache CassandraおよびElasticsearchにデータを書き込むためのプラグイン可能なコンポーネントとして機能します。
jaeger-query: クエリ要求を受信し、データストアからトレース情報を取得して、結果をユーザーインターフェイス (UI) に表示します。 jaeger-queryはステートレスなコンポーネントです。 jaeger-queryコンポーネントの複数のインスタンスを起動し、NGINXロードバランサーの背後にインスタンスをデプロイできます。
Alibaba Cloud Simple Log ServiceのJaeger
Jaeger on Alibaba Cloud Simple Log Serviceは、Jaegerベースの分散トレースシステムで、トレースデータを永続ストレージ用のSimple Log Serviceに保存します。 追跡データは、Jaeger APIを使用して照会および表示できます。 詳細については、「Alibaba Cloud Simple Log ServiceのJaeger」をご参照ください。 
利点
Jaegerを使用すると、永続的なストレージのためにApache CassandraとElasticsearchにデータを保存できます。 データストアの安定性を維持し、ストレージ容量を調整する必要があります。 Alibaba Cloud Simple Log ServiceのJaegerは、Simple Log Serviceの機能を利用して大量のデータを処理します。 このようにして、データストアに集中することなく、Jaeger分散トレーシングテクノロジを使用できます。
Jaeger UIはトレースのクエリと表示に使用できますが、分析とトラブルシューティングのサポートは不十分です。 Alibaba Cloud Simple Log ServiceのJaegerでは、Simple Log Serviceのクエリおよび分析機能を使用して、システムの問題を効率的に分析できます。
Alibaba Cloud Simple Log ServiceでJaegerを設定する方法の詳細については、「GitHub」をご参照ください。