Eine neue Browser-Toolbar nicht nur für Entwickler

Z-Ray: Raychlich Infos
Kommentare

Im Rahmen des im Juni vorgestellten Zend Server 7 hat Zend Technologies ein neues Feature für Entwickler präsentiert: Z-Ray, eine vom Applikationscode unabhängige Browser-Toolbar, die sich in den HTML-Output einklinkt und vielfältige Informationen des gerade ausgeführten Requests preisgibt.

In der aktuellen Zend-Server-Version 8 hat Z-Ray auf der Featureliste noch einmal mächtig zugelegt: Applikationsspezifische Erweiterungen, Custom Extensions und API-Call-Analyse durch Z-Ray Live. Der erste Teil der Reihe beleuchtet die Installation und die Grundfunktionalitäten von Z-Ray.

Eine Browser-Toolbar? Reichen denn nicht die „Chrome Developer Tools“ und „Firebug“? Außerdem hat doch jedes Framework, Blog- oder Shopsystem sein eigenes Bundle, Modul, Plug-in oder eine Extension zur Analyse von Performance oder Datenbank-Querys. Das ist natürlich richtig. Die Browsertools haben jedoch den Nachteil, dass sie keine Informationen vom Server selbst auslesen können. Und die Erweiterungen der Frameworks und Standard-Apps klinken sich in der Regel sehr tief ins System ein, um an die Informationen heranzukommen.

Z-Ray hingegen ist eine eigene PHP-Extension als Bestandteil des Zend-Servers, die Informationen zur Performanceanalyse, des Speicherverbrauchs, Datenbank-Querys und vieles mehr in einer SQLite-Datenbank zwischenspeichert. Diese Daten werden dann wiederum über AJAX Requests in die Z-Ray-Toolbar nachgeladen. Um Missverständnissen vorzubeugen: Z-Ray ist kein Browser-Plug-in. Der Z-Ray-Code selbst ist HTML und JavaScript, das in den Output des Requests injiziert wird. Außerdem muss die Applikation selbst in keinster Weise geändert oder angepasst werden. Aber der Reihe nach.

Zend Server 8

Zend Server 8 ist ein PHP-Application-Server, der anstelle der von der Distribution ausgelieferten PHP-Version installiert wird. Als Webserver stehen unter Linux Apache und nginx zur Wahl, unter Windows sind es Apache und IIS. Zend Server ermöglicht es – unabhängig von der Plattform – die gleiche PHP-Version auf allen Stages auszurollen. Zend Server 8 unterstützt PHP 5.5 und 5.6, bei Bugs im PHP-Core und Securityproblemen kann sich an das Support- und Entwicklerteam gewandt werden.

Neben den Monitoring- und Performanceoptimierungskomponenten stehen vor allem der Deployment-Prozess und die HA-Cluster-Fähigkeiten im Vordergrund. Durch das REST-API kann jegliche Aktion, die mit Zend Server möglich ist, über Web Services gesteuert und kontrolliert werden. Dank dieser Eigenschaften lässt sich Zend Server problemlos in Continuous-Delivery-Umgebungen implementieren. Ein Satz von so genannten „Continuous Delivery Patterns“ wie z. B. Chef Cookbook, das Nagios- oder Bamboo-Plug-in ist Open Source und kann über GitHub bezogen werden.

Der einfachste Weg, Z-Ray selbst auszuprobieren, ist es, das Ganze auf einem öffentlichen Testserver unter die Lupe zu nehmen. Nun kann eine Standard-WordPress-Applikation oder Drupal in der Basisausstattung schon einmal gut zeigen, was prinzipiell möglich ist – den eigenen Code zu analysieren hat aber natürlich eine ganz andere Qualität. Wie kommt man also zu Z-Ray? Wie oben bereits geschrieben, ist Z-Ray eine PHP-Extension, die Teil des Zend Servers ist.

Um gleich die Angst vor einer Installationsodyssee zu nehmen: Zend Server beinhaltet den PHP-Kern (PHP 5.5 oder 5.6) und erweitert diesen um Zend-Server-spezifische Features, wie z. B. Z-Ray oder das Monitoring (welches auch von Z-Ray genutzt wird). Die Installation ist Dank der Integration ins Paketmanagement nicht schwieriger als die Installation von einem „Vanilla PHP“ mit Apache oder nginx. Im Gegenteil: Durch das Installationsskript lässt sich der Zend Server insbesondere in Verbindung mit nginx mit einer Zeile auf der Command Line ohne weitere Konfiguration installieren. Alternativ kann auch Vagrant oder Docker für die Provisionierung genutzt werden.

