Compartir a través de


Perfiles de seguimiento

Este tema es aplicable a Windows Workflow Foundation 4.

Los perfiles de seguimiento contienen consultas de seguimiento que permiten a un participante de seguimiento suscribirse a los eventos del flujo de trabajo que se emiten cuando el estado de una instancia de flujo de trabajo cambia en el tiempo de ejecución.

Perfiles de seguimiento

Dependiendo de sus requisitos de supervisión, puede escribir un perfil que es muy general, que se suscribe a un conjunto pequeño de cambios de estado de alto nivel en un flujo de trabajo. En cambio, puede crear un perfil muy detallado cuyos eventos resultantes estén lo suficientemente enriquecidos para reconstruir un flujo de ejecución detallado más adelante.

Los perfiles de seguimiento se manifiestan como elementos XML dentro de un archivo de configuración .NET Framework estándar o especificado en el código. El siguiente ejemplo es de un perfil de seguimiento de .NET Framework versión 4 en un archivo de configuración que permite a un participante de seguimiento suscribirse a los eventos de flujo de trabajo Completed y Started.

<system.serviceModel>
    …
    <tracking>  
      <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>  

Los registros de seguimiento se filtran a través del modo de visibilidad dentro de un perfil de seguimiento mediante el atributo ImplementationVisibility. Una actividad compuesta es una actividad de nivel superior que contiene otras actividades que forman su implementación. El modo de visibilidad especifica los registros de seguimiento emitidos desde actividades compuestas dentro de una actividad de flujo de trabajo para especificar si se realiza el seguimiento de las actividades que forman la implementación. El modo de visibilidad se aplica en el nivel del perfil de seguimiento. Las consultas incluidas en el perfil de seguimiento controlan el filtrado de los registros de seguimiento para las actividades individuales dentro de un flujo de trabajo. Para obtener más información, consulte la sección Tipos de consulta de perfil de seguimiento en este documento.

Los dos modos de visibilidad especificados por el atributo implementationVisibility en el perfil de seguimiento son RootScope y All. Al usar el modo RootScope, se suprimen los registros de seguimiento para las actividades que forman la implementación de una actividad en el caso de que una actividad compuesta no sea la raíz de un flujo de trabajo. Esto implica que, cuando una actividad que se implementa usando otras actividades se agrega a un flujo de trabajo y implementationVisibility está definido en RootScope, sólo se realiza el seguimiento de la actividad de nivel superior incluida en esa actividad compuesta. Si una actividad es la raíz del flujo de trabajo, la implementación de la actividad es el propio flujo de trabajo y los registros de seguimiento se emiten para actividades que forman la implementación. Gracias al modo All, se permite que todos los registros de seguimiento se emitan para la actividad raíz y todas sus actividades compuestas.

Por ejemplo, suponga que MyActivity es una actividad compuesta cuya implementación contiene dos actividades, Activity1 y Activity2. Cuando esta actividad se agrega a un flujo de trabajo y se habilita el seguimiento con un perfil de seguimiento con implementationVisibility establecido en RootScope, los registros de seguimiento se emiten sólo para MyActivity. Sin embargo, no se emiten registros para las actividades Activity1 y Activity2.

Sin embargo, si el atributo implementationVisisbility para el perfil de seguimiento está establecido en All, los registros de seguimiento se emiten no sólo para MyActivity, sino también para las actividades Activity1 y Activity2.

La marca implementationVisibility se aplica a los siguientes tipos de registro de seguimiento:

  • ActivityStateRecord

  • FaultPropagationRecord

  • CancelRequestedRecord

  • ActivityScheduledRecord

Ee513989.note(es-es,VS.100).gifNota:
CustomTrackingRecords emitidos a partir de la implementación de actividad no se filtran por el valor implementationVisibility.

La funcionalidad implementationVisibility se especifica en el perfil de seguimiento en código de la siguiente forma:

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

La funcionalidad implementationVisibility puede especificarse en el perfil de seguimiento en un archivo de configuración de la siguiente manera:

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

El valor ImplementationVisibility en el perfil de seguimiento es opcional. De manera predeterminada, su valor está definido en RootScope. Los valores para este atributo distinguen entre mayúsculas y minúsculas.

