Guest post: Application Insights: monitoraggio di App Windows Phone e Windows Store

Questo post è stato scritto da Davide Benvegnù , MVP Visual Studio ALM

Nell’ultimo periodo ci sono stati due annunci piuttosto importanti che riguardano Application Insights (AI), la suite di monitoraggio applicativo online di Microsoft.

La prima importante novità è che la piattaforma di supporto ad AI viene ufficialmente spostata da Visual Studio Online ad Azure. In questo modo tutte le funzionalità avanzate del monitoraggio sono disponibili e gestibili direttamente accedendo all’Azure Portal Preview.

Già da un po’ di tempo, in realtà, era iniziata la “doppia vita” di AI, che era stata resa disponibile su entrambi i portali web (quindi sia su VSO che su Azure). Con questo annuncio, però, è stata indicata chiaramente la rotta che il servizio prende ed, inoltre, è stata inibita la possibilità di creare nuove sottoscrizioni sul portale di VSO: chi vuole creare nuovi servizi in AI deve farlo dal portale di Azure, dove saranno comunque migrati nel tempo anche tutti i servizi già esistenti.

La seconda novità è il nuovo supporto al monitoraggio di app Windows Phone e Windows Store, oltre alle webapp Java. Finora, infatti, con il servizio di Application Insights disponibile su Azure era possibile monitorare solamente le webapp Asp.NET.

 

Supporto a Windows Phone App e Windows Store App

Aggiungere il monitoraggio di Application Insights ad un’app per Windows Phone o per Windows Store è molto semplice.

È sufficiente cliccare con il tasto destro sul progetto dell’app utilizzando Visual Studio 2013 con Update 3 (o successivi) e selezionare la voce “Add Application Insights Telemetry”.

msohtmlclipclip_image001

(negli esempi ho utilizzato una Windows Store App, ma il procedimento è assolutamente identico per una Windows Phone App)

Non appena si avvia la procedura di aggiunta di AI al progetto, Visual Studio richiede di accedere al proprio account Azure (o di crearne uno nuovo). Questo è necessario perché, come detto precedentemente, è Azure a fare da backend al servizio ed a fornire l’interfaccia tramite il Portal Preview.

msohtmlclipclip_image002

Dopo aver effettuato il login ad Azure è possibile selezionare la sottoscrizione (nel caso in cui si disponga di più di una sottoscrizione) in cui creare il nuovo servizio di Application Insights.

msohtmlclipclip_image003

Selezionata la sottoscrizione, è necessario indicare quale servizio AI utilizzare. È possibile infatti creare un nuovo servizio di monitoraggio che si chiamerà come il progetto a cui stiamo associando AI (scelta di Default) oppure utilizzare un servizio precedentemente creato direttamente dal portale di Azure.

msohtmlclipclip_image004

C’è anche la possibilità, utilizzando “Configure settings” di cambiare il Resource Group associato al servizio e, quando la funzionalità sarà in GA (attualmente si tratta di una public preview), modificare la location (che al momento è fissa a Central US)

Fatte le opportune selezioni, è sufficiente cliccare sul bottone “Add Application Insights To Project” per aggiungere, come dice il nome, AI alla nostra App.

Dietro le quinte accadono le seguenti operazioni:

· Visual Studio si connette alla nostra sottoscrizione Azure, crea il nuovo servizio AI (se non abbiamo scelto di utilizzarne uno già esistente) e recupera l’”Instrumentation Key”, ovvero un valore che identifica in modo univoco il nostro servizio

msohtmlclipclip_image005

· Viene scaricato da NuGet il pacchetto che contiene le librerie necessarie al monitoraggio

· Viene configurata Application Insights sul progetto, utilizzando l’Instrumentation Key recuperata precedentemente

· Viene aggiunto allo start dell’applicazione (quindi dentro il file App.xaml.cs) l’inizializzazione del componente “Telemetry Client” che si occupa appunto del monitoraggio della nostra app.

using Microsoft.ApplicationInsights;

[…]

 public static TelemetryClient TelemetryClient;
  

[…]

 public App()
 {
     TelemetryClient = new TelemetryClient();
  

[…]

 }
  

A questo punto non rimane che avviare l’app e verificare cosa succede.

 

Verifica del monitoraggio

Dopo aver avviato la nostra app e navigato un po’ tra le pagine, veniamo notificati con un popup su Visual Studio che i dati sono stati inviati al servizio di monitoraggio.

msohtmlclipclip_image006

Per verificare quali e quanti dati di monitoraggio sono stati inviati basta accedere all’Azure Portal Preview, navigare fino alla sezione relativa ad Application Insights ed entrare sul servizio creato. In alternativa, è possibile semplicemente cliccare con il tasto destro sul nome del progetto e selezionare la voce “Open Application Insights”, che ci porta direttamente alla pagina con i dati di monitoraggio.