Zend Server testen

Eine Installation von Zend Server ist problemlos möglich. Für Windows steht ein EXE-File bereit, für Linux gibt es ein kleines Installationsskript, welche jeweils von der Zend-Website heruntergeladen werden können. Eine manuelle Installation unter Linux ist im Zend-Server-Installationsguide beschrieben.

Wer gerne ein Testsystem mit Vagrant aufsetzen möchte, wird im entsprechenden GitHub-Account fündig. Ein Docker-Container mit Zend-Server-Installation ist über das offizielle Docker Repository verfügbar.

Wer Zend Server direkt mit Puppet oder Chef in die Infrastruktur einbinden möchte, der muss keine eigenen Rezepte resp. Skripte implementieren, sondern wird im GitHub-Account fündig.

Nach der Installation muss Zend Server einem Bootstrapping unterzogen werden. Im Wesentlichen geht es um das Setzen von Passwörtern und Akzeptieren der EULA. Ein Punkt ist jedoch für Z-Ray-Nutzer wichtig: Zend Server kann in den Development-, Production- oder Cluster-Modus gesetzt werden. Z-Ray ist nur im Development-Modus (standardmäßig) aktiviert. Das ergibt durchaus Sinn, denn die Informationsfülle von Z-Ray sollte Entwicklern vorbehalten sein und nicht eine „Debug-Möglichkeit“ für den End-User darstellen. Das Bootstrapping wird durch den Aufruf des Zend-Server-UI unter http://HOSTNAME:10081 aufgerufen. Wer https nutzen will, wechselt auf den Port 10082. Im UI lässt sich Zend Server und somit auch PHP selbst komplett konfigurieren und überwachen. Besonders spannend ist es, wenn ein Cluster im Einsatz ist, da eine Konfigurationsoberfläche Änderungen an alle Knoten im Verbund weitergibt.

Los geht’s

Zend Server ist installiert, Apache, nginx oder IIS ist am Start. Jetzt wird noch eine Applikation gebraucht. Diese kann jetzt nach eigenen Wünschen installiert werden. Sei es manuell oder über Composer, oder andere Wege. Zend Server gibt diesbezüglich keine Vorgaben; es kann exakt so wie mit einem „Vanilla-PHP“ gearbeitet werden. Zend Server hingegen bietet die Möglichkeit, die Vhost-Verwaltung zu übernehmen und stellt in diesem Zusammenhang einen standardisierten Deployment-Prozess bereit. Darüber können einige Open-Source-Applikationen wie WordPress, Drupal oder Magento direkt über die Oberfläche installiert werden.

Ob die Applikation erfolgreich installiert wurde, sieht man am besten im Browser. Und da erwartet uns auch die erste Überraschung: Z-Ray ist aktiv und zeigt uns die ersten Informationen und vielleicht auch Warnungen oder Fehler. Insbesondere dann, wenn die Applikation noch nicht korrekt konfiguriert wurde und es z. B. einen Fehler gibt, weil versäumt wurde, den richtigen Include Path zu setzen.

Fassen wir an dieser Stelle schon einmal kurz zusammen: Z-Ray ist als Bestandteil von Zend Server im Development-Modus direkt aktiv und klinkt sich automatisch in den HTML-Output der Applikation ein, um eine browserunabhängige Toolbar in die Seite zu injizieren, ohne den Code in irgendeiner Form zu modifizieren. Damit hebt sie sich von applikationsspezifischen Debug Toolbars oder Profilern ab. Zum einen ist es egal, welche Applikation mit welchem Framework (wenn überhaupt) im Einsatz ist. Zum anderen muss weder ein Plug-in installiert noch ein Bundle oder Modul aktiviert werden.

Die für diesen Artikel verwendete Beispielapplikation ist ein Drupal-Setup. Um die Applikation zu beschleunigen, wurde das Redis-Modul installiert, das dafür verantwortlich ist, die zu cachenden Items im Key-Value Store von Redis zu hinterlegen. Redis wird uns am Ende des Artikels noch etwas beschäftigen, wenn es darum geht, eine eigene Z-Ray-Extension zu schreiben.

