Udostępnij za pośrednictwem


Pojęcia dotyczące śledzenia rozproszonego platformy .NET

Śledzenie rozproszone to technika diagnostyczna, która ułatwia inżynierom lokalizowanie błędów i problemów z wydajnością w aplikacjach, zwłaszcza tych, które mogą być dystrybuowane na wielu maszynach lub procesach. Zobacz Omówienie śledzenia rozproszonego, aby uzyskać ogólne informacje o tym, gdzie przydatne jest śledzenie rozproszone.

Ślady i działania

Za każdym razem, gdy nowe żądanie zostanie odebrane przez aplikację, może być skojarzone ze śladem. W składnikach aplikacji napisanych na platformie .NET jednostki pracy w śladzie są reprezentowane System.Diagnostics.Activity przez wystąpienia i ślad jako całość tworzy drzewo tych działań, potencjalnie obejmujące wiele różnych procesów. Pierwsze działanie utworzone dla nowego żądania tworzy katalog główny drzewa śledzenia i śledzi ogólny czas trwania i powodzenie/niepowodzenie obsługi żądania. Działania podrzędne można opcjonalnie utworzyć, aby podzielić pracę na różne kroki, które można śledzić indywidualnie. Na przykład, biorąc pod uwagę działanie, które śledziło określone przychodzące żądanie HTTP na serwerze internetowym, można utworzyć działania podrzędne w celu śledzenia każdego zapytania bazy danych, które były niezbędne do ukończenia żądania. Dzięki temu czas trwania i powodzenie każdego zapytania będą rejestrowane niezależnie. Działania mogą rejestrować inne informacje dla każdej jednostki pracy, takie jak OperationName, pary name-value o nazwie Tagsi Events. Nazwa identyfikuje typ wykonywanej pracy, tagi mogą rejestrować opisowe parametry pracy, a zdarzenia są prostym mechanizmem rejestrowania do rejestrowania komunikatów diagnostycznych ze znacznikami czasu.

Uwaga

Inną typową nazwą branżową jednostek pracy w śladach rozproszonych jest "Spans". Platforma .NET przyjęła termin "Działanie" wiele lat temu, zanim nazwa "Span" została dobrze ustanowiona dla tej koncepcji.

Identyfikatory działań

Relacje nadrzędno-podrzędne między działaniami w rozproszonym drzewie śledzenia są ustanawiane przy użyciu unikatowych identyfikatorów. . Implementacja śledzenia rozproszonego platformy NET obsługuje dwa schematy identyfikatorów: standardowy element TraceContext W3C, który jest domyślny w programie .NET 5+, oraz starszą konwencją platformy .NET o nazwie "Hierarchiczna", która jest dostępna na potrzeby zgodności z poprzednimi wersjami. Activity.DefaultIdFormat określa, który schemat identyfikatorów jest używany. W standardzie W3C TraceContext każdy ślad jest przypisany globalnie unikatowy 16-bajtowy identyfikator śledzenia (Activity.TraceId), a każde działanie w ramach śledzenia ma przypisany unikatowy 8-bajtowy identyfikator zakresu (Activity.SpanId). Każde działanie rejestruje identyfikator śledzenia, własny identyfikator zakresu i identyfikator zakresu jego elementu nadrzędnego (Activity.ParentSpanId). Ponieważ rozproszone ślady mogą śledzić pracę w granicach procesu, działania nadrzędne i podrzędne mogą nie być w tym samym procesie. Kombinacja identyfikatora śledzenia i nadrzędnego pola span-id może jednoznacznie identyfikować działanie nadrzędne globalnie, niezależnie od tego, w jakim procesie się znajduje.

Activity.DefaultIdFormat określa format identyfikatora używany do uruchamiania nowych śladów, ale domyślnie dodanie nowego działania do istniejącego śledzenia używa dowolnego formatu używanego przez nadrzędne działanie. Ustawienie Activity.ForceDefaultIdFormat wartości true zastępuje to zachowanie i tworzy wszystkie nowe działania z wartością DefaultIdFormat, nawet jeśli element nadrzędny używa innego formatu identyfikatora.

Uruchamianie i zatrzymywanie działań

Każdy wątek w procesie może mieć odpowiedni obiekt Działania, który śledzi pracę wykonaną w tym wątku, dostępny za pośrednictwem metody Activity.Current. Bieżące działanie automatycznie przepływa we wszystkich synchronicznych wywołaniach wątku i wykonuje wywołania asynchroniczne przetwarzane w różnych wątkach. Jeśli działanie A jest bieżącym działaniem w wątku, a kod uruchamia nowe działanie B, B staje się nowym bieżącym działaniem w tym wątku. Domyślnie działanie B będzie również traktować działanie A jako element nadrzędny. Gdy działanie B zostanie później zatrzymane, działanie A zostanie przywrócone jako bieżące działanie w wątku. Po uruchomieniu działania przechwytuje bieżący czas jako Activity.StartTimeUtc. Po zatrzymaniu Activity.Duration jest obliczana jako różnica między bieżącą godziną a czasem rozpoczęcia.

