Überwachungsprofile

Überwachungsprofile enthalten Nachverfolgungsabfragen, mit denen ein Überwachungsteilnehmer Workflowereignisse abonnieren kann. Diese werden ausgegeben, wenn sich der Zustand einer Workflowinstanz zur Laufzeit ändert.

Überwachungsprofile

Mithilfe von Nachverfolgungsprofilen wird angegeben, welche Nachverfolgungsinformationen für eine Workflowinstanz ausgegeben werden. Wenn kein Profil angegeben wird, dann werden alle Nachverfolgungsereignisse ausgegeben. Wenn ein Profil angegeben ist, werden die Nachverfolgungsereignisse, die im Profil angegeben sind, ausgegeben. Je nach Überwachungsanforderungen können Sie ein Profil schreiben, das sehr allgemein gehalten ist und einen kleinen Satz von unspezifischen Zustandsänderungen eines Workflows abonniert. Umgekehrt ist es möglich, ein sehr ausführliches Profil zu erstellen, dessen resultierende Ereignisse umfangreich genug sind, um später einen detaillierten Ausführungsfluss zu rekonstruieren.

Überwachungsprofile sind XML-Elemente, die innerhalb einer standardmäßigen .NET Framework-Konfigurationsdatei oder in Code angegeben werden. Das folgende Beispiel ist einem .NET Framework 4.6.1-Überwachungsprofil in einer Konfigurationsdatei entnommen, die es einem Überwachungsteilnehmer ermöglicht, Started- und Completed-Workflowereignisse zu abonnieren.

<system.serviceModel>
    ...
    <tracking>
     <profiles>
      <trackingProfile name="Sample Tracking Profile">
        <workflow activityDefinitionId="*">
          <workflowInstanceQueries>
            <workflowInstanceQuery>
              <states>
                <state name="Started"/>
                <state name="Completed"/>
              </states>
            </workflowInstanceQuery>
          </workflowInstanceQueries>
        </workflow>
      </trackingProfile>
    </profiles>
  </tracking>
    ...
</system.serviceModel>

Im folgenden Beispiel wird das entsprechende Nachverfolgungsprofil dargestellt, das mithilfe von Code erstellt wurde.

TrackingProfile profile = new TrackingProfile()
{
    Name = "CustomTrackingProfile",
    Queries =
    {
        new WorkflowInstanceQuery()
        {
            // Limit workflow instance tracking records for started and
            // completed workflow states.
            States = { WorkflowInstanceStates.Started, WorkflowInstanceStates.Completed },
        }
    }
};

Überwachungsdatensätze werden innerhalb eines Überwachungsprofils mit dem ImplementationVisibility-Attribut über den Sichtbarkeitsmodus gefiltert. Eine zusammengesetzte Aktivität ist eine allgemeine Aktivität mit weiteren Aktivitäten, die ihre Implementierung bilden. Der Sichtbarkeitsmodus gibt die von zusammengesetzten Aktivitäten in einer Workflowaktivität ausgegebenen Überwachungsdatensätze an. Damit wird bestimmt, ob Aktivitäten, aus denen die Implementierung besteht, nachverfolgt werden. Der Sichtbarkeitsmodus gilt für die Ebene des Überwachungsprofils. Die Filterung von Überwachungsdatensätzen für einzelne Aktivitäten eines Workflows wird von den Abfragen im Überwachungsprofil gesteuert. Weitere Informationen finden Sie im Abschnitt Abfragetypen für Überwachungsprofile in diesem Dokument.

Die zwei Sichtbarkeitsmodi, die vom implementationVisibility-Attribut im Überwachungsprofil angegeben werden, sind RootScope und All. Durch Verwendung des RootScope-Modus werden Überwachungsdatensätze für Aktivitäten, die die Implementierung einer Aktivität bilden, unterdrückt, wenn der Stamm eines Workflows keine zusammengesetzte Aktivität ist. Dies bedeutet, dass nur die allgemeine Aktivität innerhalb der zusammengesetzten Aktivität nachverfolgt wird, wenn einem Workflow eine Aktivität hinzugefügt wird, die mit anderen Aktivitäten implementiert wird, und implementationVisibility auf RootScope festgelegt ist. Wenn eine Aktivität der Stamm des Workflows ist, stellt die Implementierung der Aktivität den Workflow selbst dar, und Überwachungsdatensätze werden für Aktivitäten ausgegeben, die die Implementierung bilden. Bei Verwendung des All-Modus werden die Überwachungsdatensätze für die Stammaktivität und alle zugehörigen zusammengesetzten Aktivitäten ausgegeben.

