このトピックでは、Application Real-Time Monitoring Service (ARMS) でサポートされているトレースプロトコルについて説明します。
EagleEye プロトコル
EagleEye プロトコルは ARMS によって開発され、Alibaba Cloud で広く使用されています。
プロトコルヘッダーには、次の情報が含まれています。
EagleEye-TraceID: 32 ビット文字列。形式:
ea<8-bit IP code><13-bit timestamp><4-bit incremental ID>d<4-bit PID>
。例:eac0a8020216868084400006973d000a
。EagleEye-RpcID: スパン間の階層関係。例: 0、0.1、0.2、0.1.1。この例では、0 が親スパン、0.1 と 0.2 が子スパンです。
EagleEye-SpanID: オープンソースの冗長フィールドと互換性のあるランダムな長整数。
EagleEye-pSpanID: オープンソースの冗長フィールドと互換性のあるランダムな長整数。
EagleEye-Sampled: トレースがサンプリングされるかどうかを指定します。
EagleEye-pAppName: アップストリームアプリケーション。
EagleEye-pRpc: アップストリームアプリケーションインターフェース。
EagleEye-UserData: トレースで伝播される baggage。形式:
k1=v1&k2&v2
。
OpenTelemetry プロトコル
OpenTelemetry プロトコルは、OpenTelemetry で使用されるデフォルトのプロトコルです。
プロトコルヘッダーには、次の情報が含まれています。
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 エージェントは、現在の環境で使用されているプロトコルを自動的に識別します。現在の環境でプロトコルが使用されていない場合は、デフォルトで ARMS トレースプロトコルが使用されます。
A、B、C が異なるアプリケーションであるとします。リクエストを受信すると、システムは ARMS、Jaeger、Zipkin、SkyWalking、OpenTelemetry のプロトコルヘッダーが順番に存在するかどうかを確認します。上記のいずれかのプロトコルヘッダーが存在する場合、対応するプロトコルが使用されます。それ以外の場合、デフォルトで ARMS トレースプロトコルが使用されます。