Поделиться через


Профили отслеживания

Профили отслеживания содержат запросы отслеживания, позволяющие участнику отслеживания подписываться на события рабочего процесса, создаваемые при изменении состояния экземпляра рабочего процесса во время выполнения.

Профили отслеживания

С помощью профилей отслеживания можно определять, какие данные отслеживания создаются для экземпляра рабочего процесса. Если этот профиль не указан, создаются все события отслеживания. Если профиль указан, будут создаваться события, определенные в профиле отслеживания. Исходя из потребностей можно написать профиль с обычной гранулярностью, который будет подписан на небольшой набор изменений состояния высокого уровня в рабочем процессе. И наоборот, можно создать очень детальный профиль, результирующие события которого будут достаточно подробными для воспроизведения всего потока выполнения в дальнейшем.

Отслеживание профилей проявляется в виде XML-элементов в стандартном файле конфигурации платформа .NET Framework или указанном в коде. В следующем примере представлен профиль отслеживания платформа .NET Framework 4.6.1 в файле конфигурации, который позволяет участнику отслеживания подписаться на Started события рабочего процесса.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>

В следующем примере показан соответствующий профиль отслеживания, созданный с помощью кода.

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

Записи отслеживания фильтруются посредством режима видимости в рамках профиля отслеживания при помощи атрибута ImplementationVisibility. Составное действие является действием верхнего уровня, которое содержит другие действия, образующие его реализацию. Режим видимости задает записи отслеживания, созданные из композитных действий в действии рабочего процесса, с целью указания, отслеживаются ли действия, образующие реализацию. Режим видимости применяется на уровне профиля отслеживания. Фильтрацией записей отслеживания для отдельно взятых действий в рабочем процессе управляют при помощи запросов в профиле отслеживания. Дополнительные сведения см. в разделе "Типы запросов профилей отслеживания" в этом документе.

Два режима видимости, задаваемые атрибутом implementationVisibility в профиле отслеживания, - RootScope и All. Использование режима RootScope удаляет записи отслеживания для действий, образующих реализацию действия в том случае, когда композитное действие не является корневым действием в рабочем процессе. Это предполагает, что, когда действие, реализуемое при помощи других действий, добавляется в рабочий процесс и параметр implementationVisibility имеет значение RootScope, будут отслеживаться только события верхнего уровня внутри этого композитного действия. Если действие является корневым для рабочего процесса, реализация действия - это сам рабочий процесс, а записи отслеживания создаются для действий, образующих реализацию. Использование режима «Все» позволяет создавать записи отслеживания для корневого действия и всех его композитных действий.

Например, предположим , что MyActivity является составным действием, реализация которого содержит два действия, Activity1 и Activity2. При добавлении этого действия в рабочий процесс и отслеживания включен профиль отслеживания с implementationVisibility заданным значением RootScope, записи отслеживания создаются только для MyActivity. Однако записи не создаются для действий Activity1 и Activity2.

Однако если implementationVisibility для профиля отслеживания задано Allзначение атрибута, записи отслеживания создаются не только для MyActivity, но и для действий Activity1 и Activity2.

Флажок implementationVisibility применяется для следующих типов записей отслеживания:

  • ActivityStateRecord

  • FaultPropagationRecord

  • CancelRequestedRecord

  • ActivityScheduledRecord

Примечание.

Запись CustomTrackingRecords, создаваемая из реализации действия, не фильтруется параметром implementationVisibility.

Функция implementationVisibility задается как RootScope в профиле отслеживания в коде следующим образом:

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

Функция implementationVisibility может задается как All в профиле отслеживания в файле конфигурации следующим образом:

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

Параметр ImplementationVisibility в профиле отслеживания является необязательным. По умолчанию он имеет значение RootScope. Значения для этого атрибута также учитывают регистр.

Отслеживание типов запросов профиля

