概要
分散トレーシングを使用すると、ユーザーは複数のサービスに分散されたメッシュを介してリクエストを追跡できます。これにより、視覚化を通じてリクエストの遅延、シリアル化、並列処理についてより深く理解できます。
Istioは、Envoyの分散トレーシング機能を利用して、すぐに使えるトレーシング統合を提供します。具体的には、Istioは、さまざまなトレーシングバックエンドをインストールし、プロキシがトレーススパンをそれらに自動的に送信するように構成するためのオプションを提供します。Zipkin、Jaeger、およびLightstepのタスクドキュメントを参照して、Istioがこれらのトレーシングシステムとどのように連携するかを確認してください。
トレースコンテキストの伝播
Istioプロキシは自動的にスパンを送信できますが、それらのスパンを単一のトレースに結合するためには追加の情報が必要です。アプリケーションは、プロキシがスパンを送信する際に、バックエンドがそれらを単一のトレースに結合できるように、この情報をHTTPヘッダーで伝播する必要があります。
これを行うために、各アプリケーションは各着信リクエストからヘッダーを収集し、その着信リクエストによってトリガーされるすべての発信リクエストにヘッダーを転送する必要があります。転送するヘッダーの選択は、設定されたトレースバックエンドに依存します。転送するヘッダーのセットは、各トレースバックエンド固有のタスクページに記載されています。以下に概要を示します。
すべてのアプリケーションは、次のヘッダーを転送する必要があります。
x-request-id
: これは、ログとトレースを一貫してサンプリングするために使用されるEnvoy固有のヘッダーです。
Zipkin、Jaeger、およびStackdriverの場合、B3マルチヘッダー形式を転送する必要があります。
x-b3-traceid
x-b3-spanid
x-b3-parentspanid
x-b3-sampled
x-b3-flags
これらは、Zipkin、Jaeger、およびその他多くのツールでサポートされています。
Datadogの場合、以下のヘッダーを転送する必要があります。これらの転送は、多くの言語およびフレームワーク向けに、Datadogクライアントライブラリによって自動的に処理されます。
x-datadog-trace-id
.x-datadog-parent-id
.x-datadog-sampling-priority
.
Lightstepの場合、OpenTracingスパンコンテキストヘッダーを転送する必要があります。
x-ot-span-context
Stackdriverの場合、B3マルチヘッダー形式の代わりに、以下のヘッダーのいずれかを使用することもできます。
grpc-trace-bin
: 標準のgrpcトレースヘッダー。traceparent
: トレース用のW3Cトレースコンテキスト標準。OpenTelemetryおよびJaegerクライアントライブラリでますますサポートされています。x-cloud-trace-context
: Google Cloud製品APIで使用されます。
たとえば、サンプルPythonのproductpage
サービスを見ると、アプリケーションがOpenTracingライブラリを使用して、HTTPリクエストからすべてのトレーサーに必要なヘッダーを抽出していることがわかります。
def getForwardHeaders(request):
headers = {}
# x-b3-*** headers can be populated using the opentracing span
span = get_current_span()
carrier = {}
tracer.inject(
span_context=span.context,
format=Format.HTTP_HEADERS,
carrier=carrier)
headers.update(carrier)
# ...
incoming_headers = ['x-request-id',
'x-ot-span-context',
'x-datadog-trace-id',
'x-datadog-parent-id',
'x-datadog-sampling-priority',
'traceparent',
'tracestate',
'x-cloud-trace-context',
'grpc-trace-bin',
'user-agent',
'cookie',
'authorization',
'jwt',
]
# ...
for ihdr in incoming_headers:
val = request.headers.get(ihdr)
if val is not None:
headers[ihdr] = val
return headers
レビューアプリケーション(Java)は、requestHeaders
を使用して同様のことを行っています。
@GET
@Path("/reviews/{productId}")
public Response bookReviewsById(@PathParam("productId") int productId, @Context HttpHeaders requestHeaders) {
// ...
if (ratings_enabled) {
JsonObject ratingsResponse = getRatings(Integer.toString(productId), requestHeaders);
アプリケーションでダウンストリーム呼び出しを行う場合は、これらのヘッダーを含めるようにしてください。