Tipos de consulta de perfil de seguimiento

Los perfiles de seguimiento se estructuran como suscripciones declarativas para los registros de seguimiento que le permiten consultar el tiempo de ejecución de flujo de trabajo para registros de seguimiento específicos. Hay varios tipos de consulta que permiten que se suscriba a clases diferentes de objetos TrackingRecord. Los perfiles de seguimiento se pueden especificar en la configuración o a través del código. A continuación, se describen los tipos de consulta más comunes:

  • WorkflowInstanceQuery: úsela para realizar el seguimiento de los cambios de ciclo de vida de la instancia de flujo de trabajo como los valores Started y Completed mostrados previamente. WorkflowInstanceQuery se usa para suscribirse a los siguientes objetos TrackingRecord:

    Los estados a los que se puede suscribir se especifican en la clase WorkflowInstanceStates.

    La configuración o código usados para suscribirse a los registros de seguimiento en el nivel de instancia del flujo de trabajo correspondientes al estado de la instancia Started que usa WorkflowInstanceQuery se muestran en el siguiente ejemplo.

    <workflowInstanceQueries>
        <workflowInstanceQuery>
          <states>
            <state name="Started"/>
          </states>
        </workflowInstanceQuery>
    </workflowInstanceQueries>
    
    TrackingProfile sampleTrackingProfile = new TrackingProfile()
    {
                     Name = "Sample Tracking Profile"
                     ActivityDefinitionId="EmailWorkflow"
                     Queries = 
                       {
                         new WorkflowInstanceQuery()
                            {
                               States = { WorkflowInstanceStates.Started}
    
                            }
                        }
    }
    
  • ActivityStateQuery: úsela para realizar el seguimiento de los cambios del ciclo de vida de las actividades que constituyen una instancia de flujo de trabajo. Por ejemplo, puede que desee realizar el seguimiento de todas las veces que se completa la actividad "Enviar correo electrónico" dentro de una instancia de flujo de trabajo. Esta consulta es necesaria para que TrackingParticipant se suscriba a los objetos ActivityStateRecord. Los estados de suscripción disponibles se especifican en ActivityStates.

    La configuración y el código usados para suscribirse a los registros de seguimiento del estado de la actividad que usan ActivityStateQuery para la actividad SendEmailActivity se muestran en el siguiente ejemplo.

    <activityStateQueries>
           <activityStateQuery activityName="SendEmailActivity">
               <states>
                      <state name="Closed"/>
               </states>
           </activityStateQuery>
    </activityStateQueries>
    
    TrackingProfile sampleTrackingProfile = new TrackingProfile()
    {
         Name = "Sample Tracking Profile"
         ActivityDefinitionId="EmailWorkflow"
         Queries = {
              new ActivityStateQuery()
                       {                            
                       ActivityName = "SendEmailActivity",
                       States = { ActivityStates.Closed }
                       }
                   }
    }
    
  • ActivityScheduledQuery: esta consulta le permite realizar el seguimiento de una actividad programada para que sea ejecutada por una actividad primaria. La consulta es necesaria para que TrackingParticipant se suscriba a los objetos ActivityScheduledRecord.

    La configuración y el código usados para suscribirse a los registros relacionados con la actividad secundaria SendEmailActivity que se está programando con ActivityScheduledQuery se muestran en el siguiente ejemplo.

    <activityScheduledQueries>
                  <activityScheduledQuery activityName="ProcessNotificationsActivity" childActivityName=" SendEmailActivity" />
     </activityScheduledQueries>
    
    TrackingProfile sampleTrackingProfile = new TrackingProfile()
    {
         Name = "Sample Tracking Profile"
         ActivityDefinitionId="EmailWorkflow"
         Queries = {
                    new ActivityScheduledQuery()
                      {
                      ActivityName = "ProcessNotificationsActivity",
                      ChildActivityName = "SendEmailActivity"
                      }
                   }
    }
    
  • FaultPropagationQuery: use este valor para realizar el seguimiento del control de errores que se producen dentro de una actividad. La consulta es necesaria para que TrackingParticipant se suscriba a los objetos FaultPropagationRecord.

    La configuración y el código que se usen para suscribirse a registros relacionados con la propagación de errores mediante FaultPropagationQuery se muestran en el ejemplo siguiente.

    <faultPropagationQueries>
                  <faultPropagationQuery faultSourceActivityName="SendEmailActivity" faultHandlerActivityName="NotificationsFaultHandler" />
    </faultPropagationQueries>
    
    TrackingProfile sampleTrackingProfile = new TrackingProfile()
    {
         Name = "Sample Tracking Profile"
         ActivityDefinitionId="EmailWorkflow"
         Queries = {
                           new FaultPropagationQuery()
                            {
                                FaultSourceActivityName = "SendEmailActivity",
                                FaultHandlerActivityName = "NotificationsFaultHandler"
                            }
                    }
    }
    
  • CancelRequestedQuery: úsela para realizar un seguimiento de las solicitudes para cancelar una actividad secuncaria mediante la actividad primaria. La consulta es necesaria para que TrackingParticipant se suscriba a los objetos CancelRequestedRecord.

    La configuración y el código que se usen para suscribirse a registros relacionados con la cancelación de actividades mediante CancelRequestedQuery se muestran en el ejemplo siguiente.

    <cancelRequestedQueries>
          <cancelRequestedQuery activityName="ProcessNotificationsActivity" childActivityName="SendEmailActivity" />
    </cancelRequestedQueries>
    
    TrackingProfile sampleTrackingProfile = new TrackingProfile()
    { 
         Name = "Sample Tracking Profile"
         ActivityDefinitionId="EmailWorkflow"
         Queries = 
                {
                  new CancelRequestedQuery()
                     {
                     ActivityName = "ProcessNotificationsActivity",
                     ChildActivityName = "SendEmailActivity"
                     }
                  }
    }
    
  • CustomTrackingQuery: úsela para realizar el seguimiento de eventos que defina en las actividades de código. La consulta es necesaria para que TrackingParticipant se suscriba a los objetos CustomTrackingRecord.

    La configuración y el código usados para suscribirse a los registros relacionados con los registros de seguimiento personalizados mediante CustomTrackingQuery se muestran en el siguiente ejemplo.

    <customTrackingQueries>
         <customTrackingQuery name="EmailAddress" activityName="SendEmailActivity" />
    </customTrackingQueries>
    
    TrackingProfile sampleTrackingProfile = new TrackingProfile()
    {
         Name = "Sample Tracking Profile"
         ActivityDefinitionId="EmailWorkflow"
         Queries = 
                 {
                 new CustomTrackingQuery() 
                            {
                             Name = "EmailAddress",
                             ActivityName = "SendEmailActivity"
                            }
                 }
    }
    
  • BookmarkResumptionQuery: úsela para realizar un seguimiento de la reanudación de un marcador en una instancia de flujo de trabajo. Esta consulta es necesaria para que TrackingParticipant se suscriba a los objetos BookmarkResumptionRecord.

    La configuración y el código que se usen para suscribirse a registros relacionados con la reanudación de marcadores mediante BookmarkResumptionQuery se muestran en el ejemplo siguiente.

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

