すべてのプロダクト
Search
ドキュメントセンター

Alibaba Cloud Service Mesh:Managed Service for OpenTelemetry を使用した ASM インスタンス内外のアプリケーションのトレース

最終更新日:Mar 11, 2026

Service Mesh (ASM) は、ASM インスタンス内にデプロイされたアプリケーションをトレースできます。外部アプリケーションがメッシュ内のアプリケーションを呼び出す場合、ASM 単独では、それらのスパンを単一のエンドツーエンドトレースに相関させることはできません。OpenTelemetry 向けマネージドサービスは、両方の環境からスパンを収集し、それらを統合されたコールトレースにアセンブルすることで、このギャップを埋めます。

次の例は、このワークフローを示しています。外部 Python アプリケーション (ExternalProxy) が ASM インスタンス内の Bookinfo Productpage マイクロサービスを呼び出し、OpenTelemetry 向けマネージドサービスがそれらの間の境界を越えたコールトレースを生成します。

境界を越えたトレースの仕組み

リクエストが外部アプリケーションからメッシュに流れるとき、エンドツーエンドトレースは HTTP ヘッダーを介したトレースコンテキスト伝播 に依存します。プロセスは次のとおりです。

  1. 外部アプリケーションはルートスパンを作成し、B3 トレースヘッダーをアウトバウンド HTTP リクエストに挿入し、そのスパンをトレースバックエンドにレポートします。

  2. ASM イングレスゲートウェイはリクエストを受信し、B3 ヘッダーをアップストリームサービスに転送し、その過程で独自の子スパンを作成します。

  3. 各メッシュ内サービスのサイドカープロキシは、ヘッダーの転送と子スパンの作成を継続します。

  4. すべてのスパンが同じトレース ID を共有するため、トレースバックエンドはそれらを 1 つのコールトレースにアセンブルします。

Zipkin 互換のトレースには、次の B3 ヘッダーを伝播する必要があります。

ヘッダー目的
X-B3-TraceId全体のトレースを識別します
X-B3-SpanId現在のスパンを識別します
X-B3-ParentSpanId親スパンを識別します
重要

サイドカープロキシは、リクエスト内のすべてのコンテンツ (ヘッダーと本文) をアップストリームサービスに転送します。ただし、ご利用のアプリケーションコードは、Istio コミュニティの仕様に従って、トレース関連のリクエストヘッダーをアップストリームサービスに明示的に伝播する必要があります。ヘッダーが伝播されない場合、トレースバックエンドはスパンを相関させることができず、トレースは分断されたフラグメントとして表示されます。

前提条件

開始する前に、以下を確認してください。

例のシナリオについて

  • この例では、ExternalProxy と呼ばれる Python アプリケーションを ASM インスタンスの外部にデプロイします。ExternalProxy はポート 5000 で HTTP サーバーを実行します。そのルートパス (/) にアクセスされると、イングレスゲートウェイを介して ASM インスタンス内の Bookinfo アプリケーションの Productpage マイクロサービスを呼び出します。

  • OpenTelemetry 向けマネージドサービスの代わりに Zipkin 互換のカスタムトレースシステムを使用する場合は、ステップ 2 をスキップして、直接 ステップ 3 に進みます。OpenTelemetry 向けマネージドサービスのエンドポイントを、ご利用のカスタムトレースシステムのエンドポイントに置き換えてください。

ステップ 1: ASM インスタンス内への Bookinfo のデプロイ

ASM インスタンスに追加された ACK クラスターに Bookinfo サンプルアプリケーションをデプロイします。Istio GitHub リポジトリから各 YAML ファイルをダウンロードし、kubectl を使用して適用します。

説明

Bookinfo アプリケーションリソースは ${DATA_PLANE_KUBECONFIG} (ACK クラスター kubeconfig) を使用して適用され、仮想サービス、宛先ルール、およびゲートウェイは ${ASM_KUBECONFIG} (ASM コントロールプレーン kubeconfig) を使用して適用されます。

  1. Bookinfo アプリケーションをデプロイします。YAML ファイルは GitHub からダウンロードしてください。

       kubectl --kubeconfig=${DATA_PLANE_KUBECONFIG} apply -f bookinfo.yaml
  2. 仮想サービスをデプロイします。YAML ファイルは GitHub からダウンロードしてください。

       kubectl --kubeconfig=${ASM_KUBECONFIG} apply -f virtual-service-all-v1.yaml
  3. 宛先ルールをデプロイします。YAML ファイルは GitHub からダウンロードしてください。

       kubectl --kubeconfig=${ASM_KUBECONFIG} apply -f destination-rule-all.yaml
  4. ゲートウェイをデプロイします。YAML ファイルは GitHub からダウンロードしてください。

       kubectl --kubeconfig=${ASM_KUBECONFIG} apply -f bookinfo-gateway.yaml

ステップ 2: OpenTelemetry 向けマネージドサービスのエンドポイントの取得

