SQL Server и ETW. Ч.4
Для полноты картины стоит коснуться потребителя ETW-событий. Потребитель - это приложение, которое читает логи, созданные в ходе ETW-сессии, или цепляется к ней напрямую и потребляет генерируемые ей события в реальном времени. Консьюмить залоггированую трассу неинтересно. Не буду отвлекать на увлекательный рассказ про парсинг csv или xml или еще какого-нибудь формата. Какие-то потуги в этом направлении предпринимались во второй серии, Скрипты 1-3. Примером потребителя реального времени явлется всем хорошо известный Windows Event Viewer. Подобных приложений можно написать сколько угодно, каждое для своей области. Скажем, Performance Profiling Tools for WPF.
Рис.1
Real-time провайдером может выступать утилита tracerpt, которую мы использовали для преобразования etl в читабельные форматы (см. первая серия, Рис.8, 9). Стартуем сессию сбора событий из SQL Trace (вторая серия, Скрипт 7), направив вывод не в etl-файл, а в real-time (ключ -rt):
logman start SqlDataCollector -ets -rt -p "MSSQLServer Trace" 0 0
Рис.2
Видим среди запущенных ETW-сессий сессию по имени SqlDataCollector, которая стримит свои рез-ты в real-time. Tracerpt может подключиться к этой сессии, улавливать ее выходной стрим и направить его непосредственно в какой-либо читабельный формат:
tracerpt -rt SqlDataCollector -o c:\Temp\SqlDataCollector.xml -of XML
Рис.3
Образуется файл c:\Temp\SqlDataCollector.xml, который будет прирастать по мере поступления событий. Все время сбора он будет занят, открыть и прочесть его удастся по остановке (logman stop) сессии SqlDataCollector.
Написание собственного потребителя реального времени находится не слишком в струе светлых идей популяризации и продвижения .NET. Если провайдера ETW худо-бедно можно изобразить .NET-средствами, как мы видели в предыдущем посте, до потребителя managed world еще, увы, не добрался. Например, вот примерный пример примеривания потребителя применительно к событиям IIS.
Разумеется, со временем нашлись добрые люди, написавшие .NET-обертку вокруг native API и Сшных вызовов, чтобы потреблять события ETWшной сессии из VB.NET и С#. Образцы народного творчества можно найти в блогах и на кодплексе. Словом, интеграция ETW c .NET здесь на том же уровне, что и при создании провайдера на основе манифеста. Наверное, в .NET когда-нибудь появится нормальная поддержка ETW, поскольку это актуальная перспективная технология integrated throughout Windows, offering higher performance, flexibility, zero-config tracing and a lot of other advantages.