Beispiel: MyActivity ist eine zusammengesetzte Aktivität, deren Implementierung die zwei Aktivitäten Activity1 und Activity2 enthält. Wenn diese Aktivität einem Workflow hinzugefügt wird und die Nachverfolgung mit einem Überwachungsprofil aktiviert wird, bei dem implementationVisibility auf RootScope festgelegt wurde, werden Überwachungsdatensätze nur für MyActivity ausgegeben. Für die Aktivitäten Activity1 und Activity2 werden jedoch keine Datensätze ausgegeben.

Wurde das implementationVisibility-Attribut hingegen für das Überwachungsprofil auf All festgelegt, werden Überwachungsdatensätze nicht nur für MyActivity ausgegeben, sondern auch für die Aktivitäten Activity1 und Activity2.

Das implementationVisibility-Flag gilt für folgende Datensatztypen für die Nachverfolgung:

  • ActivityStateRecord

  • FaultPropagationRecord

  • CancelRequestedRecord

  • ActivityScheduledRecord

Hinweis

Von der Aktivitätsimplementierung ausgegebene CustomTrackingRecords werden von der implementationVisibility-Einstellung nicht herausgefiltert.

Die implementationVisibility-Funktionalität wird für das Überwachungsprofil auf folgende Weise als RootScope in Code angegeben:

TrackingProfile sampleTrackingProfile = new TrackingProfile()
{
    Name = "Sample Tracking Profile",
    ImplementationVisibility = ImplementationVisibility.RootScope
};

Die implementationVisibility-Funktionalität kann für das Überwachungsprofil auf folgende Weise als All in einer Konfigurationsdatei angegeben werden:

<tracking>
      <profiles>
        <trackingProfile name="Shipping Monitoring" implementationVisibility="All">
          <workflow activityDefinitionId="*">
...
         </workflow>
        </trackingProfile>
      </profiles>
</tracking>

Die ImplementationVisibility-Einstellung ist für das Überwachungsprofil optional. Standardmäßig ist der Wert auf RootScope festgelegt. Bei den Werten für dieses Attribut muss die Groß-/Kleinschreibung beachtet werden.

Abfragetypen für Überwachungsprofile

