Как читать расширенные события через код.net
У меня было это требование для регистрации и чтения расширенных событий, я добился этого с помощью запросов Xpath, и он работал как ожидалось. Прошло некоторое время, и теперь размер файла.xel увеличился, и запрос Xpath занимает много времени, чтобы вернуть результаты. Я слышал, что есть код.net, который поможет более эффективно читать файл.xel. Пожалуйста, помогите мне исходный код для того же.
1 ответ
Данные расширенных событий можно программно считывать с помощью QuerableXEventData из любого приложения.NET, включая PowerShell.
Ниже приведен пример консоли C#, которая извлекает данные XE из трассировки, включающей rpc_completed
событие. Перегрузка конструктора здесь указывает шаблон файла для обработки файлов XE. Проект включает сборочные ссылки на Microsoft.SqlServer.XE.Core
а также Microsoft.SqlServer.XEvent.Linq
(находится в C:\Program Files\Microsoft SQL Server\140\Shared\
в моей системе).
using System;
using Microsoft.SqlServer.XEvent.Linq;
namespace ExtendedEventsExample
{
class Program
{
static void Main(string[] args)
{
var xeFilePathPattern = @"C:\TraceFiles\rpc_completed*.xel";
using (var events = new QueryableXEventData(xeFilePathPattern))
{
foreach (var xe in events)
{
if (xe.Name == "rpc_completed")
{
var xeName = xe.Name;
var xeTimestamp = xe.Timestamp;
var xeStatementField = (String)xe.Fields["statement"].Value.ToString();
var xeDurationField = (UInt64)xe.Fields["duration"].Value;
var xeClientAppNameAction = (String)xe.Actions["client_app_name"].Value;
Console.WriteLine(
$"Name: {xeName}" +
$", Timestamp: {xeTimestamp}" +
$", Statement: {xeStatementField}" +
$", Duration: {xeDurationField}" +
$", ClientAppName: {xeClientAppNameAction}"
);
}
}
}
}
}
}
Я нашел этот метод достаточно быстрым, даже с большими файлами трассировки. Вы можете рассмотреть возможность использования файлов ролловера для ограничения размера файла трассировки. Пример тут.