Freigeben über


Nachverfolgen von Teilnehmern

Trackingteilnehmer sind Erweiterbarkeitspunkte, die es einem Workflow-Entwickler ermöglichen, auf TrackingRecord Objekte zuzugreifen und sie zu verarbeiten. .NET Framework 4.6.1 enthält einen standardmäßigen Nachverfolgungsteilnehmer, der Nachverfolgungsdatensätze als ETW-Ereignisse (Ereignisablaufverfolgung für Windows) schreibt. Wenn dies nicht Ihren Anforderungen entspricht, können Sie auch einen benutzerdefinierten Nachverfolgungsteilnehmer schreiben.

Nachverfolgen von Teilnehmern

Die Nachverfolgungsinfrastruktur ermöglicht die Anwendung eines Filters für die ausgehenden Tracking-Datensätze, sodass ein Teilnehmer eine Teilmenge der Datensätze abonnieren kann. Der Mechanismus zum Anwenden eines Filters erfolgt über ein Tracking-Profil.

Windows Workflow Foundation (WF) in .NET Framework 4.6.1 stellt einen Nachverfolgungsteilnehmer bereit, der die Nachverfolgungsdatensätze in eine ETW-Sitzung schreibt. Der Teilnehmer wird in einem Workflow-Dienst konfiguriert, indem ein verfolgspezifisches Verhalten in einer Konfigurationsdatei hinzugefügt wird. Durch Aktivierung eines ETW-Nachverfolgungsteilnehmers können Nachverfolgungsdatensätze in der Ereignisanzeige angezeigt werden. Das SDK-Beispiel für ETW-basierte Überwachung ist eine gute Möglichkeit, über den ETW-basierten Überwachungsteilnehmer mit der WF-Überwachung vertraut zu werden.

ETW Tracking-Teilnehmer

.NET Framework 4.6.1 enthält einen ETW-Nachverfolgungsteilnehmer, der die Nachverfolgungsdatensätze in eine ETW-Sitzung schreibt. Dies erfolgt auf sehr effiziente Weise mit minimalen Auswirkungen auf die Leistung der Anwendung oder auf den Durchsatz des Servers. Ein Vorteil der Verwendung des standardmäßigen ETW-Tracking-Teilnehmers besteht darin, dass die empfangenen Tracking-Datensätze mit den anderen Anwendungs- und Systemprotokollen in der Windows-Ereignisanzeige angezeigt werden können.

Der standardmäßige ETW-Nachverfolgungsteilnehmer wird in der Web.config-Datei konfiguriert, wie im folgenden Beispiel gezeigt.

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

Hinweis

Wenn kein trackingProfile Name angegeben ist, z. B. nur <etwTracking/> oder <etwTracking profileName=""/>, wird das standardnachverfolgungsprofil, das mit .NET Framework 4.6.1 in der Machine.config Datei installiert ist, verwendet.

In der Datei "Machine.config" abonniert das Standardüberwachungsprofil Workflowinstanz-Datensätze und -fehler.

In ETW werden Ereignisse über eine Anbieter-ID in die ETW-Sitzung geschrieben. Die Anbieter-ID, die der ETW-Tracking-Teilnehmer zum Schreiben der Tracking-Datensätze in ETW verwendet, wird im Diagnoseabschnitt der Web.config-Datei (unter <system.serviceModel><diagnostics>) definiert. Standardmäßig verwendet der ETW-Nachverfolgungsteilnehmer eine Standardanbieter-ID, wenn eine nicht angegeben wurde, wie im folgenden Beispiel gezeigt.

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

Die folgende Abbildung zeigt, wie Tracking-Daten über den ETW-Tracking-Teilnehmer fließen. Sobald die Tracking-Daten die ETW-Sitzung erreicht haben, kann auf verschiedene Arten darauf zugegriffen werden. Eine der nützlichsten Methoden für den Zugriff auf diese Ereignisse ist die Ereignisanzeige, ein gängiges Windows-Tool zum Anzeigen von Protokollen und Ablaufverfolgungen von Anwendungen und Diensten.

Ablauf der Datennachverfolgung über den ETW-Nachverfolgungsanbieter

Nachverfolgen von Teilnehmerereignisdaten

Ein Überwachungsteilnehmer serialisiert verfolgte Ereignisdaten in einer ETW-Sitzung jeweils im Format von einem Ereignis pro Überwachungsdatensatz. Ein Ereignis wird mithilfe einer ID innerhalb des Bereichs von 100 bis 199 identifiziert. Definitionen der von einem Tracking-Teilnehmer ausgegebenen Tracking-Ereignisdatensätze finden Sie im Thema "Tracking Events Reference ".

Die Größe eines ETW-Ereignisses ist durch die ETW-Puffergröße oder die maximale Nutzlast für ein ETW-Ereignis begrenzt, je nachdem, welcher Wert kleiner ist. Wenn die Größe des Ereignisses eines dieser ETW-Grenzwerte überschreitet, wird das Ereignis abgeschnitten und sein Inhalt auf beliebige Weise entfernt. Variablen, Argumente, Anmerkungen und benutzerdefinierte Daten werden nicht selektiv entfernt. Im Fall der Trunkierung werden alle diese Elemente unabhängig von dem Wert gekürzt, der dazu geführt hat, dass die Ereignisgröße den ETW-Grenzwert überschritten hat. Die entfernten Daten werden durch ersetzt <item>..<item>.

