Esplorare gli eventi estesi

Completato

Il motore degli eventi estesi in Azure SQL è un sistema di monitoraggio potente e leggero che consente di acquisire informazioni granulari sulle attività nei database e nei server. Le soluzioni di monitoraggio nella piattaforma Azure consentono di configurare facilmente il monitoraggio avanzato per l'ambiente e di fornire risposte automatiche alle condizioni di errore.

Gli eventi estesi si basano sulla funzionalità di SQL Server Profiler consentendo di tracciare le query ed esponendo dati aggiuntivi (eventi) che è possibile monitorare. Di seguito sono riportati alcuni esempi di problemi che è possibile risolvere con gli eventi estesi:

  • Risoluzione dei problemi relativi alle prestazioni di blocco e deadlock.
  • Identificazione di query con esecuzione prolungata.
  • Monitoraggio di operazioni DDL (Data Definition Language).
  • Registrazione delle statistiche di colonne mancanti.
  • Osservazione delle richieste di memoria nel database.
  • Operazioni di I/O fisiche con esecuzione prolungata.

Il framework di eventi estesi consente anche di usare i filtri per limitare la quantità di dati raccolti e ridurre l'overhead della raccolta dei dati e consente di identificare più facilmente il problema relativo alle prestazioni, indirizzando l'attenzione su aree specifiche.

Di seguito è riportato un esempio di sessione di eventi estesi creata nel database SQL di Azure:

Extended Event running on a SQL Database

Nell'immagine precedente, xe_deadlocks è il nome di una sessione di eventi estesi in esecuzione nel database AdventureWorks (a sinistra dell'immagine). Il nodo di destinazione event_counter, che si trova nel nodo della sessione di evento, conta il numero di occorrenze di ogni evento nella sessione di evento. Per visualizzare i dati di destinazione in Esplora oggetti di SSMS, è possibile fare clic con il pulsante destro del mouse sul nodo di destinazione e quindi selezionare Visualizza dati di destinazione. SSMS visualizza i dati come illustrato sul lato sinistro dell'immagine e i risultati del conteggio per ogni evento.

Per altre informazioni sugli eventi estesi nel database SQL di Azure, vedere Eventi estesi nel database SQL.

Cosa è possibile monitorare con gli eventi estesi?

Gli eventi estesi coprono la superficie di attacco completa di SQL Server e sono divisi in quattro canali che definiscono i destinatari di un evento.

  • Amministrativi: gli eventi amministrativi sono destinati agli utenti finali e agli amministratori. Gli eventi inclusi indicano un problema in un set ben definito di azioni che possono essere eseguite da un amministratore. Un esempio è costituito dalla generazione di un report deadlock XML che consente di identificare la causa principale del deadlock.
  • Operativi: gli eventi operativi vengono utilizzati per l'analisi e la diagnostica o i problemi comuni. Questi eventi possono essere usati per attivare un'azione o un'attività in base a un'occorrenza dell'evento. Un esempio di evento operativo è costituito da un database in un gruppo di disponibilità che modifica lo stato, indicando un failover.
  • Analitici: gli eventi analitici sono in genere correlati a eventi prestazioni e vengono pubblicati in volumi elevati. Il tracciamento di stored procedure o dell'esecuzione di query è un esempio di un evento analitico.
  • Debug: gli eventi debug non sono sempre completamente documentati ed è consigliabile usarli solo per la risoluzione dei problemi in collaborazione con il supporto tecnico Microsoft.

Gli eventi vengono aggiunti alle sessioni, che possono ospitare più eventi. In genere, più eventi vengono raggruppati in una sessione per acquisire un set di informazioni correlate.

È possibile eseguire la query seguente per ottenere un elenco di eventi, azioni e destinazioni disponibili:

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;

Creare una sessione di eventi estesi

Di seguito viene illustrato il processo di base per la creazione di una sessione di eventi estesi con la finestra di dialogo Nuova sessione di SQL Server Management Studio. È possibile accedere a questa schermata espandendo il nodo Gestione in SSMS, espandendo il nodo Eventi estesi, facendo clic con il pulsante destro del mouse su Sessioni e selezionando Nuova sessione.

Creating an Extended Events Session

L'immagine precedente mostra la finestra di dialogo Nuova sessione relativa alla funzionalità Eventi estesi. È necessario prima di tutto assegnare un nome alla sessione. In SQL Server sono disponibili numerosi modelli raggruppati nelle categorie seguenti:

  • Blocchi
  • Equivalenti di Profiler
  • Esecuzione di query
  • Monitoraggio di sistema

Questi modelli predefiniti consentono di iniziare rapidamente a usare gli eventi estesi per il monitoraggio. In questo esempio vengono visualizzati gli eventi aggiunti manualmente alla sessione per esaminare tutte le opzioni, ma quando si inizia, l'uso di un modello può essere un modo semplice per creare una sessione di base.

Sono disponibili un paio di opzioni della casella di controllo per l'avvio della sessione. È possibile scegliere di avviare la nuova sessione ogni volta che il server viene avviato ed è anche possibile scegliere di avviare la sessione non appena è stata creata. Gli amministratori possono avviare e arrestare le sessioni di eventi estesi in qualsiasi momento tramite il nodo Eventi estesi in SQL Server Management Studio. È anche possibile abilitare il rilevamento della causalità, che aggiunge un identificatore univoco globale (GUID) e un numero di sequenza all'output di ogni evento, consentendo di scorrere facilmente l'ordine in cui si sono verificati gli eventi.