Gehen wir nun ans Eingemachte. Eingeklappt gibt uns die Z-Ray-Statusleiste einen ersten Überblick über den Stand des gerade durchgeführten Requests. Es wird der Response-Code angezeigt, der URL-Pfad, die Seitenladezeit mit Speicherverbrauch und diverse Symbole, die auf Warnungen, Fehler, DB-Querys, Funktionsaufrufe und Request-Infos hinweisen. Besonders interessant: Es gibt auch Bereiche mit dem Drupal-Logo.

Aber alles der Reihe nach. Die Toolbar klappt die Detailansicht auf, sobald auf einen bestimmten Bereich geklickt wird. Ganz links bei Response-Code und URL Path öffnet sich der „Page-Request“-Tab. So weit ist alles selbsterklärend: Angezeigt wird der aufgerufene URL, die HTTP-Action, aber auch die Laufzeit und Anzahl der ausgeführten Datenbank-Querys. Aber wir können auch erkennen, dass es einen Paginator und ein Suchfeld gibt. Bei einem einzigen Request ist das ja eigentlich überflüssig, allerdings nicht, wenn man sieht, dass auch alle AJAX Requests innerhalb dieser Seite ebenfalls von Z-Ray getracet werden. Das ist eins der Highlight-Features, wenn auch auf den ersten Blick nicht sonderlich sichtbar. Die Infos aus jeglichem Request zum Server werden dem einen „Master-Request“ zugeordnet und angezeigt, sobald man diesen in der Liste auswählt.

Der Qualität dieser Funktionalität wird besonders deutlich, wenn man sieht, dass sich die angezeigten Werte in der Statusleiste (Anzahl Funktionen, DB-Queries usw.) bei Auswahl einzelner Request (höchstwahrscheinlich, abhängig vom Request) auch ändern. Wird in der Applikation z. B. ein sich selbst wiederholendes Server-Polling durchgeführt, erkennt man auch den Sinn eines Paginators und der Suche. Die Suche selbst führt übrigens eine Full-Text-Suche auf allen URLs durch.

Wie lange dauert’s denn?

Im „Execution-Time“-Tab wird der Request hinsichtlich Zeit und Speicherverbrauch aufgeschlüsselt. Besonders die Messung, ob die Zeit für den Request im PHP-Code, in der Datenbank, auf der Festplatte oder im Netz hängen geblieben ist, kann im Allgemeinen nur schwer bewerkstelligt werden. Umso wichtiger wird es bei Performanceproblemen, die ja bekanntlich viele Ursachen haben können. Es ist eben nicht immer das Monster-Query oder die x-tausendste Iteration in einer for-Schleife. Problemstellen lassen sich an dieser Stelle also schon einmal eingrenzen.

Der „Monitor-Events“-Bereich ist als Shortcut zum Zend-Server-Monitoring zu verstehen. Zend Server verwaltet eine Regel-Engine, die in bestimmten Fällen ein so genanntes Event triggert. Das kann z. B. eine nach eigener Definition zu lange laufende Funktion sein, ein DB-Fehler, oder auch ganz profane Programmierfehler. Die Events können in drei Prioritäten (Notice, Warning, Critical) unterschiedlich gewichtet werden – und so werden sie auch in Z-Ray angezeigt.

Dauert ein Request z. B. länger als 5 Sekunden, so erhalten wir in Z-Ray ein rotes Fähnchen und ein Link in das Zend-Server-UI zu einem „Slow-Request-Execution“-Event. Braucht der Request mehr als 8 MB Speicher, so sehen wir eine gelbe Flagge für eine Warning aus dem Bereich „High Memory Usage“. Möglich ist auch das Triggern von mehreren Events innerhalb eines Requests; sie werden dann ebenfalls in Z-Ray gelistet und lassen sich nach Typ filtern oder über die Suche spezifizieren. Ein etwas verstecktes Icon oben rechts erlaubt es, diese Events in ein HTML-Dokument zu exportieren. Dieses Feature gibt es übrigens in fast allen Tabs.

