Отслеживание участников

Отслеживание участников — это точки расширяемости, позволяющие разработчику рабочего процесса получать доступ к TrackingRecord объектам и обрабатывать их. .NET Framework 4.6.1 включает стандартного участника отслеживания, который записывает записи отслеживания как события ETW (Трассировка событий для Windows). Если это не соответствует вашим требованиям, вы также можете написать пользовательского участника отслеживания.

Отслеживание участников

Инфраструктура отслеживания позволяет применять фильтр к исходящим записям отслеживания, что позволяет участнику подписаться на подмножество этих записей. Механизм применения фильтра осуществляется через профиль отслеживания.

Windows Workflow Foundation (WF) в .NET Framework 4.6.1 предоставляет компонент отслеживания, который записывает события в сеанс ETW. Участник настраивается в службе рабочего процесса путем добавления специфического для отслеживания поведения в файл конфигурации. Включение участника отслеживания ETW позволяет просматривать записи отслеживания в средстве просмотра событий. Пример пакета SDK для отслеживания на основе ETW — это хороший способ ознакомиться с отслеживанием WF с помощью участника отслеживания на основе ETW.

Участник отслеживания ETW

.NET Framework 4.6.1 включает участника отслеживания ETW, который записывает записи отслеживания в сеанс ETW. Это делается очень эффективно с минимальным воздействием на производительность приложения или пропускную способность сервера. Преимущество использования стандартного участника отслеживания ETW заключается в том, что полученные записи отслеживания можно просматривать вместе с другими журналами приложений и системными журналами в средстве просмотра событий Windows Event Viewer.

Стандартный участник отслеживания ETW настроен в файле Web.config, как показано в следующем примере.

<configuration>
  <system.web>
    <compilation debug="true" targetFramework="4.0" />
  </system.web>
  <system.serviceModel>
    <behaviors>
      <serviceBehaviors>
        <behavior>
          <etwTracking profileName="Sample Tracking Profile"/>
        </behavior>
      </serviceBehaviors>
    </behaviors>
   <tracking>
      <profiles>
        <trackingProfile name="Sample Tracking Profile">
        ….
       </trackingProfile>
      </profiles>
    </tracking>
  </system.serviceModel>
</configuration>

Замечание

trackingProfile Если имя не указано, например просто <etwTracking/> или<etwTracking profileName=""/>, используется профиль отслеживания по умолчанию, установленный с .NET Framework 4.6.1 в файле Machine.config.

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

В ETW события записываются в сеанс ETW с помощью идентификатора поставщика. Идентификатор поставщика, который участник отслеживания ETW использует для записи данных в ETW, определен в разделе диагностики файла Web.config (в разделе <system.serviceModel><diagnostics> диагностики). По умолчанию участник отслеживания ETW использует идентификатор поставщика по умолчанию, если он не указан, как показано в следующем примере.

<system.serviceModel>
        <diagnostics etwProviderId="52A3165D-4AD9-405C-B1E8-7D9A257EAC9F" />

На следующем рисунке поток данных отслеживания показан через участника отслеживания ETW. Когда данные отслеживания достигают сеанса ETW, доступ к ним можно получить различными способами. Одним из наиболее полезных способов доступа к этим событиям является средство просмотра событий, обычное средство Windows, используемое для просмотра журналов и трассировок из приложений и служб.

Поток данных отслеживания через поставщика отслеживания ETW.

Отслеживание данных события участника

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

Размер события ETW ограничен размером буфера ETW или максимальной полезной нагрузкой для события ETW, независимо от того, какое значение меньше. Если размер события превышает любой из этих ограничений ETW, событие усечено и его содержимое удаляется произвольным образом. Переменные, аргументы, заметки и пользовательские данные не удаляются выборочно. В случае усечения все они усекаются независимо от значения, вызвавшего превышение предельного размера события. Удаленные данные заменяются на <item>..<item>.

