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 :
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 :