Udostępnij za pośrednictwem


Emitowanie danych śledzenia elementu User-Code

Oprócz włączania śledzenia w konfiguracji w celu zbierania danych instrumentacji generowanych przez program Windows Communication Foundation (WCF), można również programowo emitować ślady w kodzie użytkownika. W ten sposób można aktywnie tworzyć dane instrumentacji, które można później uzyskać do celów diagnostycznych. W tym temacie omówiono sposób, w jaki można to zrobić.

Ponadto przykład rozszerzenia śledzenia zawiera cały kod przedstawiony w poniższych sekcjach.

Tworzenie źródła śledzenia

Aby utworzyć źródło śledzenia użytkownika, możesz użyć następującego kodu.

TraceSource ts = new TraceSource("myUserTraceSource");

Tworzenie działań

Działania są jednostką logiczną przetwarzania. Można utworzyć jedno działanie dla każdej głównej jednostki przetwarzania, w której mają być zgrupowane ślady. Można na przykład utworzyć jedno działanie dla każdego żądania do usługi. Aby to zrobić, wykonaj następujące czynności.

  1. Zapisz identyfikator działania w zakresie.

  2. Utwórz nowy identyfikator działania.

  3. Przenieś z działania w zakresie do nowego, ustaw nowe działanie w zakresie i emituj ślad rozpoczęcia dla tego działania.

Poniższy kod pokazuje, jak to zrobić.

Guid oldID = Trace.CorrelationManager.ActivityId;
Guid traceID = Guid.NewGuid();
ts.TraceTransfer(0, "transfer", traceID);
Trace.CorrelationManager.ActivityId = traceID; // Trace is static
ts.TraceEvent(TraceEventType.Start, 0, "Add request");

Emitowanie śladów w działaniu użytkownika

Poniższy kod emituje ślady w działaniu użytkownika.

double value1 = 100.00D;
double value2 = 15.99D;
ts.TraceInformation("Client sends message to Add " + value1 + ", " + value2);
double result = client.Add(value1, value2);
ts.TraceInformation("Client receives Add response '" + result + "'");

Zatrzymywanie działań

Aby zatrzymać działania, przenieś z powrotem do starego działania, zatrzymaj bieżący identyfikator działania i zresetuj stary identyfikator działania w zakresie.

Poniższy kod pokazuje, jak to zrobić.

ts.TraceTransfer(0, "transfer", oldID);
ts.TraceEvent(TraceEventType.Stop, 0, "Add request");
Trace.CorrelationManager.ActivityId = oldID;

Propagowanie identyfikatora działania do usługi A

Jeśli ustawisz propagateActivity atrybut na true dla System.ServiceModel źródła śledzenia zarówno w plikach konfiguracji klienta, jak i usługi, przetwarzanie usługi dla żądania Dodaj odbywa się w tym samym działaniu co określony w kliencie. Jeśli usługa definiuje własne działania i przenosi, ślady usługi nie są wyświetlane w działaniu propagowanym przez klienta. Zamiast tego są one wyświetlane w działaniu skorelowanym przez dane śledzenia transferu do działania, którego identyfikator jest propagowany przez klienta.

Uwaga

propagateActivity Jeśli atrybut jest ustawiony true na wartość zarówno dla klienta, jak i usługi, działanie otoczenia w zakresie operacji usługi jest ustawiane przez usługę WCF.

Możesz użyć następującego kodu, aby sprawdzić, czy działanie zostało ustawione w zakresie przez usługę WCF.

// Check if an activity was set in scope by WCF, if it was
// propagated from the client. If not, ( ambient activity is
// equal to Guid.Empty), create a new one.
if(Trace.CorrelationManager.ActivityId == Guid.Empty)
{
    Guid newGuid = Guid.NewGuid();
    Trace.CorrelationManager.ActivityId = newGuid;
}
// Emit your Start trace.
ts.TraceEvent(TraceEventType.Start, 0, "Add Activity");

// Emit the processing traces for that request.
serviceTs.TraceInformation("Service receives Add "
                            + n1 + ", " + n2);
// double result = n1 + n2;
serviceTs.TraceInformation("Service sends Add result" + result);

// Emit the Stop trace and exit the method scope.
ts.TraceEvent(TraceEventType.Stop, 0, "Add Activity");
// return result;

Wyjątki śledzenia zgłoszone w kodzie

Po wystąpieniu wyjątku w kodzie można również prześledzić wyjątek na poziomie Ostrzeżenie lub za pomocą następującego kodu.

ts.TraceEvent(TraceEventType.Warning, 0, "Throwing exception " + "exceptionMessage");

Wyświetlanie śladów użytkownika w narzędziu podglądu śledzenia usługi

