Tous les produits
Search
Centre de documentation

Alibaba Cloud Service Mesh:Suivre les applications inter-maillages à l'aide de Managed Service for OpenTelemetry

Dernière mise à jour :Aug 11, 2026

ASM propose une solution de suivi prête à l'emploi pour les applications déployées au sein d'un maillage de services. Toutefois, pour obtenir un suivi unifié et de bout en bout des applications situées à l'intérieur et à l'extérieur du maillage, vous devez utiliser Managed Service for OpenTelemetry afin de créer une trace complète. Cette rubrique explique comment utiliser Managed Service for OpenTelemetry pour permettre à une application externe d'appeler un service au sein du maillage et de générer une trace complète.

Prérequis

Notes d'utilisation

  • Ce tutoriel déploie une application Python nommée ExternalProxy. Cette application démarre un serveur HTTP. Lorsqu'une requête atteint le chemin racine d'ExternalProxy, l'application appelle le service productpage de l'application Bookinfo exécutée au sein du maillage.

  • Ce tutoriel utilise Managed Service for OpenTelemetry comme système de suivi. Si vous utilisez un système de suivi autonome compatible avec Zipkin, vous pouvez exposer son endpoint de rapport à l'application externe. Dans ce cas, ignorez l'étape Étape 2 : Obtenir l'endpoint de Managed Service for OpenTelemetry et passez directement à l'étape Étape 3 : Déployer l'application externe ExternalProxy pour utiliser votre endpoint comme adresse de rapport.

Étape 1 : Déployer l'application Bookinfo dans le maillage

  1. Exécutez la commande suivante pour déployer l'application Bookinfo sur le cluster de votre instance ASM.

    Téléchargez le fichier YAML de l'application Bookinfo depuis GitHub.

    kubectl --kubeconfig=${DATA_PLANE_KUBECONFIG} apply -f bookinfo.yaml
  2. Exécutez la commande suivante pour déployer le service virtuel de l'application Bookinfo.

    Téléchargez le fichier YAML du service virtuel depuis GitHub.

    kubectl --kubeconfig=${ASM_KUBECONFIG} apply -f virtual-service-all-v1.yaml
  3. Exécutez la commande suivante pour déployer la règle de destination de l'application Bookinfo.

    Téléchargez le fichier YAML de la règle de destination depuis Github.

    kubectl --kubeconfig=${ASM_KUBECONFIG} apply -f destination-rule-all.yaml
  4. Exécutez la commande suivante pour déployer la passerelle de l'application Bookinfo.

    Téléchargez le fichier YAML de la passerelle depuis GitHub.

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

Étape 2 : Obtenir l'endpoint de Managed Service for OpenTelemetry

  1. Connectez-vous à la console Managed Service for OpenTelemetry. Dans le volet de navigation de gauche, cliquez sur Overview.

  2. Sur la page Overview, cliquez sur l'onglet Access process, puis sur View access point information.

  3. Consultez l'endpoint.

    1. En haut de la page, sélectionnez la région cible.

      Sélectionnez la région où le cluster ACK de l'application Bookinfo est déployé. Sinon, les traces ne pourront pas être corrélées.

    2. Dans l'onglet Access point information, activez le commutateur Show Token et sélectionnez un endpoint public ou privé en fonction de l'emplacement de déploiement de votre application ExternalProxy.

      Étant donné qu'ExternalProxy rapporte les données à l'aide de l'API Zipkin v1, vous devez utiliser un endpoint v1. Cliquez sur l'onglet Zipkin et récupérez l'endpoint dans la colonne Related Information. Dans la plupart des cas, vous pouvez utiliser l'API v2. Dans des scénarios spécifiques tels qu'Istio et Molten, utilisez l'API v1. Lorsque vous utilisez le composant Sleuth, l'URL de base n'inclut pas /api/v2/spans.

Étape 3 : Déployer l'application externe ExternalProxy

Important
  • Le proxy sidecar transfère l'intégralité de la requête entrante, y compris ses en-têtes et son corps, vers le service en amont.

  • Pour garantir la propagation du contexte de trace, votre application doit transmettre les en-têtes de requête liés au suivi aux services en amont conformément aux spécifications de la communauté.

  1. Enregistrez le code suivant sous le nom ExternalProxy.py dans l'environnement d'exécution de l'application externe.

    • Remplacez {XTRACE_ZIPKIN_V1_ENDPOINT} par l'endpoint obtenu à l'étape précédente. Si vous souhaitez rapporter les données à un système de suivi autonome, remplacez l'espace réservé par l'endpoint de rapport du système.

    • Remplacez {INGRESS_GATE_WAY_IP} par l'adresse IP de la passerelle d'entrée du cluster ACK.

      Développer pour afficher 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. Exécutez la commande suivante pour démarrer 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. Exécutez la commande suivante pour appeler ExternalProxy.

    curl localhost:5000

    Résultat attendu :

    OK

Étape 4 : Afficher les informations de suivi

  1. Connectez-vous à la console Managed Service for OpenTelemetry.

  2. Dans le volet de navigation de gauche, cliquez sur Applications. En haut de la page, sélectionnez une région, puis cliquez sur ExternalProxy dans la liste des applications.

  3. Dans le volet de navigation de gauche, cliquez sur Application Details. Cliquez sur l'onglet Traces, puis sur un trace ID pour afficher les détails de la trace correspondante.

    Dans l'onglet Traces, chaque ligne de la liste représente une trace et affiche son trace ID. Cliquez sur un trace ID pour ouvrir la page des détails de la trace.

    Une trace complète est générée, s'étendant de l'application externe ExternalProxy à l'application interne Bookinfo. Le haut de la page des détails de la trace affiche l'Start Time, la Duration, le nombre de Services, la Depth et le nombre total de Spans de la trace. Le tableau ci-dessous présente la hiérarchie complète des appels de microservices, la répartition de la durée de chaque span et l'état de la limitation de débit, tel que le span de limitation de débit ahas_rate_limit_cluster egress. Il comprend des colonnes telles que Span Name, Timeline, Service Name, Start Time, IP Address et Status.