Vereisten: In de microservice-architectuur is het bij problemen vaak erg moeilijk om te troubleshooten, omdat je niet weet of het een uitzondering is die door de service wordt gegooid, het kan zijn dat de service een bug schrijft, of dat er een probleem is met de informatie die door de service wordt verzonden die de service oproept. Als de context van alle verzoeken kan worden vastgelegd, dat wil zeggen de link naar het volledige transactieverzoek, is het cruciaal om het probleem op te lossen en te analyseren.
Recensie:
Uitzonderingsstacktraces zijn ideaal voor toepassingen die zich richten op één enkel proces, zoals een monolithisch applicatiesysteem. Maar aan de andere kant, voor het omgaan met gedistribueerde applicaties, zoals microservices-architecturen, zijn stacktraces niet voldoende om het volledige berichtspoor weer te geven. Daarom worden gedistribueerde traceertools en -standaarden noodzakelijk. Het W3C definieert een standaard voor dit type trace genaamd Trace Context.
Trace Context-standaard
W3C Trace Context documentatie:De hyperlink-login is zichtbaar.
De W3C Trace Context-specificatie definieert standaarden en formaten voor HTTP-headers om gedistribueerde tracecontextinformatie te verspreiden. Het definieert 2 velden die worden gebruikt om de traceflow in de HTTP-verzoekheader te verspreiden. Laten we eens kijken naar deze twee velden in de standaarddefinitie:
- traceparent: 用来描述在追踪图谱中到达请求的位置。它表示在追踪系统中到达请求的通用格式,被所有的 vendor 所理解。
- tracestate: 使用 vendor 特定的数据表示形式来扩展 traceparent,使用 name/value 对形式。在 tracestate 中保存信息是可选的。
traceparentveld
De specificatie voor het traceparent-veld is gedefinieerd in de vorm van het Extended Baccos Paradigm (ABNF) en bestaat uit 4 delen:
Versie - traceid - parentid/spanid - traceflags Bijvoorbeeld:
00-480e22a2781fe54d992d878662248d94-b4b37b64bb3f6141-00
- version: 8 位,系统适配的追踪上下文版本,当前位 00
- trace-id: 16 字节,追踪整体的标识。用于在系统中标识一个分布式追踪整体,De waarde is exact hetzelfde in dezelfde link。
- Ouder-ID/SPAN-ID: 8 bytes om de ouder van de huidige SPAN uit te drukken in een inkomend verzoek of een uitgaande aanvraag.
- trace-flags: 8 位,调用者的建议标志,可以考虑为调用者的建议,限制为 3 个原因:信息或是滥用,调用方的错误,或者在调用方与被调用方的不同负载。
Alle velden zijn gecodeerd in hexadecimaal, zoals weergegeven in de onderstaande afbeelding:
.NET distributed tracing
Gedistribueerd traceren is een diagnostische techniek die ingenieurs helpt storingen en prestatieproblemen in applicaties te lokaliseren, vooral die welke over meerdere computers of processen verspreid kunnen zijn. Deze techniek correleert het werk dat door verschillende applicatiecomponenten wordt verricht met elkaar via verzoektracking in de applicatie en scheidt dit van ander werk dat de applicatie mogelijk uitvoert bij het afhandelen van gelijktijdige verzoeken. Een load balancer kan bijvoorbeeld eerst een verzoek ontvangen voor een typische webservice, dit vervolgens doorsturen naar een webserverproces, en vervolgens meerdere queries naar de database sturen. Met gedistribueerd traceren kunnen ingenieurs onderscheiden of deze stappen zijn mislukt, hoe lang elke stap duurt en welke berichten er kunnen worden gelogd wanneer elke stap wordt uitgevoerd.
In .NET is de bibliotheek System.Diagnostics.Activity geconfigureerd om de W3C-standaard te gebruiken. De W3C-stijl traceparent-header Request-Id header werd toegevoegd in ASP.NET Core 2.0. Om het te veranderen in een traceparent-header die voldoet aan de W3C Trace Context, zet je de statische eigenschap Activity.DefaultIdFormat op W3C wanneer je het programma start. De code is als volgt:
Testproces,Browser -> dienst A (/http, backend gebruikt HttpClient om dienst B aan te vragen) interface -> B service (/test) interface, Service A geeft zijn eigen Trace Context en Service B's Trace Context uit, de code is als volgt:
Start diensten A en B, zoals weergegeven in de volgende figuur:
De browser opent Service A, zoals weergegeven in de volgende figuur:
Id: 00-9891603e6c4921598951f425d98e4df7-bd06e8d507a43f42-00
TraceId: 9891603e6c4921598951f425d98e4df7
SpanId: bd06e8d507a43f42
ParentId:
Inhoud van de reactie:{"id":"00-9891603e6c4921598951f425d98e4df7-8874f9b2f9c0702e-00","traceId":"9891603e6c4921598951f425d98e4df7","spanId":"8874f9b2f9c0702e","parentId": "00-9891603e6c4921598951f425d98e4df7-e0336cc56a4f2150-00","traceFlags":"Geen","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: ma, 22 dec 2025 01:37:21 GMT Server: Kestrel Transfer-codering: gehuld Verbinding: in leven blijven Inhoudstype: applicatie/json; charset=utf-8 }, Request = Method: GET, RequestUri: 'http://localhost.charlesproxy.com:5551/test', Versie: 1.1, Inhoud: <null>, Headers:
{ traceparent: 00-9891603e6c4921598951f425d98e4df7-e0336cc56a4f2150-00 }, RequestTaskStatus = RanToCompletion } -------------------------------------------------- Met behulp van de Charles Proxy packet capture-tool zijn het verzoek en de reactie als volgt:
Als je de HttpClient wilt uitschakelen om traceparent door te geven, worden de omgevingsvariabelen als volgt ingesteld:
Referentie:
De hyperlink-login is zichtbaar.
De hyperlink-login is zichtbaar.
De hyperlink-login is zichtbaar.
De hyperlink-login is zichtbaar.
De hyperlink-login is zichtbaar.
De hyperlink-login is zichtbaar. |