Wie entwickelt man ein Statistikframework in fünf Schritten?

Die Macht der Klickzahlen


Jeder, der sich mit Internetportalen auskennt, weiß, dass es viele Möglichkeiten gibt, Zugriffsstatistiken zu generieren und sie in einer grafischen Form zu präsentieren. Und jeder Entwickler steht irgendwann einmal vor der Anforderung, einem Kunden statistische Auswertungen einer (Web-)Applikation ermöglichen zu müssen. Vor einigen Jahren entstand daher die Idee, ein Statistikframework für Java-EE-Applikationen zu entwickeln. Diese Artikelserie beschreibt den steinigen Weg von dieser Idee zur heutigen Lösung, die grundlegende Anforderungen wie agile Softwareentwicklung, modularer Aufbau, modernes Caching, Datenbankunabhängigkeit und professionelle Visualisierung erfüllt.

Für Entwickler wird es dann knifflig, wenn der Kunde nicht nur Zugriffszahlen fordert, sondern diese Zahlen mit anwendungsspezifischen Businessdaten verknüpfen und diese Datenkombination auswerten möchte. Als Beispiel: Man möchte auswerten, wie oft eine Webseite von den angemeldeten Benutzern im Alter zwischen 20 und 49 Jahren besucht wurde. Mit den am Markt existierenden Open-Source-„Zugriffssammler“-Lösungen kann man weder ermitteln, welche Daten (z. B.: Alter des Benutzers) auf der Serverseite vorhanden sind, noch diese Businessdaten mit den Zugriffsdaten verknüpfen. Erschwerend kommt hinzu, dass man bei der Auswertung wesentlich komplexere Daten vorliegen hat als bei reinen Zugriffsdaten. Es liegt also nahe, ein Statistikframework für JEE-Applikationen zu entwickeln.

So entsteht ein Framework

Es war von Anfang an klar, dass man mit einfachen Zugriffsstatistiken (Hit pro Seite) nicht viel erreicht. Mit der Größe der JEE-Applikation wuchsen auch die Anforderungen an die Statistikfunktionalitäten. Also musste etwas entwickelt werden, was die folgenden Anforderungen erfüllen kann:

  • modularer Aufbau

  • agile Softwareentwicklung

  • einfache Konfiguration

  • breite Einsatzmöglichkeit

  • geringe Entwicklungszeit

  • geringe Kosten (Verwendung von Open Source, wo es möglich und sinnvoll ist)

Diese Anforderungen können – gleichzeitig – nur dann erfüllt werden, wenn man eine Art Framework entwickelt. Am Anfang des Projekts wollte ich nur ein generalisiertes Statistikmodul zu einer bestehenden JEE-Applikation erstellen. Am Ende ist es ein Framework geworden. Was ich dabei gelernt habe, ist, dass die Zeit, die man in die Planung investiert, sich später mehrfach auszahlen wird!

Der erste Schritt: Daten analysieren

In medias res: Was macht ein Statistikframework überhaupt? Es kann Informationen sammeln (StatisticAnalyser) und diese Information irgendwo sichern (StatisticWriter). Listing 1 zeigt dazu eine passende Konfiguration. In der Konfiguration sieht man, dass es zwei Wege gibt (method), die Statistiken zu erstellen. Entweder kann man es mit filter machen oder mit java über das Java-API des Frameworks. Schauen wir zuerst den Filter an.

Die HttpRequest-Verarbeitung eines Webservers nutzt das „Intercepting Filter Design Pattern“ [1]. Mit einem (Web-)Filter kann man eigene Java-Klassen in diese Kette (Filter Chain) hinzufügen. Bevor die richtige Request-Verarbeitung anfangen würde (z. B.: durch Struts, Spring, JSF usw. Processors), erhält man also die Möglichkeit, auf das Request-Objekt zuzugreifen. Das nutzen wir aus und nehmen die benötigte Information aus dem Request heraus. Listing 2 zeigt die Filter-Klasse und Listing 3 die Konfiguration der Klasse in der web.xml. Zuerst wird im Filter geprüft, ob der angeforderte url für das Framework relevant ist (isFilterApplicable). Falls ja, wird eine StatisticHandler-Klasse aufgerufen. Der StatisticHandler hat nur zwei Aufgaben: zum ersten, die StatisticAnalyser aufzurufen, um die benötigte Information zu besorgen, und zum zweiten, die gesammelte Information an den StatisticWriter zu übergeben, damit sie gesichert werden kann. Listing 4 zeigt, wie der StatisticHandler implementiert ist. Es wird zuerst die Konfiguration ausgelesen, damit der Handler „weiß“, welche Information überhaupt gesucht ist. In der Konfiguration kann man mit dem class-Parameter definieren, welche Analyser-Klasse für die konfigurierte Statistikinformation zuständig ist. Man kann also verschiedene Informationen aus verschiedenen „Quellen“ besorgen. Das Interface des StatisticAnalysers sieht so aus:

public String get(String paramName, HttpServletRequest request, String type);

Die Parameter paramName und type beziehen sich auf die gleichnamigen XML-Attribute aus der Konfiguration (Listing 1). Jede Analyser-Klasse ist von einer AbstractStatisticAnalyser-Klasse abgeleitet. Hier ist die Interfacemethode vorimplementiert. Die Methode versucht, die get + paramName-Methode der aktuellen Analyser-Klasse zu finden (per Reflection). Zum Beispiel nehmen wir die Konfiguration aus Listing 1. Hier wird versucht, die Methode getExportName (get+ <param name="exportName") aus der Klasse, die unter den Spring-Bean-Namen customStatisticAnalyser definiert ist, auszuführen. Über die abstrakte Klasse bekommt jede Analyser-Klasse den Zugriff auf das aktuelle Requ...

Neugierig geworden? Wir haben diese Angebote für dich:

Angebote für Gewinner-Teams

Wir bieten Lizenz-Lösungen für Teams jeder Größe: Finden Sie heraus, welche Lösung am besten zu Ihnen passt.

Das Library-Modell:
IP-Zugang

Das Company-Modell:
Domain-Zugang