msohtmlclipclip_image007

In entrambi i casi il risultato sarà lo stesso, simile a quello visibile in questa immagine:

msohtmlclipclip_image008

La dashboard presenta una gran quantità di dati utili, tra cui il numero di utenti che hanno utilizzato l’app, il numero di sessioni ed il numero di pagine visualizzate. Tutti i grafici sono personalizzabili e, se cliccati, presentano molte informazioni di dettaglio.

Cliccando ad esempio sul grafico delle pagine, si può avere il dettaglio delle stesse, con alcuni dati aggiuntivi.

msohtmlclipclip_image009

Cliccando nuovamente sul grafico, si apre la blade delle personalizzazioni dove è possibile configurare completamente il comportamento del grafico stesso.

msohtmlclipclip_image010

Una delle configurazioni più utili che troviamo è la possibilità di segmentare e raggruppare i dati per alcune condizioni. Nell’immagine vediamo che il grafico è raggruppato per tipologia di pagina, ma è possibile scegliere molti altri valori tra cui il tipo di Device dell’utente, il sistema operativo utilizzato, la lingua, ecc.

msohtmlclipclip_image011

L’utilità del raggruppamento diventa ancora più evidente per il grafico degli utenti: utilizzando ad esempio il raggruppamento per tipo di device possiamo orientare il nostro sviluppo ottimizzando l’applicazione per i dispositivi più utilizzati; oppure selezionando la lingua dell’utente possiamo verificare se non sia il caso di tradurre la nostra app in una lingua che ancora non abbiamo supportato, nel caso in cui ci siano tanti utenti che la usano.

Oltre al monitoraggio sull’utilizzo, sono presenti out-of-the-box anche il monitoraggio sui crash (in modo simile a quanto presente sul portale dello store) e su eventuali eccezioni verificatesi.

Se il monitoraggio di default non fosse sufficiente, abbiamo diverse possibilità di personalizzazione.

 

Monitoraggio personalizzato

Riguardando le immagini precedenti, si nota subito che sull’elenco delle pagine visitate compaiono delle generiche “application:StoreAppAIDemo.HubPage” e “application:StoreAppAIDemo.ItemPage” (si tratta in questo esempio di una Windows Store App con template di tipo Hub). Per alcuni scenari potrebbe essere sufficiente, ma se per esempio avessimo necessità di tracciare la visualizzazione dei singoli Item invece che il totale su tutti gli Item, come avviene di default?

Per supportare uno scenario come quello appena illustrato, possiamo utilizzare la funzione TrackPageView del TelemetryClient:

  
 protected override void OnNavigatedTo(NavigationEventArgs e)
 {
     App.TelemetryClient.TrackPageView(string.Format("ItemPage: {0}", e.Parameter));
  
     navigationHelper.OnNavigatedTo(e);
 }
  

Come vediamo è sufficiente aggiungere una riga di codice all’interno dell’evento OnNavigatedTo. Il risultato di questa operazione sarà che al posto delle pagine generiche avremo visualizzato nel riepilogo il nome che abbiamo scelto, seguito dall’ID dell’Item che viene visualizzato (che, in questo caso, è rappresentato dal valore di e.Parameter).

msohtmlclipclip_image012

 

Eventi personalizzati

Altro tipo di personalizzazione del monitoraggio, anch’esso molto comodo, è la generazione di eventi custom.

Supponiamo, ad esempio, di voler tener traccia di tutte le volte che un utente utilizza una determinata funzionalità. Senza il supporto di Application Insights dovremmo implementare un handler per l’evento che spedisca i dati attraverso un web service o altre tecnologie simili. Con AI, invece, anche quest’operazione si traduce in una sola riga di codice:

  
 App.TelemetryClient.TrackEvent("Nome_Evento");
  

È possibile inserire questa chiamata al TrackEvent ovunque sia necessario (pressione di un bottone, recupero di valori via API effettuata con successo, ecc). Il risultato sarà anch’esso visibile sul portale, ma nella sezione “Eventi personalizzati”.

msohtmlclipclip_image013

Oltre al tracking di un evento semplice, come nell’esempio precedente in cui ne viene tracciato solo il nome, è possibile anche aggiungere delle proprietà e delle metriche custom. Ancora una volta, farlo è molto semplice e richiede solo poche righe di codice:

  
 var properties = new Dictionary<string, string>();
 properties["IDUtente"] = App.TelemetryClient.Context.User.Id; //questo valore è null
 properties["MiaProprieta_2"] = "valore2";
  
 var metrics = new Dictionary<string, double>();
 metrics["OffsetTicks"] = DateTimeOffset.Now.Offset.Ticks;
 metrics["Metrica_2"] = 144;            
  
 App.TelemetryClient.TrackEvent("Evento_Con_Metriche", properties, metrics);
  

