Requisiti: Nell'architettura dei microservizi, quando si incontrano problemi, è spesso molto difficile risolvere i problemi, non sapendo se si tratta di un'eccezione lanciata dal servizio, se può essere che il servizio scriva un bug, oppure che ci sia un problema con le informazioni trasmesse dal servizio che chiama il servizio. Se il contesto di tutte le richieste può essere registrato, cioè il collegamento all'intera richiesta di transazione, è fondamentale risolvere e analizzare il problema.
Recensione:
Le tracce dello stack eccezione sono ideali per applicazioni che mirano a un singolo processo, come un sistema applicativo monolitico. D'altra parte, per gestire applicazioni distribuite, come le architetture di microservizi, le tracciazioni dello stack non sono sufficienti per mostrare la traccia complessiva del messaggio. Ecco perché strumenti e standard di tracciamento distribuito diventano necessari. Il W3C definisce uno standard per questo tipo di traccia chiamato Trace Context.
Standard Trace Context
Documentazione del contesto tracciato W3C:Il login del link ipertestuale è visibile.
La specifica W3C Trace Context definisce standard e formati per le intestazioni HTTP per propagare informazioni di contesto di traccia distribuite. Definisce 2 campi che vengono utilizzati per propagare il flusso di traccia nell'intestazione della richiesta HTTP. Diamo un'occhiata a questi due campi nella definizione standard:
- traceparent: 用来描述在追踪图谱中到达请求的位置。它表示在追踪系统中到达请求的通用格式,被所有的 vendor 所理解。
- tracestate: 使用 vendor 特定的数据表示形式来扩展 traceparent,使用 name/value 对形式。在 tracestate 中保存信息是可选的。
Campo traceparent
La specifica per il campo traceparent è definita sotto forma del Paradigma Esteso di Baccos (ABNF) e consiste in 4 parti:
Versione - traceid - parentid/spanid - traceflags Per esempio:
00-480e2a2781fe54d992d878662248d94-b4b37b64bb3f6141-00
- version: 8 位,系统适配的追踪上下文版本,当前位 00
- trace-id: 16 字节,追踪整体的标识。用于在系统中标识一个分布式追踪整体,Il valore è esattamente lo stesso nello stesso link。
- Parent-ID/SPAN-ID: 8 byte per esprimere il genitore dello span corrente in una richiesta in entrata o in uscita.
- trace-flags: 8 位,调用者的建议标志,可以考虑为调用者的建议,限制为 3 个原因:信息或是滥用,调用方的错误,或者在调用方与被调用方的不同负载。
Tutti i campi sono codificati in esadecimale, come mostrato nell'immagine sottostante:
Tracciamento distribuito .NET
Il tracciamento distribuito è una tecnica diagnostica che aiuta gli ingegneri a localizzare guasti e problemi di prestazioni nelle applicazioni, specialmente in quelli che possono essere distribuiti su più computer o processi. Questa tecnica correla il lavoro svolto dai diversi componenti applicativi attraverso il tracciamento delle richieste all'interno dell'applicazione e lo separa da altri lavori che l'applicazione potrebbe svolgere nella gestione di richieste concorrenti. Ad esempio, un bilanciatore di carico potrebbe prima ricevere una richiesta per un tipico servizio web, poi inoltrarla a un processo server web e infine inviare più query al database. Con il tracciamento distribuito, gli ingegneri possono distinguere se questi passaggi non sono stati eseguiti, quanto tempo impiega ciascun passaggio e quali messaggi possono essere registrati quando ogni passaggio viene eseguito.
In .NET, la libreria System.Diagnostics.Activity è stata configurata per utilizzare lo standard W3C. L'intestazione Request-Id dell'intestazione traceparent in stile W3C fu aggiunta in ASP.NET Core 2.0. Per cambiarlo in un'intestazione traceparent che rispetti il contesto Trace W3C, imposta la proprietà statica Activity.DefaultIdFormat su W3C quando avvii il programma. Il codice è il seguente:
processo di prova,Interfaccia Browser -> A service (/http, backend usa HttpClient per richiedere il servizio B) -> interfaccia B service (/test), il Servizio A genera il proprio Contesto di Traccia e il Contesto di Traccia del Servizio B, il codice è il seguente:
Avviare i servizi A e B, come mostrato nella figura seguente:
Il browser apre il Servizio A, come mostrato nella figura seguente:
Id: 00-9891603e6c4921598951f425d98e4df7-bd06e8d507a43f42-00
TraceId: 9891603e6c4921598951f425d98e4df7
SpanId: bd06e8d507a43f42
ParentId:
Contenuto della risposta:{"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:
{ Data: Lun, 22 Dic 2025 01:37:21 GMT Servitore: Kestrel Transfer-Encoding: a pezzi Connessione: mantenersi in vita Tipo di contenuto: application/json; Charset=UTF-8 }, Request = Metodo: GET, RequestUri: 'http://localhost.charlesproxy.com:5551/test', Versione: 1.1, Content: <null>, Headers:
{ TraceParent: 00-9891603E6C4921598951F425D98E4DF7-E0336CC56A4F2150-00 }, RequestTaskStatus = RanToCompletion } -------------------------------------------------- Utilizzando lo strumento di cattura pacchetti Charles Proxy, la richiesta e la risposta sono le seguenti:
Se vuoi disabilitare che l'HttpClient non passi traceparent, le variabili di ambiente sono impostate come segue:
Riferimento:
Il login del link ipertestuale è visibile.
Il login del link ipertestuale è visibile.
Il login del link ipertestuale è visibile.
Il login del link ipertestuale è visibile.
Il login del link ipertestuale è visibile.
Il login del link ipertestuale è visibile. |