Delen via


Traceringen van gebruikerscode verzenden

Naast het inschakelen van tracering in configuratie voor het verzamelen van instrumentatiegegevens die zijn gegenereerd door Windows Communication Foundation (WCF), kunt u ook traceringen programmatisch verzenden in gebruikerscode. Op deze manier kunt u proactief instrumentatiegegevens maken die u later voor diagnostische doeleinden kunt gebruiken. In dit onderwerp wordt besproken hoe u dit kunt doen.

Daarnaast bevat het voorbeeld voor uitbreidende tracering alle code die in de volgende secties wordt gedemonstreerd.

Een traceringsbron maken

U kunt de volgende code gebruiken om een gebruikerstraceringsbron te maken.

TraceSource ts = new TraceSource("myUserTraceSource");

Activiteiten maken

Activiteiten zijn een logische verwerkingseenheid. U kunt één activiteit maken voor elke primaire verwerkingseenheid waarin u traceringen wilt groeperen. U kunt bijvoorbeeld één activiteit maken voor elke aanvraag voor de service. We voeren hiervoor de volgende stappen uit.

  1. Sla de activiteits-id in het bereik op.

  2. Maak een nieuwe activiteits-id.

  3. Overdracht van de activiteit in het bereik naar de nieuwe activiteit, stel de nieuwe activiteit in het bereik in en verzendt een begintracering voor die activiteit.

De volgende code laat zien hoe u dit doet.

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

Traceringen verzenden binnen een gebruikersactiviteit

Met de volgende code worden traceringen verzonden binnen een gebruikersactiviteit.

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

De activiteiten stoppen

Als u de activiteiten wilt stoppen, gaat u terug naar de oude activiteit, stopt u de huidige activiteits-id en stelt u de oude activiteits-id opnieuw in het bereik in.

De volgende code laat zien hoe u dit doet.

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

De activiteits-id doorgeven aan een service

Als u het propagateActivity kenmerk true instelt op voor de System.ServiceModel traceringsbron in zowel de client- als serviceconfiguratiebestanden, vindt de serviceverwerking voor de aanvraag toevoegen plaats in dezelfde activiteit als het kenmerk dat is gedefinieerd in de client. Als de service zijn eigen activiteiten en overdrachten definieert, worden de servicetraceringen niet weergegeven in de door de client doorgegeven activiteit. In plaats daarvan worden ze weergegeven in een activiteit die is gecorreleerd door overdrachtstraceringen naar de activiteit waarvan de id door de client wordt doorgegeven.

Notitie

Als het propagateActivity kenmerk is ingesteld true op zowel de client als de service, wordt de omgevingsactiviteit in het bewerkingsbereik van de service ingesteld door WCF.

U kunt de volgende code gebruiken om te controleren of een activiteit is ingesteld in het bereik door 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;

Uitzonderingen traceren die zijn opgetreden in code

Wanneer u een uitzondering in code genereert, kunt u de uitzondering ook traceren op waarschuwingsniveau of hoger met behulp van de volgende code.

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

Gebruikerstraceringen weergeven in het hulpprogramma Service Trace Viewer

Deze sectie bevat schermopnamen van traceringen die worden gegenereerd door het voorbeeld Voor het uitbreiden van tracering uit te voeren, wanneer ze worden weergegeven met het hulpprogramma Service Trace Viewer (SvcTraceViewer.exe).

In het volgende diagram wordt de activiteit Aanvraag toevoegen geselecteerd die u eerder hebt gemaakt in het linkerdeelvenster. Het wordt vermeld met drie andere wiskundige bewerkingsactiviteiten (Delen, Aftrekken, Vermenigvuldigen) die het toepassingsclientprogramma vormen. De gebruikerscode heeft één nieuwe activiteit gedefinieerd voor elke bewerking om potentiële fouten in verschillende aanvragen te isoleren.

