このトピックでは、Tracing Analysis を使用する前に理解しておく必要がある用語について説明します。このトピックは、分散トレーシングシステムの目的、トレースとは何か、Tracing Analysis が依存する OpenTracing データモデル、および Tracing Analysis へのデータの報告方法を理解するのに役立ちます。
分散トレーシングシステムが必要な理由
さまざまな複雑なビジネス要件に対応するために、開発者はアジャイル開発や継続的インテグレーションなどの開発手法を採用しています。システムアーキテクチャは、スタンドアロンの大規模ソフトウェアからマイクロサービスベースのアーキテクチャへと進化しました。マイクロサービスは、異なるソフトウェアセット上に構築されています。これらのソフトウェアセットは、異なるチームによって開発されたり、異なるプログラミング言語で実装されたり、複数のサーバーでリリースされたりする可能性があります。そのため、1 つのサービスでエラーが発生した場合、数十のアプリケーションでサービス例外が発生する可能性があります。
分散トレーシングシステムは、リモートメソッド呼び出しの実行プロセスや時間消費などのリクエスト情報を記録できます。分散トレーシングシステムは、システムの問題やシステムパフォーマンスのトラブルシューティングを行うための重要なツールです。
トレースとは
一般に、トレースは、分散システムにおけるトランザクションまたはプロセスの実行プロセスを表します。OpenTracing 標準では、トレースは複数のスパンで構成される有向非巡回グラフ (DAG) です。各スパンは、トレース内で連続的に実行される名前付きの時間セグメントを表します。
次の図は、分散呼び出しの例を示しています。クライアントがリクエストを開始すると、リクエストは最初にロードバランサーに送信されます。リクエストは、認証サービスと課金サービスによって処理されます。次に、リクエストは要求されたリソースに送信されます。最後に、システムは結果を返します。

分散トレーシングシステムは、データを収集して保存した後、通常、タイムラインを含むシーケンス図を使用してトレースを表示します。

OpenTracing データモデル
概要
OpenTracing では、トレースは、トレースに属するスパンによって暗黙的に定義されます。トレースは、複数のスパンで構成される DAG と考えることができます。スパン間の関係は、参照と呼ばれます。次の例のトレースは、8 つのスパンで構成されています。
単一トレース内のスパン間の因果関係
[Span A] ←←←(ルートスパン)
|
+------+------+
| |
[Span B] [Span C] ←←←(ChildOf: Span C は Span A の子ノードです。)
| |
[Span D] +---+-------+
| |
[Span E] [Span F] >>> [Span G] >>> [Span H]
↑
↑
↑
(FollowsFrom: Span G は Span F の後に呼び出されます。)場合によっては、タイムラインを含むシーケンス図の方がトレースをうまく表示できます。
単一トレース内のスパン間の時間関係
––|–––––––|–––––––|–––––––|–––––––|–––––––|–––––––|–––––––|–> 時間
[Span A···················································]
[Span B··············································]
[Span D··········································]
[Span C········································]
[Span E·······] [Span F··] [Span G··] [Span H··]トレース
Tracer インターフェースは、span を作成するための startSpan メソッド、コンテキストを抽出するための Extract メソッド、およびコンテキストを挿入するための Inject メソッドを提供します。Tracer インターフェースは、次の機能を提供します。
span を作成するか、span のプロパティを設定します。
/** スパンを作成して開始します。次に、スパンを返します。スパンには、操作名と指定されたオプションが含まれています。 ** 例: ** 親スパンを持たないスパンを作成します。 ** sp := tracer.StartSpan("GetFeed") ** 親スパンを持つスパンを作成します。 ** sp := tracer.StartSpan("GetFeed",opentracing.ChildOf(parentSpan.Context())) **/ StartSpan(operationName string, opts ...StartSpanOption) Span各スパンには、次のオブジェクトが含まれています。
- 操作名。スパン名とも呼ばれます。
- 開始タイムスタンプ。
- 終了タイムスタンプ。
- スパンタグのコレクション。各タグはキーと値のペアです。キーと値のペアでは、キーは文字列でなければならず、値は文字列、ブール値、または数値です。
- スパンログのコレクション。各ログは、キーと値のペアとタイムスタンプで構成されます。キーと値のペアでは、キーは文字列でなければならず、値は任意のタイプです。
- SpanContext。各 SpanContext は、次のステータスデータを保持します。
- トレース ID やスパン ID など、スパンを識別するステータスデータ。OpenTracing 実装は、プロセス境界を越えて現在のトレースのステータスを送信するために、個別のスパンに依存します。
- トレースに含まれるキーと値のペアである baggage 項目。これらのキーと値のペアも、プロセス境界を越えて送信する必要があります。
- スパン間の関係を示す参照。参照には、関連するスパンが 0 個以上含まれる場合があります。スパンは、SpanContext に基づいて関係を確立します。
- データを挿入します。
データを挿入するには、次の手順を実行します。
キャリアから SpanContext を抽出します。
// Inject() は `sm` SpanContext インスタンスを取得し、`carrier` 内に挿入して // 伝播します。`carrier` の実際のタイプは、`format` の値によって異なります。 /** format パラメーターに基づいて、キャリアからトレース ID、スパン ID、baggage 項目などの SpanContext を抽出します。 ** 例: ** carrier := opentracing.HTTPHeadersCarrier(httpReq.Header) ** clientContext, err := tracer.Extract(opentracing.HTTPHeaders, carrier) **/ Extract(format interface{}, carrier interface{}) (SpanContext, error)SpanContext をキャリアに挿入します。
/** ** format パラメーターに基づいて、トレース ID、スパン ID、baggage 項目などの SpanContext をキャリアに挿入します。 ** 例: ** carrier := opentracing.HTTPHeadersCarrier(httpReq.Header) ** err := tracer.Inject(span.Context(), opentracing.HTTPHeaders, carrier) **/ Inject(sm SpanContext, format interface{}, carrier interface{}) error
データの報告方法
次の図は、エージェントを使用せずにデータを報告する方法を示しています。

次の図は、エージェントを使用してデータを報告する方法を示しています。