Event selection in SQL Server Management Studio

L'immagine precedente mostra la schermata in cui si aggiungono gli eventi alla sessione. Un evento rappresenta un punto di interesse all'interno del codice del motore di database, che può rappresentare operazioni puramente interne del sistema oppure può essere associato ad azioni utente come l'esecuzione di query. Nell'esempio precedente è possibile notare che a questa sessione dell'evento sono stati aggiunti gli eventi sp_statement_completed, sql_batch_completed e sql_statement_completed. Per impostazione predefinita, questa sessione acquisisce tutte le istanze di questi eventi che si verificano nell'istanza. È possibile limitare la raccolta facendo clic sul pulsante Configura.

Global event selection

La schermata di configurazione degli eventi consente di definire i dati raccolti in relazione agli eventi. I campi globali consentono di scegliere i dati da raccogliere quando si verifica l'evento. I campi globali sono noti anche come azioni, in quanto l'azione consiste nell'aggiungere ulteriori campi dati all'evento. Questi campi rappresentano i dati raccolti quando si verifica l'evento esteso e sono comuni per la maggior parte degli eventi estesi. Nell'immagine seguente vengono illustrate le opzioni di filtro per un evento esteso.

Event filter in SQL Server Management Studio

I filtri sono una potente funzionalità di eventi estesi che consentono di usare il controllo granulare per acquisire solo le occorrenze specifiche dell'evento che si desidera acquisire. In questo esempio è possibile notare che il filtro viene applicato al campo sqlserver.is_system, uguale a zero, a indicare che la query non è un'operazione interna. In altre parole, la sessione non acquisisce il completamento delle istruzioni inviate dalle connessioni di sistema e si vuole solo acquisire le istruzioni inviate dagli utenti o dalle applicazioni utente.

I filtri si applicano a un singolo campo in un singolo evento. Per assicurarsi di non tracciare le attività di sistema per tutti gli eventi, è necessario un filtro separato per ognuno: per l'evento sql_statement_completed, per l'evento sql_batch_completed e per l'evento sp_statement_completed.

È buona norma configurare un filtro per ogni evento da acquisire. Ciò consente di migliorare l'efficienza della raccolta dei dati e di limitare l'ambito della ricerca.

L'immagine seguente mostra i campi evento raccolti. Si tratta di filtri specifici dell'evento attivato e possono includere campi facoltativi per la raccolta. Nell'evento precedente è possibile vedere che le opzioni di raccolta facoltative sono statement e parameterized_plan_handle.

Event fields selection

Una volta definita una sessione eventi, sarà possibile definire una destinazione di archiviazione, come illustrato nell'immagine seguente.

Storage target selection for Extended Events

Una sessione di eventi estesi ha una destinazione. Una destinazione può essere semplicemente considerata come una posizione in cui il motore deve tenere traccia delle occorrenze di un evento. Due delle destinazioni più comuni sono il file di eventi, ovvero un file nel file system in grado di archiviare gli eventi e, nelle offerte PaaS di Azure SQL, questi dati vengono scritti in un archivio BLOB. Un'altra destinazione comune è il buffer circolare che si trova nella memoria SQL Server. Il buffer circolare viene comunemente usato per l'osservazione in tempo reale di una sessione di eventi, perché si tratta di un buffer circolare e i dati non vengono salvati in modo permanente oltre una sessione. La maggior parte delle destinazioni elabora i dati in modo asincrono, il che significa che i dati dell'evento vengono scritti in memoria prima di essere salvati in modo permanente su disco. L'eccezione è rappresentata dalla destinazione Event Trace for Windows (ETW) e dalle destinazioni dei contatori di eventi che vengono elaborate in modo sincrono.

La tabella seguente contiene informazioni e usi per ogni tipo di destinazione di eventi estesi.

Destinazione Descrizione In elaborazione
Contatore eventi Conta tutti gli eventi che si verificano durante una sessione di eventi estesi. Viene utilizzato per ottenere informazioni sulle caratteristiche di un carico di lavoro senza l'overhead di una raccolta di eventi completa. Sincrona
File eventi Scrive l'output della sessione eventi dalla memoria nel file persistente su disco. Asincrona
Abbinamento degli eventi Molti eventi che in genere si verificano in coppie, ad esempio l'acquisizione e il rilascio di blocchi, e questa raccolta possono essere usati per l'identità quando questi eventi non vengono eseguiti in un set appaiato. Asincrona
Event Tracing for Windows (ETW) Usato per correlare gli eventi di SQL Server con i dati di evento del sistema operativo Windows. Sincrona
Istogramma Questa operazione è simile al contatore eventi, che conta le occorrenze di un evento. La differenza consiste nel fatto che l'istogramma può essere conteggiato in base a una colonna o un'azione di un evento specifica. Asincrona
Buffer circolare Usato per mantenere i dati in memoria. I dati non vengono salvati in modo permanente sul disco e possono essere scaricati frequentemente dal buffer Asincrona

In alternativa, è possibile creare una sessione di eventi estesi usando T-SQL. I comandi T-SQL seguenti forniscono un esempio su come creare una sessione di eventi estesi:

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

Le sessioni di eventi possono essere limitate a un server o a un database. Nell'esempio precedente si aggiungono due eventi e si usa il percorso di Event Trace for Windows (ETW) con un percorso di file. Dopo aver creato la sessione è necessario avviarla. È possibile eseguire questa operazione tramite T-SQL e ALTER la sessione usando l'opzione STATE oppure è possibile usare SQL Server Management Studio.