Dela via


Generera användarkodsspårningar

Förutom att aktivera spårning i konfigurationen för att samla in instrumentationsdata som genererats av Windows Communication Foundation (WCF), kan du också generera spårningar programmatiskt i användarkoden. På så sätt kan du proaktivt skapa instrumentationsdata som du kan använda senare i diagnostiskt syfte. I det här avsnittet beskrivs hur du kan göra detta.

Dessutom innehåller exemplet Utöka spårning all kod som visas i följande avsnitt.

Skapa en spårningskälla

Du kan använda följande kod för att skapa en användarspårningskälla.

TraceSource ts = new TraceSource("myUserTraceSource");

Skapa aktiviteter

Aktiviteter är logiska bearbetningsenheter. Du kan skapa en aktivitet för varje större bearbetningsenhet där du vill att spårningar ska grupperas tillsammans. Du kan till exempel skapa en aktivitet för varje begäran till tjänsten. Det gör du med följande steg.

  1. Spara aktivitets-ID:t i omfånget.

  2. Skapa ett nytt aktivitets-ID.

  3. Överför från aktiviteten i omfånget till den nya, ange den nya aktiviteten i omfånget och generera en startspårning för den aktiviteten.

Följande kod visar hur du gör detta.

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");

Generera spårningar inom en användaraktivitet

Följande kod genererar spårningar inom en användaraktivitet.

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 + "'");

Stoppa aktiviteterna

Stoppa aktiviteterna genom att överföra tillbaka till den gamla aktiviteten, stoppa det aktuella aktivitets-ID:t och återställa det gamla aktivitets-ID:t i omfånget.

Följande kod visar hur du gör detta.

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

Sprida aktivitets-ID:t till en tjänst

Om du anger propagateActivity attributet till true för spårningskällan System.ServiceModel i både klient- och tjänstkonfigurationsfilerna sker tjänstbearbetningen för Lägg till begäran i samma aktivitet som den som definierats i klienten. Om tjänsten definierar sina egna aktiviteter och överföringar visas inte tjänstspårningarna i den klientspridningsaktiviteten. I stället visas de i en aktivitet som korreleras av överföringsspårningar till aktiviteten vars ID sprids av klienten.

Kommentar

propagateActivity Om attributet är inställt true på både klienten och tjänsten anges den omgivande aktiviteten i driftsomfånget för tjänsten av WCF.

Du kan använda följande kod för att kontrollera om en aktivitet har angetts i omfånget av 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;

Spårningsfel som genereras i kod

När du genererar ett undantag i kod kan du också spåra undantaget på varningsnivå eller uppåt med hjälp av följande kod.

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

Visa användarspårningar i visningsverktyget för tjänstspårning

Det här avsnittet innehåller skärmbilder av spårningar som genererats genom att köra exemplet Utöka spårning när det visas med hjälp av verktyget Tjänstspårningsvisare (SvcTraceViewer.exe).

I följande diagram är aktiviteten "Lägg till begäran" som skapades tidigare markerad på den vänstra panelen. Den visas med tre andra matematiska åtgärdsaktiviteter (Dividera, Subtrahera, Multiplicera) som utgör programmets klientprogram. Användarkoden har definierat en ny aktivitet för varje åtgärd för att isolera potentiella felhändelser i olika begäranden.

För att demonstrera användningen av överföringar i exemplet Utöka spårning skapas också en kalkylatoraktivitet som kapslar in de fyra åtgärdsbegäranden. För varje begäran sker en överföring fram och tillbaka från kalkylatoraktiviteten till begärandeaktiviteten (spårningen markeras i den övre högra panelen i bilden).

När du väljer en aktivitet på den vänstra panelen visas de spårningar som ingår i den här aktiviteten i den övre högra panelen. Om propagateActivity finns true vid varje slutpunkt i begärandesökvägen kommer spårningar i begärandeaktiviteten från alla processer som deltar i begäran. I det här exemplet kan du se spårningar från både klienten och tjänsten i den fjärde kolumnen i panelen.

Den här aktiviteten visar följande bearbetningsordning:

  1. Klienten skickar meddelande till Lägg till.

  2. Tjänsten tar emot Meddelandet Lägg till begäran.

  3. Tjänsten skickar Lägg till svar.

  4. Klienten får Lägg till svar.

Alla dessa spårningar har genererats på informationsnivå. När du klickar på en spårning i den övre högra panelen visas information om spårningen i den nedre högra panelen.

I följande diagram ser vi även överföringsspårningar från och till aktiviteten Kalkylator, samt två par start- och stoppspårningar per begärandeaktivitet, en för klienten och en för tjänsten (en för varje spårningskälla).

Trace Viewer: Emitting User-code traces Lista över aktiviteter efter skapandetid (vänster panel) och deras kapslade aktiviteter (övre högra panelen)

Om tjänstkoden utlöser ett undantag som gör att klienten också genererar (till exempel när klienten inte fick svaret på sin begäran), sker både tjänsten och klientvarningen eller felmeddelandena i samma aktivitet för direkt korrelation. I följande bild genererar tjänsten ett undantag som säger "Tjänsten vägrar att bearbeta den här begäran i användarkod". Klienten utlöser också ett undantag där det står "Servern kunde inte bearbeta begäran på grund av ett internt fel".

Följande bilder visar att fel mellan slutpunkter för en viss begäran visas i samma aktivitet om aktivitets-ID:t för begäran sprids:

Screenshot that shows errors across endpoints for a given request.

Om du dubbelklickar på aktiviteten Multiplicera på den vänstra panelen visas följande diagram, med spårningarna för aktiviteten Multiplicera för varje process som berörs. Vi kan se att en varning först inträffade i tjänsten (undantaget utlöstes), vilket följs av varningar och fel på klienten eftersom begäran inte kunde bearbetas. Därför kan vi antyda orsaksfelrelationen mellan slutpunkter och härleda rotorsaken till felet.

Följande bild visar en grafvy över felkorrelation:

Screenshot that shows the graph view of error correlation.

För att hämta tidigare spårningar anger ActivityTracing vi för användarspårningskällorna och propagateActivity=true för spårningskällan System.ServiceModel . Vi har inte angett ActivityTracing att spårningskällan System.ServiceModel ska aktivera spridning av användarkod till användarkodaktivitet. (När ServiceModel-aktivitetsspårning är aktiverat sprids inte aktivitets-ID:t som definierats i klienten hela vägen till tjänstanvändarkoden. Överföringar korrelerar dock klient- och tjänstanvändarkodaktiviteterna med de mellanliggande WCF-aktiviteterna.)

Genom att definiera aktiviteter och sprida aktivitets-ID:t kan vi utföra direkt felkorrelation mellan slutpunkter. På så sätt kan vi hitta rotorsaken till ett fel snabbare.

Se även