Compartir por


Crear una sesión de evento con un destino de ring_buffer en memoria

Se aplica a: Azure SQL Database Azure SQL Managed Instance

Los pasos generales de este tutorial son:

  1. Creación e inicio de una sesión de eventos con un destino ring_buffer
  2. Visualización de datos de eventos capturados como XML
  3. Visualización de datos de eventos capturados como un conjunto de filas relacional

Con el destino ring_buffer, los pasos son más sencillos que con el destino event_file porque no es necesario almacenar datos de eventos en Azure Storage.

Creación e inicio de una sesión de eventos con un destino ring_buffer

Para crear una nueva sesión de eventos en SQL Server Management Studio (SSMS), expanda el nodo Eventos extendidos. Este nodo se encuentra en la carpeta de base de datos de Azure SQL y, en la carpeta Administración de Azure SQL Managed Instance. Haga clic con el botón derecho en la carpeta Sesiones y seleccione Nueva sesión.... En la página General, escriba un nombre para la sesión, que es example-session en este ejemplo. En la página Eventos, seleccione uno o varios eventos para agregar a la sesión. En este ejemplo, se selecciona el evento sql_batch_starting.

Captura de pantalla del cuadro de diálogo Nueva sesión de SSMS en la que se muestra la página de selección de eventos con el evento sql_batch_starting seleccionado.

En la página Almacenamiento de datos, seleccione ring_buffer como tipo de destino. Para conservar la memoria, se recomienda mantener el número de eventos en un número pequeño (1000 de forma predeterminada) y establecer la memoria máxima del búfer en 1 MB o menos. Para obtener más información, consulte destino ring_buffer.

Captura de pantalla del cuadro de diálogo Nueva sesión de SSMS en la que se muestra la página de selección de almacenamiento de datos con un destino de ring_buffer seleccionado.

Ahora que la sesión está configurada, puede seleccionar opcionalmente el botón Script para crear un script de T-SQL de la sesión para guardarla más adelante. Este es el script de nuestra sesión de ejemplo:

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

Seleccione Aceptar para crear la sesión.

Visualización de datos de sesión como XML

En Explorador de objetos, expanda la carpeta Sesiones para ver la sesión de eventos que creó. De forma predeterminada, la sesión no se inicia cuando se crea. Para iniciar la sesión, haga clic con el botón derecho en el nombre de la sesión y seleccione Iniciar sesión. Puede detenerla más adelante seleccionando de forma similar Detener sesión una vez que se esté ejecutando la sesión.

A medida que se ejecutan lotes de T-SQL en esta base de datos o instancia administrada, la sesión escribe eventos en un búfer de memoria. Dado que el tamaño del búfer de memoria es finito, una vez que se usa toda la memoria, se descartan los eventos anteriores para hacer espacio para los eventos más recientes.

En Explorador de objetos, expanda la sesión para ver el destino package0.ring_buffer y haga doble clic en el destino. También puede hacer clic con el botón derecho y seleccionar Visualización de datos de destino... para abrir una cuadrícula con un fragmento XML mostrado. Seleccione este fragmento XML para ver un documento XML que representa el contenido del búfer de memoria.

La primera línea del documento XML describe los metadatos de sesión y destino:

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

En este ejemplo, vemos que el destino ring_buffer procesó 17 eventos. No se quitó ningún evento porque no se agotó la memoria del búfer y no se ha alcanzado el número máximo de eventos configurados (1000).

Sugerencia

Preste atención al atributo truncated. Si se establece en 1, significa que la representación XML del búfer de memoria no muestra todo el contenido del búfer. Para más información, consulte ring_buffer target.

El resto del documento XML contiene eventos. Una representación de un único evento en XML podría tener este aspecto:

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

Aquí, el atributo value contiene el lote de T-SQL (una sola consulta en este ejemplo).

Visualización de datos de sesión como un conjunto de filas relacional

Para ver los datos de eventos de un destino ring_buffer en un conjunto de filas relacional, debe escribir una consulta T-SQL que use expresiones XQuery para convertir XML a datos relacionales.

Este es un ejemplo de la sesión que creamos, mostrando primero los eventos más recientes:

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;