Exigences : Dans l’architecture des microservices, lorsqu’il est confronté à des problèmes, il est souvent très difficile de dépanner ; on ne sait pas s’il s’agit d’une exception lancée par le service, ou si le service écrit un bogue, ou s’il y a un problème avec les informations transmises par le service qui appelle le service. Si le contexte de toutes les requêtes peut être enregistré, c’est-à-dire le lien vers l’ensemble de la requête de transaction, il est crucial de dépanner et d’analyser le problème.
Révision:
Les traces de pile d’exception sont idéales pour les applications ciblant un seul processus, comme un système d’application monolithique. Mais d’un autre côté, pour traiter avec des applications distribuées, telles que les architectures de microservices, les traces de pile ne suffisent pas à afficher la trace globale du message. C’est pourquoi les outils et normes de traçage distribué deviennent nécessaires. Le W3C définit une norme pour ce type de trace appelée Trace Context.
Norme Trace Context
Documentation du contexte trace du W3C :La connexion hyperlientérée est visible.
La spécification Trace Context du W3C définit des normes et des formats pour que les en-têtes HTTP propagent les informations de contexte de trace distribuées. Il définit 2 champs utilisés pour propager le flux de trace dans l’en-tête de requête HTTP. Examinons ces deux champs dans la définition standard :
- traceparent: 用来描述在追踪图谱中到达请求的位置。它表示在追踪系统中到达请求的通用格式,被所有的 vendor 所理解。
- tracestate: 使用 vendor 特定的数据表示形式来扩展 traceparent,使用 name/value 对形式。在 tracestate 中保存信息是可选的。
Champ traceparent
La spécification du champ traceparent est définie sous la forme du paradigme Extended Baccos (ABNF) et se compose de 4 parties :
Version - traceid - parent/spanid - traceflags Par exemple:
00-480e22a2781fe54d992d878662248d94-b4b37b64bb3f6141-00
- version: 8 位,系统适配的追踪上下文版本,当前位 00
- trace-id: 16 字节,追踪整体的标识。用于在系统中标识一个分布式追踪整体,La valeur est exactement la même dans le même lien。
- Parent-ID/SPAN-ID : 8 octets pour exprimer le parent de la span courante dans une requête entrante ou sortante.
- trace-flags: 8 位,调用者的建议标志,可以考虑为调用者的建议,限制为 3 个原因:信息或是滥用,调用方的错误,或者在调用方与被调用方的不同负载。
Tous les champs sont codés en hexadécimal, comme montré sur l’image ci-dessous :
Traçage distribué .NET
La traçabilité distribuée est une technique de diagnostic qui aide les ingénieurs à localiser les pannes et les problèmes de performance dans les applications, en particulier celles qui peuvent être réparties sur plusieurs ordinateurs ou processus. Cette technique corrélée le travail effectué par différents composants de l’application grâce au suivi des requêtes dans l’application et le sépare des autres tâches que l’application pourrait effectuer lors du traitement de requêtes simultanées. Par exemple, un équilibreur de charge peut d’abord recevoir une requête pour un service web typique, puis la transférer à un processus serveur web, et ensuite lancer plusieurs requêtes à la base de données. Avec la traçabilité distribuée, les ingénieurs peuvent distinguer si ces étapes ont échoué, combien de temps prend chaque étape, et quels messages peuvent être enregistrés à chaque étape.
Dans .NET, la bibliothèque System.Diagnostics.Activity a été configurée pour utiliser la norme W3C. L’en-tête Request-Id de traceparent de style W3C a été ajouté dans ASP.NET Core 2.0. Pour le changer en un en-tête traceparent conforme au contexte de trace W3C, définissez la propriété statique Activity.DefaultIdFormat sur W3C au lancement du programme. Le code est le suivant :
processus de test,Navigateur -> Interface du service A (/http, le backend utilise HttpClient pour demander le service B) -> Interface du service B (/test), le Service A produit son propre Contexte de Trace et le Contexte de Trace du Service B, le code est le suivant :
Départ des services A et B, comme montré sur la figure suivante :
Le navigateur ouvre le Service A, comme montré sur la figure suivante :
Id: 00-9891603e6c4921598951f425d98e4df7-bd06e8d507a43f42-00
TraceId: 9891603e6c4921598951f425d98e4df7
SpanId: bd06e8d507a43f42
ParentId:
Contenu de la réponse : {"id » :"00-9891603e6c4921598951f425d98e4df7-8874f9b2f9c0702e-00 »,"traceId » :"9891603e6c4921598951f425d98e4df7 »,"spanId » :"8874f9b2f9c0702e »,"parentId » : « 00-9891603e6c4921598951f425d98e4df7-e0336cc56a4f2150-00 »,"traceFlags » :"None »,"isSampled » :false}
--------------------------------------------------
Name: HttpHandlerDiagnosticListener
DateTime: 2025/12/22 9:37:22
Id: 00-9891603e6c4921598951f425d98e4df7-e0336cc56a4f2150-00
TraceId: 9891603e6c4921598951f425d98e4df7
SpanId: e0336cc56a4f2150
ParentId: 00-9891603e6c4921598951f425d98e4df7-bd06e8d507a43f42-00
Key: System.Net.Http.HttpRequestOut.Stop, Value: { Response = StatusCode: 200, ReasonPhrase: 'OK', Version: 1.1, Content: System.Net.Http.HttpConnectionResponseContent, Headers:
{ Date : lun, 22 déc. 2025 01:37:21 GMT Serveur : Kestrel Encodage de transfert : chunked Connexion : maintien en vie Type de contenu : application/json ; charset=utf-8 }, Request = Méthode : GET, RequestUri : 'http://localhost.charlesproxy.com:5551/test', Version : 1.1, Content : <null>, En-têtes :
{ traceparent : 00-9891603e6c4921598951f425d98e4DF7-e0336cc56a4F2150-00 }, RequestTaskStatus = RanToCompletion } -------------------------------------------------- En utilisant l’outil de capture de paquets Charles Proxy, la requête et la réponse sont les suivantes :
Si vous souhaitez désactiver le passage du traceparent par l’HttpClient, les variables d’environnement sont définies comme suit :
Référence:
La connexion hyperlientérée est visible.
La connexion hyperlientérée est visible.
La connexion hyperlientérée est visible.
La connexion hyperlientérée est visible.
La connexion hyperlientérée est visible.
La connexion hyperlientérée est visible. |