Service Mesh (ASM) は Managed Service for OpenTelemetry と統合されており、マイクロサービスのエンドツーエンドの可視性を提供します。分散トレーシングを有効にすると、トレースデータの表示、トレースポロジの表示、アプリケーションの依存関係の分析、サービス間のリクエスト数の追跡が可能になります。
仕組み
ASM インスタンスのサイドカープロキシは、メッシュを通過するすべてのリクエストに対して自動的にスパンを生成し、送信します。しかし、プロキシだけではスパンを完全なエンドツーエンドのトレースに相関させることはできません。スパンを接続するには、アプリケーションがトレースコンテキストヘッダーを伝播させる必要があります。つまり、各受信リクエストから、その受信リクエストによってトリガーされるすべての送信リクエストに特定のヘッダーを転送する必要があります。
ヘッダーの伝播がない場合、トレーシングバックエンドは分離されたスパンを受信し、それらを単一のトレースに結合できません。プロキシが生成した各スパンは、関連性のない個別のエントリとして表示されます。
トレースコンテキストヘッダー
ASM は、B3 と W3C Trace Context の 2 つの伝播フォーマットをサポートしています。デフォルトのフォーマットは ASM インスタンスのバージョンによって異なります。
ASM インスタンスのバージョン V1.18.0.124 以前では、デフォルトで B3 プロパゲーターが使用されます。バージョン V1.18.0.124 以降の ASM インスタンスでは、デフォルトで W3C Trace Context プロパゲーターが使用されます。
B3 伝播ヘッダー
B3 伝播を使用する場合は、次のヘッダーを転送します:
-
x-request-id -
x-b3-traceid -
x-b3-spanid -
x-b3-parentspanid -
x-b3-sampled -
x-b3-flags -
x-ot-span-context
W3C Trace Context ヘッダー
W3C Trace Context 伝播を使用する場合は、次のヘッダーを転送します:
-
traceparent -
tracestate
前提条件
開始する前に、次のものが揃っていることを確認してください:
-
ご利用の Alibaba Cloud アカウントで Managed Service for OpenTelemetry が有効化されていること。課金の詳細については、「課金ルール」をご参照ください。
-
Managed Service for OpenTelemetry が有効になっている ASM インスタンス。設定手順については、「ASM トレーシングデータを Managed Service for OpenTelemetry に収集する」をご参照ください。
-
ASM インスタンスに追加された ACK クラスターにデプロイされたアプリケーション。「ASM インスタンスに追加された ACK クラスターにアプリケーションをデプロイする」をご参照ください。
アプリケーションでのトレースコンテキストヘッダーの伝播
Bookinfo サンプルアプリケーションは、さまざまな言語でトレースコンテキストヘッダーを伝播する方法を示しています。
productpage サービス (Python)
productpage サービスは OpenTracing ライブラリを使用して B3 ヘッダーを抽出し、転送します:
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']
# ...
for ihdr in incoming_headers:
val = request.headers.get(ihdr)
if val is not None:
headers[ihdr] = val
return headers
reviews サービス (Java)
reviews サービスは、受信リクエストから B3 ヘッダーを抽出し、ダウンストリームの呼び出しに渡します:
@GET
@Path("/reviews/{productId}")
public Response bookReviewsById(@PathParam("productId") int productId,
@HeaderParam("end-user") String user,
@HeaderParam("x-request-id") String xreq,
@HeaderParam("x-b3-traceid") String xtraceid,
@HeaderParam("x-b3-spanid") String xspanid,
@HeaderParam("x-b3-parentspanid") String xparentspanid,
@HeaderParam("x-b3-sampled") String xsampled,
@HeaderParam("x-b3-flags") String xflags,
@HeaderParam("x-ot-span-context") String xotspan) {
if (ratings_enabled) {
JsonObject ratingsResponse = getRatings(Integer.toString(productId), user, xreq, xtraceid, xspanid, xparentspanid, xsampled, xflags, xotspan);
Bookinfo アプリケーションへのアクセス
ブラウザで次の URL を開きます:
http://{IP address of the ingress gateway}/productpage
{IP address of the ingress gateway} をご利用の ASM イングレスゲートウェイの実際の IP アドレスに置き換えてください。
OpenTelemetry コンソールでのトレースデータの表示
ヘッダー伝播を使用してアプリケーションをデプロイした後、Managed Service for OpenTelemetry コンソールでトレースデータを表示します。
アプリケーションリストの表示
[アプリケーション] ページには、モニター対象のすべてのアプリケーションのリクエスト、エラー、期間が表示されます。[タグでフィルタリング] ボタンを使用してアプリケーションをフィルタリングします。
-
左側のナビゲーションウィンドウで、[アプリケーション] をクリックします。ページの上部で、対象のリージョンを選択します。

アプリケーション詳細の表示
アプリケーション詳細ページには、アプリケーションがデプロイされている各サーバーの呼び出しトポロジー、トレース、および主要メトリックが表示されます。
-
左側のナビゲーションウィンドウで、[アプリケーション] をクリックします。対象のリージョンを選択し、アプリケーションの名前をクリックします。
-
アプリケーション詳細ページで、[概要] タブをクリックして主要メトリックを表示するか、[トレースエクスプローラー] タブをクリックしてトレースを表示します。最大 100 件のトレースが、消費時間の降順でリスト表示されます。

トレースのウォーターフォール図の表示
ウォーターフォール図には、トレース内の各スパンが、ログ生成時間、ステータス、IP アドレスまたはサーバー名、サービス名、およびタイムラインとともに表示されます。各サイドカープロキシは、リクエストのインバウンド (サーバー) 側とアウトバウンド (クライアント) 側の両方でスパンを生成するため、2 つのメッシュ化されたサービス間の単一のホップで複数のプロキシスパンが生成されます。
-
アプリケーション詳細ページで、[トレースエクスプローラー] タブをクリックします。トレースリストで、トレース ID をクリックします。
-
表示されたページでウォーターフォール図を表示します。
説明-
[IP アドレス] 列には、[アプリケーション設定] ページで設定された内容に応じて、IP アドレスまたはサーバー名が表示される場合があります。詳細については、「アプリケーションとタグの管理」をご参照ください。
-
サービス名にカーソルを合わせると、期間、開始時刻、タグ、ログイベントなどのスパン詳細が表示されます。詳細については、「アプリケーション詳細」をご参照ください。

-
よくある質問
ASM コンソールでトレーシングを有効にした後、トレースデータが表示されないのはなぜですか?
これは、1 日あたりの使用量クォータを超過した場合に発生する可能性があります。実際のデータ量が設定された制限を超えると、システムはデータ書き込みを停止し、トレースは表示されなくなります。
この問題を確認して修正するには:
-
トレースプッシュログを表示します。
-
クラスターの kubeconfig ファイルを取得し、kubectl を使用してクラスターに接続します。詳細については、「クラスターの kubeconfig ファイルを取得し、kubectl を使用してクラスターに接続する」をご参照ください。
-
次のコマンドを実行して、istio-system 名前空間の tracing-on-external-zipkin デプロイメントに関連する Pod のトレースプッシュログを表示します:
kubectl logs "$(kubectl get pods -n istio-system -l app=tracing -o jsonpath='{.items[0].metadata.name}')" -n istio-system -c nginxステータスコード 406 がトレースプッシュログに記録されます。

-
-
クォータ使用量を表示します。
-
左側のナビゲーションウィンドウで、[システム設定] を展開し、[クラスター設定] をクリックしてクォータ使用量を表示します。

実際の使用量が設定された制限を超えると、システムはデータ書き込みを停止し、トレース情報は表示されません。
-
クォータを引き上げます。
-
[クラスター設定] ページで、[クォータ設定] の下のクォータ値を増やし、[保存] をクリックします。
-
表示される [注意] ダイアログボックスで、[OK] をクリックします。
-
イングレスゲートウェイまたはサイドカーを通過した後、トレース ID が変更されるのはなぜですか?
サイドカープロキシは、不完全なトレースコンテキストを持つリクエストを受信すると、伝播ヘッダーを再生成します。トレース ID を維持するには、最低限必要なヘッダーを含めてください:
-
B3 フォーマット:
x-b3-traceidおよびx-b3-spanid -
W3C Trace Context フォーマット:
traceparent