Reikalavimai: Mikropaslaugų architektūroje, susidūrus su problemomis, dažnai labai sunku pašalinti triktis, nežinant, ar tai yra paslaugos išmesta išimtis, gali būti, kad paslauga rašo klaidą, arba yra problemų dėl paslaugą iškviečiančios paslaugos perduodamos informacijos. Jei galima įrašyti visų užklausų kontekstą, tai yra nuorodą į visą operacijos užklausą, labai svarbu pašalinti triktis ir išanalizuoti problemą.
Peržiūra:
Išimčių rietuvės pėdsakai idealiai tinka programoms, skirtoms vienam procesui, pvz., monolitinei programų sistemai. Tačiau, kita vertus, dirbant su paskirstytomis programomis, pvz., mikropaslaugų architektūromis, rietuvės pėdsakų nepakanka, kad būtų parodytas bendras pranešimo sekimas. Štai kodėl paskirstytos sekimo priemonės ir standartai tampa būtini. W3C apibrėžia šio tipo sekimo standartą, vadinamą Trace Context.
Sekti konteksto standartą
W3C Trace konteksto dokumentacija:Hipersaito prisijungimas matomas.
W3C sekimo konteksto specifikacija apibrėžia HTTP antraščių standartus ir formatus, skirtus paskirstyto sekimo konteksto informacijai platinti. Jame apibrėžiami 2 laukai, kurie naudojami sekimo srautui platinti HTTP užklausos antraštėje. Pažvelkime į šiuos 2 standartinio apibrėžimo laukus:
- traceparent: 用来描述在追踪图谱中到达请求的位置。它表示在追踪系统中到达请求的通用格式,被所有的 vendor 所理解。
- tracestate: 使用 vendor 特定的数据表示形式来扩展 traceparent,使用 name/value 对形式。在 tracestate 中保存信息是可选的。
Laukas "TraceParent"
Traceparent lauko specifikacija apibrėžiama išplėstinės Baccos paradigmos (ABNF) forma ir susideda iš 4 dalių:
versija - traceid - parentid/spanid - traceflags Pavyzdžiui:
00-480e22a2781fe54d992d878662248d94-b4b37b64bb3f6141-00
- version: 8 位,系统适配的追踪上下文版本,当前位 00
- trace-id: 16 字节,追踪整体的标识。用于在系统中标识一个分布式追踪整体,Toje pačioje nuorodoje reikšmė yra lygiai tokia pati。
- parent-id/span-id: 8 baitai, skirti išreikšti dabartinio intervalo pirminį gaunamoje arba siunčiamoje užklausoje.
- trace-flags: 8 位,调用者的建议标志,可以考虑为调用者的建议,限制为 3 个原因:信息或是滥用,调用方的错误,或者在调用方与被调用方的不同负载。
Visi laukai yra užkoduoti šešioliktaine, kaip parodyta paveikslėlyje žemiau:
.NET paskirstytas sekimas
Paskirstytas sekimas yra diagnostikos metodas, padedantis inžinieriams lokalizuoti programų gedimus ir našumo problemas, ypač tas, kurios gali būti paskirstytos keliuose kompiuteriuose ar procesuose. Šis metodas susieja skirtingų programos komponentų atliekamą darbą per užklausų sekimą programoje ir atskiria jį nuo kitų darbų, kuriuos programa gali atlikti tvarkydama vienu metu vykdomas užklausas. Pavyzdžiui, apkrovos balansavimo priemonė pirmiausia gali gauti tipinės žiniatinklio tarnybos užklausą, tada persiųsti ją į žiniatinklio serverio procesą ir pateikti kelias užklausas duomenų bazei. Naudodami paskirstytą sekimą, inžinieriai gali atskirti, ar šie veiksmai nepavyko, kiek laiko užtrunka kiekvienas veiksmas ir kokie pranešimai gali būti registruojami, kai atliekamas kiekvienas veiksmas.
.NET System.Diagnostics.Activity biblioteka sukonfigūruota naudoti W3C standartą. W3C stiliaus traceparent antraštė Request-Id antraštė buvo įtraukta į ASP.NET Core 2.0. Norėdami pakeisti ją į W3C sekimo kontekstą atitinkančią antrinę antraštę, paleidę programą nustatykite statinę ypatybę Activity.DefaultIdFormat į W3C. Kodas yra toks:
bandymo procesas,Naršyklė -> A paslauga (/http, backend naudoja HttpClient B paslaugai užklausti) sąsaja -> B paslaugos (/test) sąsaja, A paslauga išveda savo sekimo kontekstą, o B paslaugos sekimo kontekstą, kodas yra toks:
Paleiskite A ir B paslaugas, kaip parodyta šiame paveikslėlyje:
Naršyklė atidaro paslaugą A, kaip parodyta šiame paveikslėlyje:
Id: 00-9891603e6c4921598951f425d98e4df7-bd06e8d507a43f42-00
TraceId: 9891603e6c4921598951f425d98e4df7
SpanId: bd06e8d507a43f42
ParentId:
Atsakymo turinys:{"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: Mon, 22 Dec 2025 01:37:21 GMT Serveris: Kestrel Perdavimo kodavimas: fragmentas Ryšys: išlaikyti gyvą Turinio tipas: application/json; simbolių rinkinys=utf-8 }, užklausa = metodas: GET, RequestUri: 'http://localhost.charlesproxy.com:5551/test', versija: 1.1, turinys: <null>, antraštės:
{ Pėdsakas: 00-9891603e6c4921598951f425d98e4df7-e0336cc56a4f2150-00 }, RequestTaskStatus = RanToCompletion } -------------------------------------------------- Naudojant "Charles Proxy" paketų fiksavimo įrankį, užklausa ir atsakymas yra tokie:
Jei norite išjungti HttpClient perdavimą traceparent, aplinkos kintamieji nustatomi taip:
Nuoroda:
Hipersaito prisijungimas matomas.
Hipersaito prisijungimas matomas.
Hipersaito prisijungimas matomas.
Hipersaito prisijungimas matomas.
Hipersaito prisijungimas matomas.
Hipersaito prisijungimas matomas. |