Krav: I mikrotjenestearkitektur er det ofte svært vanskelig å feilsøke når man støter på problemer, uten å vite om det er et unntak kastet av tjenesten, det kan være at tjenesten skriver en feil, eller at det er et problem med informasjonen som sendes av tjenesten som kaller tjenesten. Hvis konteksten til alle forespørsler kan registreres, altså lenken til hele den fullstendige transaksjonsforespørselen, er det avgjørende å feilsøke og analysere problemet.
Anmeldelse:
Unntaksstakkspor er ideelle for applikasjoner som retter seg mot en enkelt prosess, som et monolittisk applikasjonssystem. Men på den annen side, for å håndtere distribuerte applikasjoner, som mikrotjenestearkitekturer, er ikke stakkspor nok til å vise hele meldingssporet. Derfor blir distribuerte sporingsverktøy og standarder nødvendige. W3C definerer en standard for denne typen spor kalt Trace Context.
Trace Context-standarden
W3C Trace Context-dokumentasjon:Innloggingen med hyperkoblingen er synlig.
W3C Trace Context-spesifikasjonen definerer standarder og formater for HTTP-headere for å spre distribuert sporingskontekstinformasjon. Den definerer to felt som brukes til å videreføre sporingsflyten i HTTP-forespørselshodet. La oss se på disse to feltene i standarddefinisjonen:
- traceparent: 用来描述在追踪图谱中到达请求的位置。它表示在追踪系统中到达请求的通用格式,被所有的 vendor 所理解。
- tracestate: 使用 vendor 特定的数据表示形式来扩展 traceparent,使用 name/value 对形式。在 tracestate 中保存信息是可选的。
Traceparent-feltet
Spesifikasjonen for traceparent-feltet er definert i form av Extended Baccos Paradigm (ABNF) og består av 4 deler:
versjon - traceid - parentid/spanid - traceflags For eksempel:
00-480e22a2781fe54d992d878662248d94-b4b37b64bb3f6141-00
- version: 8 位,系统适配的追踪上下文版本,当前位 00
- trace-id: 16 字节,追踪整体的标识。用于在系统中标识一个分布式追踪整体,Verdien er nøyaktig den samme i samme lenke。
- Foreldre-ID/SPAN-ID: 8 byte for å uttrykke forelderen til den nåværende SPAN i en innkommende forespørsel eller en utgående forespørsel.
- trace-flags: 8 位,调用者的建议标志,可以考虑为调用者的建议,限制为 3 个原因:信息或是滥用,调用方的错误,或者在调用方与被调用方的不同负载。
Alle feltene er kodet i heksadesimal, som vist på bildet nedenfor:
.NET-distribuert sporing
Distribuert sporing er en diagnostisk teknikk som hjelper ingeniører med å lokalisere feil og ytelsesproblemer i applikasjoner, spesielt de som kan være distribuert over flere datamaskiner eller prosesser. Denne teknikken korrelerer arbeidet utført av ulike applikasjonskomponenter gjennom forespørselssporing i applikasjonen og skiller det fra annet arbeid applikasjonen kan utføre ved håndtering av samtidige forespørsler. For eksempel kan en lastbalanserer først motta en forespørsel om en typisk webtjeneste, deretter videresende den til en webserverprosess, og deretter sende flere forespørsler til databasen. Med distribuert sporing kan ingeniører avgjøre om disse stegene feilet, hvor lang tid hvert steg tar, og hvilke meldinger som kan logges når hvert steg kjøres.
I .NET er System.Diagnostics.Activity-biblioteket konfigurert til å bruke W3C-standarden. W3C-stil traceparent-headeren Request-Id ble lagt til i ASP.NET Core 2.0. For å endre det til en traceparent-header som samsvarer med W3C Trace Context, sett den statiske egenskapen Activity.DefaultIdFormat til W3C når du starter programmet. Koden er som følger:
testprosess,Nettleser -> tjeneste A (/http, backend bruker HttpClient for å be om tjeneste B) grensesnitt -> B tjeneste (/test) grensesnitt, Tjeneste A gir sin egen Trace Context og Service B sin Trace Context, koden er som følger:
Starttjenester A og B, som vist i følgende figur:
Nettleseren åpner Tjeneste A, som vist i følgende figur:
Id: 00-9891603e6c4921598951f425d98e4df7-bd06e8d507a43f42-00
TraceId: 9891603e6c4921598951f425d98e4df7
SpanId: bd06e8d507a43f42
ParentId:
Svarinnhold:{"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:
{ Dato: Man, 22. des 2025 01:37:21 GMT Server: Kestrel Overføring-koding: chunked Forbindelse: hold deg i live Innholdstype: application/json; charset=utf-8 }, Request = Metode: GET, RequestUri: 'http://localhost.charlesproxy.com:5551/test', Versjon: 1.1, Innhold: <null>, Headers:
{ traceparent: 00-9891603e6c4921598951f425d98e4df7-e0336cc56a4f2150-00 }, RequestTaskStatus = RanToCompletion } -------------------------------------------------- Ved å bruke Charles Proxy pakkefangstverktøyet er forespørsel og respons som følger:
Hvis du vil deaktivere HttpClient fra å sende traceparent, settes miljøvariablene som følger:
Referanse:
Innloggingen med hyperkoblingen er synlig.
Innloggingen med hyperkoblingen er synlig.
Innloggingen med hyperkoblingen er synlig.
Innloggingen med hyperkoblingen er synlig.
Innloggingen med hyperkoblingen er synlig.
Innloggingen med hyperkoblingen er synlig. |