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

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

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

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

Профили отслеживания проявляются в виде 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 применяется к следующим типам записей отслеживания:

  • ЗаписьСостоянияАктивности

  • FaultPropagationRecord

  • CancelRequestedRecord

  • ЗапланированнаяЗаписьАктивности

Замечание

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

Функция 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>
    

См. также