Om het gebruik van overdrachten in het voorbeeld Voor het uitbreiden van tracering te demonstreren, wordt ook een rekenmachineactiviteit gemaakt waarin de vier bewerkingsaanvragen worden ingekapseld. Voor elke aanvraag is er een overdracht van en naar de rekenmachineactiviteit naar de aanvraagactiviteit (tracering is gemarkeerd in het rechterbovenhoekvenster in de afbeelding).

Wanneer u een activiteit selecteert in het linkerdeelvenster, worden de traceringen die door deze activiteit zijn opgenomen, weergegeven in het deelvenster rechtsboven. true Als propagateActivity zich op elk eindpunt in het aanvraagpad bevindt, zijn traceringen in de aanvraagactiviteit afkomstig van alle processen die deelnemen aan de aanvraag. In dit voorbeeld ziet u traceringen van zowel de client als de service in de vierde kolom in het deelvenster.

Deze activiteit toont de volgende volgorde van verwerking:

  1. Client verzendt een bericht naar Toevoegen.

  2. De service ontvangt het bericht Aanvraag toevoegen.

  3. De service verzendt antwoord toevoegen.

  4. Client ontvangt antwoord toevoegen.

Al deze traceringen zijn verzonden op informatieniveau. Als u op een tracering in het deelvenster rechtsboven klikt, worden de details van die trace in het deelvenster rechtsonder weergegeven.

In het volgende diagram zien we ook overdrachtstraceringen van en naar de rekenmachineactiviteit, evenals twee paren start- en stoptraceringen per aanvraagactiviteit, één voor de client en één voor de service (één voor elke traceringsbron).

Trace Viewer: Emitting User-code traces Lijst met activiteiten per aanmaaktijd (linkerdeelvenster) en hun geneste activiteiten (rechterbovenhoek)

Als de servicecode een uitzondering genereert die ervoor zorgt dat de client ook wordt gegenereerd (bijvoorbeeld wanneer de client het antwoord op de aanvraag niet heeft ontvangen), treden zowel de service- als clientwaarschuwing of foutberichten op in dezelfde activiteit voor directe correlatie. In de volgende afbeelding genereert de service een uitzondering met de melding 'De service weigert deze aanvraag te verwerken in gebruikerscode'. De client genereert ook een uitzondering die aangeeft dat de server de aanvraag niet kan verwerken vanwege een interne fout.

In de volgende afbeeldingen ziet u dat fouten tussen eindpunten voor een bepaalde aanvraag worden weergegeven in dezelfde activiteit als de activiteits-id van de aanvraag is doorgegeven:

Screenshot that shows errors across endpoints for a given request.

Als u dubbelklikt op de activiteit Vermenigvuldigen in het linkerdeelvenster, ziet u de volgende grafiek, met de traceringen voor de activiteit Vermenigvuldigen voor elk betrokken proces. We kunnen zien dat er eerst een waarschuwing is opgetreden bij de service (uitzondering opgetreden), gevolgd door waarschuwingen en fouten op de client omdat de aanvraag niet kan worden verwerkt. Daarom kunnen we de causale foutrelatie tussen eindpunten impliceren en de hoofdoorzaak van de fout afleiden.

In de volgende afbeelding ziet u een grafiekweergave van foutcorrelatie:

Screenshot that shows the graph view of error correlation.

Om de vorige traceringen te verkrijgen, stellen we deze in ActivityTracing voor de gebruikerstraceringsbronnen en propagateActivity=true voor de System.ServiceModel traceringsbron. We hebben de traceringsbron niet ingesteld ActivityTracingSystem.ServiceModel om gebruikerscode in te schakelen voor het doorgeven van gebruikerscodeactiviteiten. (Wanneer tracering van ServiceModel-activiteiten is ingeschakeld, wordt de activiteits-id die in de client is gedefinieerd, niet helemaal doorgegeven aan de servicegebruikerscode; Overdrachten correleren echter de activiteiten van de client- en servicegebruikerscode aan de tussenliggende WCF-activiteiten.)

Door activiteiten te definiëren en de activiteits-id door te geven, kunnen we directe foutcorrelatie tussen eindpunten uitvoeren. Op deze manier kunnen we de hoofdoorzaak van een fout sneller vinden.

Zie ook