Dela via


Spåra deltagare

Spårningsdeltagare är utökningspunkter som gör det möjligt för en arbetsflödesutvecklare att komma åt TrackingRecord objekt och bearbeta dem. .NET Framework 4.6.1 innehåller en standardspårningsdeltagare som skriver spårningsposter som händelsespårning för Windows-händelser (ETW). Om det inte uppfyller dina krav kan du också skriva en anpassad spårningsdeltagare.

Spåra deltagare

Spårningsinfrastrukturen gör det möjligt att använda ett filter på utgående spårningsposter så att en deltagare kan prenumerera på en delmängd av posterna. Mekanismen för att tillämpa ett filter är via en spårningsprofil.

Windows Workflow Foundation (WF) i .NET Framework 4.6.1 tillhandahåller en spårningsdeltagare som registrerar spårningsuppgifterna i en ETW-session. Deltagaren konfigureras i en arbetsflödestjänst genom att lägga till ett spårningsspecifikt beteende i en konfigurationsfil. Om du aktiverar en ETW-spårningsdeltagare kan spårningsposter visas i händelsevisaren. SDK-exemplet för ETW-baserad spårning är ett bra sätt att bekanta sig med WF-spårning med hjälp av den ETW-baserade spårningsdeltagaren.

ETW-spårningsdeltagare

.NET Framework 4.6.1 innehåller en ETW spårningsdeltagare som skriver spårningsuppgifterna till en ETW-session. Detta görs på ett mycket effektivt sätt med minimal påverkan på programmets prestanda eller serverns dataflöde. En fördel med att använda standarddeltagaren för ETW-spårning är att spårningsposterna som den tar emot kan visas med de andra program- och systemloggarna i Windows Event Viewer.

Standarddeltagaren för ETW-spårning konfigureras i Web.config-filen enligt följande exempel.

<configuration>
  <system.web>
    <compilation debug="true" targetFramework="4.0" />
  </system.web>
  <system.serviceModel>
    <behaviors>
      <serviceBehaviors>
        <behavior>
          <etwTracking profileName="Sample Tracking Profile"/>
        </behavior>
      </serviceBehaviors>
    </behaviors>
   <tracking>
      <profiles>
        <trackingProfile name="Sample Tracking Profile">
        ….
       </trackingProfile>
      </profiles>
    </tracking>
  </system.serviceModel>
</configuration>

Anmärkning

Om ett trackingProfile namn inte har angetts, till exempel bara <etwTracking/> eller <etwTracking profileName=""/>, används standardspårningsprofilen som är installerad med .NET Framework 4.6.1 i Machine.config-filen.

I filen Machine.config registrerar sig standardspårningsprofilen för arbetsflödesinstansinformation och fel.

I ETW skrivs händelser till ETW-sessionen via ett provider-ID. Provider-ID:t som ETW-spårningsdeltagaren använder för att skriva spårningsposterna till ETW definieras i diagnostikavsnittet i Web.config-filen (under <system.serviceModel><diagnostics>). Som standard använder ETW-spårningsdeltagaren ett standardprovider-ID när ett inte har angetts, som du ser i följande exempel.

<system.serviceModel>
        <diagnostics etwProviderId="52A3165D-4AD9-405C-B1E8-7D9A257EAC9F" />

Följande bild visar flödet av spårningsdata via ETW-spårningsdeltagaren. När spårningsdata når ETW-sessionen kan du komma åt dem på flera olika sätt. Ett av de mest användbara sätten att komma åt dessa händelser är via Loggboken, ett vanligt Windows-verktyg som används för att visa loggar och spårningar från program och tjänster.

Flöde av spårningsdata via ETW-spårningsprovidern.

Spåra händelsedata för deltagare

En spårningsdeltagare serialiserar spårade händelsedata till en ETW-session i formatet en händelse per spårningspost. En händelse identifieras med ett ID inom intervallet 100 till 199. Definitioner av spårningshändelseposter som genereras av en spårningsdeltagare finns i referensavsnittet Spårningshändelser .

Storleken på en ETW-händelse begränsas av ETW-buffertstorleken eller av den maximala nyttolasten för en ETW-händelse, beroende på vilket värde som är mindre. Om händelsens storlek överskrider någon av dessa ETW-gränser trunkeras händelsen och dess innehåll tas bort på ett godtyckligt sätt. Variabler, argument, anteckningar och anpassade data tas inte bort selektivt. Vid avkortning av en händelse kommer alla dessa att avkortas oavsett vilket värde som orsakar att händelsestorleken överskrider ETW-gränsen. Borttagna data ersätts med <item>..<item>.

