Compartir a través de


Perfiles de seguimiento

Los perfiles de seguimiento contienen consultas de seguimiento que permiten a un participante de seguimiento suscribirse a eventos de flujo de trabajo que se emiten cuando el estado de una instancia de flujo de trabajo cambia en 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. En función de los requisitos de supervisión, puede escribir un perfil muy general, que abarca un pequeño conjunto de cambios de estado de alto nivel en un flujo de trabajo. Por el contrario, puede crear un perfil muy detallado cuyos eventos resultantes son lo suficientemente completos como 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 estándar de .NET Framework o especificados 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>

En el ejemplo siguiente se 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 ImplementationVisibility atributo . 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 a partir de actividades compuestas dentro de una actividad de flujo de trabajo, para especificar si se realiza un seguimiento de las actividades que forman la implementación. El modo de visibilidad se aplica en el nivel del perfil de seguimiento. El filtrado de registros de seguimiento de actividades individuales dentro de un flujo de trabajo se controla mediante las consultas dentro del perfil de seguimiento. Para obtener 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 implementationVisibility atributo del perfil de seguimiento son RootScope y All. El uso del RootScope modo suprime los registros de seguimiento de las actividades que forman la implementación de una actividad en caso de que una actividad compuesta no sea la raíz de un flujo de trabajo. Esto implica que, cuando se agrega una actividad que se implementa mediante otras actividades a un flujo de trabajo, y el implementationVisibility está configurado en RootScope, solo se rastrea la actividad de nivel superior dentro de 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 las actividades que forman la implementación. El uso del modo Todo permite emitir todos los registros de seguimiento para la actividad raíz y todas sus actividades compuestas.

Por ejemplo, supongamos 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 el seguimiento está habilitado con un perfil de seguimiento con implementationVisibility establecido en RootScope, los registros de seguimiento solo se emiten para MyActivity. Sin embargo, no se emiten registros para las actividades Activity1 y Activity2.

Sin embargo, si el implementationVisibility atributo del perfil de seguimiento se establece Allen , los registros de seguimiento se emiten no solo para MyActivity, sino también para las actividades Activity1 y Activity2.

La implementationVisibility marca 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 implementationVisibility funcionalidad se especifica como All en el perfil de seguimiento en un archivo de configuración como se indica a continuación:

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

La ImplementationVisibility configuración del perfil de seguimiento es opcional. De forma predeterminada, su valor se establece 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 permiten consultar el tiempo de ejecución del flujo de trabajo para registros de seguimiento específicos. Hay varios tipos de consulta que permiten suscribirse a diferentes clases de TrackingRecord objetos. Los perfiles de seguimiento se pueden especificar en la configuración o a través del código. Estos son los tipos de consulta más comunes:

  • WorkflowInstanceQuery : use esta opción para realizar un seguimiento de los cambios del ciclo de vida de la instancia de flujo de trabajo, como los mostrados Started anteriormente y Completed. WorkflowInstanceQuery se usa para suscribirse a los objetos siguientesTrackingRecord:

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

    La configuración o el código que se utiliza para suscribirse a los registros de seguimiento a nivel de instancia de flujo de trabajo para el estado de instancia Started utilizando WorkflowInstanceQuery se muestra 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 - Úselo para realizar un seguimiento de los cambios del ciclo de vida de las actividades que componen una instancia de flujo de trabajo. Por ejemplo, puede que desee realizar un seguimiento de cada vez que se complete 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 disponibles para suscribirse a se especifican en ActivityStates.

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

    <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 varios elementos activityStateQuery tienen el mismo nombre, solo se usan los estados del último elemento en el perfil de seguimiento.

  • ActivityScheduledQuery - Esta consulta permite realizar un seguimiento de una actividad programada para su ejecución por parte de 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 - Úselo para realizar un 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.

    En el siguiente ejemplo se muestra la configuración y el código utilizados para suscribirse a registros relacionados con la propagación de fallos utilizando FaultPropagationQuery.

    <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 secundaria mediante la actividad primaria. La consulta es necesaria para que TrackingParticipant se suscriba a los objetos CancelRequestedRecord.

    La configuración y el código usados para suscribirse a registros relacionados con la cancelación de actividad mediante CancelRequestedQuery se muestra 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 - Úselo para realizar un seguimiento de los 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 - Úselo para realizar un seguimiento de la reanudación de un marcador dentro de 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 permiten etiquetar arbitrariamente los registros de seguimiento con un valor que se puede configurar después del tiempo de compilación. Por ejemplo, es posible que quiera que varios registros de seguimiento en varios flujos de trabajo se etiqueten con "Servidor de correo" == "Mail Server1". Esto facilita la búsqueda de todos los registros con esta etiqueta al consultar los registros de seguimiento más adelante.

Para ello, se agrega una anotación a una consulta de seguimiento como se muestra en el ejemplo siguiente.

<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. Este es 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 un WF que utiliza el host del servicio de flujo de trabajo, el perfil de seguimiento se crea normalmente mediante un archivo de configuración. También es posible crear un perfil de seguimiento con código mediante el perfil de seguimiento y la API de consulta de seguimiento.

Un perfil configurado como un archivo de configuración XML se aplica a un participante de seguimiento mediante una extensión de comportamiento. Esto se agrega a el WorkflowServiceHost tal y como se describe en la sección posterior Configuración del 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 agregando 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 mediante "*" en los campos de nombre de cada una de las consultas.

Estos son algunos de los 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