Участники отслеживания
Участниками отслеживания являются точки расширения, обеспечивающие разработчику рабочего процесса доступ к объектам TrackingRecord и возможность их обработки. платформа .NET Framework 4.6.1 включает стандартный участник отслеживания, который записывает записи отслеживания в качестве событий трассировки событий Windows (ETW). Если это не отвечает заданным требованиям, то можно создать своего собственного участника отслеживания.
Участники отслеживания
Инфраструктура отслеживания позволяет применять фильтр к исходящим записям отслеживания таким образом, что участник может подписаться на подмножество записей. Фильтр применяется через профиль отслеживания.
Windows Workflow Foundation (WF) в платформа .NET Framework 4.6.1 предоставляет участник отслеживания, который записывает записи отслеживания в сеанс ETW. Участник настраивается в службе рабочего процесса путем добавления в файл конфигурации поведения, связанного с отслеживанием. Включив участника отслеживания ETW, можно будет просматривать записи отслеживания в обозревателе событий. Образец пакета SDK для отслеживания на основе ETW помогает освоиться с отслеживанием WF с помощью участника отслеживания на основе ETW.
Участник отслеживания ETW
платформа .NET Framework 4.6.1 включает участника отслеживания ETW, который записывает записи отслеживания в сеанс ETW. Это делается очень эффективно, с минимальным воздействием на работу приложения и пропускную способность сервера. Преимущество использования стандартного участника отслеживания трассировки событий Windows в том, что получаемые им записи отслеживания можно просматривать в других приложениях и системных журналах в обозревателе событий Windows.
Cтандартный участник отслеживания 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, определяется в разделе diagnostics файла Web.config (в <system.serviceModel><diagnostics>
). Как показано в следующем примере, если идентификатор поставщика не задан, по умолчанию участник отслеживания ETW использует стандартный идентификатор.
<system.serviceModel>
<diagnostics etwProviderId="52A3165D-4AD9-405C-B1E8-7D9A257EAC9F" />
На следующей иллюстрации показан поток данных отслеживания, проходящих через участника отслеживание ETW. Когда данные отслеживания попадают в сеанс ETW, обратиться к ним можно несколькими способами. Обращаться к этим событиям лучше всего с помощью обозревателя событий - простого инструмента Windows для просмотра журналов и данных трассировки, полученных от приложений и служб.
Данные события участника отслеживания
Участник отслеживания сериализует данные отслеживания события в сеансе ETW в формате «одно событие - одна запись отслеживания». Событие определяется по идентификатору в диапазоне от 100 до 199. Определения записей событий отслеживания, созданных участником отслеживания, см. в разделе "Справочник по событиям отслеживания".
Размер события ETW ограничен меньшей из двух величин: размером буфера ETW и максимальным размером полезных данных о событии ETW. Если размер события превышает любое из этих ограничений ETW, событие усекается и его содержание удаляется случайным образом. Переменные, аргументы, заметки и настраиваемые данные не удаляются выборочно. В случае усечения все они усекаются независимо от значения, из-за которого размер события превысил предела ETW. Удаленные данные заменяются <item>..<item>
.
Сложные типы в переменных, аргументах и пользовательских элементах данных сериализуются в запись события ETW с помощью NetDataContractSerializer класса. Этот класс включает информацию о типе CLR в сериализованном XML-потоке.
Усечение полезных данных из-за ограничений ETW может привести к дублированию записей отслеживания, которые направляются в сеанс ETW. Это может произойти, если события прослушиваются несколькими сеансами с разной предельной полезной нагрузкой для событий.
В сеансе с более низкой границей событие может быть усечено. Участник отслеживания трассировки событий Windows не имеет сведений о числе сеансов, прослушивающих события; если событие усекается для сеанса, то участник трассировки событий Windows пытается отправить событие повторно один раз. В этом случае сеанс, настроенный на прием полезных данных большего объема, получит событие дважды (неусеченное и усеченное событие). Дублирование можно предотвратить, задав для всех сеансов трассировки событий Windows одинаковый предельный размер буфера.
Доступ к данным отслеживания из участника ETW в обозревателе событий
Обратиться к событиям, записанным участником отслеживания ETW в сеансе ETW, можно с помощью обозревателя событий (если по умолчанию используется идентификатор поставщика). Это позволяет быстро просмотреть записи отслеживания, созданные рабочим процессом.
Примечание.
События записей отслеживания, записанные в сеансах ETW, используют идентификаторы событий в диапазоне от 100 до 199.
Включение просмотра записей отслеживания в обозревателе событий
Запустите обозреватель событий (EVENTVWR.EXE)
Выберите Просмотр событий, журналы приложений и служб, Microsoft, Windows, Application Server-Applications.
Щелкните правой кнопкой мыши и убедитесь, что выбраны журналы просмотра, отображения аналитики и отладки . Если он еще не выбран, выберите его, чтобы рядом появилась галочка. В этом окне отображаются журналы аналитики, perf и debug .
Щелкните правой кнопкой мыши журнал Аналитики и выберите пункт "Включить журнал". Журнал будет существовать в файле %SystemRoot%\System32\Winevt\Logs\Microsoft-Windows-Application Server-Applications%4Analytic.etl.
Настраиваемый участник отслеживания
API участника отслеживания позволяет расширить среду выполнения отслеживания с помощью пользовательского участника отслеживания, который может включать настраиваемую логику для обработки записей отслеживания, созданных средой рабочего процесса. Чтобы создать настраиваемого участника отслеживания, разработчик должен реализовать метод Track
в классе TrackingParticipant. Этот метод вызывается, когда среда рабочего процесса выпускает запись отслеживания.
Участники отслеживания являются производными от класса TrackingParticipant. Предоставляемый системой EtwTrackingParticipant выпускает событие Event Tracking для Windows (ETW) для каждой из полученных записей отслеживания. Чтоб создать настраиваемого участника отслеживания, создается класс, производный от TrackingParticipant. Чтобы обеспечить базовые функции отслеживания, переопределение TrackTrack вызывается при отправке записи отслеживания средой выполнения и может обрабатываться соответствующим образом. В следующем примере определяется настраиваемый класс участника отслеживания, который выдает все записи отслеживания в окне консоли. Можно также использовать объект 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();