Komplexa typer av variabler, argument och anpassade dataobjekt serialiseras till ETW-händelseposten med hjälp av NetDataContractSerializer klassen. Den här klassen innehåller CLR-typinformation i serialiserad XML-ström.

Trunkering av nyttolastdata på grund av ETW-gränser kan leda till att dubbletter av spårningsposter skickas till en ETW-session. Detta kan inträffa om fler än en session lyssnar efter händelserna och sessionerna har olika nyttolastgränser för händelserna.

För sessionen med den lägre gränsen kan händelsen avkortas. ETW-spårningsdeltagaren har ingen information om hur många sessioner lyssnar på händelserna. Om en händelse bryts för en session, försöker ETW-deltagaren att återigen skicka händelsen en gång. I det här fallet kommer den session som är konfigurerad för att acceptera en större nyttolast få händelsen två gånger (både den icke-trunkerade och den trunkerade händelsen). Dubblering kan förhindras genom att konfigurera alla ETW-sessioner med samma buffertstorleksgränser.

Komma åt spårningsinformation från en ETW-deltagare i Händelseloggen

Händelser som skrivs till en ETW-session av ETW-spårningsdeltagaren kan nås via Händelseloggen (när du använder standard-ID för leverantören). Detta gör det möjligt att snabbt visa spårningsposter som har genererats av arbetsflödet.

Anmärkning

Spårning av logghändelser som skickas till en ETW-session med händelse-ID:n i området 100 till 199.

Aktivera visning av spårningsloggar i Loggboken

  1. Starta Händelsevisaren (EVENTVWR.EXE)

  2. Välj Händelselogg, Program och tjänstloggar, Microsoft, Windows, Programserver-applikationer.

  3. Högerklicka och kontrollera att Visa, Visa analys och felsökningsloggar är markerade. Annars markerar du den så att bockmarkeringen visas bredvid den. Då visas loggarna Analys, Perf och Felsökning .

  4. Högerklicka på analysloggen och välj sedan Aktivera logg. Loggen finns i filen %SystemRoot%\System32\Winevt\Logs\Microsoft-Windows-Application Server-Applications%4Analytic.etl.

Anpassad spårningsdeltagare

API:et för spårningsdeltagare tillåter tillägg av spårningskörningen med en spårningsdeltagare som tillhandahålls av användaren och som kan inkludera anpassad logik för att hantera spårningsposter som genereras av arbetsflödeskörningen. Om du vill skriva en anpassad deltagare för spårning måste utvecklaren implementera Track-metoden på TrackingParticipant-klassen. Den här metoden anropas när en spårningspost genereras av arbetsflödesmiljön.

Deltagare i spårning härleds från klassen TrackingParticipant. Systemet EtwTrackingParticipant avger en Event Tracking for Windows (ETW)-händelse för varje spårningspost som tas emot. För att skapa en anpassad spårningsdeltagare skapas en klass som härleds från TrackingParticipant. För att tillhandahålla grundläggande spårningsfunktioner, åsidosätt Track. Track kallas när en spårningspost skickas av körningsmiljön och kan bearbetas på önskat sätt. I följande exempel definieras en anpassad spårningsdeltagareklass som skickar alla spårningsposter till konsolfönstret. Du kan också implementera ett TrackingParticipant objekt som bearbetar spårningsposterna asynkront med hjälp av dess BeginTrack och EndTrack metoder

class ConsoleTrackingParticipant : TrackingParticipant
{
    protected override void Track(TrackingRecord record, TimeSpan timeout)
    {
        if (record != null)
        {
            Console.WriteLine("=================================");
            Console.WriteLine(record);
        }
    }
}

Om du vill använda en viss spårningsdeltagare registrerar du den med den arbetsflödesinstans som du vill spåra, som du ser i följande exempel.

myInstance.Extensions.Add(new ConsoleTrackingParticipant());

I följande exempel skapas ett arbetsflöde som består av en Sequence aktivitet som innehåller en WriteLine aktivitet. ConsoleTrackingParticipant Läggs till i tilläggen och arbetsflödet anropas.

Activity activity= new Sequence()
{
    Activities =
    {
        new WriteLine()
        {
            Text = "Hello World."
        }
    }
};

WorkflowApplication instance = new WorkflowApplication(activity);

instance.Extensions.Add(new ConsoleTrackingParticipant());
  instance.Completed = delegate(WorkflowApplicationCompletedEventArgs e)
            {
                Console.WriteLine("workflow instance completed, Id = " + instance.Id);
                resetEvent.Set();
            };
            instance.Run();
            Console.ReadLine();

Se även