Sammeln und Auswerten von Telemetriedaten

Application Insights für Web-Apps
Kommentare

Microsoft Application Insights ist ein Monitoring-System, mit dem die Verfügbarkeit, die Leistung und die Nutzung einer Anwendung analysiert werden können. Dazu stellt das System verschiedene Werkzeuge bereit, um Telemetriedaten zu einer Anwendung zu sammeln. Die gesammelten Daten können dann, ebenfalls mit Werkzeugen von Application Insights, ausgewertet werden. Der vorliegende Artikel vermittelt Ihnen einen Überblick über den Funktionsumfang von Application Insights für Webanwendungen. 

Application Insights befindet sich aktuell in der Preview-Phase. Die erste Vorabversion wurde Ende 2013 als Teil von Visual Studio Online veröffentlicht. Mittlerweile wurde das System nach Microsoft Azure portiert, daher existieren zurzeit zwei Versionen von Application Insights. Microsoft fokussiert sich aktuell auf die Version, die unter Azure läuft, weshalb ich deren Nutzung empfehlen würde. Zumal alle neuen Features ausschließlich in diese Version integriert werden und der Funktionsumfang beider Versionen daher sehr unterschiedlich ausfällt. Auch das User Interface der Azure-Version wurde enorm weiterentwickelt und hat keinerlei Ähnlichkeit mehr mit der Version, die unter Visual Studio Online verfügbar ist. Im weiteren Verlauf des Artikels wird die Azure-Version genauer unter die Lupe genommen.

Application Insights kann grundsätzlich sowohl mit Web-, als auch mit Windows Store- und Windows Phone Store Apps umgehen. Die Integration von Application Insights in eine Universal App gestaltet sich heute noch immer etwas problematisch, obwohl Microsoft diese App-Variante für Windows-Apps empfiehlt. Hier fehlt allerdings beispielsweise noch der Assistent in Visual Studio. So muss man dem Projekt die notwendigen NuGet-Pakete und die benötigten Konfigurationen per Hand hinzufügen. Microsoft hat aber eine einfache Einbindung von Application Insights in Universal Apps auf der Agenda, ein Releasedatum für die Unterstützung von Universal Apps oder gar Application Insights insgesamt ist jedoch noch nicht bekannt. Web-Apps können aber bereits mit der aktuellen Preview-Version schon sehr gut analysiert und ausgewertet werden. Daher werden im weiteren Verlauf des Artikels die bestehenden Möglichkeiten von Application Insights in Verbindung mit Web-Apps gezeigt.

Application Insights über Azure Portal verwenden

Um Application Insights in der Azure-Version nutzen zu können, wird ein Azure-Konto benötigt. Bei der Erstanmeldung auf der Plattform erhält man ein Guthaben von 150 Euro für alle Azure- Dienste. Da sich Application Insights aktuell in der Preview befindet, wird es von Microsoft kostenlos angeboten. Hat man sein Azure-Konto eingerichtet, können die Funktionen von Application Insights verwendet werden. Diese finden sich im neuen Azure-Portal, das sich ebenfalls gerade in der Previewphase befindet. Über dieses können einige Funktionen von Application Insights direkt verwendet werden, ohne dass eine Webanwendung modifiziert werden muss. Für andere Funktionen müssen entsprechende Aufrufe an das Application-Insights-API in den .NET- bzw. JavaScript-Code eingefügt werden.

Verfügbarkeit mit Webtests sicherstellen

Application Insights kann die Verfügbarkeit einer Web-App mit so genannten Webtests messen. Hierbei führt Application Insights regelmäßig einen Ping auf einen konfigurierbaren URL der Web-App durch. Überscheitet der Ping eine bestimmte Antwortzeit, geht Application Insights davon aus, dass die Web-App nicht mehr erreichbar ist, und vermerkt dies in den Telemetriedaten. Ist ein Ping nicht erfolgreich, kann man sich von Application Insights via E-Mail benachrichtigen lassen. Dieses Werkzeug kann daher insbesondere dazu genutzt werden, die Erreichbarkeit einer Web-App zu messen und aktiv zu überwachen. Abbildung 1 zeigt, wie Application Insights diese Informationen im Portal darstellt.

