Acest articol este un articol oglindă al traducerii automate, vă rugăm să faceți clic aici pentru a sări la articolul original.

Vedere: 56|Răspunde: 0

[ASP.NET] ASP.NET Nucleu (34) Context de urmărire

[Copiază linkul]
Postat peAcum 4 zile | | | |
Cerințe: În arhitectura microserviciilor, atunci când întâmpini probleme, este adesea foarte dificil să se depaneze, neștiind dacă este o excepție aruncată de serviciu, poate fi că serviciul scrie un bug sau există o problemă cu informațiile transmise de serviciul care apelează serviciul. Dacă contextul tuturor cererilor poate fi înregistrat, adică legătura către întreaga cerere de tranzacție, este esențial să se depaneze și să analizeze problema.

Recenzie:
ASP.NET Core link tracing (2) folosește integrarea SkyAPM
https://www.itsvse.com/thread-9458-1-1.html

ASP.NET Core Link Tracing (4) Acces la Jaeger link tracing
https://www.itsvse.com/thread-9537-1-1.html

Trace-urile de stivă excepțională sunt ideale pentru aplicațiile care vizează un singur proces, cum ar fi un sistem de aplicații monolitic. Dar, pe de altă parte, pentru gestionarea aplicațiilor distribuite, cum ar fi arhitecturile microserviciilor, traseele stack nu sunt suficiente pentru a arăta trasarea generală a mesajului. De aceea, instrumentele și standardele de trasare distribuită devin necesare. W3C definește un standard pentru acest tip de trasă numit Trace Context.

Standardul Trace Context

Documentația contextului Trace W3C:Autentificarea cu hyperlink este vizibilă.

Specificația W3C Trace Context definește standarde și formate pentru anteturile HTTP pentru a propaga informațiile distribuite ale contextului trace-urilor. Definește 2 câmpuri care sunt folosite pentru a propaga fluxul de trasee în antetul cererii HTTP. Să aruncăm o privire la aceste 2 câmpuri în definiția standard:

  • traceparent: 用来描述在追踪图谱中到达请求的位置。它表示在追踪系统中到达请求的通用格式,被所有的 vendor 所理解。
  • tracestate: 使用 vendor 特定的数据表示形式来扩展 traceparent,使用 name/value 对形式。在 tracestate 中保存信息是可选的。

Câmpul traceparent

Specificația câmpului traceparent este definită sub forma Paradigmei Baccos Extinse (ABNF) și constă din 4 părți:
Versiune - traceid - parentid/spanid - traceflags

De exemplu:
00-480e2a2781fe54d992d878662248d94-b4b37b64bb3f6141-00

  • version: 8 位,系统适配的追踪上下文版本,当前位 00
  • trace-id: 16 字节,追踪整体的标识。用于在系统中标识一个分布式追踪整体,Valoarea este exact aceeași în același link
  • Parent-ID/SPAN-ID: 8 octeți pentru a exprima părintele span-ului curent într-o cerere inbound sau outbound.
  • trace-flags: 8 位,调用者的建议标志,可以考虑为调用者的建议,限制为 3 个原因:信息或是滥用,调用方的错误,或者在调用方与被调用方的不同负载。

Toate câmpurile sunt codificate în hexazecimal, așa cum se arată în imaginea de mai jos:



Trasarea distribuită .NET

Trasarea distribuită este o tehnică de diagnostic care ajută inginerii să localizeze defecțiunile și problemele de performanță în aplicații, în special cele care pot fi distribuite pe mai multe calculatoare sau procese. Această tehnică corelează munca efectuată de diferite componente ale aplicației prin urmărirea cererilor în aplicație și o separă de alte sarcini pe care aplicația le-ar putea efectua în gestionarea cererilor simultane. De exemplu, un load balancer poate primi mai întâi o cerere pentru un serviciu web tipic, apoi să o trimită către un proces de server web și apoi să emită mai multe interogări către baza de date. Cu trasarea distribuită, inginerii pot distinge dacă acești pași au eșuat, cât durează fiecare pas și ce mesaje pot fi înregistrate la rularea fiecărui pas.

În .NET, biblioteca System.Diagnostics.Activity a fost configurată să folosească standardul W3C. Antetul traceparent în stil W3C, Request-Id, a fost adăugat în ASP.NET Core 2.0. Pentru a-l schimba într-un antet traceparent care să corespundă contextului Trace W3C, setează proprietatea statică Activity.DefaultIdFormat la W3C când pornești programul. Codul este următorul:
procesul de testare,Browser -> Interfața serviciului A (/http, backend-ul folosește HttpClient pentru a solicita serviciul B) -interfața serviciului > B (/test), Serviciul A generează propriul său Context de Urmărire și Contextul de Urmărire al Serviciului B, codul fiind următorul:
Începeți serviciile A și B, așa cum este ilustrat în figura următoare:



Browserul deschide Serviciul A, așa cum se vede în următoarea figură:


Id: 00-9891603e6c4921598951f425d98e4df7-bd06e8d507a43f42-00
TraceId: 9891603e6c4921598951f425d98e4df7
SpanId: bd06e8d507a43f42
ParentId:

Conținutul răspunsului:{"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:
{
  Data: Luni, 22 Dec 2025 01:37:21 GMT
  Server: Kestrel
  Transfer-Codificare: fragmentată
  Conexiune: păstrează-te în viață
  Tipul conținutului: application/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 }
--------------------------------------------------
Folosind instrumentul Charles Proxy de capturare a pachetelor, cererea și răspunsul sunt următoarele:



Dacă doriți să dezactivați Clientul Http să nu transmită traceparent, variabilele de mediu sunt setate astfel:

Referință:

Autentificarea cu hyperlink este vizibilă.
Autentificarea cu hyperlink este vizibilă.
Autentificarea cu hyperlink este vizibilă.
Autentificarea cu hyperlink este vizibilă.
Autentificarea cu hyperlink este vizibilă.
Autentificarea cu hyperlink este vizibilă.




Precedent:010 Editor nu vine implicit cu un șablon DEX
Următor:Compilarea proiectului front-end Nu se poate seta proprietăți ale undefined (setarea 'părinte')
Disclaimer:
Tot software-ul, materialele de programare sau articolele publicate de Code Farmer Network sunt destinate exclusiv scopurilor de învățare și cercetare; Conținutul de mai sus nu va fi folosit în scopuri comerciale sau ilegale, altfel utilizatorii vor suporta toate consecințele. Informațiile de pe acest site provin de pe Internet, iar disputele privind drepturile de autor nu au legătură cu acest site. Trebuie să ștergi complet conținutul de mai sus de pe calculatorul tău în termen de 24 de ore de la descărcare. Dacă îți place programul, te rugăm să susții software-ul autentic, să cumperi înregistrarea și să primești servicii autentice mai bune. Dacă există vreo încălcare, vă rugăm să ne contactați prin e-mail.

Mail To:help@itsvse.com