Schnell erklärt ist das Tab „Errors & Warning“, wenn es auch im täglichen Gebrauch nicht weniger wichtig ist. Hier werden alle Fehler, die im PHP-Error-Log landen, in ansprechender Form dargestellt. Auch hier gibt es die Filterung nach Typ und eine Volltextsuche. Ein weiteres Minifeature in diesem Bereich ist die Möglichkeit, die mit @ unterdrückten Fehler anzuzeigen – sie fliegen normalerweise unter dem Radar und werden nicht ins Log geschrieben.

Wie oft wird in den Quellcode debuggt, um das eine entscheidende, fehlerhafte Query herauszubekommen? Die Doctrines und Zend_Dbs dieser Welt machen es einem wirklich nicht leicht. Und wenn das Query dann endlich dank eines mutig gesetzten var_dump() im Browser erscheint, war es ein Prepared Statement und statt der Variablen werden nur „?“ als Platzhalter angezeigt. Das „Database-Queries“-Tab kann aus diesem Grund das Entwicklerleben erleichtern. Alle Queries werden gelistet, mit Syntax Highlighting, Filterung, Volltextsuche und gebundene Variablen aus Prepared Statements werden ersetzt. Dazu gibt es Anzeigen für die Laufzeit des Queries und die Anzahl der modifizierten Rows.

Manchmal ist es auch interessant zu erfahren, wo das Query ausgeführt wurde. Da es häufig innerhalb eines DB-Abstraction-Layers passiert, hilft uns der Backtrace weiter. Das kleine Symbol ganz rechts neben dem Query führt uns zu einer anderen Ansicht, in der alle Aufrufe von der index.php bis hin zum DB-Call mit Datei- und Zeilenangabe sowie übergebenen Parametern angezeigt werden. Unterstützt werden zurzeit OCI, MySQL, MySQLi, DB2, SQLite3, PostgreSQL, sowie alle PDO Extensions.

Kommen wir nun zum erschreckendsten Tab: „Functions“ (Abb. 1). Schon die Anzahl der ausgeführten Funktionen, in der Statusleiste ersichtlich, lässt die meisten Entwickler erstaunen. Und das sind nur die eindeutigen Funktionen, nicht die Anzahl aller Aufrufe. Wie dem auch sei, hier bekommt man das eigentliche Big Picture. Was wird aufgerufen? Wie oft? Wie lange hat das gedauert? Um ein wenig Ordnung in die Liste zu bekommen, kann auch hier gefiltert werden. Und zwar nach Class Namespace oder einfach nach einem gesetzten Präfix. Z-Ray nutzt eine gewisse Vorauswahl, die über das Zend-Server-UI beliebig ergänzt werden kann. So bekommt man z. B. auch wirklich nur die eigene Businesslogik zu sehen und nicht das ganze Yii, Symfony oder Zend Framework.

Abbildung: Das Tab „Functions“

Abbildung: Das Tab „Functions“

Die „Request Info“ ist im Wesentlichen selbsterklärend. Aber auch hier versteckt sich ein kleines aber feines Highlight: Bei der Anzeige der superglobalen Arrays werden nicht nur die aktuellen Werte angezeigt, sondern auch die neuen, gelöschten oder geänderten Werte des aktuellen Requests bezüglich des vorhergehenden. Sie werden farblich hervorgehoben und können dementsprechend gefiltert werden. So kann z. B. überprüft werden, ob die Session für einen Warenkorb in einem Shopsystem korrekt gefüllt und aktualisiert wird. Des Weiteren werden über Sub-Tabs die Request Header, Raw Post Data, Reponse Header und Respone Body angezeigt. Das kann vor allem für (REST-)API-lastige JavaScript-Anwendungen von Vorteil sein, wenn man genau nachvollziehen möchte, was am Server reinkommt und wieder rausgeht.

Zu guter Letzt versteckt sich noch ein kleiner, blau-türkiser Käfer in der Statusleiste. Über diesen kann eine Debug- oder Profiling-Session mit der IDE gestartet werden. Neben Zend Studio wird auch PhpStorm unterstützt.

Übersicht über alle Artikel dieser Reihe

Dieser Artikel ist Teil einer Reihe zum Thema Z-Ray. Diese umfasst die folgenden Teile:

Teil 1: Installation und Grundfunktionalität von Z-Ray

Teil 2: Eigene Extensions implementieren

Unsere Redaktion empfiehlt:

Relevante Beiträge

Meinungen zu diesem Beitrag

X
- Gib Deinen Standort ein -
- or -