Partilhar via


Criar uma sessão de evento com um destino ring_buffer na memória

Aplica-se a:Banco de Dados SQL do Azure Instância Gerenciada SQLdo Azure

As etapas de alto nível neste passo a passo são:

  1. Criar e iniciar uma sessão de evento com um ring_buffer destino
  2. Exibir dados de eventos capturados como XML
  3. Exibir dados de eventos capturados como um conjunto de linhas relacional

Com o destino, as etapas são mais simples do que com o ring_buffer event_file destino porque você não precisa armazenar dados de eventos no Armazenamento do Azure.

Criar e iniciar uma sessão de evento com um destino ring_buffer

Para criar uma nova sessão de evento no SQL Server Management Studio (SSMS), expanda o nó Eventos Estendidos . Este nó está sob a pasta de banco de dados no Banco de Dados SQL do Azure e sob a pasta Gerenciamento na Instância Gerenciada SQL do Azure. Clique com o botão direito do mouse na pasta Sessões e selecione Nova sessão.... Na página Geral , insira um nome para a sessão, que está example-session neste exemplo. Na página Eventos, selecione um ou mais eventos para adicionar à sessão. Neste exemplo, selecionamos o sql_batch_starting evento.

Screenshot of the New Session SSMS dialog showing the event selection page with the sql_batch_starting event selected.

Na página Armazenamento de Dados, selecione ring_buffer como o tipo de destino. Para conservar memória, recomendamos que você mantenha o número de eventos para um número pequeno (1.000 por padrão) e defina a memória buffer máxima para 1 MB ou menos. Para obter detalhes, consulte ring_buffer destino.

Screenshot of the New Session SSMS dialog showing the data storage selection page with a ring_buffer target selected.

Agora que a sessão está configurada, você pode, opcionalmente, selecionar o botão Script para criar um script T-SQL da sessão para salvá-lo para mais tarde. Aqui está o script para nossa sessão de exemplo:

CREATE EVENT SESSION [example-session] ON DATABASE
ADD EVENT sqlserver.sql_batch_starting
ADD TARGET package0.ring_buffer(SET max_memory=(1024))
GO

Selecione OK para criar a sessão.

Exibir dados de sessão como XML

No Pesquisador de Objetos, expanda a pasta Sessões para ver a sessão de evento que você criou. Por padrão, a sessão não é iniciada quando é criada. Para iniciar a sessão, clique com o botão direito do rato no nome da sessão e selecione Iniciar sessão. Mais tarde, você pode pará-lo selecionando de forma semelhante Parar sessão, uma vez que a sessão esteja em execução.

Como os lotes T-SQL são executados nesse banco de dados ou instância gerenciada, a sessão grava eventos em um buffer de memória. Como o tamanho do buffer de memória é finito, uma vez que toda a memória é usada, os eventos mais antigos são descartados para abrir espaço para eventos mais recentes.

No Pesquisador de Objetos, expanda a sessão para ver o package0.ring_buffer destino e clique duas vezes no destino. Você também pode clicar com o botão direito do mouse e selecionar Exibir dados de destino.... Isso abre uma grade com um fragmento XML mostrado. Selecione este fragmento XML para ver um documento XML que representa o conteúdo do buffer de memória.

A primeira linha do documento XML descreve os metadados de sessão e destino:

<RingBufferTarget truncated="0" processingTime="0" totalEventsProcessed="17" eventCount="17" droppedCount="0" memoryUsed="32070">

Neste exemplo, vemos que 17 eventos foram processados pelo ring_buffer destino. Nenhum evento foi descartado porque a memória do buffer não se esgotou e o número máximo de eventos que configuramos (1.000) não foi atingido.

Gorjeta

Preste atenção ao truncated atributo. Se estiver definido como 1, significa que a representação XML do buffer de memória não está mostrando todo o conteúdo do buffer. Para obter mais informações, consulte ring_buffer destino.

O restante do documento XML contém eventos. Uma representação de um único evento em XML pode ter esta aparência:

  <event name="sql_batch_starting" package="sqlserver" timestamp="2023-10-18T17:43:34.079Z">
    <data name="batch_text">
      <type name="unicode_string" package="package0"></type>
      <value><![CDATA[SELECT
'DatabaseXEStore[@Name=' + quotename(CAST(db_name() AS sysname),'''') +' and @ServerName=' + quotename(CAST(SERVERPROPERTY('servername') AS sysname),'''') + ']' AS [Urn],
CAST(db_name() AS sysname) AS [Name],
CAST(SERVERPROPERTY('servername') AS sysname) AS [ServerName],
(SELECT count(*) FROM sys.dm_xe_database_sessions) AS [RunningSessionCount]]]></value>
    </data>
  </event>

Aqui, o atributo contém o value lote T-SQL (uma única consulta neste exemplo).

Exibir dados de sessão como um conjunto de linhas relacional

Para ver dados de eventos de um destino em um ring_buffer conjunto de linhas relacional, você precisa escrever uma consulta T-SQL que use expressões XQuery para converter XML em dados relacionais.

Aqui está um exemplo para a sessão que criamos, exibindo os eventos mais recentes primeiro:

WITH
/* An XML document representing memory buffer contents */
RingBuffer AS
(
SELECT CAST(xst.target_data AS xml) AS TargetData
FROM sys.dm_xe_database_session_targets AS xst
INNER JOIN sys.dm_xe_database_sessions AS xs
ON xst.event_session_address = xs.address
WHERE xs.name = N'example-session'
),
/* A row for each event in the buffer, represented as an XML fragment */
EventNode AS
(
SELECT CAST(NodeData.query('.') AS xml) AS EventInfo
FROM RingBuffer AS rb
CROSS APPLY rb.TargetData.nodes('/RingBufferTarget/event') AS n(NodeData)
)
/* A relational rowset formed by using the XQuery value method */
SELECT EventInfo.value('(event/@timestamp)[1]','datetimeoffset') AS timestamp,
       EventInfo.value('(event/@name)[1]','sysname') AS event_name,
       EventInfo.value('(event/data/value)[1]','nvarchar(max)') AS sql_batch_text
FROM EventNode
ORDER BY timestamp DESC;