Профили отслеживания структурированы в форме объявляющих подписок на записи отслеживания, которые позволяют выполнять запросы к среде выполнения рабочего процесса в отношении определенных записей отслеживания. Существует множество типов запросов, которые позволяют подписаться на различные классы объектов TrackingRecord. Профили отслеживания могут быть заданы в конфигурации или посредством кода. Ниже приводятся наиболее распространенные типы запросов.

  • WorkflowInstanceQuery - используйте этот запрос для отслеживания изменений жизненного цикла экземпляра рабочего процесса, таких как ранее представленные события Started и Completed. Запрос WorkflowInstanceQuery используется для подписки на следующие объекты TrackingRecord.

    Состояния, на которые можно подписаться, задаются классом WorkflowInstanceStates.

    Конфигурация или код, используемые для подписки на записи отслеживания на уровне экземпляра рабочего процесса для состояния экземпляра Started при помощи запроса WorkflowInstanceQuery, показаны в следующем примере.

    <workflowInstanceQueries>
        <workflowInstanceQuery>
          <states>
            <state name="Started"/>
          </states>
        </workflowInstanceQuery>
    </workflowInstanceQueries>
    
    TrackingProfile sampleTrackingProfile = new TrackingProfile()
    {
        Name = "Sample Tracking Profile",
        Queries =
        {
            new WorkflowInstanceQuery()
            {
                States = { WorkflowInstanceStates.Started}
            }
        }
    };
    
  • ActivityStateQuery - используйте этот запрос для отслеживания изменений жизненного цикла действий, составляющих экземпляр рабочего процесса. Например, вы можете отслеживать каждый раз, когда действие "Отправить электронную почту" завершается в экземпляре рабочего процесса. Этот запрос необходим, чтобы участник TrackingParticipant мог подписаться на объекты ActivityStateRecord. Состояния, доступные для подписки, указаны в ActivityStates.

    Конфигурация и код, используемые для подписки на записи отслеживания состояний действий при помощи запроса ActivityStateQuery для действия SendEmailActivity, показаны в следующем примере.

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

    Примечание.

    Если несколько элементов activityStateQuery имеют одинаковые имена, то только состояния в последнем элементе используются в профиле отслеживания.

  • ActivityScheduledQuery - этот запрос позволяет отслеживать действие, запланированное к исполнению родительским действием. Этот запрос необходимо, чтобы участник TrackingParticipant мог подписаться на объекты ActivityScheduledRecord.

    Конфигурация и код, используемые для подписки на записи, связанные с дочерним действием SendEmailActivity, планируемым при помощи запроса ActivityScheduledQuery, показаны в следующем примере.

    <activityScheduledQueries>
      <activityScheduledQuery activityName="ProcessNotificationsActivity" childActivityName="SendEmailActivity" />
    </activityScheduledQueries>
    
    TrackingProfile sampleTrackingProfile = new TrackingProfile()
    {
        Name = "Sample Tracking Profile",
        Queries =
        {
            new ActivityScheduledQuery()
            {
                ActivityName = "ProcessNotificationsActivity",
                ChildActivityName = "SendEmailActivity"
            }
        }
    };
    
  • FaultPropagationQuery - используйте такой запрос для отслеживания обработки ошибок, возникающих во время действия. Этот запрос необходимо, чтобы участник TrackingParticipant мог подписаться на объекты FaultPropagationRecord.

    Конфигурация и код, используемые для подписки на записи, связанные с распространением ошибок при помощи запроса FaultPropagationQuery, показаны в следующем примере.

    <faultPropagationQueries>
      <faultPropagationQuery faultSourceActivityName="SendEmailActivity" faultHandlerActivityName="NotificationsFaultHandler" />
    </faultPropagationQueries>
    
    TrackingProfile sampleTrackingProfile = new TrackingProfile()
    {
        Name = "Sample Tracking Profile",
        Queries =
        {
            new FaultPropagationQuery()
            {
                FaultSourceActivityName = "SendEmailActivity",
                FaultHandlerActivityName = "NotificationsFaultHandler"
            }
        }
    };
    
  • CancelRequestedQuery - используйте этот запрос для отслеживания запросов по отмене дочернего действия родительским действием. Этот запрос необходимо, чтобы участник TrackingParticipant мог подписаться на объекты CancelRequestedRecord.

    Конфигурация и код, используемые для подписки на записи, связанные с отменой действий, CancelRequestedQuery показан в следующем примере.

    <cancelRequestedQueries>
      <cancelRequestedQuery activityName="ProcessNotificationsActivity" childActivityName="SendEmailActivity" />
    </cancelRequestedQueries>
    
    TrackingProfile sampleTrackingProfile = new TrackingProfile()
    {
        Name = "Sample Tracking Profile",
        Queries =
        {
            new CancelRequestedQuery()
            {
                ActivityName = "ProcessNotificationsActivity",
                ChildActivityName = "SendEmailActivity"
            }
        }
    };
    
  • CustomTrackingQuery - используйте этот запрос для отслеживания событий, определенных в действиях кода. Этот запрос необходимо, чтобы участник TrackingParticipant мог подписаться на объекты CustomTrackingRecord.

    Конфигурация и код, используемые для подписки на записи, связанные с пользовательскими записями отслеживания при помощи запроса CustomTrackingQuery, показаны в следующем примере.

    <customTrackingQueries>
      <customTrackingQuery name="EmailAddress" activityName="SendEmailActivity" />
    </customTrackingQueries>
    
    TrackingProfile sampleTrackingProfile = new TrackingProfile()
    {
        Name = "Sample Tracking Profile",
        Queries =
        {
            new CustomTrackingQuery()
            {
                Name = "EmailAddress",
                ActivityName = "SendEmailActivity"
            }
        }
    };
    
  • BookmarkResumptionQuery - используйте этот запрос для отслеживания возобновления закладки в экземпляре рабочего процесса. Этот запрос необходим, чтобы участник TrackingParticipant мог подписаться на объекты BookmarkResumptionRecord.

    Конфигурация и код, используемые для подписки на записи, связанные с возобновлением закладок при помощи запроса BookmarkResumptionQuery, показаны в следующем примере.

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

