Workflow Foundation > Articles > Surveiller un Workflow
       Accueil
       L'équipe


       Présentation
       Activités WF
       Articles
       Tutoriaux
       Trucs & Astuces


       Forum (MSDN)
       Téléchargements
       Ressources FR
       Annuaire des liens
       Formation (WW)


       Administration


 


Ne ratez pas le MSDN et TechNet Tour 2008 : votre nouveau rendez-vous Développeur dans votre région

Surveiller un Workflow

Que cela soit en phase de conception ou bien en production, il est important d’être capable de surveiller l’état d’avancement d’une instance de Workflow. Pour ceci, et afin de pouvoir anticiper d’éventuels problèmes de charge, la collecte d'informations sur l’état de santé de chacune voir de l’ensemble des instances semble essentielle, au même titre ainsi que la surveillance de l’application et de la machine hôte.

Workflow Foundation propose plusieurs façons de suivre l’évolution d’un Workflow, chacune adaptée à un besoin, de la gestion des erreurs classiques au suivit informatif de l’évolution de des instances. Cet article présente trois approches :
   - Le tracking, service spécifique à Workflow Foundation, est utilisé afin de suivre de manière détaillée l’évolution des instances.
   - Les compteurs de performance offrent une méthode pratique pour avoir des informations en temps réel sur le comportement global de Workflow Foundation.
   - La génération de log est quand à elle intéressante dans le but de capturer des informations analysables dans le temps et être alerté immédiatement en cas de problème technique.


Le tracking

Le tracking fait parti, au même titre que la persistance et de la gestion des transactions, des services de base que Windows Workflow Foundation est capable d’utiliser.
Le service de tracking se place au niveau du Runtime et permet de capturer certains éléments levés par les instances de Workflows.

On distingue trois types d’événements :
   - Les évènements levés au niveau instance qui permettent de suivre l’évolution de l’état de celles-ci (TrackingWorkflowEvent) :
      o Created : l’instance vient d’être créée
      o Started : L’instance a démarré
      o Aborted : l’instance a été interrompue
      o Changed : un changement a été fait au niveau du contenu de l’instance
      o Exception : Une exception vient d’être levée et n’a pas été capturée
      o Idle : L’instance est en attente
      o Suspended : L’exécution de l’instance a été suspendue
      o Resumed : Une instance suspendue vient de reprendre son exécution
      o Persisted : L’instance a été persistée
      o Loaded : L’instance est chargée en mémoire
      o Unloaded : L’instance a été déchargée de la mémoire
      o Completed : l’instance vient de terminer
      o Terminated : L’instance s’est terminée

   - Les évènements plus détaillés, levés lors du changement de statuts des activités (ActivityExecutionStatus) au cours de l’exécution d’une instance
      o Initialized quand une activité s’initialise
      o Executing : quand une activité s’exécute
      o Canceling : quand une activité est annulée
      o Compensating : quand une activité s’est interrompue et est en train d’être compensée
      o Fautling : quand une activité cause une erreur
      o Closed : quand une activité est terminée

   - Les évènements personnalisés (TrackPoint), levés depuis le code du Workflow à l’initiative du développeur.

Workflow Foundation propose de base une gestion du tracking dans SQLServer. Il suffit pour ceci de préparer une base de données en exécutant les scripts « Tracking_Schema.sql » et « Tracking_Logic.sql » situés dans le répertoire du Framework .NET 3.0 : « C:\Windows\Microsoft.NET\Framework\v3.0\Windows Workflow Foundation\SQL\EN »

Une fois la base de données prête, il est nécessaire d’activer le service de persistance soit par code :

string connectionString = "Initial Catalog=Tracking;Data Source=localhost;Integrated Security=SSPI;";
WorkflowRuntime workflowRuntime = new WorkflowRuntime();
workflowRuntime.AddService(new SqlTrackingService(connectionString));

Soit dans le fichier de configuration :

