End-to-End-Monitoring mit CasperJS

Seid ihr alle da?

Das Monitoring der Infrastruktur hat viele Facetten. Im einfachsten Fall wird überprüft, ob die relevanten Server erreichbar sind. Doch machen sie auch, was sie sollen? Für Funktionstests lassen sich freie Tools wie CasperJS verwenden, das wir hier näher vorstellen.
Damit Sie als Admin stets über alle Parameter Ihrer IT Bescheid wissen, befasst sich IT-Administrator im Juni mit dem Schwerpunkt 'Monitoring'. Darin lesen Sie ... (mehr)

Ping. Pong. Die Website ist erreichbar. Soweit das Monitoring-System. Aber erlaubt das eingesetzte Shop-System den Besuchern auch, die digitalen Produkte einzukaufen? Hier gibt es viele Fehlerquellen, die verhindern können, dass eine komplexe Website wie erwartet funktioniert: die Datenbank dahinter, die Firewall-Konfiguration oder auch der eben aktualisierte Javascript-Code einschließlich einem halben Dutzend aktualisierter Libraries.

In der Software-Entwicklung hat sich das automatisierte Testen unter dem Stichwort Continuous Integration etabliert. Dabei wird üblicherweise zwischen Unit-Tests, die das Verhalten einzelner Software-Komponenten gegenüber definierten Tests überprüfen, und funktionalen Tests, die eben die Funktion größerer Blöcke testen, unterschieden. Unter dem Schlagwort "DevOps" werden solche Methoden auch beim Server-Management angewandt und beispielsweise mit Monitoring-Systemen integriert.

Auch beim Monitoring lassen sich Größe und Umfang eines Tests wählen. Ein grundlegender Test ist dabei beispielsweise die Verfügbarkeit eines Diensts. So könnte man in der Prozesstabelle nachsehen, ob der nötige Service überhaupt läuft – und ihn gegebenenfalls automatisch starten, wie dies etwa systemd, monit oder supervisord tun. Diese Methode ist aber nicht zuverlässig: Möglicherweise steckt der Prozess in einer endlosen Schleife fest oder irgendein Bug verhindert, dass er seiner Arbeit nachgeht.

Testen von Funktionalität

Der nächstbessere Ansatz ist deshalb, zu prüfen, ob ein Server Netzwerkverbindungen annimmt. Hiermit lässt sich zumindest die grundlegende Funktion überprüfen. Beispiele dafür sind SMTP-, IMAP-, Web-, Datenbankserver und so weiter. Im nächsten Schritt wird getestet, ob die Dienste in der Lage sind, ein bestimmtes Quantum der geplanten Tätigkeit zu verrichten, etwa das Verschicken oder Abrufen einer Mail, die Auslieferung einer Webseite oder eine SQL-Abfrage.

 Streng genommen wird dabei nicht mehr nur eine Komponente getestet, sondern ein mehr oder weniger definiertes Konglomerat, das seinen Teil dazu beiträgt, dass Dienste funktionieren oder auch nicht. So könnte beispielsweise eine Fehlerquelle beim Verschicken einer Mail wieder die Firewall-Konfiguration oder auch ein Problem mit dem DNS sein. Je nach Konfiguration ist dieses Problem beliebig komplex.

Im Folgenden wollen wir vorführen, wie ein solcher Test einen komplexen Ablauf auf einer Website testen kann, die ebenfalls verschiedene Komponenten wie Webserver, Datenbank, Shopsystem, HTML- und Javascript-Code einbezieht. Für diese Methode, die auch unter dem Begriff End-to-End-Monitoring bekannt ist, gibt es ausgewachsene Open-Source-Tools wie Al'exa oer Sakuli, die Methoden der Bilderkennung verwenden, um Benutzerverhalten zu simulieren. Wir werden hier CasperJS [1] verwenden, das den HTML-Code analysiert und den Benutzer somit auf Quellcode-Ebene simuliert. Es basiert wiederum auf PhantomJS [2], einer Art gescriptetem Webbrowser auf der Commandline ("headless browser").

Listing 1: phantom-test.js



var page = require('webpage').create();
page.open('http://www.admin-magazin.de',
    function(status) {
    console.log("Status: " + status);
    if(status === "success") {page.render('website.png');
    }
    phantom.exit();
})

Installation von PhantomJS

Zur Installation laden Sie sich zunächst die passende Version von PhantomJS von der Website herunter und entpacken sie, etwa mit »tar xf phantomjs-2.1.1-linux-x86_64.tar.bz2« (64-Bit-Version). Das Programm "phantomjs" finden Sie anschließend im Verzeichnis »phantomjs-2.1.1-linux-x86_64/bin« . Wenn Sie es ausführen, landen Sie im interaktiven Modus, in dem Sie Javascript-Funktionen eingeben können. Für einen ausführlicheren Test speichern Sie Listing 1 (das sie auch auf der PhantomJS-Website finden) in der Datei "phantom-test.js" ab und führen es mit »phantomjs phantom-test.js« aus.

Bild 1: Der Shop zeigt in einem Popup das hinzugefügte Produkt an.

Hat alles geklappt, finden Sie im aktuellen Verzeichnis die Datei "website.jpg" mit einem Screenshot der Website. Hier lässt sich schon das Potenzial des Tools erahnen, das mit wenigen Zeilen einen kompletten Webseitenabruf emuliert und in einen Screenshot umgewandelt hat. Hierzu noch eine kurze Randnotiz: Bei aktuellen Websites, die sich auf Mobilgeräte einstellen ("responsive design"), kann es passieren, dass PhantomJS als Mobilgerät wahrgenommen und die Website deshalb sehr schmal gerendert wird. Um dies zu verhindern, können Sie die "Breite" Ihres virtuellen Browsers so einstellen:

