Nagios Monitoring von Webanwendungen mit Selenium

von Roland Rickborn

In diesem Posting gehe ich der Frage nach, wie man eine Auerswald Telefonanlage mit einem Monitoring System überwachen kann.

Einführung

Die Telefonanlagen der Firma Auerswald verfügen über keine SNMP Schnittstelle [1] für das Monitoring der Anlage über ein Monitoring System, z. B. Nagios. Störungen an der Anlage bemerkt man im schlechtesten Fall einfach nicht, man freut sich vielleicht sogar über die Ruhe vor dem Telefon. Die Aufgabe bestand also darin, die TK-Anlage und dort insbesondere die VoIP-Anschlüsse ins Monitoring einzubeziehen. Sobald die TK-Anlage nicht betriebsbereit ist oder die VoIP-Anschlüsse nicht verfügbar sind, soll eine Störung gemeldet werden.

Das Problem

Die TK-Anlage bietet keine Monitoring Funktionalität, die von einer externen Anwendung abgefragt werden könnte. Es ist insbesondere nicht möglich, den Status der Anlage oder der VoIP-Anschlüsse per SNMP abzufragen. Die beiden einzigen Möglichkeiten, den Status der Anlage bzw. der Anschlüsse zu kontrollieren, sind: 

  1. Als Benutzer eine Telefonverbindung aufzubauen und das Verbindungssignal abzuwarten (Testanruf)
  2. Sich als Administrator in die Webanwendung der Anlage einzuloggen und den Status manuell zu überprüfen


Beide Lösungen kommen natürlich für das automatische Monitoring nicht in Frage. Aber der Weg über die Webanwendung erscheint für eine Automatisierung geeignet zu sein.

Die Lösung

Der Vorgang der Anmeldung an der Webanwendung und der Kontrolle der VoIP-Anschlüsse in der Webanwendung wurde mit dem Selenium Builder aufgezeichnet. Das daraus resultierende JSON Skript wurde danach so angepasst, dass es zuverlässig mit dem SeInterpreter wiedergegeben werden kann. Insbesondere die xpath Lokatoren mussten überprüft und geändert werden. Eingefügte Print-Kommandos unterstützten das Debugging des Skripts. Damit ist der erste Teil der Aufgabe bewältigt, das automatische Monitoring der VoIP-Anschlüsse.

Für den zweiten Teil der Aufgabe, die Einbindung in ein Monitoring System, wurde ein Nagios Plugin erstellt, welches Selenium JSON Skripte ausführen kann. Das Plugin setzt ein Selenium Grid [2] voraus, an welches es seine Aufträge schicken kann. In unserem Fall wurde auf dem Host, auf dem das Monitoring System läuft, ein Selenium Grid eingerichtet. Mittels Init-Skript [3] wird sowohl der Hub, als auch ein Node mit Firefox im Headless-Modus [4] gestartet. Wer kein Grid ausetzen möchte oder zur Verfügung hat, kann stattdessen die Cloud-Lösung von Sauce Labs [5] verwenden.
Desweiteren setzt das Plugin das Tool SeInterpreter [6] voraus, womit die Ausführung eines Selenium JSON Skripts über die Kommandozeile gestartet werden kann.
Das Plugin kann nur die Status OK und CRITICAL zurückgeben:

STATUS=$(${JAVA_BIN} \
    -Dorg.apache.commons.logging.Log=${LOGGING} \
    -jar ${INTERPRETER} \
    --driver=Remote \
    --driver.url=${HUB} \
    --driver.browserName=${BROWSER} \
    --driver.version=$VERSION \
    ${PARAMETER} \
    ${SCRIPTFILE} 2>&1)

if [[ "${STATUS}" =~ "succeed" ]]; then
    exit "${RC_OK}"
elif [[ "${STATUS}" =~ "failed" ]]; then
    exit "${RC_CRIT}"
fi

Das fertige Skript gibt es bei Nagios Exchange [7] und auf GitHub [8] als Download.

Einbindung ins Monitoring System

Die Einbindung des Plugins ins Monitoring System funktioniert wie bei anderen Plugins. Sie setzt allerdings, wie oben beschrieben, SeInterpreter und Selenium Grid voraus. Die Pfade im Plugin müssen entsprechend angepasst werden. Falls Nagios als Monitoring System zum Einsatz kommt, sieht die Konfiguration des Kommandos in der Datei commands.cfg wie folgt aus:

define command {
  command_name                   check_website_by_selenium
  command_line                   $USER2$/check_website_by_selenium.sh -s $ARG1$ -h $ARG2$ -b $ARG3$ -v $ARG4$
}

Der Aufruf des neuen Kommandos in einem Service in der Datei services.cfg sieht dann so aus:

define service {
  service_description            check_website_by_selenium_demo
  host_name                      demo_host
  use                            check_mk_active
  check_command                  check_website_by_selenium!/tmp/demo.json
}

Tipps

Wie oben erwähnt, bietet die TK-Anlage keine Monitoring Funktionalität. Der Status eines VoIP-Anschlusses wird entweder mit einem grünen oder einem roten Bild in Form einer Kontrolllampe angegeben. Für die Überprüfung der "Kontrolllampe" kommt daher das Selenium Kommando assertElementAttribute zum Einsatz. Der Aufruf im JSON Skript sieht wie folgt aus:

{
  "type": "assertElementAttribute",
  "locator": {
    "type": "xpath",
    "value": ".//*[@id='datas']/tr[2]/td[5]/img"
  },
  "attributeName": "src",
  "value": "http://tk-anlage/images/port_gruen.gif"
}

Sobald sich der Status des überprüften VoIP-Anschlusses ändert, wird von der Webanwendung die rote "Kontrolllampe" in Form von port_rot.gif angezeigt. Dadurch schlägt das obige Assert-Kommando fehl, was dazu führt, dass das Nagios Plugin CRITICAL zurückgibt.
In ähnlicher Weise lassen sich natürlich auch die anderen Assert-Kommandos von Selenium verwenden, z. B. assertTextPresent oder assertAlertText.

Fazit

Im Fall von Webanwendungen, die über keine Monitoring Schnittstellen verfügen, z. B. von Drittanbietern oder bei veralteten Webanwendungen, die nicht mehr gewartet werden, kann das vorgestellte Plugin oftmals eine schnelle und günstige Lösung darstellen. Der Nachteil, dass das Plugin nur die Status OK und CRITICAL wiedergibt, wiegt den Vorteil auf, dass überhaupt ein Monitoring zur Verfügung steht.
Mit etwas Aufwand lässt sich das Plugin so anpassen, dass es auch Performance Angaben wiedergeben kann. Das erfordert natürlich speziell angepasste JSON Skripte für Selenium.

Kategorien: Selenium

Zurück