Abb. 1: Grafische Darstellung von Webtests

Im Beispiel aus Abbildung 1 habe ich zwei Webtests eingerichtet. Beide führen einen Ping auf eine Web-App durch, die auf einem Server in Europa gehostet ist. An den durchschnittlichen Ping-Zeiten lässt sich gut erkennen, dass ein Zugriff auf die Web-App von Amsterdam aus schneller ist als von Chicago aus. Weiterhin sieht man, dass 99 Prozent aller Pings innerhalb des eingestellten Zeitfensters von 12 Stunden erfolgreich waren. Die App weist also eine Verfügbarkeit von 99 Prozent innerhalb der letzten 12 Stunden auf. Ein Ping hatte eine sehr lange Antwortzeit, ansonsten war die Web-App konstant schnell erreichbar.

Leistung mit dem SDK erfassen

Um die Leistung einer Web-App zu erfassen, muss das Application Insights SDK zu der Web-App hinzugefügt werden. Bei einer Web-App kann die Leistung sowohl am Server als auch am Client (im Browser) gemessen werden. Daher existieren zwei unterschiedliche SDKs.

Für die Auswertung bezüglich des Servers benötigt man ein NuGet-Paket, das dem ASP.NET-Projekt direkt hinzugefügt wird. Dazu wird zusätzlich eine Konfigurationsdatei benötigt, in der unter anderem die ID der Application-Insights-Instanz angegeben wird, an die die Informationen gesendet werden sollen. Um es zu vereinfachen, Application Insights zu einem Projekt hinzuzufügen, hat Microsoft einen Assistenten in Visual Studio integriert. Mit einem Rechtsklick auf ein Webprojekt im Projektmappen-Explorer kann im Kontextmenü der Eintrag Add Application Insights Telemetry to Project ausgewählt werden (Abb. 2, links). Anschließend wird man durch einen Dialog geführt, der die NuGet-Pakete letztendlich hinzufügt und die Konfigurationsdatei entsprechend füllt.

Das SDK zur Clientauswertung ist hingegen ein JavaScript SDK. Es wird im Tag jeder HTML-Seite einer Web-App registriert. Das Script selbst, das in den Tag eingefügt werden muss, lässt sich über das Azure-Portal beziehen. Hierzu muss im Azure-Portal ein Diagramm angeklickt werden, das Daten aus dem Browser darstellt. Wurden noch keine Daten vom Browser gesendet, zeigt das Azure-Portal als Hilfestellung das einzufügende Script an (Abb. 2, rechts). Anschließend kopiert man dieses Script und fügt es in seine Web-App ein. Bei einer ASP.NET-MVC-Anwendung kann das Script beispielsweise zentral im Tag der _Layouts.cshtml-Datei eingefügt werden. Diese Datei wird standardmäßig von allen anderen Views verwendet. Somit ist die Registrierung des Application Insights SDKs zentral an einer Stelle möglich.

Abb. 2: Hinzufügen des Application Insights SDK im Server und Client

Ist das alles erledigt, müssen keine weiteren Änderungen an einer Web-App vorgenommen werden. Allein durch das Hinzufügen der SDKs kann Application Insights nun jede Menge Leistungsdaten zu einer Anwendung sammeln. Abbildung 3 zeigt beispielhaft, wie Application Insights die gesammelten Daten darstellen kann.

Abb. 3: Grafische Darstellung von Leistungsdaten

