Open Source im professionellen Einsatz
Linux-Magazin 11/2016
© dolgachov, 123RF

© dolgachov, 123RF

Proaktives Monitoring

Alle Achtung!

Spätestens dann, wenn eine Monitoring-Software auf den Ausfall eines Dienstes oder Servers hinweist, sind Systemverwalter gefragt. Im Gegensatz zu diesem reaktiven Ansatz ermöglicht es proaktives Monitoring, Probleme im Vorfeld zu erkennen.

1729

Viele Monitoring-Lösungen reagieren auf ein Problem, sobald ein vom Admin festgelegter Schwellenwert erreicht ist. Diese Werte beruhen meist auf Erfahrung, führen aber regelmäßig zu Verstimmungen beim Bereitschaftsdienst, wenn beispielsweise Festplatten-Auslastungen während eines Backups über einen Grenzwert steigen und mitten in der Nacht einen Alarm auslösen.

Anstelle dieses reaktiven Monitorings propagieren der Entwickler Kyle Kingsbury und sein Team das so genannte proaktive Monitoring mit Riemann [1] – Systemverwalter sollen künftige Ausfälle vorhersehen können, um rechtzeitig Gegenmaßnahmen einzuleiten.

Bei dem 2012 zuerst veröffentlichten Programm handelt es sich um einen so genannten Event-Stream-Prozessor, das heißt: per Protokollpuffer schicken angeschlossene Hosts Ereignisse zum Riemann-Server. Jedes Event enthält Daten zum Host, eine Service-Beschreibung, einen Status, den Zeitpunkt der Messung sowie eine Gültigkeitsdauer. Riemann verarbeitet die empfangenen Events und aggregiert Werte zu statistischen Mitteln. Mit einer funktionalen Sprache konfigurieren Admins den Eventfluss, etwa um die Daten an andere Programme zwecks Auswertung weiterzureichen. Auch das Alarmieren eines zuständigen Mitarbeiters oder Teams ist möglich.

Wie geht's?

Die Richtung ist also umgekehrt wie bei reaktivem Monitoring: Überwachte Hosts senden von sich aus Metriken an Riemann und beurteilen ihren Status selbst, statt diese Entscheidung einer zentralen Instanz zu überlassen [2]. Neben dem Riemann-Server, der in Clojure implementiert ist und in einer Java Virtual Maschine läuft, gibt es ein Webinterface (das Riemann-Dash) sowie diverse Clients für Linux, OS  X und Windows.

Der Riemann-Dienst hält alle Informationen in seinem Index vor und nutzt diesen, um die Anfragen der Clients zu beantworten. Der Index befindet sich ausschließlich im RAM und speichert für jede empfangene Metrik genau einen Wert – jeweils den neuesten. Nach dem Neustarten des Riemann-Prozesses ist also kein Bezug mehr auf vorherige Events möglich. Auch historische Analysen sind nur dann drin, falls Admins das Logging für die Komponenten eingerichtet haben.

Mit Hilfe externer Tools ist dieser kleine Schönheitsfehler aber zu verschmerzen. Der Artikel zeigt neben dem Installieren und Konfigurieren der Serverkomponente auch, wie die Zusammenarbeit mit Linux-Clients gelingt (siehe Kasten "Die Testumgebung"), welche Möglichkeiten das Riemann-Dash bietet und wie Benutzer die gesammelten Daten längerfristig archivieren.

Die Testumgebung

Zum Einsatz kam Version 0.2.11 vom 20. April 2016 unter Centos 7.1 und Ubuntu 16.04. Die Tester simulierten zwei Rechenzentren an unterschiedlichen Standorten. In der kleineren Niederlassung laufen ein Webserver, ein Datenbankserver und ein Riemann-Server, der lokal Events empfängt, sammelt und an die zentrale Riemann-Instanz im Hauptrechenzentrum sendet.

Dort arbeiten auf insgesamt drei Hosts zwei Webserver und ein Datenbankserver, ein Load Balancer und die zentrale Riemann-Instanz. Dieser Server wertet die Ereignisse der kleineren Niederlassung so aus, als hätte er sie direkt erhalten. Auf diese Weise ist es möglich, Nachrichten zwischenzuspeichern und eventuelle Verbindungsprobleme zwischen den Standorten abzufangen.

