Sdílet prostřednictvím


Koncepty distribuovaného trasování .NET

Distribuované trasování je diagnostická technika, která technikům pomáhá lokalizovat chyby a problémy s výkonem v aplikacích, zejména těch, které mohou být distribuovány napříč více počítači nebo procesy. V přehledu distribuovaného trasování najdete obecné informace o tom, kde je distribuované trasování užitečné a ukázkový kód, který vám umožní začít.

Trasování a aktivity

Pokaždé, když aplikace obdrží novou žádost, může být přidružena k trasování. V komponentách aplikací napsaných v .NET jsou jednotky práce v trasování reprezentovány instancemi System.Diagnostics.Activity a trasováním jako celek tvoří strom těchto aktivit, které mohou být rozloženy napříč mnoha různými procesy. První aktivita vytvořená pro nový požadavek tvoří kořen stromu trasování a sleduje celkovou dobu trvání a úspěšnost nebo selhání zpracování požadavku. Podřízené aktivity je možné volitelně vytvořit pro rozdělení práce do různých kroků, které je možné sledovat jednotlivě. Například při aktivitě, která sledovala konkrétní příchozí požadavek HTTP na webovém serveru, lze podřízené aktivity vytvořit ke sledování jednotlivých databázových dotazů, které byly nezbytné k dokončení požadavku. To umožňuje nezávisle zaznamenávat dobu trvání a úspěšnost každého dotazu. Aktivity mohou zaznamenávat další informace pro každou jednotku práce, jako OperationNamejsou páry název-hodnota s názvem Tags, a Events. Název identifikuje typ prováděné práce, značky mohou zaznamenávat popisné parametry práce a události představují jednoduchý mechanismus protokolování pro zaznamenávání časových razítek diagnostických zpráv.

Poznámka:

Dalším běžným názvem odvětví pro jednotky práce v distribuovaném trasování jsou "Spans". .NET přijal termín "Aktivita" před mnoha lety před názvem Span byl pro tento koncept dobře zaveden.

ID aktivit

Vztahy nadřazenosti a podřízenosti mezi aktivitami v distribuovaném trasovacím stromu se navazují pomocí jedinečných ID. . Implementace distribuovaného trasování podporuje dvě schémata ID: standard TraceContext W3C, což je výchozí hodnota v .NET 5+ a starší konvence .NET s názvem Hierarchická, která je k dispozici pro zpětnou kompatibilitu. Activity.DefaultIdFormat určuje, které schéma ID se používá. Ve standardu W3C TraceContext je každému trasování přiřazeno globálně jedinečné 16bajtů trace-id (Activity.TraceId) a každé aktivitě v rámci trasování je přiřazeno jedinečné 8bajtů span-id (Activity.SpanId). Každá aktivita zaznamenává id trasování, vlastní span-ID a ID rozsahu nadřazeného objektu (Activity.ParentSpanId). Vzhledem k tomu, že distribuované trasování může sledovat práci napříč hranicemi procesu, nadřazené a podřízené aktivity nemusí být ve stejném procesu. Kombinace id trasování a id nadřazeného rozsahu může jedinečně identifikovat nadřazenou aktivitu globálně bez ohledu na to, v jakém procesu se nachází.

Activity.DefaultIdFormat určuje, který formát ID se používá pro spouštění nových trasování, ale ve výchozím nastavení přidává novou aktivitu do existujícího trasování, používá jakýkoli formát, který nadřazená aktivita používá. Nastavení Activity.ForceDefaultIdFormat na hodnotu true toto chování přepíše a vytvoří všechny nové aktivity s defaultIdFormat, i když nadřazený objekt používá jiný formát ID.

Spuštění a zastavení aktivit

Každé vlákno v procesu může mít odpovídající objekt aktivity, který sleduje práci na daném vlákně, přístupné prostřednictvím Activity.Current. Aktuální aktivita automaticky proudí podél všech synchronních volání ve vlákně a také po asynchronních voláních, která se zpracovávají v různých vláknech. Pokud je aktivita A aktuální aktivitou ve vlákně a kód spustí novou aktivitu B, stane se B novou aktuální aktivitou v daném vlákně. Ve výchozím nastavení bude aktivita B zacházet s aktivitou A jako s nadřazenou aktivitou. Když je aktivita B později zastavena, aktivita A se obnoví jako aktuální aktivita ve vlákně. Když je aktivita spuštěna, zachycuje aktuální čas jako Activity.StartTimeUtc. Když se zastaví, Activity.Duration vypočítá se jako rozdíl mezi aktuálním časem a počátečním časem.

