Emittrar User-Code Traces

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. Utför följande steg för att göra det.

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

  2. Skapa ett nytt aktivitets-ID.

  3. Överför från den aktuella aktiviteten till den nya, sätt den nya aktiviteten i fokus och starta en spå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 klientöverförda aktiviteten. I stället visas de i en aktivitet som korreleras av överföringsspårningar till aktiviteten vars ID sprids av klienten.

Anmärkning

Om attributet är inställt till propagateActivity på både klienten och tjänsten, ställs den omgivande aktiviteten i tjänstens driftsomfång in 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åra undantag som kastas 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 operationer (Dividera, Subtrahera, Multiplicera) som utgör klientprogrammet för applikationen. 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 en lägg till-begäran.

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

  4. Klient får svaret "Lägg till".

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).

Spårningsvisare: Avge användarkodsspårningar 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 även klienten kastar ett undantag (till exempel när klienten inte fick svar på sin begäran), inträffar både tjänstens och klientens varnings- eller felmeddelanden 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:

Skärmbild som visar fel mellan slutpunkter för en viss begäran.

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:

Skärmbild som visar grafvyn över felkorrelation.

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 ställde inte in ActivityTracing för spårningskällan System.ServiceModel för att möjliggöra spridning av användarkod till användarkodsaktivitet. (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