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

Alibaba Cloud Service Mesh:メッシュ内外のアプリケーションに対する統一されたトレースの実装

最終更新日:Jun 22, 2026

Alibaba Cloud Service Mesh (ASM) は、サービスメッシュ内のアプリケーションに対してすぐに使えるトレース機能を提供します。しかし、メッシュ内のサービスと通信する外部アプリケーションを含むエンドツーエンドのトレースを実現するには、OpenTelemetry 向けマネージドサービスを使用してコールトレースを統一する必要があります。このガイドでは、OpenTelemetry 向けマネージドサービスを使用して、外部アプリケーションから ASM インスタンス内のアプリケーションへのリクエストをトレースし、単一の統一されたコールトレースを作成する方法を説明します。

前提条件

注意事項

  • このガイドでは、ExternalProxy という名前の Python アプリケーションをデプロイします。このアプリケーションは HTTP サーバーを実行します。ExternalProxy のルートパスにアクセスすると、サービスメッシュ内で実行されている Bookinfo アプリケーションの `productpage` サービスが呼び出されます。

  • このガイドでは、トレースバックエンドとして OpenTelemetry 向けマネージドサービスを使用します。Zipkin と互換性のある自己管理型のトレースシステムを使用する場合は、そのレポート用エンドポイントを外部アプリケーションに公開してください。その場合、「ステップ 2:OpenTelemetry エンドポイントの取得」をスキップし、システムのレポート用アドレスを使用して直接「ステップ 3:メッシュ外の ExternalProxy アプリケーションのデプロイ」に進むことができます。

ステップ 1:メッシュ内の Bookinfo アプリケーションのデプロイ

  1. 次のコマンドを実行して、Bookinfo アプリケーションを ASM インスタンス内のクラスターにデプロイします。

    Bookinfo アプリケーションの YAML ファイルは GitHub からダウンロードできます。

    kubectl --kubeconfig=${DATA_PLANE_KUBECONFIG} apply -f bookinfo.yaml
  2. 次のコマンドを実行して、Bookinfo アプリケーションの VirtualService をデプロイします。

    VirtualService の YAML ファイルは GitHub からダウンロードできます。

    kubectl --kubeconfig=${ASM_KUBECONFIG} apply -f virtual-service-all-v1.yaml
  3. 次のコマンドを実行して、Bookinfo アプリケーションの DestinationRule をデプロイします。

    DestinationRule の YAML ファイルは Github からダウンロードできます。

    kubectl --kubeconfig=${ASM_KUBECONFIG} apply -f destination-rule-all.yaml
  4. 次のコマンドを実行して、Bookinfo アプリケーションの Gateway をデプロイします。

    Gateway の YAML ファイルは GitHub からダウンロードできます。

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

ステップ 2:OpenTelemetry エンドポイントの取得

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

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

  3. エンドポイントを表示します。

    1. ページ上部で、対象のリージョンを選択します。

      Bookinfo アプリケーションの ACK クラスターがデプロイされているリージョンを選択する必要があります。そうしないと、トレースデータを関連付けることができません。

    2. [アクセスポイント情報] タブで、[トークンの表示] スイッチをオンにします。ExternalProxy アプリケーションがデプロイされている場所に基づいて、パブリックネットワークまたはプライベートネットワークのエンドポイントを選択します。

      ExternalProxy は Zipkin v1 API を使用してデータをレポートするため、v1 エンドポイントが必要です。[Zipkin] タブをクリックし、表から適切なエンドポイントを見つけます。通常は v2 エンドポイントを使用すべきですが、Istio や Molten の統合といった特定のシナリオでは v1 エンドポイントが必要です。Sleuth コンポーネントを使用する場合、ベース URL に /api/v2/spans を含めてはいけません。

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

重要
  • サイドカープロキシは、HTTP ヘッダーやリクエストボディを含む、受信リクエストのすべての部分をアップストリームサービスに転送します。これは、トレース関連のヘッダーも転送されることを意味します。

  • トレースコンテキストの伝播を確実にするには、アプリケーションが標準的なコミュニティの慣行に従い、アウトバウンドリクエストに必要なトレースヘッダーを転送する必要があります。

  1. 次のコードを ExternalProxy.py という名前のファイルとして、外部アプリケーションの実行環境に保存します。

    • {XTRACE_ZIPKIN_V1_ENDPOINT} を前のステップで取得したエンドポイントに置き換えます。自己管理型のトレースシステムにレポートする場合は、そのレポート用エンドポイントを使用します。

    • {INGRESS_GATE_WAY_IP} をご利用の ACK クラスターのイングレスゲートウェイの IP アドレスに置き換えます。

      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:トレース情報の表示

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

  2. 左側のナビゲーションウィンドウで[アプリケーション]をクリックし、ページの上部でリージョンを選択して、アプリケーション一覧で ExternalProxy をクリックします。

  3. 左側のナビゲーションウィンドウで、[アプリケーション詳細] をクリックします。[トレース] タブをクリックし、次に [トレース ID] をクリックして呼び出しトレースの詳細を表示します。

    これで、外部アプリケーション ExternalProxy とメッシュ内の Bookinfo アプリケーションとの間に完全なコールトレースが形成されました。トレース詳細ページの上部には、開始時刻期間サービス深さ合計スパン数などの概要情報が表示されます。概要の下には、各スパンの階層関係を示すツリービューが表示されます。列には、スパン名タイムラインサービス名開始時刻IP アドレスステータスが含まれます。この例では、コールトレースは `external-proxy` から始まり、`productpage` を経由して、`details`、`reviews`、`ratings` の各サービスを順番に呼び出します。`ahas_rate_limit_cluster` のレート制限スパンなど、一部のスパンはエラーステータスで表示される場合があります。