2 votes

Stackdriver Strace embedded traces pour une requête avec python

J'utilise Stackdriver Trace pour surveiller les délais de certains microservices, mais j'ai quelques difficultés à faire en sorte que tous les allers-retours soient affichés comme une seule requête.

Disons que j'ai deux services (pour rester simple). Afin d'obtenir les traces des deux services, je dois installer les bibliothèques clientes dans les deux services. Maintenant disons que dans le premier service je fais :

@app.route('/dump')
def dump():
    url = "http://db-dump/dump"
    tracer = app.config['TRACER']
    tracer.start_span(name='dump')
    result = requests.get(url)
    tracer.end_span()

    return result.content

Dans mon deuxième service, je le fais :

@app.route('/dump')
def dump():
    conn = connect()
    tracer = app.config['TRACER']
    tracer.start_span(name='dump')
    db_content = select(conn)
    tracer.end_span()
    db_content_to_print = format(db_content)

    return render_page(db_content_to_print)

Ce second service effectue une requête dans une base de données, en extrait les résultats et les envoie au premier service, qui affiche le contenu.

Maintenant, je dois bien sûr commencer à compter le délai dans les deux microservices, puisque je veux savoir combien de temps il faut entre le premier service et le second. Et je dois aussi commencer à compter dans le deuxième service, puisque je veux savoir combien de temps il faut pour récupérer le contenu de la base de données.

Mais quand je récupère les traces sur la console GCP, je vois ceci :

enter image description here

Où la première trace provient de la base de données, et la seconde trace est les deux (du premier service au second + base de données).

Je veux savoir comment intégrer la deuxième trace dans la première en python. J'ai vérifié opencensus documentation pour python, et j'ai trouvé ceci :

classe opencensus.trace.span.Span(nom, parent_span=None,...)

Un span est un événement temporel individuel qui constitue un nœud de la trace. trace. Chaque span a un nom, un id de span et un id de parent. L'identifiant du parent indique les relations de cause à effet entre les span individuels dans une trace distribuée unique. Une span qui n'a pas d'identifiant parent est est appelée span racine. Tous les spans associés à une trace spécifique partagent également un identifiant de trace commun. Les span n'ont pas besoin d'être continus. il peut y avoir des écarts entre deux spans.

Donc, je suppose, que je dois envoyer la span_id de la première demande avec la demande au second microservice ? Il y a un autre problème ici, qui semble avoir besoin d'initialiser le traceur avec ces paramètres, mais mon traceur sur le deuxième microservice est déjà initialisé. Je ne peux pas l'initialiser lors de l'envoi de la requête car il ne va déjà pas calculer le délai correctement.

J'ai besoin de demander cela, car pour faire les tests, je dois créer l'image, la télécharger sur docker hub, puis faire les tests sur k8s. C'est trop de travail à faire étant plutôt aveugle ici.

La bibliothèque client Python pour la trace Stackdriver est en alpha, il n'y a donc pas beaucoup de documentation à ce sujet sur le site GCP.

EDITAR

Comme il n'y a pas eu de réponses, j'ai essayé de faire passer la commande span_context l'information, qui est la suivante :

>>> print(tracer.span_context)
SpanContext(trace_id=987b84e7efc5562ff6c21723e674cd41, span_id=910de32857b896da, trace_options=TraceOptions(enabled=True), tracestate=None)

...au deuxième microservice lors de l'initialisation, mais ça n'a pas marché. Quand il commence à compter la trace sur le deuxième microservice, il génère automatiquement de nouveaux trace_id y span_id et ignore le span_context du premier. Je suis à court d'idées à ce stade.

EDIT2

Ce que je veux, c'est que l'ensemble de la trace (microservice 1 -> microservice 2 -> base de données) apparaisse sous la même trace, avec des portées différentes. Quelque chose de similaire à ceci :

a new

1voto

Suren,

Pouvez-vous s'il vous plaît passer le trace_id au lieu de span_id ? Cela devrait vous montrer tout en une seule trace.

0voto

suren Points 1638

J'ai réussi à le faire, à la fin. On dirait que, j'ai dû passer le trace_id au deuxième microservice. Pas de span_id. Mais j'ai maintenant un autre problème, que je vais poser dans une autre question.

Donc, pour résumer, j'ai résolu le problème d'avoir les traces dans des travées séparées. Maintenant ils sont dans la même enter image description here :

Le problème est que la première trace inclut toujours la deuxième. Et si j'en avais un troisième, la première trace les inclurait tous les deux, et la deuxième trace inclurait le troisième, car je n'ai aucun moyen d'arrêter le premier span depuis le deuxième microservice. Lorsque j'essaie, j'obtiens l'erreur suivante.

WARNING:root:No active span, cannot do end_span.

Ce que j'ai essayé de faire, c'est de terminer le premier span du second microservice juste après y être arrivé, mais j'obtiens cette erreur. Je vais juste poster une autre réponse, car je ne peux pas passer par cet écran comment.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X