Anforderungen: In der Microservice-Architektur ist es bei Problemen oft sehr schwierig, Fehler zu beheben, da man nicht weiß, ob es sich um eine Ausnahme handelt, die vom Service ausgelöst wird; es kann daran liegen, dass der Dienst einen Fehler schreibt oder es ein Problem mit den Informationen gibt, die vom Service übermittelt werden, der den Service aufruft. Wenn der Kontext aller Anfragen aufgezeichnet werden kann, also die Verbindung zur gesamten vollständigen Transaktionsanfrage, ist es entscheidend, das Problem zu beheben und zu analysieren.
Rezension:
Ausnahmestack-Traces sind ideal für Anwendungen, die auf einen einzelnen Prozess abzielen, wie etwa ein monolithisches Anwendungssystem. Andererseits reichen Stack-Traces für den Umgang mit verteilten Anwendungen wie Microservices-Architekturen nicht aus, um die gesamte Nachrichtenspur darzustellen. Deshalb sind Werkzeuge und Standards für verteiltes Nachverfolgen notwendig. Das W3C definiert einen Standard für diese Art von Spur namens Trace Context.
Trace Context Standard
W3C Trace Context Dokumentation:Der Hyperlink-Login ist sichtbar.
Die W3C Trace Context-Spezifikation definiert Standards und Formate für HTTP-Header zur Weitergabe verteilter Trace-Kontextinformationen. Es definiert zwei Felder, die verwendet werden, um den Trace-Fluss im HTTP-Anfrage-Header weiterzugeben. Schauen wir uns diese zwei Felder in der Standarddefinition an:
- traceparent: 用来描述在追踪图谱中到达请求的位置。它表示在追踪系统中到达请求的通用格式,被所有的 vendor 所理解。
- tracestate: 使用 vendor 特定的数据表示形式来扩展 traceparent,使用 name/value 对形式。在 tracestate 中保存信息是可选的。
traceparent-Feld
Die Spezifikation für das traceparent-Feld ist in Form des Extended Baccos Paradigm (ABNF) definiert und besteht aus 4 Teilen:
Version - traceid - parentid/spanid - traceflags Zum Beispiel:
00-480e22a2781fe54d992d878662248d94-b4b37b64bb3f6141-00
- version: 8 位,系统适配的追踪上下文版本,当前位 00
- trace-id: 16 字节,追踪整体的标识。用于在系统中标识一个分布式追踪整体,Der Wert ist im selben Link exakt gleich。
- Parent-ID/SPAN-ID: 8 Bytes, um den Elternteil des aktuellen SPAN in einer eingehenden oder ausgehenden Anfrage auszudrücken.
- trace-flags: 8 位,调用者的建议标志,可以考虑为调用者的建议,限制为 3 个原因:信息或是滥用,调用方的错误,或者在调用方与被调用方的不同负载。
Alle Felder sind hexadezimal codiert, wie im untenstehenden Bild gezeigt:
.NET-verteiltes Tracking
Distributed Tracing ist eine Diagnosetechnik, die Ingenieuren hilft, Fehler und Leistungsprobleme in Anwendungen zu lokalisieren, insbesondere solche, die über mehrere Computer oder Prozesse verteilt sein können. Diese Technik korreliert die von verschiedenen Anwendungskomponenten geleistete Arbeit durch Request Tracking in der Anwendung und trennt sie von anderen Arbeiten, die die Anwendung bei gleichzeitiger Bearbeitung von Anfragen ausführen könnte. Zum Beispiel kann ein Load Balancer zunächst eine Anfrage für einen typischen Webservice erhalten, diese dann an einen Webserver-Prozess weiterleiten und anschließend mehrere Abfragen an die Datenbank senden. Mit verteiltem Nachverfolgen können Ingenieure erkennen, ob diese Schritte fehlgeschlagen haben, wie lange jeder Schritt dauert und welche Nachrichten beim Ausführen protokolliert werden können.
In .NET wurde die System.Diagnostics.Activity-Bibliothek so konfiguriert, dass sie den W3C-Standard verwendet. Der W3C-ähnliche traceparent-Header Request-Id wurde in ASP.NET Core 2.0 hinzugefügt. Um es in einen Traceparent-Header zu ändern, der dem W3C-Trace-Kontext entspricht, setzen Sie beim Start des Programms die statische Eigenschaft Activity.DefaultIdFormat auf W3C. Der Code lautet wie folgt:
Testprozess,Browser -> Dienst A (/http, Backend nutzt HttpClient zur Anfrage von Dienst B) Schnittstelle -> Dienst B (/test) Schnittstelle, Dienst A gibt seinen eigenen Trace-Kontext und den Trace-Kontext von Service B aus, der Code lautet wie folgt:
Starte die Dienste A und B, wie in der folgenden Abbildung dargestellt:
Der Browser öffnet Service A, wie in der folgenden Abbildung gezeigt:
Id: 00-9891603e6c4921598951f425d98e4df7-bd06e8d507a43f42-00
TraceId: 9891603e6c4921598951f425d98e4df7
SpanId: bd06e8d507a43f42
ParentId:
Inhalt der Antwort:{"id":"00-9891603e6c4921598951f425d98e4df7-8874f9b2f9c0702e-00","traceId":"9891603e6c4921598951f425d98e4df7","spanId":"8874f9b2f9c0702e","parentId": "00-9891603e6c4921598951f425d98e4df7-e0336cc56a4f2150-00","traceFlags":"Keine","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: Mo, 22. Dez 2025 01:37:21 GMT Kellner: Kestrel Transfer-Kodierung: gehackt Verbindung: am Leben bleiben Inhaltstyp: application/json; charset=utf-8 }, Request = Methode: GET, RequestUri: 'http://localhost.charlesproxy.com:5551/test', Version: 1.1, Inhalt: <null>, Headers:
{ traceparent: 00-9891603e6c4921598951f425d98e4df7-e0336cc56a4f2150-00 }, RequestTaskStatus = RanToCompletion } -------------------------------------------------- Mit dem Charles Proxy Paketerfassungstool sind Anfrage und Antwort wie folgt:
Wenn Sie den HttpClient daran hindern möchten, Traceparent zu übergeben, werden die Umgebungsvariablen wie folgt gesetzt:
Referenz:
Der Hyperlink-Login ist sichtbar.
Der Hyperlink-Login ist sichtbar.
Der Hyperlink-Login ist sichtbar.
Der Hyperlink-Login ist sichtbar.
Der Hyperlink-Login ist sichtbar.
Der Hyperlink-Login ist sichtbar. |