このトピックでは、Application Real-Time Monitoring Service (ARMS) がサポートするトレース伝搬プロトコルについて説明します。
EagleEye プロトコル
EagleEye プロトコルは ARMS によって開発され、Alibaba Cloud で広く使用されています。
プロトコルヘッダーには、次の情報が含まれています。
EagleEye-TraceID: ランダムな 32 ビット文字列。
EagleEye-RpcID: スパン間の階層関係。例: 0、0.1、0.2、0.1.1。この例では、0 が親スパン、0.1 と 0.2 が子スパンです。
EagleEye-SpanID: オープンソースの冗長フィールドと互換性のあるランダムな long 整数。
EagleEye-pSpanID: オープンソースの冗長フィールドと互換性のあるランダムな long 整数。
EagleEye-Sampled: トレースがサンプリングされるかどうかを指定します。
EagleEye-pAppName: アップストリーム アプリケーション。
EagleEye-pRpc: アップストリーム アプリケーション インターフェイス。
EagleEye-UserData: トレースで伝搬される baggage。フォーマット:
k1=v1&k2=v2。
W3C プロトコル
W3C プロトコルは、World Wide Web コンソーシアム (W3C) で使用されるデフォルトのプロトコルです。.
プロトコルヘッダーには、次の情報が含まれています。
traceparent: フォーマット:
<2 ビット バージョン番号>-<32 ビット トレース ID>-<16 ビット 親スパン ID>-<サンプリング識別子>。例: :00-0af7651916cd43dd8448eb211c80319c-b7ad6b7169203331-01。tracestate: トレースで伝搬される baggage。例:
k1=v1&k2=v2。
Zipkin プロトコル
Zipkin プロトコルは、オープンソースの Zipkin で使用されます。
プロトコルヘッダーには、次の情報が含まれています。
X-B3-TraceId: 32 ビット トレース ID。例:
0af7651916cd43dd8448eb211c80319c。X-B3-SpanId: 16 ビット スパン ID。例:
b7ad6b7169203331。X-B3-ParentSpanId: 16 ビット 親スパン ID。例:
b7ad6b7169203331。X-B3-Sampled: サンプリング識別子。たとえば、1 はトレースがサンプリングされることを示し、0 はトレースがサンプリングされないことを示します。
baggage-: トレースで伝搬される baggage。例:
baggage-k1=v1, baggage-k2=v2。
Jaeger プロトコル
Jaeger プロトコルは、オープンソースの Jaeger で使用されます。
プロトコルヘッダーには、次の情報が含まれています。
uber-trace-id: フォーマット:
traceId:spanId:parentSpanId:flag。例:0af7651916cd43dd8448eb211c80319c:b7ad6b7169203331:b7ad6b7169203331:1。uberctx-: トレースで伝搬される baggage。例:
uberctx-k1=v1, uberctx-k2=v2。
SkyWalking プロトコル
SkyWalking プロトコルは、オープンソースの SkyWalking で使用されます。
sw8: 8 つのフィールドで構成されます。フィールドはハイフン (-) で区切ります。デフォルトでは、プロトコルヘッダーの最大文字数は 2,000 文字未満である必要があります。プロトコルヘッダーには、次のフィールドが含まれています。すべての文字列値は Base64 でエンコードする必要があります。
次のフィールドは必須です。
Sample: 0 または 1。0 はコンテキストが存在し、無視できることを示します。1 はトレースをサンプリングしてバックエンドに送信する必要があることを示します。
トレース ID: トレース操作の一意の識別子です。値は Base64 エンコード された文字列です。文字列は、ピリオド (.) で区切られた 3 つの long 値で構成されます。
Parent trace segment Id: グローバルに一意のセグメント ID。値は Base64 エンコードされた文字列です。
Parent span ID: 0 または正の整数。
Parent service: Base64 エンコードされた文字列。文字列は 50 文字以上の UTF-8 文字で構成されている必要があります。
Parent service instance ID: Base64 エンコードされた文字列。文字列は 50 文字以上の UTF-8 文字で構成されている必要があります。
Parent service endpoint: 親トレースセグメントの最初のエントリスパンのエンドポイント。値は Base64 エンコードされた文字列です。文字列は 50 文字以上の UTF-8 文字で構成されている必要があります。
Destination URL of the request: クライアントがアクセスしたい宛先サービスの URL。URL のフォーマットは
<IP アドレス><ポート番号>とは異なる場合があります。値は Base64 エンコードされた文字列です。
sw8 プロトコルヘッダーの例:
1-TRACEID-SEGMENTID-3-PARENT_SERVICE-PARENT_INSTANCE-PARENT_ENDPOINT-IPPORT。sw8-x: フィールドはハイフン (-) で区切ります。フィールドは拡張可能です。
追跡モードは null、0、または 1 に設定できます。デフォルト値 null または 0 は、コンテキストで生成されたすべてのスパンが分析されないことを示します。コンテキストは、追跡中に変更されない限り、デフォルトでアップストリームに伝搬されます。
トレース伝搬プロトコルを選択する
デフォルトでは、ARMS エージェントは、リクエストのヘッダーに指定されたプロトコルヘッダーが含まれているかどうかに基づいて、対応するトレース伝搬プロトコルを選択します。
A > B > C トレースを例に挙げます。ここで、A、B、C は異なる アプリケーション です。リクエストを受信すると、以下のロジックに従ってトレース伝搬プロトコルを順番に選択します。
リクエストのすべてのヘッダーで、プロトコル固有のヘッダーを検索します。
ARMS エージェント v4.x 以降では、検索順序は EagleEye、W3C、SkyWalking、Jaeger、Zipkin です。
v4.x より前の ARMS エージェントでは、検索順序は EagleEye、Jaeger、Zipkin、SkyWalking、W3C です。
特定のトレース伝搬プロトコルに対応するヘッダーが見つかった場合は、手順 2 に進みます。それ以外の場合は、手順 3 に進みます。
特定のプロトコルに対応するヘッダーが存在する場合は、まずそのプロトコルに基づいてリクエストからトレースコンテキストを復元し、次にこのプロトコルを使用して、ダウンストリーム アプリケーションへの後続の呼び出しのトレースコンテキストを伝搬します。
リクエストに有効なプロトコルヘッダーが見つからない場合は、新しいトレースコンテキストを作成し、次に優先順位が最も高いプロトコルに従ってトレースコンテキストを伝搬します。デフォルトの優先順位が最も高いプロトコルは EagleEye プロトコルです。[構成] > トレースコンテキスト伝播プロトコル設定[構成] > [カスタム構成]トレースコンテキスト伝播プロトコル設定 タブの セクションで、プロトコルの優先順位を変更できます。詳細については、「」をご参照ください。