Ta sekcja zawiera zrzuty ekranu śledzenia wygenerowane przez uruchomienie przykładu Rozszerzanie śledzenia po wyświetleniu przy użyciu narzędzia Podgląd śledzenia usługi (SvcTraceViewer.exe).

Na poniższym diagramie działanie "Dodaj żądanie" utworzone wcześniej jest zaznaczone na panelu po lewej stronie. Jest on wymieniony z trzema innymi działaniami operacji matematycznymi (Dzielenie, Odejmowanie, Mnożenie), które stanowią program kliencki aplikacji. Kod użytkownika zdefiniował jedno nowe działanie dla każdej operacji, aby odizolować potencjalne wystąpienia błędów w różnych żądaniach.

Aby zademonstrować użycie transferów w przykładzie Extending Tracing , tworzone jest również działanie Kalkulator, które hermetyzuje cztery żądania operacji. Dla każdego żądania istnieje przeniesienie z powrotem z działania Kalkulator do działania żądania (ślad jest wyróżniony w prawym górnym panelu na rysunku).

Po wybraniu działania na panelu po lewej stronie ślady zawarte w tym działaniu są wyświetlane w prawym górnym panelu. Jeśli propagateActivity znajduje się true w każdym punkcie końcowym w ścieżce żądania, ślady w działaniu żądania pochodzą ze wszystkich procesów uczestniczących w żądaniu. W tym przykładzie można zobaczyć ślady zarówno klienta, jak i usługi w 4 kolumnie w panelu.

To działanie pokazuje następującą kolejność przetwarzania:

  1. Klient wysyła komunikat do polecenia Dodaj.

  2. Usługa odbiera komunikat Dodaj żądanie.

  3. Usługa wysyła polecenie Dodaj odpowiedź.

  4. Klient otrzymuje pozycję Dodaj odpowiedź.

Wszystkie te ślady zostały wyemitowane na poziomie informacji. Kliknięcie śladu w prawym górnym panelu pokazuje szczegóły tego śledzenia w prawym dolnym panelu.

Na poniższym diagramie widzimy również ślady transferu z i do działania Kalkulator, a także dwie pary śladów uruchamiania i zatrzymywania dla działania żądania, jeden dla klienta i jeden dla usługi (jeden dla każdego źródła śledzenia).

Trace Viewer: Emitting User-code traces Lista działań według czasu utworzenia (lewy panel) i ich zagnieżdżonych działań (panel w prawym górnym rogu)

Jeśli kod usługi zgłasza wyjątek, który powoduje również zgłoszenie klienta (na przykład gdy klient nie otrzyma odpowiedzi na żądanie), zarówno usługa, jak i komunikaty o błędach występują w tej samej działaniu w celu bezpośredniej korelacji. Na poniższej ilustracji usługa zgłasza wyjątek z komunikatem "Usługa odmawia przetworzenia tego żądania w kodzie użytkownika". Klient zgłasza również wyjątek z komunikatem "Serwer nie mógł przetworzyć żądania z powodu błędu wewnętrznego".

Na poniższych obrazach pokazano, że błędy w punktach końcowych dla danego żądania są wyświetlane w tym samym działaniu, jeśli identyfikator działania żądania został rozpropagowany:

Screenshot that shows errors across endpoints for a given request.

Dwukrotne kliknięcie działania Pomnożenie na panelu po lewej stronie przedstawia następujący wykres ze śladami działania Mnożenie dla każdego zaangażowanego procesu. W usłudze (zgłoszonym wyjątkiem) widać ostrzeżenie, po którym następują ostrzeżenia i błędy na kliencie, ponieważ nie można przetworzyć żądania. W związku z tym możemy sugerować przyczynowe relacje błędów między punktami końcowymi i uzyskać główną przyczynę błędu.

Na poniższej ilustracji przedstawiono widok wykresu korelacji błędów:

Screenshot that shows the graph view of error correlation.

Aby uzyskać poprzednie ślady, ustawiliśmy ActivityTracing dla źródeł śledzenia użytkownika i propagateActivity=trueSystem.ServiceModel źródła śledzenia. Nie ustawiliśmy ActivityTracing źródła śledzenia, System.ServiceModel aby umożliwić propagację działania kodu użytkownika w kodzie użytkownika. (Gdy śledzenie aktywności usługi ServiceModel jest włączone, identyfikator działania zdefiniowany w kliencie nie jest propagowany do kodu użytkownika usługi; Transfery skorelują jednak działania kodu klienta i użytkownika usługi z pośrednimi działaniami programu WCF).

Definiowanie działań i propagowanie identyfikatora działania umożliwia wykonywanie bezpośredniej korelacji błędów między punktami końcowymi. W ten sposób możemy szybciej zlokalizować główną przyczynę błędu.

Zobacz też