Converter um script existente de Rastreamento do SQL em uma sessão de Eventos Estendidos
Aplica-se a: SQL Server Banco de Dados SQL do Azure Instância Gerenciada de SQL do Azure
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 que precisa para fazer a conversão.
As etapas incluem o seguinte:
Execute o script existente para criar uma sessão de Rastreamento do SQL obter a ID do rastreamento.
Execute uma consulta que usa a função fn_trace_geteventinfo para localizar os Eventos Estendidos e as ações e eventos para cada classe de evento Rastreamento do SQL e suas colunas associadas.
Use a função fn_trace_getfilterinfo para listar os filtros e as ações equivalentes de Eventos Estendidos a serem usados.
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
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.
Obtenha a ID do rastreamento. Para fazer isso, use a seguinte consulta:
SELECT * FROM sys.traces; GO
Observação
ID de Rastreamento 1 geralmente indica o rastreamento padrão.
Para determinar os equivalentes de Eventos Estendidos
Para determinar os eventos e as ações equivalentes de Eventos Estendidos, execute a seguinte consulta, em que trace_id é definido como o valor da ID de rastreamento que você obteve no procedimento anterior.
Observaçã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:
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 Duração (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.
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 do evento equivalente, use a consulta no tópico Exibir os Eventos Estendidos equivalentes às classes de evento de Rastreamento do SQL.)
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 do 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.
Adicione instruções para criar a sessão de evento, substituindo session_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;
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 no equivalente de Eventos Estendidos, são adicionados os eventos sqlserver.sp_statement_starting e sqlserver.sp_statement_completed 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 )
Adicione o destino de arquivo assíncrono, substituindo os caminhos de arquivo com a localização em que 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
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çã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, confira 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');
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');
Confira também
Exibir os Eventos Estendidos equivalentes às classes de rastreamento de eventos do SQL