Überwachungsprofile werden als deklarative Abonnements für Überwachungsdatensätze angeordnet, die es Ihnen ermöglichen, bestimmte Überwachungsdatensätze aus der Workflowlaufzeit abzufragen. Es gibt mehrere Abfragetypen, mit denen Sie andere Klassen von TrackingRecord-Objekten abonnieren können. Überwachungsprofile können in der Konfiguration oder durch Code angegeben werden. Im Folgenden werden die häufigsten Abfragetypen aufgeführt:

  • WorkflowInstanceQuery – Hiermit können Sie Änderungen am Workflowinstanz-Lebenszyklus nachverfolgen, z. B. die bereits erwähnten Optionen Started und Completed. WorkflowInstanceQuery – Wird für das Abonnieren der folgenden TrackingRecord-Objekte verwendet:

    Jeder Zustand, der abonniert werden kann, ist in der WorkflowInstanceStates-Klasse angegeben.

    Die Konfiguration bzw. der Code zum Abonnieren von Überwachungsdatensätzen auf Workflowinstanzebene für den Started-Instanzzustand mit dem WorkflowInstanceQuery-Objekt wird im folgenden Beispiel gezeigt.

    <workflowInstanceQueries>
        <workflowInstanceQuery>
          <states>
            <state name="Started"/>
          </states>
        </workflowInstanceQuery>
    </workflowInstanceQueries>
    
    TrackingProfile sampleTrackingProfile = new TrackingProfile()
    {
        Name = "Sample Tracking Profile",
        Queries =
        {
            new WorkflowInstanceQuery()
            {
                States = { WorkflowInstanceStates.Started}
            }
        }
    };
    
  • ActivityStateQuery – Hiermit können Sie die Lebenszyklusänderungen der Aktivitäten nachverfolgen, aus denen eine Workflowinstanz besteht. Beispielsweise könnten Sie jede abgeschlossene Aktivität vom Typ „E-Mail senden“ innerhalb einer Workflowinstanz nachverfolgen. Diese Abfrage ist notwendig, damit ein TrackingParticipant-Objekt ActivityStateRecord-Objekte abonnieren kann. Die verfügbaren Zustände, die abonniert werden können, werden im ActivityStates-Objekt angegeben.

    Die Konfiguration und der Code zum Abonnieren von Überwachungsdatensätzen für den Aktivitätszustand, die das ActivityStateQuery-Objekt für die SendEmailActivity-Aktivität verwenden, werden im folgenden Beispiel gezeigt.

    <activityStateQueries>
      <activityStateQuery activityName="SendEmailActivity">
        <states>
          <state name="Closed"/>
        </states>
      </activityStateQuery>
    </activityStateQueries>
    
    TrackingProfile sampleTrackingProfile = new TrackingProfile()
    {
        Name = "Sample Tracking Profile",
        Queries =
        {
            new ActivityStateQuery()
            {
                ActivityName = "SendEmailActivity",
                States = { ActivityStates.Closed }
            }
        }
    };
    

    Hinweis

    Wenn mehrere activityStateQuery-Elemente denselben Namen haben, werden nur die Zustände im letzten Element im Nachverfolgungsprofil verwendet.

  • ActivityScheduledQuery – Mit dieser Abfrage können Sie eine Aktivität nachverfolgen, die von einer übergeordneten Aktivität ausgeführt werden soll. Die Abfrage ist notwendig, damit ein TrackingParticipant-Objekt ActivityScheduledRecord-Objekte abonnieren kann.

    Die Konfiguration und der Code zum Abonnieren von Datensätzen, die mit der untergeordneten SendEmailActivity-Aktivität verknüpft sind, deren Planung mit dem ActivityScheduledQuery-Objekt erfolgt, wird im folgenden Beispiel gezeigt.

    <activityScheduledQueries>
      <activityScheduledQuery activityName="ProcessNotificationsActivity" childActivityName="SendEmailActivity" />
    </activityScheduledQueries>
    
    TrackingProfile sampleTrackingProfile = new TrackingProfile()
    {
        Name = "Sample Tracking Profile",
        Queries =
        {
            new ActivityScheduledQuery()
            {
                ActivityName = "ProcessNotificationsActivity",
                ChildActivityName = "SendEmailActivity"
            }
        }
    };
    
  • FaultPropagationQuery – Hiermit können Sie die Behandlung von Fehlern nachverfolgen, die in einer Aktivität auftreten. Die Abfrage ist notwendig, damit ein TrackingParticipant-Objekt FaultPropagationRecord-Objekte abonnieren kann.

    Die Konfiguration und der Code zum Abonnieren von mit der Fehlerweitergabe verknüpften Datensätzen mithilfe von FaultPropagationQuery werden im folgenden Beispiel gezeigt.

    <faultPropagationQueries>
      <faultPropagationQuery faultSourceActivityName="SendEmailActivity" faultHandlerActivityName="NotificationsFaultHandler" />
    </faultPropagationQueries>
    
    TrackingProfile sampleTrackingProfile = new TrackingProfile()
    {
        Name = "Sample Tracking Profile",
        Queries =
        {
            new FaultPropagationQuery()
            {
                FaultSourceActivityName = "SendEmailActivity",
                FaultHandlerActivityName = "NotificationsFaultHandler"
            }
        }
    };
    
  • CancelRequestedQuery – Hiermit können Sie Anforderungen zum Abbrechen einer untergeordneten Aktivität durch die übergeordnete Aktivität nachverfolgen. Die Abfrage ist notwendig, damit ein TrackingParticipant-Objekt CancelRequestedRecord-Objekte abonnieren kann.

    Die Konfiguration und der Code zum Abonnieren von mit dem Aktivitätsabbruch verknüpften Datensätzen mithilfe von CancelRequestedQuery werden im folgenden Beispiel gezeigt.

    <cancelRequestedQueries>
      <cancelRequestedQuery activityName="ProcessNotificationsActivity" childActivityName="SendEmailActivity" />
    </cancelRequestedQueries>
    
    TrackingProfile sampleTrackingProfile = new TrackingProfile()
    {
        Name = "Sample Tracking Profile",
        Queries =
        {
            new CancelRequestedQuery()
            {
                ActivityName = "ProcessNotificationsActivity",
                ChildActivityName = "SendEmailActivity"
            }
        }
    };
    
  • CustomTrackingQuery – Hiermit können Sie Ereignisse nachverfolgen, die Sie in den Codeaktivitäten definieren. Die Abfrage ist notwendig, damit ein TrackingParticipant-Objekt CustomTrackingRecord-Objekte abonnieren kann.

    Die Konfiguration und der Code zum Abonnieren von mit der benutzerdefinierten Nachverfolgung verknüpften Datensätzen mit CustomTrackingQuery werden im folgenden Beispiel gezeigt.

    <customTrackingQueries>
      <customTrackingQuery name="EmailAddress" activityName="SendEmailActivity" />
    </customTrackingQueries>
    
    TrackingProfile sampleTrackingProfile = new TrackingProfile()
    {
        Name = "Sample Tracking Profile",
        Queries =
        {
            new CustomTrackingQuery()
            {
                Name = "EmailAddress",
                ActivityName = "SendEmailActivity"
            }
        }
    };
    
  • BookmarkResumptionQuery – Hiermit können Sie die Wiederaufnahme eines Lesezeichens in einer Workflowinstanz nachverfolgen. Diese Abfrage ist notwendig, damit ein TrackingParticipant-Objekt BookmarkResumptionRecord-Objekte abonnieren kann.

    Die Konfiguration und der Code zum Abonnieren von mit der Wiederaufnahme von Lesezeichen verknüpften Datensätzen mithilfe von BookmarkResumptionQuery werden im folgenden Beispiel gezeigt.

    <bookmarkResumptionQueries>
      <bookmarkResumptionQuery name="SentEmailBookmark" />
    </bookmarkResumptionQueries>
    
    TrackingProfile sampleTrackingProfile = new TrackingProfile()
    {
        Name = "Sample Tracking Profile",
        Queries =
        {
            new BookmarkResumptionQuery()
            {
                Name = "sentEmailBookmark"
            }
        }
    };
    

