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 skriver spårningsposterna till 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 loggboken. 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årningsposterna 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 Loggboken.

Standarddeltagaren för ETW-spårning konfigureras i filen Web.config 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>

Kommentar

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 filen Machine.config.

I filen Machine.config prenumererar standardspårningsprofilen på arbetsflödesinstansposter 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 filen Web.config (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.

Flow of tracking data through the ETW tracking provider.

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. När det gäller trunkering trunkeras alla dessa oavsett vilket värde som gjorde att händelsestorleken översteg 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-ånga.

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 trunkeras. ETW-spårningsdeltagaren har ingen kunskap om antalet sessioner som lyssnar efter händelserna. Om en händelse trunkeras för en session försöker ETW-deltagaren skicka händelsen en gång. I det här fallet får den session som är konfigurerad för att acceptera en större nyttolaststorlek händelsen två gånger (den icke trunkerade och trunkerade händelsen). Dubblering kan förhindras genom att konfigurera alla ETW-sessioner med samma buffertstorleksgränser.

Åtkomst till spårningsdata från en ETW-deltagare i Loggboken

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

Kommentar

Spårning av posthändelser som skickas till en ETW-session använder händelse-ID:n i intervallet 100 till 199.

Aktivera visning av spårningsposter i Loggboken

  1. Starta Loggboken (EVENTVWR.EXE)

  2. Välj Loggboken, Program- och tjänstloggar, Microsoft, Windows, Programserverprogram.

  3. Högerklicka och kontrollera att Loggarna Visa, Visa analys och Felsökning ä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 spårningsdeltagare måste utvecklaren Track implementera -metoden i TrackingParticipant klassen. Den här metoden anropas när en spårningspost genereras av arbetsflödeskörningen.

Spårningsdeltagare härleds från TrackingParticipant klassen. Systemet EtwTrackingParticipant genererar en händelsespårning för Windows (ETW) 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 anropas åsidosättning Track. Track när en spårningspost skickas av körningen 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