Как читать расширенные события через код.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}"
                            );
                    }
                }
            }
        }
    }
}

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

Другие вопросы по тегам