Converter um script existente de Rastreamento do SQL em uma sessão de Eventos Estendidos

Se você tiver um script de Rastreamento do SQL que deseja converter em sessão de Eventos Estendidos, poderá usar os procedimentos deste tópico para criar uma sessão de Eventos Estendidos equivalente. Usando as informações das tabelas de sistema trace_xe_action_map e trace_xe_event_map, você pode coletar as informações de que precisa para fazer a conversão.

As etapas incluem o seguinte:

  1. Execute o script existente para criar uma sessão de Rastreamento do SQL obter a ID do rastreamento.

  2. Execute uma consulta que use a função fn_trace_geteventinfo para localizar os eventos e as ações equivalentes de Eventos Estendidos para cada classe de evento de Rastreamento do SQL e suas colunas associadas.

  3. Use a função fn_trace_getfilterinfo para listar os filtros e as ações equivalentes de Eventos Estendidos a serem usados.

  4. Crie manualmente uma sessão de Eventos Estendidos, usando os eventos, as ações e os predicados (filtros) equivalentes de Eventos Estendidos.

Para obter a ID de rastreamento

  1. Abra o script de Rastreamento do SQL no Editor de Consultas e execute o script para criar a sessão de rastreamento. Saiba que a sessão de rastreamento não precisa estar em execução para concluir este procedimento.

  2. Obtenha a ID do rastreamento. Para fazer isso, use a seguinte consulta:

    SELECT * FROM sys.traces;
    GO
    
    ObservaçãoObservação

    ID de Rastreamento 1 geralmente indica o rastreamento padrão.

Para determinar os equivalentes de Eventos Estendidos

  1. Para determinar os eventos e as ações equivalentes de Eventos Estendidos, execute a seguinte consulta, onde trace_id é definido como o valor da ID de rastreamento que você obteve no procedimento anterior.

    ObservaçãoObservação

    Nesse exemplo, a ID do rastreamento padrão (1) é usada.

    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;
    

    A ID de evento, o nome de pacote, o nome de evento, a ID de coluna e o nome de ação equivalentes dos Eventos Estendidos são retornados. Você usará essa saída no procedimento "Para criar a sessão de Eventos Estendidos" mais adiante neste tópico.

    Em alguns casos, a coluna filtrada é mapeada para um campo de dados de evento incluído por padrão no evento de Eventos Estendidos. Portanto, a coluna "Extended_Events_action_name" será NULL. Se isso acontecer, você deve fazer o seguinte para determinar qual campo de dados é equivalente à coluna filtrada:

    1. Para as ações que retornam NULL, identifique quais classes de evento de Rastreamento do SQL no script contém a coluna que está sendo filtrada.

      Por exemplo, você pode ter usado a classe de evento SP:StmtCompleted e especificado um filtro no nome de coluna de rastreamento Duration (ID 45 da classe de evento de Rastreamento do SQL e ID 13 da coluna de Rastreamento do SQL). Nesse caso, o nome de ação aparecerá como NULL nos resultados da consulta.

    2. Para cada classe de evento de Rastreamento do SQL identificada na etapa anterior, localize o nome de evento equivalente de Eventos Estendidos. (Se você não tiver certeza do nome de evento equivalente, use a consulta do tópico Exibir os Eventos Estendidos equivalentes às classes do Rastreamento do SQL.)

    3. Use a seguinte consulta a fim de identificar os campos de dados corretos para os eventos que você identificado na etapa anterior. A consulta mostra os campos de dados de Eventos Estendidos na coluna "event_field". Na consulta, substitua <event_name> pelo nome de um evento que você especificou na etapa anterior.

      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>';
      

      Por exemplo, a classe de evento SP:StmtCompleted é mapeada para o evento sp_statement_completed de Eventos Estendidos. Se você especificar sp_statement_completed como nome de evento da consulta, a coluna "event_field" mostrará os campos que são incluídos por padrão no evento. Observando os campos, você constatará que há um campo "duração". Para criar o filtro na sessão equivalente de Eventos Estendidos, você adicionará um predicado como "WHERE duration > 0". Para obter um exemplo, consulte o procedimento "Para criar a sessão de Eventos Estendidos" neste tópico.

Para criar a sessão de Eventos Estendidos

Use o Editor de Consultas para criar a sessão de Eventos Estendidos e gravar a saída em um destino de arquivo. As etapas a seguir descrevem uma única consulta, com explicações para mostrar como criar a consulta. Para obter o exemplo de consulta completo, consulte a seção "Exemplo" deste tópico.

  1. Adicione instruções para criar a sessão de evento, substituindo ession_name pelo nome que você deseja usar para a sessão de Eventos Estendidos.

    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. Adicione os eventos e as ações de Eventos Estendidos que foram retornados como saída no procedimento "Determinar os equivalentes de Eventos Estendidos" e adicione os predicados (filtros) que você identificou no procedimento "Para determinar os filtros usados no script".

    O exemplo a seguir usa um script de Rastreamento do SQL que inclui as classes de evento SQL:StmtStarting e SP:StmtCompleted, com filtros para ID e duração de sessão. A saída de exemplo da consulta no procedimento "Determinar os equivalentes de Eventos Estendidos" retornou este conjunto de resultados:

    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
    

    Para converter isso em equivalente de Eventos Estendidos, os eventos sqlserver.sp_statement_starting e sqlserver.sp_statement_completed são adicionados, com uma lista de ações. As instruções de predicado são incluídas como cláusulas 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. Adicione o destino de arquivo assíncrono, substituindo os caminhos de arquivo com o local onde você deseja salvar a saída. Ao especificar o destino de arquivo, você deve incluir um arquivo de log e um arquivo de caminho de arquivo de metadados.

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

Para exibir os resultados

  1. Você pode usar a função sys.fn_xe_file_target_read_file para exibir a saída. Para fazer isso, execute a seguinte consulta, substituindo os caminhos de arquivo pelos caminhos que você especificou:

    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);
    
    ObservaçãoObservação

    A conversão dos dados de evento como XML é opcional.

    Para obter mais informações sobre a função sys.fn_xe_file_target_read_file, consulte sys.fn_xe_file_target_read_file (Transact-SQL).

Exemplo

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');

Consulte também

Conceitos

Exibir os Eventos Estendidos equivalentes às classes do Rastreamento do SQL