Utilizzo di Debugger flusso eventi di StreamInsight

I sistemi aziendali in settori come il controllo di processi e produzione, i servizi, le compravendite finanziarie, il Web e il monitoraggio IT generano flussi di eventi con interrelazioni complesse e requisiti di latenza bassa. Vista l'importanza dell'aspetto temporale per l'elaborazione di tali flussi di eventi, un'importante sfida in questi sistemi consiste nel determinare la validità dei risultati in presenza di un comportamento dei flussi vario e dinamico e nel risolvere i problemi relativi alla query in caso di errori.

Per questo motivo, sono necessari strumenti di analisi delle query in grado di soddisfare i requisiti seguenti:

  • Gestione di quantità elevate di dati e riduzione dello spazio di ricerca dei problemi.

  • Gestione di requisiti di coerenza rigidi.

  • Intuitività sufficiente per consentire all'utente di giungere rapidamente a una diagnosi o a una soluzione.

Microsoft StreamInsight fornisce un'interfaccia utente grafica (GUI) autonoma dello strumento Debugger flusso eventi. Debugger flusso eventi di StreamInsight consente a uno sviluppatore o a un amministratore di un'applicazione CEP (Complex Event Processing, elaborazione di eventi complessi) di controllare il flusso di eventi attraverso una query di StreamInsight, eseguire il debug di tale flusso e valutarlo. In questo argomento vengono descritte le caratteristiche di Debugger flusso eventi e vengono illustrate le procedure necessarie per iniziare a utilizzare in modo rapido questo strumento di debug e analisi.

Informazioni sul debug del flusso di eventi