Заметки

Заметки позволяют произвольно добавлять теги для записей отслеживания со значением, которое можно изменить после построения. Например, может потребоваться, чтобы несколько записей отслеживания в нескольких рабочих процессах были помечены как "Почтовый сервер" == "Mail Server1". Это упростит поиск всех записей с этим тегом при последующем составлении запроса записей отслеживания.

Для этого к запросу отслеживания добавляется заметка, как показано в следующем примере.

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

Создание профиля отслеживания

Элементы запроса отслеживания используются для создания профиля отслеживания с помощью XML-файла конфигурации или платформа .NET Framework кода 4.6.1. Ниже приводится пример профиля отслеживания, созданного при помощи файла конфигурации.

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

Предупреждение

Для WF с использованием узла служб рабочих процессов профиль отслеживания обычно создается при помощи файла конфигурации. Также можно создать профиль отслеживания при помощи кода, используя профиль отслеживания и API-интерфейс запросов отслеживания.

Профиль, настроенный как XML-файл конфигурации, применяется к участнику отслеживания при помощи расширения поведения. Это добавляется в WorkflowServiceHost, как описано в следующем разделе настройка отслеживания для рабочего процесса.

Детализация записей отслеживания, создаваемых узлом, определяется параметрами конфигурации в профиле отслеживания. Участник отслеживания подписывается на записи отслеживания путем добавления запросов в профиль отслеживания. Чтобы подписаться на все записи отслеживания, профиль отслеживания должен указать все запросы отслеживания с помощью "*" в полях имени в каждом из запросов.

Ниже приводятся некоторые распространенные примеры профилей отслеживания.

  • Профиль отслеживания для получения записей экземпляра рабочего процесса и ошибок.

    <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>
    
  • Профиль отслеживания для получения всех пользовательских записей отслеживания.

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

См. также