Variables y argumentos

Al realizar el seguimiento de la ejecución de un flujo de trabajo, resulta útil a menudo para extraer los datos. Esto proporciona contexto adicional al tener acceso a un registro de seguimiento posterior a la ejecución. En .NET Framework 4, puede extraer cualquier variable o argumento visibles dentro del ámbito de cualquier actividad en un flujo de trabajo que use el seguimiento. Los perfiles de seguimiento facilitan la extracción de datos.

Las variables y los argumentos se extraen cuando una actividad emite ActivityStateRecord. Una variable sólo está disponible para la extracción si se encuentra dentro del ámbito de la actividad. Una variable que se va a extraer con una actividad se especifica de la siguiente manera

  • Si el nombre de variable especifica una variable, el seguimiento busca la variable en la actividad actual a la que se está realizando el seguimiento y en las actividades primarias. Se busca la variable en el ámbito de actividad actual y en el ámbito primario.

  • Si las variables que se van a extraer se especifican con name= "*", se extraerán todas las variables dentro de la actividad actual a la que se esté realizando el seguimiento. En este caso, las variables que estén dentro del ámbito pero que estén definidas en actividades primarias no se extraen.

Al extraer los argumentos, los argumentos extraídos dependen del estado de la actividad. Cuando el estado de una actividad es Executing, sólo están disponibles para su extracción InArguments. Para cualquier otro estado de actividad (Closed, Faulted, Canceled), todos los argumentos, InArguments y OutArguments estarán disponibles para la extracción.

