Instrumentez une application Python avec le client Jaeger afin d'envoyer les données de traçage vers Managed Service for OpenTelemetry. Une fois la connexion établie, la console ARMS affiche la topologie de l'application, les traces, les transactions anormales et lentes, ainsi que l'analyse SQL.
Pour bénéficier de fonctionnalités avancées et de capacités de traçage étendues, nous vous recommandons de connecter votre application à Managed Service for OpenTelemetry en utilisant le protocole OpenTelemetry.
Nos guides d'intégration détaillés pour OpenTelemetry et nos bonnes pratiques vous aident à démarrer avec Managed Service for OpenTelemetry. Pour plus d'informations, consultez la rubrique Connecter une application.
Fonctionnement
Jaeger prend en charge deux architectures de rapport de données :
Sans l'agent Jaeger : le client Jaeger envoie directement les données de traçage au backend de Managed Service for OpenTelemetry.
Avec l'agent Jaeger : le client Jaeger envoie les données de traçage à un agent Jaeger exécuté localement, qui les transfère ensuite au backend via gRPC.
Limites
Le client Python Jaeger (v1.25) ne peut envoyer des données de traçage que via l'agent Jaeger, et non par HTTP. Consultez la documentation Fonctionnalités de la bibliothèque cliente.
Le client communique avec l'agent via UDP, un protocole qui ne garantit pas la livraison des paquets. Pour minimiser la perte de données, exécutez les deux composants sur le même hôte.
Étape 1 : Démarrer l'agent Jaeger
-
Téléchargez l'image de l'agent Jaeger :
docker pull jaegertracing/jaeger-agent:1.25 -
Démarrez le conteneur de l'agent Jaeger. Remplacez les espaces réservés suivants par les valeurs issues de la page Cluster Configurations :
Espace réservé Description <endpoint>Endpoint gRPC de Managed Service for OpenTelemetry <auth>Jeton d'authentification docker run -d --name jaeger-agent \ -p 5775:5775/udp \ -p 6831:6831/udp \ -p 6832:6832/udp \ -p 5778:5778/tcp \ jaegertracing/jaeger-agent:1.25 \ --reporter.type=grpc \ --reporter.grpc.host-port=<endpoint> \ --agent.tags=<auth> -
Vérifiez que l'agent est en cours d'exécution. Un statut
Upconfirme que l'agent a démarré correctement. Si le conteneur n'est pas actif, consultez les journaux :docker ps --filter name=jaeger-agentdocker logs jaeger-agent
Étape 2 : Instrumenter l'application Python
-
Installez les packages requis. Enregistrez le contenu suivant dans un fichier
requirements.txt, puis installez les packages :certifi==2021.5.30 charset-normalizer==2.0.4 idna==3.2 jaeger-client==4.6.0 opentracing==2.4.0 requests==2.26.0 six==1.16.0 threadloop==1.0.2 thrift==0.13.0 tornado==6.1 urllib3==1.26.6pip install -r requirements.txt -
Créez un fichier Python (par exemple,
tracing_demo.py) contenant le code ci-dessous. Voici les paramètres de configuration clés :Paramètre Valeur Description sampler.typeconstÉchantillonne chaque trace. Pour la production, utilisez probabilisticavec une valeurparamplus faible.sampler.param1Avec le type const,1signifie échantillonner toutes les traces, tandis que0signifie n'en échantillonner aucune.reporting_host127.0.0.1Adresse de l'agent Jaeger. Utilisez 127.0.0.1lorsque l'agent s'exécute sur le même hôte.reporting_port6831Port UDP sur lequel l'agent Jaeger écoute les spans. service_namemytest3Nom identifiant votre application dans la console ARMS. import logging import time from jaeger_client import Config def construct_span(tracer): with tracer.start_span('AliyunTestSpan') as span: span.log_kv({'event': 'test message', 'life': 42}) print("tracer.tags: ", tracer.tags) with tracer.start_span('AliyunTestChildSpan', child_of=span) as child_span: span.log_kv({'event': 'down below'}) return span if __name__ == "__main__": log_level = logging.DEBUG logging.getLogger('').handlers = [] logging.basicConfig(format='%(asctime)s %(message)s', level=log_level) config = Config( config={ 'sampler': { 'type': 'const', # Sample every trace. Use 'probabilistic' in production. 'param': 1, }, 'local_agent': { # The Jaeger agent address. Keep this as 127.0.0.1 when the agent # runs on the same host, which is recommended for UDP reliability. 'reporting_host': '127.0.0.1', 'reporting_port': 6831, }, 'logging': True, }, service_name="mytest3", # Replace with your application name. validate=True ) # Initialize the tracer. This also sets opentracing.tracer. tracer = config.initialize_tracer() span = construct_span(tracer) # Allow the IOLoop to flush buffered spans before closing. # See: https://github.com/jaegertracing/jaeger-client-python/issues/50 time.sleep(2) tracer.close() -
Exécutez le fichier. Lors d'une initialisation réussie, la sortie de débogage affiche la configuration du traceur et confirme que les spans sont envoyés à l'agent Jaeger.
python tracing_demo.py
Vérifier les données de traçage dans la console
Connectez-vous à la console ARMS. Dans le volet de navigation de gauche, sélectionnez Application Monitoring > Applications.
-
Sur la page Applications, sélectionnez une région dans la barre de navigation supérieure, puis cliquez sur le nom de votre application.
RemarqueSi l'icône