Anmerkungen

Anmerkungen ermöglichen es Ihnen, Überwachungsdatensätze mit einem beliebigen Wert zu markieren, der nach der Erstellung konfiguriert werden kann. Sie können beispielsweise mehrere Nachverfolgungsdatensätze in mehreren Workflows mit "Mail Server" == "Mail Server1" markieren. Auf diese Weise können alle Datensätze mit diesem Tag einfach gefunden werden, wenn zu einem späteren Zeitpunkt Überwachungsdatensätze abgefragt werden.

Damit dies funktioniert, wird einer Überwachungsabfrage eine Anmerkung hinzugefügt, wie im folgenden Beispiel gezeigt.

<activityStateQuery activityName="SendEmailActivity">
  <states>
    <state name="Closed"/>
  </states>
  <annotations>
    <annotation name="MailServer" value="Mail Server1"/>
  </annotations>
</activityStateQuery>

Erstellen eines Überwachungsprofils

Mit Überwachungsabfrageelementen wird ein Überwachungsprofil erstellt. Dazu wird entweder eine XML-Konfigurationsdatei oder .NET Framework 4.6.1-Code verwendet. Im Folgenden finden Sie ein Beispiel für ein mit einer Konfigurationsdatei erstelltes Überwachungsprofil.

<system.serviceModel>
  <tracking>
    <profiles>
      <trackingProfile name="Sample Tracking Profile ">
        <workflow activityDefinitionId="*">
          <!--Specify the tracking profile query elements to subscribe for tracking records-->
        </workflow>
      </trackingProfile>
    </profiles>
  </tracking>
</system.serviceModel>

Warnung

Bei WF mit dem Workflowdiensthost wird das Überwachungsprofil in der Regel mit einer Konfigurationsdatei erstellt. Es ist auch möglich, ein Überwachungsprofil mit Code zu erstellen. Dazu wird die API für Überwachungsprofile und Überwachungsabfragen verwendet.

Ein Profil, das als XML-Konfigurationsdatei konfiguriert ist, wird mit einer Verhaltenserweiterung auf einen Überwachungsteilnehmer angewendet. Dies wird einem WorkflowServiceHost hinzugefügt, wie weiter unten im Abschnitt Konfigurieren der Nachverfolgung für einen Workflow beschrieben.

Der Detailliertheitsgrad der Überwachungsdatensätze, die vom Host ausgegeben werden, wird von den Konfigurationseinstellungen im Überwachungsprofil bestimmt. Ein Überwachungsteilnehmer abonniert Überwachungsdatensätze, indem einem Überwachungsprofil Abfragen hinzugefügt werden. Zum Abonnieren aller Überwachungsdatensätze müssen im Überwachungsprofil alle Überwachungsabfragen mit „*“ in den Namensfeldern der einzelnen Abfragen angegeben werden.

Es folgen einige häufige Beispiele für Überwachungsprofile.

  • Ein Überwachungsprofil zum Abfragen von Workflowinstanz-Datensätzen und -fehlern

    <trackingProfile name="Instance and Fault Records">
      <workflow activityDefinitionId="*">
        <workflowInstanceQueries>
          <workflowInstanceQuery>
            <states>
              <state name="*" />
            </states>
          </workflowInstanceQuery>
        </workflowInstanceQueries>
        <activityStateQueries>
          <activityStateQuery activityName="*">
            <states>
              <state name="Faulted"/>
            </states>
          </activityStateQuery>
        </activityStateQueries>
      </workflow>
    </trackingProfile>
    
  • Ein Überwachungsprofil zum Abfragen aller benutzerdefinierten Überwachungsdatensätze

    <trackingProfile name="Instance_And_Custom_Records">
      <workflow activityDefinitionId="*">
        <customTrackingQueries>
          <customTrackingQuery name="*" activityName="*" />
        </customTrackingQueries>
      </workflow>
    </trackingProfile>
    

Weitere Informationen