Prima di illustrare Debugger flusso eventi, è importante notare la differenza fondamentale tra un debugger del flusso di controllo (ad esempio, un debugger C# o C++) e il debugger del flusso di eventi.

Per il debug del flusso di controllo lo sviluppatore "compila" un programma scritto in un linguaggio specifico in modalità di debug, abilita i punti di interruzione in corrispondenza di istruzioni o giunzioni specifiche nel flusso di controllo del programma, "esegue" il programma fino a questi punti di interruzione specifici, valuta il codice e lo stato del sistema, esegue funzioni e routine, controlla variabili e così via, fino al completamento dell'esecuzione. La valutazione temporale delle variabili di "dati", ovvero l'analisi della trasformazione di queste variabili nel tempo, è limitata o inesistente.

All'opposto, il debug del flusso di eventi prevede l'analisi di un evento nel tempo, con l'avanzare da una fase della query CEP a quella successiva, nonché all'interno di una fase, da un operatore al successivo. In questo caso il debug richiede la comprensione degli effetti di un evento su un flusso all'entrata da un operatore specifico e del modo in cui vengono generati nuovi eventi in seguito a calcoli sugli eventi in un operatore. Nel caso del debug del flusso di eventi, l'enfasi è posta sul modo in cui la semantica dell'operatore (Filter, Project, Join, Aggregate, Multicast e così via) influisce sull'evento, piuttosto che sull'esecuzione (flusso di controllo) degli operatori stessi. Di conseguenza, il debugger consente di comprendere l'impatto di un evento specifico su altri eventi e l'impatto di altri eventi sull'evento analizzato.

Modalità di debug e monitoraggio

Debugger flusso eventi è uno strumento di debug autonomo basato sulla traccia degli eventi. Il debugger ha le due finalità seguenti:

  • Debug di una traccia del flusso di eventi. La sessione di debug può essere basata su:

    • Una traccia generata da una registrazione in tempo reale di una query operativa specifica, con il debugger connesso a un server attivo.

    • Un file di traccia generato all'esterno del debugger utilizzando un'utilità della riga di comando e il file caricato in un secondo momento nel debugger.

  • Monitoraggio del server. In questa modalità il debugger fornisce uno strumento di esplorazione degli oggetti tramite cui vengono elencati oggetti di sistema e applicazione. È possibile ottenere dati diagnostici operativi su ognuna di queste entità. Lo strumento di esplorazione degli oggetti rappresenta anche l'interfaccia attraverso cui è possibile abilitare e disabilitare query per la traccia, nonché avviare e arrestare l'esecuzione di query in modo funzionale.

Per poter utilizzare il Debugger flusso eventi, l'utente deve far parte del gruppo Performance Log Users di Windows. In questo modo, l'utente può raccogliere tracce all'esterno del debugger utilizzando trace.cmd o registrare eventi da una query mentre lavora all'interno del debugger. Per informazioni sui passaggi di tale operazione, vedere la sezione relativa alla gestione e alle operazioni Windows.

Se StreamInsight è stato installato correttamente, è consigliabile avviare il debugger e analizzare la pagina iniziale per informazioni sulle funzionalità di base dello strumento. Per avviare il debugger, fare clic sul pulsante Start, scegliere Tutti i programmi, fare clic su Microsoft StreamInsight 1.1, quindi fare clic su Debugger flusso eventi di StreamInsight.

Esecuzione del debug di una query di StreamInsight

È possibile connettere il debugger al server StreamInsight come applicazione client locale o remota, quindi registrare e riprodurre la traccia del flusso di eventi di una o più query. In alternativa, è anche possibile utilizzare questo strumento come applicazione client autonoma scollegata dal server e analizzare le query in base alle tracce degli eventi raccolte offline. Questo approccio offre la flessibilità di scelta tra l'esecuzione del debug di una query specifica mentre è operativa o l'esecuzione del testing della query in seguito, basandosi sulle tracce cronologiche delle sue esecuzioni.

Registrazione degli eventi di query in tempo reale

Per registrare gli eventi da una query in esecuzione, è necessario connettere Debugger flusso eventi a un server StreamInsight attivo. Nella procedura seguente viene descritto come connettersi a un server attivo, aprire una query in esecuzione e abilitare la traccia nella query.

  1. Come prerequisito, è necessario che l'amministratore del server o l'utente corrente abiliti il servizio Web per il server. Per ulteriori informazioni sull'abilitazione del servizio Web, vedere Pubblicazione e connessione al server StreamInsight.

  2. Confermare che l'utente client dispone delle autorizzazioni per connettersi al server essendo membro nel rispettivo gruppo di utenti di StreamInsight. Per ulteriori informazioni, vedere la sezione "Gruppo Users di StreamInsight" in Installazione (StreamInsight).

  3. Nel debugger fare clic su File, quindi su Connetti al server. Immettere l'indirizzo dell'endpoint server. L'endpoint predefinito per un server StreamInsight installato è https://localhost/StreamInsight/<instance_name>.

    Se il server è stato configurato correttamente per le connessioni, nel debugger verrà visualizzato Esplora oggetti nel riquadro sinistro.

  4. In Esplora oggetti fare clic sulla gerarchia di oggetti fino a quando non viene visualizzata la query di cui eseguire il debug. Fare doppio clic sull'oggetto di tipo query. Verrà aperto il grafico di query, come illustrato nella figura seguente. Nella figura viene indicato che la query di esempio "TrafficSensorQuery" è attualmente in esecuzione.

    Grafico della query in Debugger flusso eventi

    Figura 1 - Visualizzazione di una query nel grafico di query.

  5. Per abilitare la query per la traccia, fare clic con il pulsante destro del mouse sulla query e selezionare Abilita traccia. In alternativa, è possibile abilitare la traccia a livello di programmazione utilizzando un'API. Per ulteriori informazioni, vedere Monitoraggio delle query e del server StreamInsight.

  6. Per registrare gli eventi elaborati nella query, fare clic sul pulsante Avvia registrazione. In questo modo, verrà avviato il processo di registrazione, come illustrato nella figura seguente. Dopo aver registrato gli eventi per alcuni minuti, fare clic su Arresta.

    Registrazione del flusso di eventi in una query.

    Figura 2 - Registrazione di eventi in una query in esecuzione.

In questo modo, il debugger verrà impostato nello stato illustrato nella figura 1. A questo punto, è possibile utilizzare lo strumento di analisi delle query fornito nel debugger. Le caratteristiche di analisi sono descritte nella sezione seguente.

Caricamento del file di traccia del flusso di eventi (EFT, Event Flow Trace) o di Analisi eventi per Windows (ETW, Event Tracing for Windows)

StreamInsight supporta distribuzioni dei server sia autonome che incorporate. Se l'applicazione incorpora il server e non abilita il servizio Web, un'applicazione client come il debugger non può connettersi al server. Per le query in esecuzione in uno scenario di questo tipo, è necessario un meccanismo per eseguire il debug e diagnosticare i problemi.

Per raccogliere i log di traccia degli eventi per un server StreamInsight in esecuzione, è possibile utilizzare l'utilità trace.cmd inclusa nell'installazione di StreamInsight. Nella procedura seguente viene descritto come creare un file di traccia e caricare il file in Debugger flusso eventi.

  1. Con il server e le query pertinenti in esecuzione, digitare l'istruzione seguente nel prompt dei comandi di Windows. È importante utilizzare l'estensione di file etl quando si assegna un nome al file di traccia.

trace.cmd start <filename>.etl

  1. Dopo aver consentito l'esecuzione della query per un intervallo di tempo sufficiente, arrestare la traccia utilizzando:

trace.cmd stop <filename>.etl

  1. Per caricare il file risultante nel debugger, fare clic su File, quindi su Apri. Nella finestra di dialogo Apri passare al percorso di <filename>.etl e fare clic su Apri. Verrà visualizzato il grafico di query, come illustrato nella figura seguente.

    Caricamento di un file di traccia di query nel debugger.

    Figura 3 - Visualizzazione di una query caricata da un file di traccia.

Rispetto agli oggetti illustrati nella figura 1, in questa figura è presente un numero minore di entità in Esplora oggetti. Questo si verifica in quanto il debugger non è connesso al server. In particolare, gli oggetti diagnostici a livello di server, come le utilità di pianificazione, non possono essere visualizzati quando il debugger non è connesso al server.

Si noti che nella figura è illustrato un indicatore di stato sulla barra di stato, che segnala lo stato di avanzamento del caricamento del file ETL. Durante il caricamento, il debugger converte un file ETL nel proprio formato EFT proprietario e compresso.

È importante notare che l'utilità trace.cmd è uno script basato sul comando Windows Logman. Logman utilizza, a sua volta, l'infrastruttura di Event Trace for Windows (ETW) per la raccolta degli eventi. Durante il processo di caricamento del log di traccia, il debugger può avvertire l'utente che alcuni eventi sono andati persi. Ciò è dovuto alle impostazioni di sessione e di buffer ETW non appropriate. Per risolvere il problema, modificare il comando Logman nel file trace.cmd e aumentare le dimensioni del buffer specificate nell'opzione -bs (ad esempio, -bs 3000) o aumentare il numero di buffer specificati nell'opzione -nb. Per ulteriori informazioni ed esempi, vedere la documentazione di Logman.

Analisi delle query utilizzando lo strumento Debugger flusso eventi

Debugger flusso eventi offre le funzionalità chiave riportate di seguito per l'analisi delle query.

  • Possibilità di visualizzare il piano di query per una query specifica, gli operatori di query e i flussi di eventi. In questo modo è possibile comprendere la query LINQ in termini di flusso di eventi sottostante e di nodi di elaborazione nel flusso di eventi.

  • Possibilità di controllare tutti gli eventi nell'input e nell'output del flusso di eventi complesso insieme ai risultati intermedi in ogni fase del calcolo. Sono inclusi i metadati degli eventi in termini di timestamp di inizio e di fine e i campi payload.

  • Possibilità di visualizzare flussi di eventi complessi partizionati per la scalabilità orizzontale. Il debugger è in grado di mostrare il modo in cui gli eventi vengono partizionati dall'operazione di raggruppamento dell'operatore di raggruppamento e applicazione e trasformati nell'operatore di applicazione.

  • Possibilità di eseguire un set di analisi globali per ridurre lo spazio di ricerca dei problemi o correlare gli eventi di più fasi del flusso di eventi.

  • Possibilità di esaminare passo a passo la traccia dell'esecuzione di una query nel tempo e comprendere in che modo gli eventi si propagano in una query di flusso.

  • Possibilità di analizzare gli eventi e comprendere in che modo hanno raggiunto un determinato stato, ovvero comprendere l'impatto di altri eventi o operatori sui payload e sulle ore degli eventi.

  • Possibilità di analizzare l'impatto di un determinato evento su eventi a valle dell'operatore corrente. Essenzialmente, si tratta di verificare in anticipo l'elaborazione futura degli eventi fino all'effetto definitivo dell'evento sull'output.

Per implementare queste funzionalità, il debugger fornisce tre caratteristiche per l'analisi:

  • Riproduzione - Utilizzando questa caratteristica è possibile esaminare passo a passo il flusso, un evento per volta, e osservarne l'avanzamento da un operatore a quello successivo. In alternativa, è possibile impostare punti di interruzione in corrispondenza di operatori specifici nel grafico di query ed "eseguire" il debugger, ovvero attivare il flusso di eventi, fino all'operatore specifico o al soddisfacimento di una condizione specifica nell'operatore.

  • Analisi causa radice - Utilizzando questa caratteristica, è possibile "risalire" alla "causa radice" o alla sequenza di operazioni o modifiche in seguito a cui l'evento ha raggiunto la condizione attuale.

  • Analisi di propagazione eventi - Utilizzando questa caratteristica, è possibile analizzare gli effetti dell'evento nel flusso in termini di modifiche subite da tale evento specifico oppure in termini di impatto su altri eventi o di influenza sulla generazione di nuovi eventi. Questa caratteristica è il contrario dell'Analisi causa radice.

Utilizzo della Riproduzione

Dopo aver caricato gli eventi nel debugger tramite registrazione in tempo reale o il caricamento da un file di log di traccia, il passaggio successivo consiste nell'individuare tali eventi. A tale scopo, è necessario riprodurre gli eventi facendo clic sull'icona a forma di orologio. Verrà visualizzato un lettore di eventi. È possibile esaminare passo a passo gli eventi facendo clic sull'icona Avanti di un passaggio. In alternativa, è possibile impostare un punto di interruzione in corrispondenza di qualsiasi operatore facendo clic sul pulsante di opzione a sinistra di un operatore, quindi su Passa al punto di interruzione successivo nel lettore di eventi.

Nella figura seguente è stato impostato un punto di interruzione nell'operatore di aggregazione nel ramo di applicazione e il flusso di eventi è stato attivato. La riga evidenziata in verde nell'operatore di aggregazione mostra l'avanzamento del flusso di eventi fino al punto attuale.

Eventi visualizzati nella caratteristica Riproduzione

Figura 4 - Impostazione di un punto di interruzione nell'operatore di aggregazione.

Una volta avviato il flusso di eventi nella query, è possibile espandere ogni operatore facendo clic sulle icone triangolari a destra di ognuno di essi. È possibile continuare a esaminare passo a passo gli eventi e visualizzarne l'avanzamento.

Utilizzo dell'Analisi causa radice

Utilizzando l'Analisi causa radice, è possibile analizzare il modo in cui l'evento ha raggiunto lo stato corrente. Dalla griglia di eventi di qualsiasi operatore è possibile avviare l'Analisi causa radice facendo clic con il pulsante destro del mouse sull'evento desiderato e scegliendo Analisi causa radice.

Quando si sceglie Analisi causa radice, nel debugger viene visualizzata una vista espansa di tutti gli operatori che contengono gli eventi che hanno potenzialmente contribuito allo stato corrente dell'evento analizzato. Nella figura seguente viene illustrato, ad esempio, in che modo è stato ottenuto il valore avgCount di 18, con i timestamp di inizio e di fine specificati. Nel menu di scelta rapida fare clic con il pulsante destro del mouse sull'evento evidenziato e scegliere Analisi causa radice. Nel debugger verrà visualizzata la pila derivante da un'operazione di riproduzione dell'Analisi causa radice, posizionando una seconda freccia nell'intestazione dell'area di disegno delle query a schede. Questo aspetto è illustrato nella figura seguente. Un contributo allo stato di questo evento in questa fase di elaborazione della query è dato da un'operazione di inserimento nell'operatore SensorInput con un valore VehicularCount di 24.

Analisi causa radice

Figura 5 - Utilizzo dell'Analisi causa radice.

Utilizzo dell'Analisi di propagazione eventi

Mentre l'Analisi causa radice consente di determinare l'impatto di altri eventi o passaggi di elaborazione su un evento, l'Analisi di propagazione eventi è un'analisi predittiva finalizzata a comprendere l'impatto dell'evento corrente sugli eventi a valle. Dalla griglia di eventi di qualsiasi operatore è possibile avviare l'Analisi di propagazione eventi facendo clic con il pulsante destro del mouse sull'evento desiderato e scegliendo Analisi di propagazione eventi.

Visualizzazione in pila delle analisi

È possibile visualizzare le analisi in pila una sopra l'altra. È possibile avviare il debug tramite la funzionalità Riproduzione. A un determinato punto dell'analisi, è possibile avviare un'Analisi causa radice per un evento specifico. Da questa vista, è possibile scegliere un altro evento per l'analisi di propagazione. In questo modo, è possibile impilare le analisi una sull'altra.

È inoltre possibile aprire la stessa query in più schede e visualizzare analisi e viste diverse nelle diverse schede, per poter confrontare lo stesso segmento, o segmenti diversi, della query, in analisi diverse.

Operatori

Ogni casella rettangolare nel grafico di query rappresenta un operatore, ovvero il nodo di calcolo in una query di StreamInsight. L'algebra di query supporta vari operatori tra cui Select (Filter), Project, Import, Export, Group-and-Apply, Join, Multicast, Union, Top-K, AlterLifetime, Advancetime e Cleanse. Ogni operatore è identificato con il nome specifico nei metadati del server, insieme all'indicazione del relativo tipo.

È importante notare che potrebbe non esserci una corrispondenza 1:1 tra gli operatori presenti nel grafico di query e le operazioni che compongono una query LINQ. Un operatore Import rappresenta, ad esempio, un'istanza dell'adattatore di input e un operatore Export rappresenta l'istanza dell'adattatore di output. Cleanse è un operatore interno introdotto da Query Optimizer per gestire dati non ordinati e non è presente nella query LINQ. Analogamente, AdvanceTime e AlterLifetime rappresentano le operazioni temporali principali nell'algebra di query, risultanti dalla specifica delle estensioni LINQ AlterEventDuration o AlterEventLifeTime o da operazioni di windowing nella query. Sarà tuttavia possibile mettere in correlazione una query LINQ con il grafico di query risultante senza troppa difficoltà.

Ogni griglia di eventi include le sezioni seguenti.

Etichetta operatore

Il titolo della griglia è costituito dal nome dell'operatore fornito dalla query e dal tipo di operatore.

Filtro

In questa casella di testo è possibile specificare un'espressione C# condizionale per filtrare gli eventi di interesse. Potrebbe, ad esempio, essere necessario esaminare solo gli eventi che soddisfano o superano un valore o un orario specifico.

Campi evento

Nella parte rimanente della finestra della griglia di eventi sono presenti i campi di un evento. I campi includono il tipo di evento specificato dall'utente (Insert o CTI) e gli eventi interni (Retract ed Expand). Le colonne dei campi visualizzate per impostazione predefinita sono EventKind, StartTime, EndTime e i campi payload dell'evento. È possibile aggiungere o rimuovere campi dalla griglia di eventi facendo clic con il pulsante destro del mouse sulla barra di intestazione per visualizzare il menu di scelta rapida oppure facendo clic su Visualizza, quindi su Colonne e selezionando o deselezionando i nomi di campo. Si noti che tutti i campi timestamp sono visualizzati nel formato UTC. Il menu di scelta rapida consente di modificare i fusi orari.

I campi disponibili vengono visualizzati nell'ordine elencato nella tabella seguente. Gli eventi in qualsiasi operatore specifico possono essere esportati in un file facendo clic con il pulsante destro del mouse sulla barra del titolo dell'operatore e scegliendo l'opzione 'Scrivi eventi in file'. In genere, questa operazione viene effettuata per esportare gli eventi per un'ulteriore elaborazione tramite un altro programma.

Nome campo

Descrizione

EventKind

Insert, Cti, Retract o Expand.

StartTime

Ora di inizio dell'evento.

EndTime

Ora di fine dell'evento.

NewEndTime

Ora di fine modificata dell'evento per alcuni tipi di evento di sistema speciali. Ignorare i valori in questa colonna.

Latency

Latenza di sistema dell'evento in corrispondenza del momento specificato. Si tratta dell'intervallo di tempo tra il momento in cui l'evento in entrata che ha provocato la generazione dell'evento è entrato nel sistema e il momento in cui quest'ultimo evento è stato generato dal sistema.

EnqueueTime

Ora di sistema in cui l'evento è stato generato dall'operatore.

Uno o più campi payload

Campi dati definiti dall'utente disponibili nell'evento.

Operatore Group-and-Apply

L'operatore Group-and-Apply, o operatore di raggruppamento e applicazione, è un operatore speciale costituito da un operatore Grouping come punto di ingresso, un set di operatori di ramo Apply e un operatore Group Union come operatore di delimitazione in uscita. Espandendo il nodo di raggruppamento vengono visualizzati tutti i rami di applicazione ancorati sui rispettivi valori di chiave di raggruppamento. È possibile espandere (o comprimere) l'operatore Group-and-Apply semplicemente trascinando il ramo di interesse dal nodo di raggruppamento nell'area di disegno. Ogni operatore nel ramo può a questo punto essere espanso per un'ulteriore analisi. Facendo clic sul segno X in ogni ramo, questo viene di nuovo compresso nel grafico secondario dell'operatore Group-and-Apply master. Nella figura seguente è illustrato un nodo Group-and-Apply in Debugger flusso eventi.

Espansione di un operatore di raggruppamento e analisi

Figura 6 - Visualizzazione di un nodo Group-and-Apply.

Ulteriori caratteristiche di utilizzabilità

Il debugger offre le caratteristiche di utilizzabilità seguenti:

  • È possibile ingrandire l'area di disegno del grafico di query passando in modo semplice dalla visualizzazione degli operatori a quella del grafico di query completo.

  • Tutte le funzionalità disponibili tramite icone sono disponibili anche scegliendo le opzioni dai menu di scelta rapida.

  • Quando il debugger è connesso al server, qualsiasi errore restituito dal server verrà indicato con le impostazioni locali en-US, indipendentemente dalle impostazioni locali installate. Per le impostazioni locali non inglesi, è possibile utilizzare questi messaggi di errore per informazioni di supporto e di diagnosi aggiuntive.

  • Tutti gli operatori possono essere espansi o compressi utilizzando le caratteristiche Espandi tutto e Comprimi tutto.

  • Le opzioni disponibili nel menu Strumenti consentono di impostare i valori predefiniti per diverse impostazioni del debugger. È possibile scegliere di leggere il file di traccia del flusso di eventi in segmenti di dimensioni specifiche. Questo garantisce un'esperienza di debug più immediata e prevedibile. È possibile specificare il formato DateTime e TimeZone per tutti gli operatori del grafico di query. È inoltre possibile specificare la durata massima e minima della registrazione del flusso di eventi per uno scenario in cui il debugger è connesso a un server.

Monitoraggio del dashboard

Oltre a essere uno strumento di debug, Debugger flusso eventi funge da strumento di monitoraggio per il server StreamInsight. È possibile connettere il debugger a un server attivo seguendo i passaggi descritti in precedenza. Tramite il debugger viene visualizzato Esplora oggetti con tutte le entità server. Al livello principale, vengono visualizzate le statistiche di riepilogo relative a Gestione eventi, Gestione query e utilità di pianificazione. Per visualizzare i dati diagnostici di runtime relativi a uno di questi oggetti, fare clic con il pulsante destro del mouse sull'icona dell'oggetto e scegliere Diagnostica.

È anche possibile fare clic nella gerarchia di oggetti e scegliere una query specifica registrata nel server. È possibile abilitare o disabilitare la traccia in una query, nonché avviare o arrestare una query. Se inoltre la query è in esecuzione, è possibile ottenere i dati diagnostici di runtime della query. Utilizzando questa interfaccia è possibile monitorare le informazioni sugli eventi prodotti e utilizzati, le caratteristiche di latenza e velocità effettiva e i requisiti di memoria della query.

È possibile recuperare queste metriche anche a livello di programmazione utilizzando le API delle viste diagnostiche. Per una descrizione delle informazioni di diagnostica disponibili per ogni entità, vedere Monitoraggio delle query e del server StreamInsight.

Cronologia modifiche

Contenuto aggiornato

Sono state aggiunte le informazioni sulla causa e la risoluzione nella sezione 'Caricamento del file di traccia del flusso di eventi (EFT, Event Flow Trace) o di Analisi eventi per Windows (ETW, Event Tracing for Windows)' per l'avviso relativo agli "eventi persi".

È stato aggiunto il passaggio 2 nella sezione 'Registrazione degli eventi di query in tempo reale'.