apparaît dans la colonne Language, l'application utilise Application Monitoring. Un tiret (-) indique Managed Service for OpenTelemetry. -
Dans la section Application Overview, vérifiez les métriques de performance clés et la topologie.
L'onglet Overview Analysis de la page Application Overview affiche les métriques principales suivantes :
Total Requests : nombre de requêtes, avec les variations hebdomadaires et quotidiennes.
Average Response Time : temps de réponse et sa tendance.
Exceptions : nombre de requêtes anormales.
Span Count : nombre total de spans dans la trace.
Sous ces métriques, les zones Services Provided et Dependent Services affichent chacune des graphiques linéaires représentant le volume de requêtes et le temps de réponse moyen.
-
Dans le volet de navigation de gauche, cliquez sur Application Details. L'onglet Overview affiche le résumé de l'application.
Sur la page Application Details, l'onglet Overview s'affiche par défaut. Il présente la topologie de l'application ainsi que trois graphiques de surveillance : Requests, response time et Exceptions. La liste des services à gauche indique le temps de réponse, le nombre de requêtes et le nombre d'exceptions pour chaque interface.
Cliquez sur l'onglet Traces pour consulter les données de traçage envoyées par votre application.
Résoudre les problèmes de données de traçage manquantes
Si les données de traçage n'apparaissent pas dans la console après l'exécution de votre application, vérifiez les points suivants :
| Problème | Action |
|---|---|
| L'agent Jaeger n'est pas en cours d'exécution | Exécutez docker ps --filter name=jaeger-agent et vérifiez que le statut indique Up. Consultez les journaux de l'agent avec docker logs jaeger-agent. |
| Endpoint ou jeton incorrect | Vérifiez que les valeurs <endpoint> et <auth> correspondent à celles de la page Cluster Configurations. Redémarrez l'agent après correction. |
| Agent et client sur des hôtes différents | Le client Jaeger envoie les données via UDP, ce qui n'est pas fiable entre différents hôtes. Exécutez l'agent sur le même hôte que l'application et définissez reporting_host sur 127.0.0.1. |
| Spans non vidés | Assurez-vous que time.sleep(2) est appelé avant tracer.close() pour permettre à l'IOLoop de vider les spans mis en mémoire tampon. |
| Connectivité réseau | Vérifiez que l'hôte peut atteindre l'endpoint de Managed Service for OpenTelemetry sur le port gRPC configuré. |
Opérations courantes avec Jaeger
Les exemples suivants couvrent les opérations de traçage Jaeger les plus fréquentes. Pour plus de détails, consultez la documentation Getting Started.
Créer un traceur
from jaeger_client import Config
def init_jaeger_tracer(service_name='your-app-name'):
config = Config(config={}, service_name=service_name)
return config.initialize_tracer()
Créer et terminer des spans
# Start a root span (no parent).
tracer.start_span('TestSpan')
# Start a child span.
tracer.start_span('ChildSpan', child_of=span)
# Finish the span.
span.finish()
Propager SpanContext entre les services
# Inject: serialize the SpanContext into a carrier for downstream services.
tracer.inject(
span_context=span.context, format=Format.TEXT_MAP, carrier=carrier
)
# Extract: deserialize the SpanContext from an incoming request.
span_ctx = tracer.extract(format=Format.TEXT_MAP, carrier={})