Tous les produits
Search
Centre de documentation

Alibaba Cloud Service Mesh:Traçage unifié pour les applications dans et hors du maillage de services

Dernière mise à jour :Sep 21, 2026

Alibaba Cloud Service Mesh (ASM) propose des fonctionnalités de traçage prêtes à l'emploi pour les applications au sein du maillage de services. Toutefois, pour obtenir un traçage de bout en bout incluant les applications externes qui communiquent avec les services du maillage, vous devez utiliser Managed Service for OpenTelemetry afin d'unifier les traces d'appels. Ce guide explique comment utiliser Managed Service for OpenTelemetry pour tracer une requête provenant d'une application externe vers une application située dans une instance ASM, créant ainsi une trace d'appel unique et unifiée.

Prérequis

Notes

  • Ce guide déploie une application Python nommée ExternalProxy qui exécute un serveur HTTP. L'accès au chemin racine d'ExternalProxy appelle le service productpage de l'application Bookinfo s'exécutant à l'intérieur du maillage de services.

  • Ce guide utilise Managed Service for OpenTelemetry comme backend de traçage. Si vous utilisez un système de traçage autogéré compatible avec Zipkin, exposez son endpoint de rapport à l'application externe. Vous pouvez alors ignorer l'étape Étape 2 : Obtenir l'endpoint pour Managed Service for OpenTelemetry et passer directement à l'étape Étape 3 : Déployer l'application ExternalProxy hors maillage, en utilisant l'endpoint de votre système 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.

    Vous pouvez télécharger 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 VirtualService de l'application Bookinfo.

    Vous pouvez télécharger le fichier YAML du VirtualService depuis GitHub.

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

    Vous pouvez télécharger le fichier YAML du DestinationRule depuis Github.

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

    Vous pouvez télécharger le fichier YAML de la Gateway depuis GitHub.

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

Étape 2 : Obtenir l'endpoint 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 données de traçage ne pourront pas être corrélées.

    2. Dans l'onglet Access point information, activez l'option Show token. Choisissez un endpoint de réseau public ou privé en fonction de l'emplacement de déploiement de votre application ExternalProxy.

      Étant donné qu'ExternalProxy rapporte les données via l'API Zipkin v1, vous avez besoin d'un endpoint v1. Cliquez sur l'onglet Zipkin et trouvez l'endpoint approprié dans le tableau. En règle générale, vous devez utiliser un endpoint v2. Cependant, pour des scénarios spécifiques tels que les intégrations Istio ou Molten, un endpoint v1 est requis. Lors de l'utilisation du composant Sleuth, l'URL de base ne doit pas inclure /api/v2/spans.

Étape 3 : Déployer l'application ExternalProxy hors maillage

Important
  • Le proxy sidecar transfère toutes les parties d'une requête entrante, y compris les en-têtes HTTP et le corps de la requête, vers le service en amont. Cela signifie que les en-têtes liés au traçage sont également transférés.

  • Pour garantir la propagation du contexte de trace, votre application doit transmettre les en-têtes de traçage requis dans ses requêtes sortantes, conformément aux pratiques standard de la communauté.

  1. Enregistrez le code suivant dans un fichier nommé ExternalProxy.py dans l'environnement d'exécution de votre application externe.

    • Remplacez {XTRACE_ZIPKIN_V1_ENDPOINT} par l'endpoint obtenu à l'étape précédente. Si vous utilisez un système de traçage autogéré, utilisez son endpoint de rapport à la place.

    • Remplacez {INGRESS_GATE_WAY_IP} par l'adresse IP de la passerelle d'entrée de votre cluster 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. Exécutez la commande suivante pour démarrer l'application 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 envoyer une requête à l'application ExternalProxy.

    curl localhost:5000

    Résultat attendu :

    OK

Étape 4 : Consulter les informations de trace

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

  2. Dans le volet de navigation de gauche, cliquez sur Applications. Sélectionnez la région en haut de la page, 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 d'appel.

    Une trace d'appel complète relie désormais l'application externe, ExternalProxy, et l'application Bookinfo dans le maillage. Le haut de la page des détails de la trace affiche des informations récapitulatives, notamment l'Start time, la Duration, les Services, la Depth et le nombre total de Total spans. Sous le résumé, une vue arborescente montre la relation hiérarchique de chaque span. Les colonnes incluent Span name, Timeline, Service name, Start time, IP address et Status. Dans cet exemple, la trace d'appel commence par external-proxy, passe par productpage, puis appelle successivement les services details, reviews et ratings. Certaines spans, telles que la span de limitation de débit ahas_rate_limit_cluster, peuvent apparaître avec un statut d'erreur.