Die oberen blauen Werte zeigen, wie schnell der Browser Daten vom Webserver erhält, bzw. diese verarbeitet. Der grüne Wert zeigt die durchschnittliche Antwortzeit des Webservers bei einem Request. Durch die Grafik können wir ebenfalls feststellen, dass in unserer Anwendung im Browser keine nicht gefangenen JavaScript-Exceptions geworfen wurden. Der letzte Wert zeigt die Anzahl der Seitenaufrufe. Dies ist nur ein kleiner Ausschnitt der Daten, die durch Application Insights erfasst und dargestellt werden. Durch das Erfassen und Auswerten der Leistungswerte einer Anwendung ist es möglich, herauszufinden, wo Performanceprobleme liegen könnten. Ich achte zum Beispiel bei Single Page Applications (SPA) gerne auf das Verhältnis zwischen Seitenansichten und Web-Requests. Die beste SPA nutzt nichts, wenn sie zu viele Requests an den Server sendet und damit für den Benutzer zu träge wird. Dies lässt sich mit Application Insights beobachten. Obwohl es auch möglich ist, nur das Server- bzw. nur das Client-SDK zu nutzen, empfehle ich immer die Verwendung von beiden SDKs parallel. Der Aufwand zum Hinzufügen beider SDKs ist so minimal, dass er gegenüber dem späteren Nutzen (Telemetriedaten sowohl vom Server als auch vom Client zu erhalten) nicht ins Gewicht fällt.

Nutzung durch Events transparent machen

Um herauszufinden, wie eine Anwendung vom Benutzer verwendet wird, bietet Application Insights die Möglichkeit, anwendungsspezifische Events zu erfassen. Hiermit können wir zum Beispiel herausfinden, welche Funktionen einer Anwendung am häufigsten verwendet werden. Ohne dass man etwas tun muss, erfasst Application Insights standardmäßig die aufgerufenen HTML-Seiten. Bei einer SPA ist das jedoch nicht besonders hilfreich, da nur eine einzige Seite existiert. Schöner wäre es, die einzelnen Views der SPA zu erfassen. Dies geschieht jedoch nicht automatisch. Hier muss beim ersten Mal der Code innerhalb der Anwendung erweitert werden. Durch die Einbindung des JavaScript SDKs steht uns die globale Variable appInsights zur Verfügung. Diese enthält ein JavaScript-Objekt, das die Funktionen des SDKs bereitstellt. Listing 1 zeigt, wie die Aufrufe von einzelnen Views einer AngularJS-Anwendung, die mit dem UI-Router arbeitet, mithilfe des SDKs an Application Insights gesendet werden können.

// AngularJS App erstellen
var myApp = angular.module("MyWebClient", ["ui.router"]);

// Event zum wechseln der View abonnieren
myApp.run(["$rootScope", "$state", function ($rootScope, $state) {
    $rootScope.$on("$locationChangeSuccess", function () {
        // Sobald sich die View geändert hat den Namen des aktuellen UI State an 
        // Application Insights senden
        appInsights.trackPageView($state.current.name);
    });
}]);

Haben wir eine klassische Webanwendung (eine HTML-Seite pro View, bzw. eine ASP.NET MVC-Anwendung) oder eine SPA mit AngularJS, der das in Listing 1 gezeigte Script hinzugefügt wurde, zeigt uns Application Insights ein Ranking der am häufigsten besuchten Views unserer Anwendung. Abbildung 4 zeigt am Beispiel einer SPA, wie dies in Application Insights dargestellt werden kann.

Abb. 4: Ranking der Views

Die View-Namen mit einem Punkt im Namen entsprechen dabei den States des UI-Routers. „My Angular App“ ist der Titel der Haupt-HTML-Seite der Anwendung.

Neben der Erfassung der Views ist es darüber hinaus möglich, anwendungsspezifische Events zu erfassen. Dies ist nützlich, wenn die Häufigkeit einer Benutzeraktion gemessen werden soll, die jedoch nicht direkt in dem Aufruf einer neuen View endet. Das Erfassen solcher Events ist wiederum sowohl im Client via JavaScript als auch auf dem Server via .NET möglich. In beiden Fällen ist es im einfachsten Fall ausreichend, den Namen des Events an Application Insights zu senden. Im Fall von JavaScript wird dazu die globale Variable appInsights verwendet und darauf die Funktion TrackEvent aufgerufen:

