Perfiles de seguimiento

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

Los perfiles de seguimiento se usan para especificar qué información de seguimiento se emite para una instancia de flujo de trabajo. Si no se especifica ningún perfil, se emiten todos los eventos de seguimiento. Si se especifica un perfil, se emitirán los eventos de seguimiento especificados en el perfil. 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 en un archivo de configuración de .NET Framework estándar o especificado en el código. El siguiente ejemplo es de un perfil de seguimiento de .NET Framework 4.6.1 en un archivo de configuración que permite a un participante de seguimiento suscribirse a los eventos de flujo de trabajo Started y Completed.

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

El ejemplo siguiente muestra el perfil de seguimiento equivalente creado mediante código.

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 },
        }
    }
};

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 más información, consulte la sección Tipos de consulta de perfil de seguimiento de 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 implementationVisibility 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

Nota

CustomTrackingRecords emitidos a partir de la implementación de actividad no se filtran por el valor implementationVisibility.

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

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

La funcionalidad implementationVisibility se especifica como All 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",
        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 quiera hacer el seguimiento de todas las veces que se completa la actividad "Enviar correo electrónico" en 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",
        Queries =
        {
            new ActivityStateQuery()
            {
                ActivityName = "SendEmailActivity",
                States = { ActivityStates.Closed }
            }
        }
    };
    

    Nota

    Si hay varios elementos activityStateQuery con el mismo nombre, solo se los estados del último elemento en el perfil de seguimiento.

  • 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",
        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",
        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",
        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",
        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",
        Queries =
        {
            new BookmarkResumptionQuery()
            {
                Name = "sentEmailBookmark"
            }
        }
    };
    

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.6.1. 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.serviceModel>

Advertencia

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 Configuración de 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>
    
  • 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>
    

Consulte también