Das Riemann-Projekt bietet auf der Startseite [1] ein Debian- und ein RPM-Paket sowie die Quellen zum Download an. Voraussetzung für das Installieren und Betreiben von Riemann ist ein Java Software Development Kit; laut Projektseite arbeitet Riemann mit Oracle JDK und Open JDK in den Versionen 7 und 8 zusammen. Auf dem Testrechner kam das Open JDK 1.8 aus dem Epel-Repository (Extra Packages for Enterprise Linux) zum Einsatz. Für den Riemann-Client und das -Dashboard spielen Nutzer zudem das Paket »ruby-dev« ein.

Im Riemann-Serverpaket sind der vorkompilierte Clojure-Bytecode, ein Shellskript zum Starten, Stoppen und Neuladen der Konfiguration (»/etc/init.d/riemann« ) sowie eine minimale Einrichtungsdatei (»/etc/riemann/riemann.config« ) enthalten, die für erste Gehversuche ausreicht. Auf aktuellen Distributionen nutzt Systemd das Initskript, um den Daemon zu steuern. Unter Centos 7 verhindert es derzeit allerdings das Ausführen von »service riemann reload« . Das Problem ist bekannt [3] und dürfte in der kommenden Release behoben sein. Da der Index im flüchtigen Speicher liegt, ist ein Stoppen und anschließendes Starten keine gute Idee. Als Zwischenlösung schicken Admins von Hand »kill -SIGHUP« an die Riemann-PID.

Gut eingerichtet

Bevor es ans Eingemachte geht, sollten Benutzer prüfen, ob das Senden und Empfangen von Events klappt. Sie spielen dazu über »sudo gem install riemann-cli« die Kommandozeilen-Schnittstelle ein, was weitere Ruby-Gems (darunter Thor, Beefcake, Trollop und den Riemann-Client) nachzieht. Listing 1 zeigt das Verschicken eines Ereignisses und das anschließende Auslesen mit dem Tool »riemann-cli« .

Listing 1

Test-Event verschicken und abrufen

01 # riemann-cli send --service=TestEvent --metric="31337" --state=warning --ttl=20 --description="Dies ist ein Test-Event" --tags=riemann test
02 # riemann-cli query --string='service = "TestEvent"'
03 {host:"dc-monitoring.kr.naetverk.net", service:"TestEvent", state:"warning", time:1472220028, description:"Dies ist ein Test-Event", tags:["riemann", "test"], metric_f:31337.0, metric_d:, metric_sint64:31337, ttl:20.0}

Wie die Ausgabe zeigt, definiert der Client alle Felder und schickt sie an den Server. »tags« ermöglichen es, Hosts zu gruppieren oder Zuordnungen zu Produktions- und Testumgebungen vorzunehmen. Die drei Felder »metric_f« , »metric_d« und »metric_sint64« enthalten die Metrik als Float, Double oder Signed 64-Bit-Integer. Die Clients wählen selbst die Darstellung aus; Listing 1 zeigt, dass Riemann die Events als Float und Integer im Index hinterlegt hat. Last but not least, finden Anwender Hinweise zur Gültigkeitsdauer des Events (»ttl« ) – Riemann prüft regelmäßig Ereignisse in seinem Index und löscht abgelaufene.

Wer mehr zu den Datentypen erfahren möchte, findet eine Erklärung auf der Mailingliste [4]. Riemann unterstützt auch komplexere Abfragen. Die Dokumentation auf der Projektseite enthält zahlreiche Beispiele – mit ein bisschen Geduld ist das Format nach kurzer Zeit geläufig. Die Syntax benötigen Anwender ebenfalls für das Riemann-Dash, um die Widgets einzurichten (siehe Abschnitt "Ins Bild gesetzt").

Die Serverkonfiguration (»/etc/riemann/riemann.config« ) ist ein Clojure-Skript [5]. Die Funktionen dieses Lisp-Dialekts folgen der polnischen Notation, die Funktion steht also zuerst und dann kommen alle Argumente. So definiert »(+ 1 3)« zuerst eine Addition und führt danach die Summanden auf. Ein Artikel aus dem Jahr 2010 führt in die Clojure-Programmierung ein und stellt die grundlegenden Konzepte vor [6].