<?xml version="1.0"?>
   <configuration xmlns="http://schemas.microsoft.com/.NetConfiguration/v2.0">
      <configSections>
         <section name="WorkflowRuntime"ntype="System.Workflow.Runtime.Configuration.WorkflowRuntimeSection, System.Workflow.Runtime, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" />
      </configSections>
      <Services Name="Workflow">
            <add type="System.Workflow.Runtime.Tracking.SqlTrackingService, System.Workflow.Runtime, Version=3.0.00000.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" ConnectionString="Initial Catalog=Tracking;Data Source=localhost;Integrated Security=SSPI;"/>
      </Services>
   </configuration>

A partir du moment où le service de tracking est activé, celui-ci va automatiquement enregistrer les différents événements dans la base de données sélectionnée.

Ces informations vont ensuite pouvoir être manipulées au travers de l’API de tracking fournie avec le Framework :

private static void OutputWorkflowTrackingEvents(Guid instanceId)
{
      //création d'un objet permettant de requêter le tout
      SqlTrackingQuery sqlTrackingQuery = new SqlTrackingQuery(connectionString);

      //récupération de l'instance de Workflow a analyser à partir de son identifiant unique
      SqlTrackingWorkflowInstance sqlTrackingWorkflowInstance;
      if (sqlTrackingQuery.TryGetWorkflow(instanceId, out sqlTrackingWorkflowInstance))
      {
            //récupération des évènements levés par les instances
            foreach (WorkflowTrackingRecord workflowTrackingRecord in sqlTrackingWorkflowInstance.WorkflowEvents)
            {
                  Console.WriteLine("EventDescription : {0} DateTime : {1}", workflowTrackingRecord.TrackingWorkflowEvent,
                                              workflowTrackingRecord.EventDateTime);
            }

            //récupération des évènements lévés par les activités
            foreach (ActivityTrackingRecord activityTrackingRecord in sqlTrackingWorkflowInstance.ActivityEvents)
            {
                  Console.WriteLine("StatusDescription : {0} DateTime : {1} Activity Qualified Name : {2}",
                                              activityTrackingRecord.ExecutionStatus, activityTrackingRecord.EventDateTime,
                                              activityTrackingRecord.QualifiedName);
            }
      }
}

Il est donc possible de suivre l’état d’avancement de votre Workflow en écrivant votre propre application s’appuyant sur l’API de tracking, par exemple dans une page Web. Deux exemples très complets d’application sont disponibles en téléchargement avec sources : Une application Winforms, présente dans les exemples du SDK de Windows « C:\Program Files\Microsoft SDKs\Windows\v6.0\Samples\WFSamples\Applications\WorkflowMonitor »…



 …et une application Web, téléchargeable sur le site du Framework 3.0 dans la rubrique Workflow « http://wf.netfx3.com/files/folders/technology/entry1872.aspx  » écrite par Jon Flanders (http://www.masteringbiztalk.com/blogs/jon/PermaLink,guid,79f45d4d-6e5a-437b-a230-d7df13ae18e7.aspx)

Pour aller plus loin, il bien entendu possible de créer son propre service de tracking, un exemple proposant d’enregistrer les informations dans des fichiers plutôt que dans SQL Server est d’ailleurs disponible avec sources dans le SDK de Windows.

Si vous souhaitez gérer autre chose que les événements de base « TrackingWorkflowEvent » et « ActivityExecutionStatus », vous avez la possibilité d’insérer vos propres points de tracking. Il est pour ceci nécessaire de modifier le fichier XML « tracking profile » qui est chargé de définir les événements à capturer. La modification du profil fera l’objet d’un autre article dans les prochaines semaines.


Compteurs de performance

L’outil « Perfmon.exe », présent dans Windows, permet d’analyser les différents compteurs de performance de l’ordinateur. Lorsque vous installez le Framework .NET 3.0, des compteurs spécifiques à Workflow Foundation sont ajoutés. Ceux-ci permettent de surveiller l’ensemble des types de Workflow hébergés sur la machine ou bien uniquement un type en particulier.

