Поделиться через


Преобразование существующего скрипта трассировки SQL в сеанс расширенных событий

Применимо к:SQL ServerAzure SQL База данныхAzure SQL Управляемый экземплярSQL База данных в Microsoft Fabric

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

Эти действия включают следующие шаги.

  1. Создание сеанса трассировки SQL и получение идентификатора трассировки с помощью существующего скрипта.

  2. Выполнение запроса, использующего функцию fn_trace_geteventinfo для поиска эквивалентных событий и действий расширенных событий для каждого класса событий трассировки SQL и связанных с ним столбцов.

  3. Функция fn_trace_getfilterinfo позволяет получить список фильтров и эквивалентных действий расширенных событий для использования.

  4. Создайте сеанс расширенных событий вручную с помощью эквивалентных событий, действий и предикатов (фильтров) расширенных событий.

Получение идентификатора трассировки

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

  2. Получите идентификатор трассировки. Для этого выполните следующий запрос:

    SELECT * FROM sys.traces;  
    GO  
    

    Примечание.

    Идентификатор трассировки 1 обычно соответствует трассировке по умолчанию.

Определение эквивалентов расширенных событий

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

    Примечание.

    В этом примере используется код идентификатор для трассировки по умолчанию (1).

    USE MASTER;  
    GO  
    DECLARE @trace_id int;  
    SET @trace_id = 1;  
    SELECT DISTINCT el.eventid, em.package_name, em.xe_event_name AS 'event'  
       , el.columnid, ec.xe_action_name AS 'action'  
    FROM (sys.fn_trace_geteventinfo(@trace_id) AS el  
       LEFT OUTER JOIN sys.trace_xe_event_map AS em  
          ON el.eventid = em.trace_event_id)  
    LEFT OUTER JOIN sys.trace_xe_action_map AS ec  
       ON el.columnid = ec.trace_column_id  
    WHERE em.xe_event_name IS NOT NULL AND ec.xe_action_name IS NOT NULL;  
    

    Возвращаются эквивалентные идентификатор события, имя пакета, имя события, идентификатор столбца и имя действия расширенных событий. Эти выходные данные будут использоваться в процедуре «Создание сеанса расширенных событий» далее в этом разделе.

    В некоторых случаях отфильтрованный столбец сопоставляется с полем данных события, включенным по умолчанию в событие расширенных событий. Поэтому столбец «Extended_Events_action_name» будет иметь значение NULL. В этом случае необходимо выполнить следующие действия, чтобы определить, какое поле данных эквивалентно отфильтрованному столбцу.

    1. Для действий, возвращающих значение NULL, определите в скрипте классы событий трассировки SQL, содержащие фильтруемый столбец.

      Например, при использовании класса событий SP:StmtCompleted мог быть указан фильтр по имени столбца трассировки Duration (идентификатор класса событий трассировки SQL — 45, идентификатор столбца трассировки SQL — 13). В этом случае имя действия будет отображаться в результатах запроса как значение NULL.

    2. Для каждого класса событий трассировки SQL, определенных в предыдущем шаге, найдите эквивалентное имя события расширенных событий. (Если вы не уверены в правильности имени эквивалентного события, используйте запрос, приведенный в разделе Просмотр эквивалентов расширенных событий для классов событий трассировки SQL.)

    3. Следующий запрос используется для определения правильных полей данных для событий, определенных в предыдущем шаге. Запрос отображает поля данных расширенных событий в столбце «event_field». В запросе замените <event_name> именем события, указанного на предыдущем шаге.

      SELECT xp.name package_name, xe.name event_name  
         ,xc.name event_field, xc.description  
      FROM sys.trace_xe_event_map AS em  
      INNER JOIN sys.dm_xe_objects AS xe  
         ON em.xe_event_name = xe.name  
      INNER JOIN sys.dm_xe_packages AS xp  
         ON xe.package_guid = xp.guid AND em.package_name = xp.name  
      INNER JOIN sys.dm_xe_object_columns AS xc  
         ON xe.name = xc.object_name  
      WHERE xe.object_type = 'event' AND xc.column_type <> 'readonly'  
         AND em.xe_event_name = '<event_name>';  
      

      Например, класс событий SP:StmtCompleted сопоставляется с событием sp_statement_completed расширенных событий. Если указать в запросе в качестве имени события sp_statement_completed, то в полях, которые по умолчанию включаются в событие, появится столбец "event_field". Среди полей есть поле «duration». Чтобы создать фильтр в эквивалентном сеансе расширенных событий, добавьте предикат, например WHERE duration > 0. В качестве примера см. процедуру «Создание сеанса расширенных событий» в этом разделе.

Создание сеанса расширенных событий