OpenTelemetry 向けマネージドサービスコンソールから Zipkin V1 エンドポイントを取得します。ExternalProxy はそのトレースデータをこのエンドポイントにレポートします。

  1. OpenTelemetry 向けマネージドサービスOpenTelemetry 向けマネージドサービスコンソールにログインします。左側のナビゲーションウィンドウで、[概要] をクリックします。

  2. [概要] ページで、[アクセスプロセス] タブをクリックし、[アクセスポイント情報の表示] をクリックします。

  3. ページ上部で、ACK クラスターがデプロイされているリージョンを選択します。

    重要

    Bookinfo が実行されている ACK クラスターと同じリージョンを選択します。異なるリージョンを選択した場合、トレースデータを OpenTelemetry 向けマネージドサービスにレポートできません。

  4. アクセスポイント情報」タブで、[クラスター情報] パラメーターの [トークンを表示] を有効にします。ExternalProxy アプリケーションをデプロイする場所に応じて、Zipkin V1 エンドポイント(パブリックまたはプライベート)をコピーします。

    Access point information

ステップ 3: ExternalProxy アプリケーションのデプロイ

ExternalProxy アプリケーションを作成して実行します。ExternalProxy は、py_zipkin ライブラリを使用してアウトバウンドリクエストに B3 トレースヘッダーを計測し、ステップ 2 で取得した Zipkin V1 エンドポイントにスパンをレポートします。

  1. 次の内容で ExternalProxy.py という名前のファイルを作成します。保存する前に、2 つのプレースホルダーを実際の値に置き換えてください。

    プレースホルダー説明
    ${XTRACE_ZIPKIN_V1_ENDPOINT}ステップ 2 で取得した Zipkin V1 エンドポイント。トレースデータをカスタムトレースシステムにレポートする必要がある場合は、カスタムトレースシステムのアクセスエンドポイントを使用します。
    ${INGRESS_GATE_WAY_IP}ACK クラスターにデプロイされたイングレスゲートウェイのエンドポイント

    ExternalProxy.py を展開して表示

       import requests
       from flask import Flask
       from py_zipkin.zipkin import zipkin_span,create_http_headers_for_new_span
       from py_zipkin.util import generate_random_64bit_string
       from py_zipkin.util import ZipkinAttrs
       import time
    
       app = Flask(__name__)
    
       def do_stuff(trace_id, span_id, parent_span_id):
           time.sleep(2)
           headers = create_http_headers_for_new_span()
           headers["X-B3-TraceId"] = trace_id
           headers["X-B3-SpanId"] = span_id
           headers["X-B3-ParentSpanId"] = parent_span_id
           print "SEND TO INGRESS HEADERS : {0}".format(headers)
           r = requests.get('http://${INGRESS_GATE_WAY_IP}/productpage', headers=headers)
           return 'OK'
    
    
       def http_transport(encoded_span):
           # encoding prefix explained in https://github.com/Yelp/py_zipkin#transport
           body=encoded_span
           zipkin_url="${XTRACE_ZIPKIN_V1_ENDPOINT}"
           headers = {"Content-Type": "application/x-thrift"}
    
           # You'd probably want to wrap this in a try/except in case POSTing fails
           r=requests.post(zipkin_url, data=body, headers=headers)
           print(body)
    
    
       @app.route('/')
       def index():
           with zipkin_span(
               service_name='external-proxy',
               span_name='external-proxy/inbound',
               transport_handler=http_transport,
               port=5000,
               sample_rate=100,
           ) as inbound_span:
           do_stuff(inbound_span.zipkin_attrs.trace_id, inbound_span.zipkin_attrs.span_id, inbound_span.zipkin_attrs.parent_span_id)
    
           return 'OK', 200
    
       if __name__=='__main__':
           app.run(host="0.0.0.0",port=5000,debug=True)
  2. ExternalProxy を起動します。期待される出力:

       python ExternalProxy.py
        * Serving Flask app "main" (lazy loading)
        * Environment: production
          WARNING: This is a development server. Do not use it in a production deployment.
          Use a production WSGI server instead.
        * Debug mode: on
        * Running on http://0.0.0.0:5000/ (Press CTRL+C to quit)
        * Restarting with stat
        * Debugger is active!
        * Debugger PIN: 317-792-686
  3. ExternalProxy にリクエストを送信します。期待される出力:

       curl localhost:5000
       OK

ステップ 4: コールトレースの表示

ExternalProxy が Bookinfo を正常に呼び出した後、OpenTelemetry 向けマネージドサービスでエンドツーエンドトレースを確認します。

  1. OpenTelemetry 向けマネージドサービス コンソールにログインします。

  2. 左側のナビゲーションウィンドウで、[アプリケーション] をクリックします。ページの上部で、ACK クラスターが存在するリージョンを選択します。アプリケーションリストで ExternalProxy をクリックします。

  3. 左側のナビゲーションウィンドウで、[アプリケーション詳細] をクリックします。[トレース] タブをクリックし、確認したい呼び出しトレースのトレース ID をクリックします。トレースには、ExternalProxy (メッシュ外) がイングレスゲートウェイ経由で Bookinfo Productpage サービス (メッシュ内) を呼び出す完全なリクエストパスが表示されます。