Le nom (type) de votre Workflow est renseigné dans le fichier de configuration sous l’attribut « Name ». Les compteurs de performance sont activés par défaut, mais il est possible de les désactiver en modifiant la valeur de l’attribut « EnablePerformanceCounters » au même niveau, dans le même fichier de configuration.

   <WorkflowRuntime Name="Bdabd.Transaction" EnablePerformanceCounters="True">

Une fois le nom du Runtime définit et l’application Perfmon.exe lancée, il est nécessaire d’initialiser au moins une instance du Workflow afin que celle-ci apparaisse dans la liste des instances sélectionnables au niveau de la gestion des compteurs :



Il ne reste plus ensuite qu’a choisir les compteurs adaptés dans la liste proposée avant de pouvoir suivre en temps réel l’évolution de vos Workflows.
Parmi les choix, sont présents :
   - Workflows Aborted (count)
   - Workflows Abourted/sec (rate)
   - Workflows Completed (count)
   - Workflows Completed/s (rate)
   - Workflow Created (count)
   - Workflows Created/sec (rate)
   - Workflows Executing (count)
   - Workflows In Memory (count)
   - Workflows Loaded (count)
   - Workflows Loaded/sec (rate)
   - Workflows Pending (count)
   - Workflows Persisted/sec (count)
   - Workflows Persisted/sec (rate)
   - Workflows Runnable (count)
   - Workflows Suspended (count)
   - Workflows Suspended/sec (rate)
   - Workflows Terminated (count)
   - Workflows Terminated/sec (rate)
   - Workflow Unloaded (count)
   - Workflow Unloaded/sec (rate)

 


Log classique

Windows Workflow Foundation s’appuyant sur le Framework .NET 2.0 pour fonctionner, il est aussi possible d’utiliser l’API system.diagnostics dans le but de capturer des informations. Il suffit pour ceci d’activer les éléments à enregistrer dans le fichier de configuration de votre application hôte, parmi lesquels :

<switches>
   <add name="System.Workflow.LogToFile" value="1" />
   <add name="System.Workflow.Runtime" value="All" />
   <add name="System.Workflow.Runtime.Hosting" value="All" />
   <add name="System.Workflow.Runtime.Tracking" value="All" />
   <add name="System.Workflow.Activities" value="All" />
   <add name="System.Workflow.Activities.Rules" value="All" />
</switches>

Cette configuration permet d’enregistrer les informations directement dans un fichier « WorkflowTrace.log ». Si vous souhaitez utiliser vos propres trace listeners, il suffit de remplacer les informations « name=system.workflow.logToFile » par « name=system.workflow.LogToTraceListener » et de définir des listeners dans le code de votre application hôte. Il est ainsi possible, par exemple, de créer un listener qui enverra automatiquement un Email aux administrateurs du Workflow en cas d’erreur critique tout en conservant les informations de type warning dans l’event log de Windows.

Pour chaque élément de log, l’attribut « value » peut prendre les valeurs suivantes :
   - All : Log tout les messages recuts
   - Off : Ne log rien
   - Critical : uniquement les messages définis comme critiques
   - Error : messages critiques et erreurs
   - Warning : Messages critiques, erreurs et avertissements
   - Information : Messages critiques, erreurs, avertissements et informations
   - Verbose : Messages critiques, erreurs, avertissements, information et autres

 

Quelques liens pour terminer

Voici quelques liens complémentaires relatifs aux éléments cités dans cet article :
   - MSDN, exemples en ligne d’utilisation/personnalisation du tracking (US) : http://msdn2.microsoft.com/en-us/library/ms741724.aspx
   - Téléchargement du Windows SDK : http://www.microsoft.com/downloads/details.aspx?familyid=7614FE22-8A64-4DFB-AA0C-DB53035F40A0&displaylang=en
   - MSDN, les compteurs de performance (US) : http://msdn2.microsoft.com/en-us/library/ms732345.aspx
   - MSDN, le fichier de configuration de Workflow Foundation (US) : http://msdn2.microsoft.com/en-us/library/ms732240.aspx 

Florent SANTIN