Współrzędna między granicami procesu

Aby śledzić pracę przez granice procesów, identyfikatory nadrzędne działań muszą być przesyłane przez sieć, aby proces odbierania mógł tworzyć działania odwołujące się do nich. W przypadku korzystania z formatu identyfikatora TraceContext W3C platforma .NET używa również nagłówków HTTP zalecanych przez standard do przesyłania tych informacji. W przypadku korzystania z formatu identyfikatora Hierarchical platforma .NET używa niestandardowego nagłówka HTTP identyfikatora żądania do przesyłania identyfikatora. W przeciwieństwie do wielu innych środowisk uruchomieniowych języka biblioteki wbudowane platformy .NET, takie jak serwer internetowy ASP.NET i System.Net.Http, natywnie rozumieją, jak dekodować i kodować identyfikatory działań w komunikatach HTTP. Środowisko uruchomieniowe rozumie również, jak przepływać identyfikator za pomocą wywołań synchronicznych i asynchronicznych. Oznacza to, że aplikacje platformy .NET, które odbierają i emitują komunikaty HTTP, uczestniczą w automatycznym przepływie rozproszonych identyfikatorów śledzenia bez specjalnego kodowania przez dewelopera aplikacji ani zależności bibliotek innych firm. Biblioteki innych firm mogą dodać obsługę przesyłania identyfikatorów za pośrednictwem protokołów komunikatów innych niż HTTP lub obsługi niestandardowych konwencji kodowania dla protokołu HTTP.

Zbieranie śladów

Instrumentowany kod może tworzyć Activity obiekty w ramach rozproszonego śledzenia, ale informacje w tych obiektach muszą być przesyłane i serializowane w scentralizowanym magazynie trwałym, aby cały ślad można było przejrzeć później. Istnieje kilka bibliotek kolekcji danych telemetrycznych, które mogą wykonywać to zadanie, takie jak application Szczegółowe informacje, OpenTelemetry lub biblioteka dostarczana przez dostawcę telemetrii innej firmy lub dostawcy APM. Alternatywnie deweloperzy mogą tworzyć własne niestandardowe kolekcje telemetrii aktywności za pomocą polecenia System.Diagnostics.ActivityListener lub System.Diagnostics.DiagnosticListener. Element ActivityListener obsługuje obserwowanie dowolnego działania niezależnie od tego, czy deweloper ma wcześniejszą wiedzę na ten temat. Dzięki temu element ActivityListener jest prostym i elastycznym rozwiązaniem ogólnego przeznaczenia. Natomiast użycie narzędzia DiagnosticListener jest bardziej złożonym scenariuszem, który wymaga, aby instrumentowany kod zdecydował się na wywołanie DiagnosticSource.StartActivity , a biblioteka kolekcji musi znać dokładne informacje nazewnictwa używane podczas jego uruchamiania. Użycie elementu DiagnosticSource i DiagnosticListener umożliwia twórcy i odbiornikowi wymianę dowolnych obiektów platformy .NET i ustanowienie niestandardowych konwencji przekazywania informacji.

Próbkowanie

Aby uzyskać lepszą wydajność w aplikacjach o wysokiej przepływności, śledzenie rozproszone na platformie .NET obsługuje próbkowanie tylko podzestaw śladów, a nie rejestrowanie wszystkich z nich. W przypadku działań utworzonych za pomocą zalecanego ActivitySource.StartActivity interfejsu API biblioteki kolekcji danych telemetrycznych mogą kontrolować próbkowanie za pomocą wywołania zwrotnego ActivityListener.Sample . Biblioteka rejestrowania może w ogóle nie tworzyć działania, aby utworzyć je z minimalnymi informacjami niezbędnymi do propagowania identyfikatorów śledzenia dystrybucji lub wypełnić je pełnymi informacjami diagnostycznymi. Te opcje zastępują zwiększenie nakładu pracy związanego z wydajnością w celu zwiększenia narzędzia diagnostycznego. Działania, które zaczynają używać starszego wzorca wywoływania Activity.Activity , a DiagnosticSource.StartActivity także mogą obsługiwać próbkowanie DiagnosticListener przez pierwsze wywołanie metody DiagnosticSource.IsEnabled. Nawet w przypadku przechwytywania pełnych informacji diagnostycznych implementacja platformy .NET została zaprojektowana tak, aby mogła być szybka — w połączeniu z wydajnym modułem zbierającym można utworzyć, wypełnić i przekazać działanie około mikrosekundy na nowoczesnym sprzęcie. Próbkowanie może zmniejszyć koszt instrumentacji do mniej niż 100 nanosekund dla każdego nie zarejestrowanego działania.

Następne kroki

Aby na przykład rozpocząć korzystanie z śledzenia rozproszonego w aplikacjach platformy .NET, zobacz Instrumentacja śledzenia rozproszonego.