El siguiente ejemplo muestra una consulta de estado de actividad que extrae variables y argumentos cuando se emite el registro de seguimiento de la actividad Closed. Los argumentos y las variables solo se pueden extraer con ActivityStateRecord y, por tanto, se suscriben en un perfil de seguimiento con ActivityStateQuery.

<activityStateQuery activityName="SendEmailActivity">
  <states>
    <state name="Closed"/>
  </states>
  <variables>
    <variable name="FromAddress"/>
  </variables>
  <arguments>
    <argument name="Result"/>
  </arguments>
</activityStateQuery>

Proteger la información almacenada dentro de variables/argumentos

El tiempo de ejecución de WF hace visible de manera predeterminada a la variable o argumento a los que se ha realizado el seguimiento. Un desarrollador de software del flujo de trabajo puede evitar el acceso si da los pasos adecuados.

  1. Cifre el valor de una variable.

  2. Controle la creación de un perfil de seguimiento para evitar la extracción de variable o argumento.

  3. En el caso del seguimiento personalizado, los participantes se aseguran de que el código WF no divulgue información confidencial que esté almacenada en variables o argumentos.

Anotaciones

Las anotaciones le permiten etiquetar de forma arbitraria registros de seguimiento con un valor que se puede configurar después de la compilación. Por ejemplo, podría desear varios registros de seguimiento por varios flujos de trabajo que se van a etiquetar con "Mail Server" == "Mail Server1". De esta forma se facilita la búsqueda de todos los registros con esta etiqueta cuando se realizan consultas de registros de seguimiento posteriormente.

Para lograr esto, se agrega una anotación a una consulta de seguimiento tal y como se muestra en el siguiente ejemplo.

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

Cómo crear un perfil de seguimiento

Los elementos de consulta de seguimiento se usan para crear un perfil de seguimiento mediante un archivo de configuración XML o código de .NET Framework 4. A continuación encontrará un ejemplo de un perfil de seguimiento creado mediante un archivo de configuración.

<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.seriviceModel>
Ee513989.Warning(es-es,VS.100).gif Precaución:
Para que WF use el host de servicio de flujo de trabajo, el perfil de seguimiento se crea normalmente con un archivo de configuración. También es posible crear un perfil de seguimiento con código que use el perfil de seguimiento y la API de consulta de seguimiento.

Los perfiles configurados como un archivo de configuración XML se aplican a un participante de seguimiento mediante una extensión de comportamiento. Esto se agrega a WorkflowServiceHost tal y como se describe en la sección posterior Configurar seguimiento para un flujo de trabajo.

El nivel de detalle de los registros del seguimiento emitidos por el host está determinado por los valores de configuración en el perfil de seguimiento. Un participante de seguimiento se suscribe a los registros de seguimiento mediante la adición de consultas a un perfil de seguimiento. Para suscribirse a todos los registros de seguimiento, el perfil de seguimiento debe especificar todas las consultas de seguimiento con "*" en los campos de nombre de cada una de las consultas.

A continuación, se especifican algunos ejemplos comunes de perfiles de seguimiento.

  • Un perfil de seguimiento para obtener registros de instancia del flujo de trabajo y errores.
<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>
  1. Un perfil de seguimiento para obtener todos los registros de seguimiento personalizados.
<trackingProfile name="Instance_And_Custom_Records">
      <workflow activityDefinitionId="*">
            <customTrackingQueries>
                 <customTrackingQuery name="*" activityName="*" />
            </customTrackingQueries>
      </workflow>
</trackingProfile>