Exploración de eventos extendidos
El motor de eventos extendidos de Azure SQL es un sistema de supervisión ligero y eficaz que permite capturar información pormenorizada sobre la actividad que tiene lugar en las bases de datos y los servidores. Las soluciones de supervisión de la plataforma Azure permiten configurar fácilmente una supervisión eficaz para su entorno y proporcionar respuestas automáticas a las condiciones de error.
Los eventos extendidos se basan en la funcionalidad de SQL Server Profiler, ya que permiten realizar un seguimiento de las consultas y exponer datos adicionales (eventos) que se pueden supervisar. Los siguientes son algunos ejemplos de los problemas que se pueden solucionar con los eventos extendidos:
- Solución de problemas de rendimiento de bloqueo e interbloqueo.
- Identificación de consultas de larga duración.
- Supervisión de operaciones del lenguaje de definición de datos (DDL).
- Registro de estadísticas de columna que faltan.
- Observación de la presión de memoria en la base de datos.
- Operaciones de E/S físicas de larga duración.
El marco de trabajo de los eventos extendidos también permite usar filtros para limitar la cantidad de datos que se recopilan, con el fin de reducir la sobrecarga de recopilación de datos, y permite identificar más fácilmente el problema de rendimiento centrándose en áreas específicas.
A continuación, se muestra un ejemplo de una sesión de eventos extendidos creada en Azure SQL Database:
En la imagen anterior, xe_deadlocks es el nombre de una sesión de evento extendido que se ejecuta en la base de datos AdventureWorks (a la izquierda de la imagen). El nodo de destino event_counter, que se encuentra en el nodo de sesión de eventos, registra la cantidad de repeticiones de cada evento en la sesión de eventos. Si desea ver los datos de destino en el Explorador de objetos de SSMS, haga clic con el botón derecho en el nodo de destino y, luego, seleccione Ver datos de destino. SSMS muestra los datos como vemos en el lado izquierdo de la imagen y los resultados del recuento de cada evento.
Para más información sobre los eventos extendidos en Azure SQL Database, consulte Eventos extendidos en Azure SQL Database.
¿Qué se puede supervisar con los eventos extendidos?
Los eventos extendidos cubren toda el área expuesta de SQL Server y se dividen en cuatro canales, que definen la audiencia de un evento.
- Administración: los eventos de administración van dirigidos a usuarios finales y administradores. Estos eventos indican un problema en un conjunto de acciones bien definido que puede llevar a cabo un administrador. Un ejemplo de esto es la generación de un informe de interbloqueo XML para ayudar a identificar la causa principal del interbloqueo.
- Operativo: los eventos operativos se utilizan para análisis y diagnósticos, o problemas comunes. Estos eventos se pueden usar para desencadenar una acción o una tarea cuando se produce el evento. Un ejemplo de un evento operativo sería una base de datos de un grupo de disponibilidad que cambia de estado, que indicaría una conmutación por error.
- Analítico: los eventos analíticos suelen estar relacionados con eventos de rendimiento y se publican en un volumen elevado. El seguimiento de procedimientos almacenados o de la ejecución de consultas es un ejemplo de evento analítico.
- Depuración: los eventos de depuración no tienen por qué estar completamente documentados y solo deben usarse para solucionar problemas junto con el equipo de soporte técnico de Microsoft.
Los eventos se agregan a las sesiones, que pueden hospedar varios eventos. Normalmente, se agrupan varios eventos en una sesión para capturar un conjunto de información relacionado.
Para obtener una lista de los eventos, acciones y destinos disponibles, ejecute la consulta siguiente:
SELECT
obj.object_type,
pkg.name AS [package_name],
obj.name AS [object_name],
obj.description AS [description]
FROM sys.dm_xe_objects AS obj
INNER JOIN sys.dm_xe_packages AS pkg ON pkg.guid = obj.package_guid
WHERE obj.object_type in ('action', 'event', 'target')
ORDER BY obj.object_type,
pkg.name,
obj.name;
Creación de una sesión de eventos extendidos
A continuación, verá el proceso básico de crear una sesión de eventos extendidos en el diálogo Nueva sesión de SQL Server Management Studio. Para acceder a esta pantalla, expanda el nodo Administración en SSMS, expanda el nodo Eventos extendidos, haga clic con el botón derecho en Sesiones y seleccione Nueva sesión.
En la imagen anterior se muestra el diálogo Nueva sesión para la característica de eventos extendidos. Primero debe asignarle un nombre a la sesión. SQL Server proporciona numerosas plantillas que se agrupan en las siguientes categorías:
- Bloqueos
- Equivalentes de generador de perfiles
- Ejecución de la consulta
- Supervisión del sistema
Estas plantillas predefinidas permiten empezar a trabajar rápidamente con eventos extendidos para la supervisión. En este ejemplo, se muestran los eventos agregados manualmente a la sesión para hacer un recorrido por todas las opciones, pero, cuando empiece, el uso de una plantilla puede ser una manera sencilla de crear una sesión básica.
Dispone de un par de opciones con una casilla para indicar cuándo se inicia la sesión. Puede elegir que se inicie la sesión nueva siempre que se inicie el servidor o que se inicie tan pronto como se cree la sesión. Los administradores pueden iniciar y detener las sesiones de eventos extendidos en cualquier momento a través del nodo Eventos extendidos en SQL Server Management Studio. También tiene la opción de habilitar el seguimiento de causalidad, que agrega un identificador único global (GUID) y un número de secuencia a la salida de cada evento, lo que permite recorrer fácilmente el orden en el que se produjeron los eventos.
En la imagen anterior, se muestra la pantalla donde se agregan los eventos a la sesión. Un evento representa un punto de interés en el código del motor de base de datos, que puede representar una mera operación interna del sistema, o bien puede estar asociado a una acción del usuario, como la ejecución de consultas. En el ejemplo anterior, puede ver que los eventos sp_statement_completed
, sql_batch_completed
y and sql_statement_completed
se agregaron a esta sesión de eventos. De forma predeterminada, esta sesión capturaría todas las instancias de estos eventos que tengan lugar en la instancia. Para limitar la recopilación, haga clic en el botón Configurar.
La pantalla de configuración de eventos permite definir qué datos se van a recopilar en relación con los eventos. Los campos globales permiten elegir los datos que se van a recopilar cuando se produce el evento. Los campos globales se conocen también como acciones, porque la acción es agregar campos de datos adicionales al evento. Estos campos representan los datos que se recopilan cuando se produce el evento extendido y son comunes en la mayoría de los eventos extendidos. En la imagen siguiente se muestran las opciones de filtro para un evento extendido.
Los filtros son una característica muy eficaz de los eventos extendidos, porque permite usar un control pormenorizado para capturar solo repeticiones específicas de un evento que desee capturar. En este ejemplo, puede ver que se está aplicando un filtro en el campo sqlserver.is_system
donde es igual a cero, lo que indica que la consulta no es una operación interna. En otras palabras, la sesión no capturará la finalización de las instrucciones enviadas por las conexiones del sistema y solo queremos capturar las instrucciones enviadas por usuarios o aplicaciones de usuario.
Los filtros se aplican a un único campo en un único evento. Si quiere asegurarse de no realizar el seguimiento de las actividades del sistema para ningún evento, necesitará un filtro independiente para cada una: para el evento sql_statement_completed
, para el evento sql_batch_completed
y para el evento sp_statement_completed
.
Se recomienda configurar un filtro para cada evento que se captura. Esto ayuda a mejorar la eficacia de la recopilación de datos y permite limitar el enfoque de la búsqueda.
En la imagen siguiente, se muestran los campos de evento que se recopilan. Estos campos son específicos del evento que se desencadena y pueden incluir campos opcionales para la recopilación. En el evento anterior, puede ver que las opciones de recopilación opcionales son statement
y parameterized_plan_handle
.
Una vez que haya definido una sesión de eventos, debe definir un destino de almacenamiento, como se muestra en la imagen siguiente.
Una sesión de eventos extendidos tiene un destino, que se puede considerar simplemente como un lugar para que el motor haga un seguimiento de las repeticiones de un evento. Dos de los destinos más comunes son archivo de evento, que es un archivo del sistema de archivos que puede almacenar eventos, y en las ofertas de PaaS de Azure SQL, estos datos se escriben en un almacenamiento de blobs. Otro destino común es el búfer en anillo, que se encuentra dentro de la memoria de SQL Server. Por lo general, el búfer en anillo se usa para la observación en directo de una sesión de eventos, ya que es un búfer circular y los datos no se conservan después de la sesión. La mayoría de los destinos procesan los datos de forma asincrónica, lo que significa que los datos de eventos se escriben en la memoria antes de que se guarden en el disco. Los destinos Seguimiento de eventos para Windows (ETW) y contador de eventos son una excepción, porque se procesan de manera sincrónica.
La tabla siguiente contiene la información y los usos de cada tipo de destino de eventos extendidos.
Target | Descripción | Procesamiento |
---|---|---|
Contador de eventos | Cuenta todos los eventos que tienen lugar durante una sesión de eventos extendidos. Se usa para obtener información sobre las características de una carga de trabajo sin la sobrecarga que supone recopilar todos los eventos. | Sincrónica |
Código de destino del archivo de evento para eventos extendidos en Base de datos SQL | Escribe la salida de la sesión de eventos que está en la memoria en un archivo persistente en el disco. | Asincrónica |
Emparejamiento de eventos | Muchos eventos se producen generalmente en pares (por ejemplo, la adquisición de un bloqueo y la liberación del bloqueo) y esta recopilación se puede usar para identificar cuándo no ocurren esos eventos en un conjunto coincidente. | Asincrónica |
Seguimiento de eventos para Windows (ETW) | Se usa para correlacionar eventos de SQL Server con los datos de eventos del sistema operativo Windows. | Sincrónica |
Histograma | Es similar al contador de eventos, que cuenta las veces que se produce un evento. La diferencia es que el histograma puede contar en función de una acción o una columna específicas de un evento. | Asincrónica |
Búfer en anillo | Se utiliza para almacenar los datos en la memoria. Los datos no se guardan en el disco y es posible que la memoria se vacíe con frecuencia. | Asincrónica |
Como alternativa, puede crear una sesión de eventos extendidos mediante T-SQL. Los comandos T-SQL siguientes proporcionan un ejemplo de cómo crear una sesión de eventos extendidos:
IF EXISTS (SELECT * FROM sys.server_event_sessions WHERE name='test_session')
DROP EVENT session test_session ON SERVER;
GO
CREATE EVENT SESSION test_session
ON SERVER
ADD EVENT sqlos.async_io_requested,
ADD EVENT sqlserver.lock_acquired
ADD TARGET package0.etw_classic_sync_target (SET default_etw_session_logfile_path = N'C:\demo\traces\sqletw.etl' )
WITH (MAX_MEMORY=4MB, MAX_EVENT_SIZE=4MB);
GO
El ámbito de las sesiones de eventos se puede limitar a un servidor o a una base de datos. En el ejemplo anterior, se agregan dos eventos y se usa la ruta de acceso de Seguimiento de eventos para Windows (ETW), con la ubicación de un archivo. Después de crear la sesión, debe iniciarla. Puede hacerlo mediante T-SQL y aplicar ALTER
a la sesión con la opción STATE
, o bien puede usar SQL Server Management Studio para hacerlo.