appInsights.trackEvent(„MyEvent“);

In .NET wird die Klasse TelemetryClient verwendet und die Methode TrackEvent aufgerufen. Hierbei kann der parameterlose Konstruktor verwendet werden. Die Klasse liest die Application-Insights-Konfigurationsdatei ein, um die Daten an die richtige Instanz zu senden:

TelemetryClient telemetryClient = new TelemetryClient(); telemetryClient.TrackEvent(„MyEvent“);

Die Daten können von Application Insights ähnlich dargestellt werden wie die Seitenaufrufe in Abbildung 1. Es ist aber auch möglich, die Daten nicht nur als Tabelle, sondern auch als Grafik anzuzeigen. Hier bietet Application Insights verschiedene Anpassungsmöglichkeiten in der Benutzeroberfläche, die sich jeder Benutzer individuell einstellen kann.

Die Funktionalität zum Erfassen beliebiger Events kann dazu genutzt werden, mehr über das Nutzerverhalten der Anwender einer Web-App zu erfahren. Mit jedem Event können außerdem beliebige Parameter an die Application-Insights-Telemetriedatenbank gesendet werden. Denkbare Fragestellungen, die wir damit beantworten könnten, wären zum Beispiel die folgenden: Wie oft wird ein bestimmter Bericht mit welchen Parameter- bzw. Filtereinstellungen verwendet? Oder: Wie oft startet ein Benutzer einen Workflow bzw. bricht ihn wieder ab?

Fazit

Application Insights ist ein mächtiges Werkzeug. Es bietet mit keinem bzw. geringem Integrationsaufwand einen großen Nutzen. Wer schon immer mehr darüber erfahren wollte, wie seine Web-App genau verwendet wird bzw. wo Probleme liegen könnten, sollte sich das System einmal genauer anschauen. Obwohl es noch in der Preview-Phase ist, kann man schon sehr viele Informationen zu seiner Anwendung erfassen und auswerten. Die Integration in eigene Anwendungen fällt leicht. Hilfestellung ist oftmals sogar direkt im Portal zu finden (zum Beispiel das JavaScript-Code-Snippet zur Integration in den Webclient). Positiv ist zudem zu bewerten, dass die Einstiegshürde an sich äußerst gering ist, da sehr viele Daten gesammelt werden können, ohne dass große Modifikationen an einer Anwendung notwendig sind. Für Neueinsteiger empfehle ich die Dokumentation direkt auf der Azure-Homepage. Sie ist übersichtlich gestaltet und enthält leicht verständlichen Beispielcode.

Sehr gut gefällt mir auch das Konzept hinter dem neuen Azure-Portal. Benutzer haben hiermit grundsätzlich die Möglichkeit, personalisierte Dashboards zur Analyse der gesammelten Daten zu konfigurieren. Mir persönlich fehlen jedoch noch Möglichkeiten, die Diagramme genauer nach meinen persönlichen Vorstellungen anzupassen. Zum Beispiel gibt es aktuell noch keine Tortendiagramme, außerdem hat man lediglich einfache Möglichkeiten, Daten zu segmentieren. An dieser Stelle bleibt zu hoffen, dass Microsoft noch etwas in den Ausbau der Analysewerkzeuge investiert.

Bedauerlich ist auch, dass es noch keinen Zeitplan gibt, wann mit einem Release zu rechnen ist. Wie üblich sollte man bis dahin davon ausgehen, dass es zu Ausfällen oder größeren Änderungen kommen kann. Dies ist der Preview-Phase geschuldet, sollte aber niemanden davon abhalten, Application Insights schon jetzt zu verwenden.

Unsere Redaktion empfiehlt:

Relevante Beiträge

Meinungen zu diesem Beitrag

X
- Gib Deinen Standort ein -
- or -