Сложные типы в переменных, аргументах и пользовательских элементах данных сериализуются в записи события ETW с помощью класса NetDataContractSerializer. Этот класс содержит сведения о типе CLR в сериализованном потоке XML.

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

Для сеанса с нижним ограничением событие может быть усечено. Участник отслеживания ETW не имеет никаких знаний о количестве сеансов, прослушивающих события; Если событие усечено для сеанса, участник ETW повторит отправку события один раз. В этом случае сеанс, настроенный на прием увеличенного размера полезных данных, получит событие дважды (не усеченное и усеченное). Дублирование можно предотвратить, настроив все сеансы ETW с одинаковыми ограничениями размера буфера.

Получение доступа к данным отслеживания из источника ETW в средстве просмотра событий

События, записанные в сеанс ETW с помощью участника отслеживания ETW, можно просмотреть через Просмотр событий (используя идентификатор поставщика по умолчанию). Это позволяет быстро просматривать записи отслеживания, созданные рабочим процессом.

Замечание

Отслеживание событий, регистрируемых в сеансе ETW, использует идентификаторы событий в диапазоне от 100 до 199.

Чтобы разрешить просмотр записей отслеживания в средстве просмотра событий

  1. Запуск средства просмотра событий (EVENTVWR.EXE)

  2. Выберите средство просмотра событий, журналы приложений и служб, Microsoft, Windows, Application Server-Applications.

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

  4. Щелкните правой кнопкой мыши журнал Аналитический и выберите Включить журнал. Журнал будет существовать в %SystemRoot%\System32\Winevt\Logs\Microsoft-Windows-Application Server-Applications%4Analytic.etl файле.

Индивидуальный участник отслеживания

API участника отслеживания позволяет расширению среды выполнения отслеживания с участником отслеживания, предоставленным пользователем, который может включать пользовательскую логику для обработки записей отслеживания, создаваемых средой выполнения рабочего процесса. Чтобы написать пользовательского участника отслеживания, разработчик должен реализовать Track метод в TrackingParticipant классе. Этот метод вызывается, когда запись отслеживания создается средой выполнения рабочего процесса.

Отслеживание участников, производных TrackingParticipant от класса. EtwTrackingParticipant Система выдает событие отслеживания событий для Windows (ETW) для каждой полученной записи отслеживания. Для создания пользовательского участника отслеживания создается класс, производный от TrackingParticipant. Чтобы обеспечить базовые функции отслеживания, перекройте Track. Track вызывается, когда запись отслеживания отправлена средой выполнения и может обрабатываться соответствующим образом. В следующем примере определяется пользовательский класс участника отслеживания, который выдает все записи отслеживания в окно консоли. Кроме того, можно реализовать TrackingParticipant объект, обрабатывающий записи отслеживания асинхронно с использованием его BeginTrack и EndTrack методов.

class ConsoleTrackingParticipant : TrackingParticipant
{
    protected override void Track(TrackingRecord record, TimeSpan timeout)
    {
        if (record != null)
        {
            Console.WriteLine("=================================");
            Console.WriteLine(record);
        }
    }
}

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

myInstance.Extensions.Add(new ConsoleTrackingParticipant());

В следующем примере создается рабочий процесс, состоящий из активности Sequence, которая содержит активность WriteLine. В расширения добавляется ConsoleTrackingParticipant, и вызывается рабочий процесс.

Activity activity= new Sequence()
{
    Activities =
    {
        new WriteLine()
        {
            Text = "Hello World."
        }
    }
};

WorkflowApplication instance = new WorkflowApplication(activity);

instance.Extensions.Add(new ConsoleTrackingParticipant());
  instance.Completed = delegate(WorkflowApplicationCompletedEventArgs e)
            {
                Console.WriteLine("workflow instance completed, Id = " + instance.Id);
                resetEvent.Set();
            };
            instance.Run();
            Console.ReadLine();

См. также