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

Alibaba Cloud Service Mesh:ASM インスタンス内外におけるアプリケーションをトレースするために Managed Service for OpenTelemetry を使用する

最終更新日:Jan 14, 2025

サービスメッシュ(ASM)は、ASM インスタンス内にデプロイされているアプリケーションをトレースできます。ASM インスタンス内外にデプロイされているアプリケーションを同時にトレースするには、Managed Service for OpenTelemetry を使用して呼び出しトレースを生成する必要があります。このトピックでは、Managed Service for OpenTelemetry を使用して、外部アプリケーションが ASM インスタンス内のアプリケーションを呼び出すことができるようにする方法について説明します。このようにして、Managed Service for OpenTelemetry は 2 つのアプリケーション間の呼び出しトレースを生成します。

前提条件

使用上の注意

  • この例では、Python を使用してコンパイルされた ExternalProxy アプリケーションが ASM インスタンス外にデプロイされています。ExternalProxy は HTTP サーバーを使用します。ExternalProxy のルートパスにアクセスすると、HTTP サーバーは ASM インスタンス内にデプロイされている Bookinfo アプリケーションの Productpage マイクロサービスを呼び出します。

  • この例では、アプリケーションのトレースに Managed Service for OpenTelemetry を使用します。Zipkin と互換性のあるカスタムトレースシステムを使用する場合は、「手順 2:Managed Service for OpenTelemetry にアクセスするために使用するエンドポイントを取得する」をスキップして、「手順 3:ExternalProxy アプリケーションをデプロイする」に進みます。カスタムトレースシステムへの外部アクセスのエンドポイントを、トレースデータが報告されるエンドポイントに設定します。

手順 1:ASM インスタンス内に Bookinfo アプリケーションをデプロイする

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

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

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

    仮想サービスの YAML ファイルは、GitHub からダウンロードできます。

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

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

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

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

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

手順 2:Managed Service for OpenTelemetry にアクセスするために使用するエンドポイントを取得する

  1. Managed Service for OpenTelemetry コンソールにログインします。左側のナビゲーションペインで、[概要] をクリックします。

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

  3. アクセスエンドポイントを表示します。

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

      Bookinfo アプリケーションがデプロイされている ACK クラスタのリージョンを選択します。別のリージョンを選択すると、Bookinfo アプリケーションのトレースデータを Managed Service for OpenTelemetry に報告できません。

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

      この例では、ExternalProxy のトレースデータは Zipkin V1 の API を使用して報告されます。そのため、Zipkin V1 のパブリックエンドポイントまたはプライベートエンドポイントを使用する必要があります。查看接入点地址

手順 3:ExternalProxy アプリケーションをデプロイする

重要
  • サイドカープロキシは、リクエストで受信したすべてのコンテンツ(HTTP リクエストヘッダーとリクエストボディを含む)をアップストリームサービスに転送します。そのため、トレース関連のヘッダーもアップストリームサービスに転送されます。

  • トレース情報を渡すには、アプリケーションは Istio コミュニティの仕様に従って、トレース関連のリクエストヘッダーをアップストリームサービスに渡す必要があります。

  1. 次のコンテンツを含む ExternalProxy.py ファイルを作成し、ExternalProxy アプリケーションのランタイム環境にファイルを保存します。

    • {XTRACE_ZIPKIN_V1_ENDPOINT} を手順 2 で取得したエンドポイントに置き換えます。トレースデータをカスタムトレースシステムに報告する必要がある場合は、変数をカスタムトレースシステムのアクセスエンドポイントに置き換えます。

    • {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'
      
      
      # トレース情報を Zipkin に送信する
      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. Managed Service for OpenTelemetry コンソールにログインします。

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

  3. 表示されるページで、左側のナビゲーションペインの [アプリケーションの詳細] をクリックします。[アプリケーションの詳細] ページで、[トレース] タブをクリックします。次に、クエリする呼び出しトレースのトレース ID をクリックします。

    ASM インスタンス外にデプロイされている ExternalProxy アプリケーションと、ASM インスタンス内にデプロイされている Bookinfo アプリケーションの間に呼び出しトレースが生成されます。