Krav: I mikrotjänstarkitektur är det ofta mycket svårt att felsöka när man stöter på problem, utan att veta om det är ett undantag som tjänsten kastar, kan det vara att tjänsten skriver en bugg eller att det finns ett problem med informationen som skickas av tjänsten som anropar tjänsten. Om kontexten för alla förfrågningar kan registreras, det vill säga länken till hela den fullständiga transaktionsförfrågan, är det avgörande att felsöka och analysera problemet.
Recension:
Undantagsstackspår är idealiska för applikationer som riktar sig mot en enskild process, såsom ett monolitiskt applikationssystem. Men å andra sidan, för att hantera distribuerade applikationer, såsom mikrotjänstarkitekturer, räcker stackspår inte för att visa det övergripande meddelandespåret. Det är därför distribuerade spårningsverktyg och standarder blir nödvändiga. W3C definierar en standard för denna typ av spår kallad Trace Context.
Trace Context-standarden
W3C Trace Context-dokumentation:Inloggningen med hyperlänken är synlig.
W3C Trace Context-specifikationen definierar standarder och format för HTTP-headers för att sprida distribuerad spårningskontextinformation. Den definierar två fält som används för att sprida spårflödet i HTTP-begäran. Låt oss titta på dessa två fält i standarddefinitionen:
- traceparent: 用来描述在追踪图谱中到达请求的位置。它表示在追踪系统中到达请求的通用格式,被所有的 vendor 所理解。
- tracestate: 使用 vendor 特定的数据表示形式来扩展 traceparent,使用 name/value 对形式。在 tracestate 中保存信息是可选的。
traceparent-fältet
Specifikationen för traceparent-fältet definieras i form av Extended Baccos Paradigm (ABNF) och består av fyra delar:
Version - traceid - parentid/spanid - traceflags Till exempel:
00-480e22a2781fe54d992d878662248d94-b4b37b64bb3f6141-00
- version: 8 位,系统适配的追踪上下文版本,当前位 00
- trace-id: 16 字节,追踪整体的标识。用于在系统中标识一个分布式追踪整体,Värdet är exakt detsamma i samma länk。
- Parent-ID/SPAN-ID: 8 byte för att uttrycka föräldern till den aktuella SPAN i en inkommande eller utgående förfrågan.
- trace-flags: 8 位,调用者的建议标志,可以考虑为调用者的建议,限制为 3 个原因:信息或是滥用,调用方的错误,或者在调用方与被调用方的不同负载。
Alla fält är kodade i hexadecimal, som visas i bilden nedan:
.NET-distribuerad spårning
Distribuerad spårning är en diagnostisk teknik som hjälper ingenjörer att lokalisera fel och prestandaproblem i applikationer, särskilt sådana som kan vara distribuerade över flera datorer eller processer. Denna teknik korrelerar arbetet som utförs av olika applikationskomponenter genom förfrågningsspårning i applikationen och separerar det från annat arbete som applikationen kan utföra vid samtidiga förfrågningar. Till exempel kan en lastbalanserare först ta emot en förfrågan om en typisk webbtjänst, sedan vidarebefordra den till en webbserverprocess och därefter skicka flera frågor till databasen. Med distribuerad spårning kan ingenjörer avgöra om dessa steg misslyckades, hur lång tid varje steg tar och vilka meddelanden som kan loggas när varje steg körs.
I .NET har System.Diagnostics.Activity-biblioteket konfigurerats för att använda W3C-standarden. W3C-stilens traceparent-header Request-Id-header lades till i ASP.NET Core 2.0. För att ändra det till en traceparent-header som följer W3C Trace Context, sätt den statiska egenskapen Activity.DefaultIdFormat till W3C när du startar programmet. Koden är följande:
Testprocess,Webbläsare -> A-tjänst (/http, backend använder HttpClient för att begära B-tjänst) gränssnitt -> B-tjänstgränssnitt (/test), Tjänst A ger sin egen Trace Context och Tjänst Bs Trace Context, koden är följande:
Starttjänster A och B, som visas i följande figur:
Webbläsaren öppnar Tjänst A, som visas i följande figur:
Id: 00-9891603e6c4921598951f425d98e4df7-bd06e8d507a43f42-00
TraceId: 9891603e6c4921598951f425d98e4df7
SpanId: bd06e8d507a43f42
ParentId:
Svarsinnehåll:{"id":"00-9891603e6c4921598951f425d98e4df7-8874f9b2f9c0702e-00","traceId":"9891603e6c4921598951f425d98e4df7","spanId":"8874f9b2f9c0702e","parentId": "00-9891603e6c4921598951f425d98e4df7-e0336cc56a4f2150-00","traceFlags":"Ingen","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:
{ Datum: Mån, 22 dec 2025 01:37:21 GMT Server: Kestrel Överföringskodning: chunked Anslutning: håll vid liv Innehållstyp: application/json; charset=utf-8 }, Request = Metod: GET, RequestUri: 'http://localhost.charlesproxy.com:5551/test', Version: 1.1, Innehåll: <null>, Headers:
{ traceparent: 00-9891603e6c4921598951f425d98e4df7-e0336cc56a4f2150-00 }, RequestTaskStatus = RanToCompletion } -------------------------------------------------- Med Charles Proxy paketfångstverktyg är förfrågan och svaret följande:
Om du vill inaktivera HttpClient från att skicka traceparent, sätts miljövariablerna enligt följande:
Hänvisning:
Inloggningen med hyperlänken är synlig.
Inloggningen med hyperlänken är synlig.
Inloggningen med hyperlänken är synlig.
Inloggningen med hyperlänken är synlig.
Inloggningen med hyperlänken är synlig.
Inloggningen med hyperlänken är synlig. |