Souřadnice přes hranice procesu

Aby bylo možné sledovat práci přes hranice procesu, musí se nadřazená ID aktivit přenášet přes síť, aby přijímající proces mohl vytvářet aktivity, které na ně odkazují. Při použití formátu ID trasování W3C používá .NET také hlavičky HTTP doporučené standardem k přenosu těchto informací. Při použití Hierarchical formátu ID používá .NET k přenosu ID vlastní hlavičku HTTP ID požadavku. Na rozdíl od mnoha jiných jazykových modulů runtime knihovny .NET in-box, jako je například webový server ASP.NET a System.Net.Http, nativně chápou, jak dekódovat a kódovat ID aktivit ve zprávách HTTP. Modul runtime také rozumí toku ID prostřednictvím synchronních a asynchronních volání. To znamená, že aplikace .NET, které přijímají a generují zprávy HTTP, se automaticky účastní toku distribuovaných ID trasování bez speciálního kódování závislostí knihovny nebo vývojářů aplikací třetích stran. Knihovny třetích stran můžou přidat podporu pro přenos ID přes protokoly zpráv jiného typu než HTTP nebo podporu vlastních konvencí kódování pro PROTOKOL HTTP.

Shromažďování trasování

Instrumentovaný kód může vytvářet Activity objekty jako součást distribuovaného trasování, ale informace v těchto objektech musí být přenášeny a serializovány v centralizované trvalé úložiště, aby bylo možné celé trasování užitečně zkontrolovat později. K dispozici je několik knihoven shromažďování telemetrických dat, které můžou tuto úlohu provést, například application Přehledy, OpenTelemetry nebo knihovnu poskytovanou externí telemetrií nebo dodavatelem APM. Alternativně můžou vývojáři vytvářet vlastní shromažďování telemetrie aktivit pomocí System.Diagnostics.ActivityListener nebo System.Diagnostics.DiagnosticListener. ActivityListener podporuje sledování jakékoli aktivity bez ohledu na to, jestli má vývojář nějaké předchozí znalosti. Díky tomu je ActivityListener jednoduchým a flexibilním řešením pro obecné účely. Naproti tomu použití diagnosticListener je složitější scénář, který vyžaduje instrumentovaný kód, aby se přihlásil vyvoláním DiagnosticSource.StartActivity a knihovna kolekcí potřebuje znát přesné informace o pojmenování, které instrumentovaný kód použitý při jeho spuštění používá. Použití DiagnosticSource a DiagnosticListener umožňuje tvůrci a naslouchacímu procesu vyměňovat libovolné objekty .NET a stanovit přizpůsobené konvence předávání informací.

Vzorkování

Kvůli lepšímu výkonu v aplikacích s vysokou propustností podporuje distribuované trasování v .NET vzorkování pouze podmnožinu trasování, nikoli jejich záznam. U aktivit vytvořených s doporučeným ActivitySource.StartActivity rozhraním API můžou knihovny shromažďování telemetrických dat řídit vzorkování pomocí zpětného ActivityListener.Sample volání. Knihovna protokolování se nemůže vůbec rozhodnout, že aktivitu nevytvoří, aby ji vytvořila s minimálními informacemi potřebnými k šíření ID trasování nebo k naplnění úplnými diagnostickými informacemi. Tyto volby se můžou zvyšovat režijní náklady na výkon pro zvýšení diagnostického nástroje. Aktivity, které začaly používat starší vzor vyvolání Activity.Activity a DiagnosticSource.StartActivity mohou také podporovat vzorkování DiagnosticListener prvním voláním DiagnosticSource.IsEnabled. I když se zachytávají úplné diagnostické informace, je implementace .NET navržená tak, aby byla rychlá – spolu s efektivním kolektorem lze vytvořit, naplnit a přenášet informace o mikrosekundách na moderním hardwaru. Vzorkování může snížit náklady na instrumentaci na méně než 100 nanosekund pro každou nezaznamenanou aktivitu.

Další kroky

Příklad kódu, který vám umožní začít používat distribuované trasování v aplikacích .NET, najdete v tématu Instrumentace distribuovaného trasování.