var page = require('webpage').
   create({
        viewportSize: {
          width: 1920,
          height: 1080
        }
});

Im nächsten Schritt installieren Sie CasperJS, wofür die Javascript-Umgebung Node.js und deren Paketmanager NPM nötig sind, die Sie von [3] herunterladen können. Die LTS-Version (Long Term Support) war zum Redaktionsschluss 6.10.0. Zur Installation entpacken Sie die Datei in "/usr/local" und legen zwei symbolische Links zu den beiden Binaries an:

$ sudo tar xf node-v6.10.0-linux-x64.tar.xz -C /usr/local
$ sudo ln -s /usr/local/node-v6.10.0-linux-x64/ /usr/local/node
$ sudo ln -s /usr/local/node/bin/node /usr/local/bin/node
$ sudo ln -s /usr/local/node/bin/npm /usr/local/bin/npm

Ein Aufruf von »node --version« verrät, ob die Installation erfolgreich war. CasperJS installieren Sie mit dem Befehl »npm install casperjs« . Per Default installiert NPM Node-Module im lokalen Verzeichnis "node_modules", wo Sie anschließend das CasperJS-Binary finden: "node_modules/casperjs/bin/casperjs". Alternativ ist es auch möglich, CasperJS "global" im Dateisystem zu installieren, wenn Sie npm mit "-g" aufrufen.

Listing 2: title.js

var casper = require('casper').create();
casper.start('http://www.it-administrator.de/');
casper.then(function() {
     this.echo('title: ' + this.getTitle());
});
casper.run();

CasperJS lässt sich ähnlich wie PhantomJS verwenden. Erstellen Sie für einen ersten Test eine Datei mit dem Inhalt von Listing 2 und speichern Sie sie als "title.js". Führen Sie sie aus, bekommen Sie den Titel der IT-Administrator-Website angezeigt:

$ node_modules/casperjs/bin/casperjs test.js
title: IT-Administrator - Praxiswissen für Systemadministration und Netzwerkadministration

So lässt sich in wenigen Zeilen "Web Scraping" betreiben, das skriptgesteuerte Extrahieren von Informationen aus einer Webseite. Jetzt sind es nur noch wenige Schritte zum automatisierten Test. Für einfache Tests vergleichen Sie den von der Website gelieferten Wert mit einer im Skript formulierten Erwartung. Oder Sie implementieren das Nagios-Plug-in-Interface [4] und geben die von dem freien Monitoring-System erwarteten Status-Codes zurück (Listing 3).

Listing 3: check.js



var plugin = "titlecheck";
var title_expect = "IT-Administrator - Praxiswissen für Systemadministration und Netzwerkadministration"
var casper = require('casper').create();
casper.start('http://www.it-administrator.de/');
casper.then(function() {
    title_real = this.getTitle();
    if (title_real == '') {
        exit('CRITICAL', 2, "no title");
    } else if (title_real != title_expect) {
        exit('WARNING', 1, "title changed");
    } else if (title_real == title_expect) {
        exit('OK', 0, 'title ok');
    } else {
        exit('UNKNOWN', 3, "unknown error");
    }
});
function exit(state, exit_code, msg) {
    console.log(plugin + ' ' + state + ': ' + msg);
    casper.exit(exit_code);
}
casper.run();

Statt den Erwartungswert im Skript festzulegen, ist es natürlich auch möglich, ihn etwa als Commandline-Parameter zu übergeben (hier ohne Fehlerbehandlung):

title_expect = casper.cli.args[0]

Da Node respektive NPM ein reichhaltiger Fundus an Paketen ist, sind der Fantasie hier keine Grenzen gesetzt. Auch Daten aus einer Datenbank zu lesen, ist damit kein Problem (beispielsweise mit dem MySQL-Modul per »npm install mysql« ).

Alternativ zur vorgestellten Methode enthält CasperJS auch eine Test-Library, die es erlaubt, Tests wie in der Software-Entwicklung zu schreiben. Dazu bietet das Framework Sprachkonstrukte wie "test.assertTitle", "test.assertExists", "test.assert-UrlMatch" und so weiter, die das Schreiben von Tests vereinfachen. Bei einem Testlauf gibt CasperJS die Ergebnisse farblich markiert aus, sodass gleich ersichtlich ist, wenn ein Test fehlgeschlagen ist. Darüber hinaus erlaubt CasperJS den Export der Testergebnisse im XUnit-Format, das es beispielsweise ermöglicht, die Tests in Umgebungen wie den Continuous-Integrations-Server Jenkins zu integrieren.

Bild 2: Das Ergebnis des Testlaufs zeigt: Das Heft wurde in den Warenkorb gelegt.

Ähnliche Artikel

comments powered by Disqus

Artikel der Woche

Eigene Registry für Docker-Images

Wer selber Docker-Images herstellt, braucht auch eine eigene Registry. Diese gibt es ebenfalls als Docker-Image, aber nur mit eingeschränkter Funktionalität. Mit einem Auth-Server wird daraus ein brauchbares Repository für Images. (mehr)
Einmal pro Woche aktuelle News, kostenlose Artikel und nützliche ADMIN-Tipps.
Ich habe die Datenschutzerklärung gelesen und bin einverstanden.

Konfigurationsmanagement

Ich konfiguriere meine Server

  • von Hand
  • mit eigenen Skripts
  • mit Puppet
  • mit Ansible
  • mit Saltstack
  • mit Chef
  • mit CFengine
  • mit dem Nix-System
  • mit Containern
  • mit anderer Konfigurationsmanagement-Software

Google+

Ausgabe /2019