Innanzitutto è importante notare che “proprietà” e “metriche” sono rappresentate da due oggetti di tipo Dictionary ma con diverso tipo del valore. Nel primo caso si tratta di valori di tipo testuale (string) mentre nel secondo di tipo numerico (double).

In entrambi i casi, comunque, quello che viene inserito all’interno dei Dictionary è assolutamente libero e personalizzabile, sia come valore sia come numero degli elementi (purché sia ovviamente rispettato il tipo).

Utilizzando questa funzionalità potremo quindi avere sulla dashboard del servizio l’indicazione dell’evento, come nel caso precedente, ma con anche i dati personalizzati inseriti.

msohtmlclipclip_image014

Si noti che non viene riportato il valore della proprietà “IDUtente” in quanto a Runtime, come riportato nel commento vicino al codice, era NULL.

Accedere ai valori richiede qualche click in più rispetto a quanto visto finora. Innanzitutto bisogna cliccare sul nome dell’evento nella dashboard principale, poi di nuovo sul nome dell’evento nella tabella denominata “Totale di events per event name”, fare clic poi sul singolo evento e finalmente si arriverà alla schermata con i dati.

image

Altre personalizzazioni

Oltre a pagine ed eventi, è possibile tracciare altri elementi:

  
 //EXCEPTION
 var ex = new Exception();
 App.TelemetryClient.TrackException(ex);
 App.TelemetryClient.TrackException(ex, properties, metrics);
  
 //METRIC
 App.TelemetryClient.TrackMetric("Mia_Metrica", 123546);
 App.TelemetryClient.TrackMetric("Mia_Metrica", valore_medio, numero_valori, 
         valore_minimo, valore_massimo, properties);
  
 //REQUEST 
 App.TelemetryClient.TrackRequest("Mia_Richiesta", DateTimeOffset.Now, durata_richiesta,
         reponse_code, successo);
  
 //TRACE
 App.TelemetryClient.TrackTrace("Messaggio");
 App.TelemetryClient.TrackTrace("Messaggio", 
  Microsoft.ApplicationInsights.DataContracts.SeverityLevel.Information);
 App.TelemetryClient.TrackTrace("Messaggio"", 
  Microsoft.ApplicationInsights.DataContracts.SeverityLevel.Warning,
         properties);
  

Ogni tipo di tracciamento verrà visualizzato nella sua rispettiva area della dashboard. Per quanto riguarda le metriche personalizzate, è anche possibile includerle nel grafico principale andando sulla sua configurazione (semplicemente cliccandoci sopra) e selezionando i valori da visualizzare.

 

Informazioni utili

Ci sono due cose da considerare, quando si utilizza il monitoraggio con Application Insights.

La prima riguarda l’invio dei dati al servizio:

· Quando l’applicazione è compilata in Debug, l’invio avviene in tempo reale. Sarà quindi possibile vederli immediatamente inseriti nei grafici e nelle tabelle sul Portal Preview.

· Quando l’applicazione, invece, è compilata in Release il comportamento è differente. I dati infatti vengono salvati in locale sul device e l’invio al servizio avviene allo start dell’App oppure al resume della stessa. Nel caso in cui non sia disponibile la connettività l’invio verrà posticipato al prossimo evento di start o resume.

Il secondo elemento di cui tenere conto è che, al momento, il monitoraggio di Application Insights non supporta direttamente le Universal App, ma solamente le Windows Phone App e le Windows Store App; non c’è quindi la voce “Add Application Insights Telemetry” nel menu contestuale della solution. C’è tuttavia un workaround che permette di monitorare anche questo tipo di app.

Come abbiamo detto precedentemente, infatti, una delle operazioni che Visual Studio effettua quando aggiungiamo AI al nostro progetto è il download di un pacchetto da NuGet. Basterà quindi aggiungere ad entrambi i progetti della Universal app il relativo pacchetto NuGet.

Conclusioni

Il monitoring applicativo è una componente molto importante ed abbiamo visto com’è semplice implementarlo utilizzando Application Insights.

Grazie al recente supporto alle App è quindi ora possibile monitorare anche gli aspetti più “interni”, come il verificarsi di eventi, la visualizzazione delle pagine ed il verificarsi di eccezioni, oltre ad aggiungere metriche personalizzate alla dashboard.

La visualizzazione sull’Azure Portal Preview, poi, permette di accedere ai dati in modo semplice e veloce e di poter gestire e configurare grafici e tabelle in modo completo.