Воспользуйтесь редактором запросов для создания сеанса расширенных событий и записи выходных данных в целевой файл. Следующие шаги описывают один запрос, там же объясняется, как строить запрос. Полный пример запроса см. в подразделе «Пример» этого раздела.

  1. Добавьте инструкции для создания сеанса событий, заменив имя_сеанса нужным именем сеанса расширенных событий.

    IF EXISTS(SELECT * FROM sys.server_event_sessions WHERE name='session_name')  
       DROP EVENT SESSION [Session_Name] ON SERVER;  
    CREATE EVENT SESSION [Session_Name]  
    ON SERVER;  
    
  2. Добавьте события и действия расширенных событий, возвращенные в качестве выходных данных в процедуре «Определение эквивалентов расширенных событий», и предикаты (фильтры), определенные в процедуре «Определение фильтров, использованных в скрипте».

    В приведенном ниже примере используется скрипт трассировки SQL с классами событий SQL:StmtStarting и SP:StmtCompleted и фильтрами по полям session_id и duration. Образец выходных данных для запроса процедуры «Определение эквивалентов расширенных событий» представляет собой следующий результирующий набор:

    Eventid  package_name  event                   columnid  action  
    44       sqlserver     sp_statement_starting   6         nt_username  
    44       sqlserver     sp_statement_starting   9         client_pid  
    44       sqlserver     sp_statement_starting   10        client_app_name  
    44       sqlserver     sp_statement_starting   11        server_principal_name  
    44       sqlserver     sp_statement_starting   12        session_id  
    45       sqlserver     sp_statement_completed  6         nt_username  
    45       sqlserver     sp_statement_completed  9         client_pid  
    45       sqlserver     sp_statement_completed  10        client_app_name  
    45       sqlserver     sp_statement_completed  11        server_principal_name  
    45       sqlserver     sp_statement_completed  12        session_id  
    

    Для преобразования его в эквивалент расширенных событий добавляются события sqlserver.sp_statement_starting и sqlserver.sp_statement_completed со списком действий. Инструкции-предикаты включены в качестве предложений WHERE.

    ADD EVENT sqlserver.sp_statement_starting  
       (ACTION  
          (  
          sqlserver.nt_username,  
          sqlserver.client_pid,  
          sqlserver.client_app_name,  
          sqlserver.server_principal_name,  
          sqlserver.session_id  
          )  
       WHERE sqlserver.session_id = 59   
       ),  
    
    ADD EVENT sqlserver.sp_statement_completed  
       (ACTION  
          (  
          sqlserver.nt_username,  
          sqlserver.client_pid,  
          sqlserver.client_app_name,  
          sqlserver.server_principal_name,  
          sqlserver.session_id  
          )  
       WHERE sqlserver.session_id = 59 AND duration > 0  
       )  
    
  3. Добавьте целевой асинхронный файл, заменив путь к файлу расположением, в котором требуется сохранить выходные данные. При использовании целевого файла следует включить путь к файлу журнала и метаданных.

    ADD TARGET package0.asynchronous_file_target(  
       SET filename='c:\temp\ExtendedEventsStoredProcs.xel', metadatafile='c:\temp\ExtendedEventsStoredProcs.xem');  
    

Просмотр результатов

  1. Просмотреть выходные данные можно с помощью функции sys.fn_xe_file_target_read_file. Для этого запустите следующий запрос, заменив пути к файлам указанными путями:

    SELECT *, CAST(event_data as XML) AS 'event_data_XML'  
    FROM sys.fn_xe_file_target_read_file('c:\temp\ExtendedEventsStoredProcs*.xel', 'c:\temp\ExtendedEventsStoredProcs*.xem', NULL, NULL);  
    
    

    Примечание.

    Приведение данных события к XML является необязательным.

    Дополнительные сведения о функции sys.fn_xe_file_target_read_file см. в разделе sys.fn_xe_file_target_read_file (Transact-SQL).

    IF EXISTS(SELECT * FROM sys.server_event_sessions WHERE name='session_name')  
       DROP EVENT SESSION [session_name] ON SERVER;  
    CREATE EVENT SESSION [session_name]  
    ON SERVER  
    
    ADD EVENT sqlserver.sp_statement_starting  
       (ACTION  
       (  
          sqlserver.nt_username,  
          sqlserver.client_pid,  
          sqlserver.client_app_name,  
          sqlserver.server_principal_name,  
          sqlserver.session_id  
       )  
       WHERE sqlserver.session_id = 59   
       ),  
    
    ADD EVENT sqlserver.sp_statement_completed  
       (ACTION  
       (  
          sqlserver.nt_username,  
          sqlserver.client_pid,  
          sqlserver.client_app_name,  
          sqlserver.server_principal_name,  
          sqlserver.session_id  
       )  
       WHERE sqlserver.session_id = 59 AND duration > 0  
       );  
    
    ADD TARGET package0.asynchronous_file_target  
       (SET filename='c:\temp\ExtendedEventsStoredProcs.xel', metadatafile='c:\temp\ExtendedEventsStoredProcs.xem');  
    

Пример

IF EXISTS(SELECT * FROM sys.server_event_sessions WHERE name='session_name')  
   DROP EVENT SESSION [session_name] ON SERVER;  
CREATE EVENT SESSION [session_name]  
ON SERVER  
  
ADD EVENT sqlserver.sp_statement_starting  
   (ACTION  
   (  
      sqlserver.nt_username,  
      sqlserver.client_pid,  
      sqlserver.client_app_name,  
      sqlserver.server_principal_name,  
      sqlserver.session_id  
   )  
   WHERE sqlserver.session_id = 59   
   ),  
  
ADD EVENT sqlserver.sp_statement_completed  
   (ACTION  
   (  
      sqlserver.nt_username,  
      sqlserver.client_pid,  
      sqlserver.client_app_name,  
      sqlserver.server_principal_name,  
      sqlserver.session_id  
   )  
   WHERE sqlserver.session_id = 59 AND duration > 0  
   )  
  
ADD TARGET package0.asynchronous_file_target  
   (SET filename='c:\temp\ExtendedEventsStoredProcs.xel', metadatafile='c:\temp\ExtendedEventsStoredProcs.xem');  

См. также

Просмотр эквивалентов расширенных событий для классов событий трассировки SQL