Požadavky: V architektuře mikroslužeb je při výskytu problémů často velmi obtížné je diagnostikovat, aniž by bylo jasné, zda jde o výjimku ze strany služby, může se stát, že služba napíše chybu, nebo je problém s informacemi přenášenými službou, která službu volá. Pokud lze zaznamenat kontext všech požadavků, tedy spojení s celým požadavkem na celou transakci, je zásadní problém diagnostikovat a analyzovat.
Přezkoumání:
Stopy výjimek jsou ideální pro aplikace zaměřené na jeden proces, například pro monolitické aplikační systémy. Na druhou stranu, pro práci s distribuovanými aplikacemi, jako jsou architektury mikroservisů, stack trace nestačí k zobrazení celkového message trace. Proto jsou nástroje a standardy pro distribuované trasování nezbytné. W3C definuje standard pro tento typ stopy nazývaný Trace Context.
Standard Trace Context
Dokumentace kontextu W3C Trace:Přihlášení k hypertextovému odkazu je viditelné.
Specifikace W3C Trace Context definuje standardy a formáty pro HTTP hlavičky pro šíření informací o kontextu distribuovaného trace. Definuje 2 pole, která se používají k šíření trace flow v HTTP hlavičce požadavku. Podívejme se na tyto dvě pole ve standardní definici:
- traceparent: 用来描述在追踪图谱中到达请求的位置。它表示在追踪系统中到达请求的通用格式,被所有的 vendor 所理解。
- tracestate: 使用 vendor 特定的数据表示形式来扩展 traceparent,使用 name/value 对形式。在 tracestate 中保存信息是可选的。
pole traceparent
Specifikace pole traceparent je definována ve formě Rozšířeného Baccos Paradigmatu (ABNF) a skládá se ze 4 částí:
Verze - traceId - parentID/Spanid - TraceFlags Například:
00-480e22a2781fe54d992d878662248d94-b4b37b64bb3f6141-00
- version: 8 位,系统适配的追踪上下文版本,当前位 00
- trace-id: 16 字节,追踪整体的标识。用于在系统中标识一个分布式追踪整体,Hodnota je ve stejném odkazu přesně stejná。
- Parent-ID/SPAN-ID: 8 bajtů pro vyjádření rodiče aktuálního spanu v příchozím nebo odchozím požadavku.
- trace-flags: 8 位,调用者的建议标志,可以考虑为调用者的建议,限制为 3 个原因:信息或是滥用,调用方的错误,或者在调用方与被调用方的不同负载。
Všechna pole jsou kódována v hexadecimálním formátu, jak je znázorněno na obrázku níže:
.NET distribuované trasování
Distribuované trasování je diagnostická technika, která pomáhá inženýrům lokalizovat poruchy a problémy s výkonem v aplikacích, zejména těch, které mohou být distribuovány mezi více počítačů nebo procesů. Tato technika koreluje práci vykonanou různými aplikačními komponentami prostřednictvím sledování požadavků v aplikaci a odděluje ji od jiné práce, kterou může aplikace provádět při zpracování současných požadavků. Například load balancer může nejprve přijmout požadavek na typickou webovou službu, poté jej předat procesu webového serveru a následně zaslat více dotazů do databáze. Díky distribuovanému trasování mohou inženýři rozlišit, zda tyto kroky selhaly, jak dlouho každý krok trvá a jaké zprávy mohou být zaznamenány při každém provedení jednotlivých kroků.
V .NET byla knihovna System.Diagnostics.Activity nakonfigurována tak, aby používala standard W3C. Hlavička traceparent ve stylu W3C Request-Id byla přidána v ASP.NET Core 2.0. Pro změnu na traceparent hlavičku, která odpovídá W3C Trace Context, nastavte při spuštění programu statickou vlastnost Activity.DefaultIdFormat na W3C. Kód je následující:
Testovací proces,Prohlížeč -> A služba (/http, backend používá HttpClient k požadavku B služby) rozhraní -> B služba (/test), Služba A vydává svůj vlastní Trace Context a Trace Context služby B, kód je následující:
Začněte služby A a B, jak je znázorněno na následujícím obrázku:
Prohlížeč otevírá službu A, jak je znázorněno na následujícím obrázku:
Id: 00-9891603e6c4921598951f425d98e4df7-bd06e8d507a43f42-00
TraceId: 9891603e6c4921598951f425d98e4df7
SpanId: bd06e8d507a43f42
ParentId:
Obsah odpovědí:{"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:
{ Datum: Po 22. prosince 2025 01:37:21 GMT Server: Kestrel Přenosové kódování: rozdělené na části Spojení: udržuj naživu Typ obsahu: aplikace/json; Charset=utf-8 }, Request = Method: GET, RequestUri: 'http://localhost.charlesproxy.com:5551/test', Version: 1.1, Content: <null>, Headers:
{ TraceParent: 00-9891603e6c4921598951F425D98e4DF7-E0336CC56A4F2150-00 }, RequestTaskStatus = RanToCompletion } -------------------------------------------------- Pomocí nástroje Charles Proxy pro zachycení paketů jsou požadavky a odpovědi následující:
Pokud chcete zakázat HttpClientovi předávání traceparent, proměnné prostředí jsou nastaveny následovně:
Odkaz:
Přihlášení k hypertextovému odkazu je viditelné.
Přihlášení k hypertextovému odkazu je viditelné.
Přihlášení k hypertextovému odkazu je viditelné.
Přihlášení k hypertextovému odkazu je viditelné.
Přihlášení k hypertextovému odkazu je viditelné.
Přihlášení k hypertextovému odkazu je viditelné. |