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. Obecné informace o tom, kde je distribuované trasování užitečné, najdete v přehledu distribuovaného trasování.

Trasování a aktivity

Pokaždé, když aplikace obdrží novou žádost, může být přidružena k trasovacímu záznamu. V komponentách aplikace napsaných v .NET jsou jednotky práce v trasování reprezentovány instancemi System.Diagnostics.Activity a trasování 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. Práci lze rozdělit na jednotlivé sledovatelné kroky vytvořením volitelných podřízených aktivit. Například vzhledem k 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, například OperationName, páry název a hodnota označované jako 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, než byl název "Span" pro tento koncept dobře zaveden.

Identifikátory aktivit

Parent-Child vztahy mezi aktivitami v distribuovaném trasovacím stromu se navazují pomocí jedinečných ID. Implementace distribuovaného trasování v rozhraní .NET podporuje dvě schémata ID: standard W3C TraceContext, což je výchozí v .NET 5+, a starší konvence .NET zvaná 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á trace-id, své vlastní span-id a span-id svého nadřazeného objektu (Activity.ParentSpanId). Vzhledem k tomu, že distribuované sledování stop může sledovat práci napříč hranicemi procesu, nadřazené a podřízené aktivity nemusí být ve stejném procesu. Kombinace trace-id a parent span-id může globálně jedinečně identifikovat nadřazenou aktivitu bez ohledu na to, v jakém procesu se nachází.

Activity.DefaultIdFormat určuje, který formát ID se používá pro zahajování nových trasování, ale ve výchozím nastavení, pokud přidáváte novou aktivitu do existujícího trasování, se použije formát, který používá nadřazená aktivita. Nastavení Activity.ForceDefaultIdFormat na 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 prochází všemi synchronními voláními ve vlákně a sleduje asynchronní volání, 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ě. Při spuštění aktivity zaznamená aktuální čas jako Activity.StartTimeUtc. Když se zastaví, Activity.Duration se vypočítá jako rozdíl mezi aktuálním časem a počátečním časem.

Koordinovat napříč hranicemi procesů

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é standardní k přenosu těchto informací. Při použití formátu ID Hierarchical používá .NET vlastní hlavičku HTTP request-id k přenosu ID. Na rozdíl od mnoha jiných jazykových modulů runtime, integrované knihovny .NET, jako je například webový server ASP.NET a System.Net.Http, nativně chápou, jak kódovat a dekódovat ID aktivit ve zprávách HTTP. Modul runtime také rozumí tomu, jak správně zajišťovat tok 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, automaticky zpracovávají distribuovaná ID trasování, aniž by bylo třeba speciální kódování od vývojářů aplikací nebo závislostí na knihovnách 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.

Sbírejte stopy

Instrumentovaný kód může vytvářet Activity objekty jako součást distribuovaného trasování, ale informace v těchto objektech je potřeba přenášet a serializovat do centralizovaného trvalého úložiště, aby bylo možné celé trasování užitečně zkontrolovat později. Tuto úlohu může provádět několik knihoven shromažďování telemetrických dat, jako je Application Insights, OpenTelemetrynebo knihovna, kterou poskytuje externí telemetrie nebo dodavatel APM. Vývojáři můžou také vytvářet vlastní kolekce telemetrie aktivity 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. Použití DiagnosticListener je naopak složitější scénář, který vyžaduje od instrumentovaného kódu souhlas vyvoláním DiagnosticSource.StartActivity, a knihovna kolekcí potřebuje znát přesné informace o pojmenování, které instrumentovaný kód použil při svém spuštění. 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žiny tras, namísto jejich úplného zaznamenávání. U aktivit vytvořených pomocí doporučeného rozhraní API pro ActivitySource.StartActivity můžou knihovny shromažďování telemetrických dat řídit vzorkování pomocí zpětného volání ActivityListener.Sample. Knihovna protokolování se může rozhodnout aktivitu nevytvořit vůbec, vytvořit ji s minimálními informacemi potřebnými k distribuci trasovacích ID, nebo ji naplnit úplnými diagnostickými informacemi. Těmito volbami se vyměňuje vyšší výkonnostní režie za lepší diagnostickou užitečnost. Aktivity, které začaly používat starší způsob volání Activity.Activity a DiagnosticSource.StartActivity, mohou také podporovat vzorkování DiagnosticListener prvním voláním DiagnosticSource.IsEnabled. I při zachytávání úplných diagnostických informací je implementace .NET navržená tak, aby byla rychlá – v kombinaci s efektivním kolektorem je možné vytvořit, naplnit a přenášet aktivitu 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 instrumentaci pro distribuované trasování.

Seznam aktivit emitovaných nativně rozhraním .NET najdete v části Vestavěné aktivity v rozhraní .NET.