Komplexe Typen in Variablen, Argumenten und benutzerdefinierten Datenelementen werden mithilfe der NetDataContractSerializer Klasse in den ETW-Ereignisdatensatz serialisiert. Diese Klasse enthält CLR-Typinformationen im serialisierten XML-Datenstrom.

Aufgrund der ETW-Beschränkung abgeschnittene Nutzlastdaten können dazu führen, dass Überwachungsdatensätze mehrfach an eine ETW-Sitzung gesendet werden. Dies kann auftreten, wenn mehrere Sitzungen auf die Ereignisse lauschen und die Sitzungen unterschiedliche Nutzlastgrenzwerte für die Ereignisse aufweisen.

Für die Sitzung mit dem unteren Grenzwert kann das Ereignis verkürzt werden. Der ETW-Überwachungsteilnehmer hat keine Informationen zur Anzahl von Sitzungen, die die Ereignisse überwachen. Wenn ein Ereignis für eine Sitzung abgeschnitten wird, versucht der ETW-Teilnehmer noch ein Mal, das Ereignis zu senden. In diesem Fall empfängt die Sitzung, für die eine höhere Nutzlastgröße konfiguriert ist, das Ereignis zweimal (das nicht abgeschnittene und das abgeschnittene Ereignis). Duplizierungen können verhindert werden, indem alle ETW-Sitzungen mit den gleichen Puffergrößenbeschränkungen konfiguriert werden.

Zugreifen auf Überwachungsdaten über einen ETW-Teilnehmer in der Ereignisanzeige

Ereignisse, die vom ETW-Tracking-Teilnehmer in eine ETW-Sitzung geschrieben werden, können über die Ereignisanzeige (bei Verwendung der Standardanbieter-ID) aufgerufen werden. Auf diese Weise können Überwachungsdatensätze, die vom Workflow ausgegeben wurden, schnell angezeigt werden.

Hinweis

Überwachungsdatensatz-Ereignisse, die an eine ETW-Sitzung ausgegeben werden, verwenden Ereignis-IDs im Bereich von 100 bis 199.

So aktivieren Sie das Anzeigen der Nachverfolgungsdatensätze in der Ereignisanzeige

  1. Starten der Ereignisanzeige (EVENTVWR.EXE)

  2. Wählen Sie Ereignisanzeige, Anwendungen und Diensteprotokolle, Microsoft, Windows, Anwendungsserveranwendungen aus.

  3. Klicken Sie mit der rechten Maustaste, und stellen Sie sicher , dass "Ansicht", "Analyse- und Debugprotokolle anzeigen " ausgewählt ist. Wenn nicht, aktivieren Sie es, damit das Häkchen daneben angezeigt wird. Dadurch werden die Analyse-, Perf- und Debugprotokolle angezeigt.

  4. Klicken Sie mit der rechten Maustaste auf das Analyseprotokoll , und wählen Sie dann "Protokoll aktivieren" aus. Das Protokoll ist in der %SystemRoot%\System32\Winevt\Logs\Microsoft-Windows-Application Server-Applications%4AnalyticETL-Datei vorhanden.

Benutzerdefinierte Nachverfolgungskomponente

Die Tracking-Teilnehmer-API ermöglicht die Erweiterung der Tracking-Laufzeit mit einem vom Benutzer bereitgestellten Tracking-Teilnehmer, der benutzerdefinierte Logik zum Verarbeiten von Tracking-Datensätzen enthalten kann, die von der Workflowlaufzeit ausgegeben werden. Um einen benutzerdefinierten Nachverfolgungsteilnehmer zu schreiben, muss der Entwickler die Track Methode für die TrackingParticipant Klasse implementieren. Diese Methode wird aufgerufen, wenn ein Tracking-Datensatz von der Workflow-Runtime ausgegeben wird.

Überwachungsteilnehmer sind von der TrackingParticipant-Klasse abgeleitet. Das vom System bereitgestellte EtwTrackingParticipant-Objekt gibt ein ETW (Ereignisablaufverfolgung für Windows)-Ereignis für jeden empfangenen Überwachungsdatensatz aus. Um einen benutzerdefinierten Tracking-Teilnehmer zu erstellen, wird eine Klasse erstellt, die von TrackingParticipant abgeleitet ist. Überschreiben Sie für die Bereitstellung der grundlegenden Nachverfolgungsfunktion Track. Track wird aufgerufen, wenn ein Nachverfolgungsdatensatz von der Runtime gesendet wird und wie gewünscht verarbeitet werden kann. Im folgenden Beispiel wird eine benutzerdefinierte Tracking-Teilnehmerklasse definiert, die alle Nachverfolgungsdatensätze an das Konsolenfenster sendet. Sie können auch ein TrackingParticipant Objekt implementieren, das die Nachverfolgungsdatensätze asynchron mithilfe der zugehörigen BeginTrack und EndTrack Methoden verarbeitet.

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

Um einen bestimmten Nachverfolgungsteilnehmer zu verwenden, registrieren Sie ihn mit der Workflowinstanz, die Sie nachverfolgen möchten, wie im folgenden Beispiel gezeigt.

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

Im folgenden Beispiel wird ein Workflow erstellt, der aus einer Sequence Aktivität besteht, die eine WriteLine Aktivität enthält. Der ConsoleTrackingParticipant wird den Erweiterungen hinzugefügt, und der Workflow wird aufgerufen.

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

Siehe auch