Listing 2 zeigt die Konfigurationsdatei des zentralen Riemann-Servers, wie sie in der Testumgebung zum Einsatz kommt. Die erste Funktion der Einrichtungsdatei schaltet das Protokollieren ein; die Logfiles landen in »/var/log/riemann/riemann.log« . Danach ist die Funktion »graph« definiert. Sie ruft eine Unterfunktion namens »graphite« auf; als Parameter erhält diese den Hostnamen des Graphite-Servers (siehe Abschnitt "Teamwork mit Graphite").

Listing 2

Konfiguration des zentralen Servers

01 ; Aktivieren des Logs:
02 (logging/init {:file "/var/log/riemann/riemann.log"})
03
04 ; Anbinden des Graphite-Servers:
05 (def graph (graphite {:host "graphite-server"}))
06
07 ; Aktivieren aller Interfaces für TCP, UDP und Websockets:
08 (let [host "0.0.0.0"]
09   (tcp-server {:host host})
10   (udp-server {:host host})
11   (ws-server  {:host host}))
12
13 ; Aufräumen von Events (alle 5 Sekunden):
14 (periodically-expire 5)
15
16 ; E-Mail-Adresse, von der aus Benachrichtigungen kommen:
17 (def email (mailer {:from "riemann@example.com"}))
18
19 ; Index: Definition
20 (let [index (index)]
21   (streams
22     (default :ttl 60
23       ; umgehendes Indizieren aller ankommenden Events:
24       index
25
26     ; Weiterleiten von Fehlern, sortiert nach Tags:
27     (where (state "error")
28       (where (tagged "www")
29         (email "webmaster@example.com"))
30       (where (service = "postgres")
31         (email "dba@example.com"))
32       (where (not (or (tagged "www") (service = "postgres")))
33         (email "admin@example.com")))
34
35     ; Berechnen der vorhandenen Hosts:
36     (let [hosts (atom #{})]
37       (fn [event]
38         (swap! hosts conj (:host event))
39         (prn :hosts @hosts)
40         (index {:service "unique hosts"
41                 :time (unix-time)
42                 :metric (count @hosts)})))
43
44     ; Weiterleiten aller Events zum Graphite-Host:
45     graph
46
47     ; Loggen von inaktiven Events:
48     (expired
49       (fn [event] (info "expired" event)))))
50 )

Es folgt das Aktivieren einiger Interfaces für TCP (Port 5555), UDP (5555) sowie Websockets (5556). In der mitgelieferten Einrichtungsdatei geschieht dies für Localhost. Admins ändern »127.0.0.1« in »0.0.0.0« , damit der Riemann-Service auf allen verfügbaren Netzwerkschnittstellen lauscht. Wer Sicherheitsbedenken hat, findet unter [7] eine Anleitung zum Absichern mittels TLS.

Die Angabe »(periodically-expire 5)« weist Riemann dazu an, alle fünf Sekunden Events aus seinem Index zu entfernen, bei denen die TTL abgelaufen ist. Die »email« -Funktion enthält als Parameter nur die Absenderadresse; um alles andere kümmert sich die Clojure-E-Mail-Bibliothek Postal [8]. Riemann bietet freilich auch die Möglichkeit, E-Mails per SMTP zuzustellen [9].

Der nächste Block definiert den Index samt einem Stream, der alle ankommenden Events beinhaltet. Die Standard-TTL liegt für alle Ereignisse bei 60 Sekunden, sofern nicht von einem Client anders festgelegt. Einige Filter generieren dann aus Events, die sowohl einen Fehlerstatus als auch ein bestimmtes Tag enthalten, E-Mails für verschiedene Empfänger. Auf diese Weise erreichen den Admin eines Webservers andere Nachrichten als den Datenbankbetreuer. Alle anderen Error Messages landen wiederum bei einem dritten Verantwortlichen.

Gerade in Cloudumgebungen, wo die Anzahl der Hosts skalieren kann, ist es sinnvoll, mit einem eigenen Stream zu verfolgen, wie viele davon Daten an Riemann senden. Die nächste Funktion berechnet daher die Menge der Hosts, die Ereignisse an den Riemann-Server senden, und schreibt sie als Service »unique hosts« in den Index. Die beiden letzten Abschnitte stellen sicher, dass die »graph« -Funktion alle Ereignisse an den Graphite-Server schickt und dass die Funktion »expired« alle abgelaufenen Events im zuvor definierten Logfile protokolliert.

Nachdem die Anwender alle Anpassungen an der Datei vorgenommen haben, laden sie die neue Konfiguration mit »service reload« beziehungsweise »kill -SIGHUP« . Ein Blick ins Logfile zeigt eine Bestätigung. Dort sind auch eventuelle Syntaxfehler mit den Zeilennummern der Einrichtungsdatei aufgelistet, was das Debuggen erleichtert.

Im Falle eines Fehlers quittiert Riemann netterweise nicht den Dienst, sondern läuft einfach mit der alten Konfiguration weiter. Wer vor dem Neuladen einen manuellen Test auf der Konsole bevorzugt, ruft »riemann test« zusammen mit der Einrichtungsdatei auf (Listing 3).

Listing 3

Testen der Riemann-Konfiguration

01 # riemann test /etc/riemann/riemann.config
02 INFO [2016-08-29 14:44:45,019] main - riemann.bin - Loading /etc/riemann/riemann.config
03 INFO [2016-08-29 14:44:45,221] clojure-agent-send-off-pool-2 - riemann.graphite - Connecting to  {:host graphite, :port 2003}
04 INFO [2016-08-29 14:44:45,224] clojure-agent-send-off-pool-0 - riemann.graphite - Connecting to  {:host graphite, :port 2003}
05 [...]
06 INFO [2016-08-29 14:44:45,375] clojure-agent-send-off-pool-2 - riemann.graphite - Connected to 192.168.144.69
07
08 Testing clojure.core
09
10 Ran 0 tests containing 0 assertions.
11 0 failures, 0 errors.

Mit dem bereits erwähnten Tool »riemann-cli« testen Anwender den Mailversand:

riemann-cli send --service=Mailtest --metric="31337" --state=error --ttl=20 --description="Test der Mailfunktion" --tags=riemann test www

Dieses Kommando veranlasst den Riemann-Server dazu, eine Nachricht an die in der Konfiguration hinterlegten Adressen zu schicken.

Diesen Artikel als PDF kaufen

Express-Kauf als PDF

Umfang: 6 Heftseiten

Preis € 0,99
(inkl. 19% MwSt.)

Linux-Magazin kaufen

Einzelne Ausgabe
 
Abonnements
 
TABLET & SMARTPHONE APPS
Bald erhältlich
Get it on Google Play

Deutschland

Ähnliche Artikel

  • Einführung

    Auch diesen Monat bekommen DELUG-Käufer die doppelte Datenmenge zum einfachen Preis: Seite eins der DVD enthält das Live-System Arch Strike, Seite zwei unter anderem ein E-Book mit dem Rückblick auf 20 Jahre KDE, eine VM mit dem IDS/IPS-System Selks, die Distributionen Hypriot OS und Manjaro sowie einiges mehr.

  • OSMC

    Ihr Zehnjähriges konnte in diesem Jahr die Open Source Monitoring Conference feiern. Der Jubilar bewies mit einer Fülle interessanter Vorträge, dass er wieder einen Besuch in Nürnberg wert war.

  • Clojure

    Clojure sieht aus wie Lisp und läuft überall, wo Java installiert ist. Dank praktischer Tools und ausgereifter Bibliotheken ist mit der Sprache auch rasch eine moderne Webanwendung programmiert.

  • Grafana-Backends

    Grafana bereitet Messdaten aus verschiedenen Quellen optisch auf und bietet dem Admin eine gute Übersicht. Welche Backends unterstützt es? Eine Übersicht.

  • Sensu

    Es ist schon ein paar Jahre her, als das Twitter-Hashtag "#monitoringsucks" aufkam und sich schnell großer Verbreitung erfreute, denn Überwachungssoftware war an ihre Grenzen gelangt und stagnierte. Unser Autor Jochen Lillich berichtet, wie er einen Ausweg aus dem Dilemma fand.

comments powered by Disqus

Ausgabe 10/2017

Digitale Ausgabe: Preis € 6,40
(inkl. 19% MwSt.)

Artikelserien und interessante Workshops aus dem Magazin können Sie hier als Bundle erwerben.