ADMIN

2023

05

2023-04-28T12:00:00

Lokale Netzwerke

SCHWERPUNKT

070

Netzwerk

Monitoring

Echtzeit-Monitoring mit Graphite

Alles auf einen Haufen

von Dr. Holger Reibold

Veröffentlicht in Ausgabe 05/2023 - SCHWERPUNKT

Die Open-Source-Software Graphite verspricht ein Echtzeitmonitoring für IT-Umgebungen. Dabei zeichnet es sich als gewissenhafter und schneller Datensammler aus, der jedoch bei Visualisierung und Alarmierung auf Drittanwendungen angewiesen ist. Ist diese Hürde jedoch überwunden, profitieren Admins von einem Monitoring, dass Daten aus nahezu allen Systemen sammeln und verarbeiten kann.

Graphite [1], das im Jahr 2006 als Nebenprojekt eines Überwachungswerkzeugs eines Flug- und Reiseportals startete, hat sich bis heute zu einem mächtigen System entwickelt, das laut Angaben des Entwicklers Chris Davis die Unternehmen Etsy, Booking.com, GitHub, Salesforce, Reddit und vielen anderen zur Überwachung ihrer Geschäftsprozesse dient. Seit 2008 steht die Software unter der Open-Source-Lizenz Apache 2.0.
Im Kern leistet Graphite zwei Aufgaben: Es speichert numerische Zeitreihendaten und rendert die Daten in Form von Diagrammen. Dabei gestaltet sich die Übertragung von Rohdaten in das System besonders einfach. IT-Verantwortliche profitieren dabei von einem inzwischen stark angewachsenen Ökosystem, das für alle gängigen Anwendungsszenarien die notwendigen Collection-Agenten und Sprachanbindungen bietet.
Das Innenleben von Graphite
Um möglichst unterschiedliche Rohdaten bündeln zu können, setzt Graphite auf das Zusammenspiel mit drei Softwarekomponenten. Dabei fragt Carbon die verschiedenen Zeitreihendaten ab, Whisper übernimmt als Datenbankbibliothek die Speicherung dieser Daten und Graphite-web stellt das User-Interface und die API für die Darstellung von Diagrammen und Dashboards bereit. Der Carbon-Dienst ist für die Einspeisung der verschiedenen Rohdaten in den Stack zuständig, der seinerseits der langfristigen Speicherung der Daten in der Whisper-Datenbanken dient. Administratoren interagieren mit der Graphite-Web-UI oder der API, die wiederum Carbon und Whisper nach den Daten abfragt.
Graphite [1], das im Jahr 2006 als Nebenprojekt eines Überwachungswerkzeugs eines Flug- und Reiseportals startete, hat sich bis heute zu einem mächtigen System entwickelt, das laut Angaben des Entwicklers Chris Davis die Unternehmen Etsy, Booking.com, GitHub, Salesforce, Reddit und vielen anderen zur Überwachung ihrer Geschäftsprozesse dient. Seit 2008 steht die Software unter der Open-Source-Lizenz Apache 2.0.
Im Kern leistet Graphite zwei Aufgaben: Es speichert numerische Zeitreihendaten und rendert die Daten in Form von Diagrammen. Dabei gestaltet sich die Übertragung von Rohdaten in das System besonders einfach. IT-Verantwortliche profitieren dabei von einem inzwischen stark angewachsenen Ökosystem, das für alle gängigen Anwendungsszenarien die notwendigen Collection-Agenten und Sprachanbindungen bietet.
Das Innenleben von Graphite
Um möglichst unterschiedliche Rohdaten bündeln zu können, setzt Graphite auf das Zusammenspiel mit drei Softwarekomponenten. Dabei fragt Carbon die verschiedenen Zeitreihendaten ab, Whisper übernimmt als Datenbankbibliothek die Speicherung dieser Daten und Graphite-web stellt das User-Interface und die API für die Darstellung von Diagrammen und Dashboards bereit. Der Carbon-Dienst ist für die Einspeisung der verschiedenen Rohdaten in den Stack zuständig, der seinerseits der langfristigen Speicherung der Daten in der Whisper-Datenbanken dient. Administratoren interagieren mit der Graphite-Web-UI oder der API, die wiederum Carbon und Whisper nach den Daten abfragt.
Der zentrale Gewinn des Tools besteht darin, dass es die verschiedensten Ausgangsdaten bündelt, konsolidiert und für Drittanwendungen verfügbar macht. Graphite unterstützt diverse Ausgabestile und -formate, beispielsweise CSV, XML und JSON. Damit ist die Voraussetzung für das Einbetten von benutzerdefinierten Diagrammen in externe Websites oder Dashboards gegeben.
Hinsichtlich der Übermittlung der Rohdaten an Graphite sind Sie flexibel. Die Monitoringumgebung unterstützt dafür drei Hauptmethoden: Klartext, das Python-spezifische Datenformat Pickle und AMQP (Advanced Message Queuing Protocol). Die an Graphite gesendeten Informationen werden von Carbon und Carbon-Relay verwaltet, während das Graphite-Webinterface diese Daten entweder aus dem Cache oder direkt von einem Speichermedium liest.
Welche Übertragungsmethode im Einzelfall zum Einsatz kommen sollte, ist dabei primär von den auslesenden Applikationen oder den verwendeten Skripten abhängig. Manche davon verfügen über spezielle Tools oder APIs, die Ihnen helfen können, Daten nach Carbon zu übertragen. Um die Übertragungsspezifika kennenzulernen, verwenden Sie am einfachsten das Klartextprotokoll.
Hinter Carbon verbergen sich verschiedene Daemons, die das Storage-Backend bilden. Eine einfache Graphite-Installation verwendet üblicherweise lediglich einen Daemon ("carbon-cache.py"). Bei größeren Umgebungen kommen in der Regel "carbon-relay.py" und "carbon-aggregator.py" hinzu, um die Last der Metrikenverarbeitung zu verteilen beziehungsweise benutzerdefinierte Aggregationen durchzuführen. Grundsätzlich erwarten alle Carbon-Daemons Zeitreihendaten von Drittquellen und können diese über gängige Übertragungsprotokolle empfangen. Allerdings unterscheiden sich die verschiedenen Daemons in der Verarbeitungsform der entgegengenommenen Daten. Die Kenntnisse dieser unterschiedlichen Verarbeitungsmöglichkeiten ist bei der Implementierung von anspruchsvollen Speicher-Backends notwendig.
Installation
Graphite ist eine komplexe Linux-basierte Umgebung, die primär in Python programmiert wurde. Für das Rendern der Graphiken verwendet die Umgebung die Cairo-Grafikbibliothek. Daraus ergeben sich verschiedene Abhängigkeiten, wie sie typischen Serverinstallationen üblicherweise nicht bereitstellen. Bei der quellenbasierten Installation steht Ihnen das Skript "check-dependencies.py" zur Prüfung zur Verfügung. Am einfachsten gestaltet sich die Installation von Graphite in Docker – so ist auch eine Evaluierung auf einem Windows-System möglich. In diesem Fall führen Sie folgende Befehle aus:
docker run -d \
    --name graphite \
    --restart=always \
    -p 80:80 \
    -p 2003-2004:2003-2004 \
    -p 2023-2024:2023-2024 \
    -p 8125:8125/udp \
    -p 8126:8126 \
    graphiteapp/graphite-statsd
Bei einer Standardinstallation müssen Sie neben Python ab Version 2.7 folgenden Voraussetzungen schaffen:
- cairocffi
- Django 1.11.19 oder höher
- django-tagging 0.4.6
- pytz
- scandir
- fontconfig
- WSGI und ein Webserver (bei Apache ist außerdem das Modul "mod_wsgi" erforderlich)
Außerdem benötigen Sie die Graphite-Webapp, Carbon und die Whisper-Datenbankbibliothek, die Teil des Graphite-Projekts ist. Abhängig von optional genutzten Funktionen sind weitere Python-Module wie "python-memcache", "python-lpad" und "python-rrdtool" erforderlich.
Dass die Installation nicht zwingend eine Herausforderung darstellen muss, zeigt die Verwendung von Synthesize [2], einem Installationsskript für Graphite und den zugehörigen Diensten auf Linux. Allerdings ist der Einsatz von Synthesize auf Ubuntu 18.04 LTS begrenzt. Jedoch existiert mit REsynthesize [3] ein Fork, der für CentOS 8.1 oder höher konzipiert ist.
Bild 1: Das Graphite-Dashboard liefert wie hier zu erkennen lediglich ein einfaches Werkzeug für die Visualisierung metrischer Daten – besser klappt es mit Grafana.
Carbon-Modul konfigurieren
Das Carbon-Modul ist das Herzstück der Graphite-Umgebung. Seine Steuerung erfolgt über verschiedene Konfigurationsdateien, die im Verzeichnis "/opt/graphite/conf/" liegen. Da die Erstinstallation keine Konfigurationsdatei anlegt, müssen Sie dies händisch übernehmen. Dabei greifen Sie am einfachsten auf die verschiedenen Beispieldateien ("conf.example") zurück. Kopieren Sie diese in das Konfigurationsverzeichnis und entfernen Sie den Zusatz ".example". Graphite kennt folgende Konfigurationsdateien:
- "carbon.conf" ist die Hauptkonfigurationsdatei, mit der Sie die Einstellung für jeden Carbon-Daemon definieren.
- "storage-schemas.conf" bestimmt die Aufbewahrungsraten für die Speicherung von Metriken.
- "storage-aggregation.conf" legt fest, wie Daten geringerer Genauigkeit aggregiert werden.
- "relay-rules.conf": Mithilfe von Relay-Regeln werden Metriken an spezifische Backends übermittelt.
- "aggregation-rules.conf": Die sogenannten Aggregationsregeln bündeln verschiedene Metriken.
- "rewrite-rules.conf" erlaubt das Umbenennen von Metriken mithilfe regulärer Ausdrücke.
Bei einer Erstinstallation sind primär die Anpassungen der "carbon.conf" und der "speicher-schemas.conf" relevant. Die Hauptkonfigurationsdatei "carbon.conf" bündelt die Einstellungen der verschiedenen Daemons, wobei die Konfiguration in Abschnitte unterteilt ist: In "[cache]" steuern Sie "carbon-cache", mit "[relay] das Modul "carbon-relay" und entsprechend mit dem Abschnitt "[aggregator]" den Aggregator "carbon-aggregator". Die Entwickler empfehlen bei der Erstverwendung das Augenmerk auf den Abschnitt "[cache]" zu legen.
In der "storage-schemas.conf"-Datei weisen Sie den Mustern Metrikpfade zu und hinterlegen für die Komponente "whisper" Frequenz und Dauer der Datenspeicherung. Bei den Mustern handelt es sich um reguläre Ausdrücke, die sich in drei Zeilen definieren. In der ersten weisen Sie der Regel eine Bezeichnung zu. Es folgen der reguläre Ausdruck, den Sie mit "pattern=" angeben und die Retentionsrate ("retentions="). Ein einfaches Beispiel hierzu:
[garbage_collection]
pattern = garbageCollections$
retentions = 10s:14d
Im Beispiel dient die Bezeichnung "[garbage_collection]" primär der Dokumentation. Graphite protokolliert diesen und die entsprechenden Metriken in der Protokolldatei "creates.log". Dieses Muster kommt für alle Metriken zur Anwendung, die mit "garbageCollections" enden. Grundsätzlich gilt es zu beachten, dass Graphite die Python-Syntax für reguläre Ausdrücke verwendet. Die Retentions-Zeile besagt, dass jeder Datenpunkt zehn Sekunden repräsentiert und Daten der letzten 14 Tagen verfügbar sein sollen.
Neben den verschiedenen Konfigurationsdateien steuern Sie die Verwendung von Metriken mit White- und Black-Listen. Im Fall der Whitelist-Funktionalität akzeptiert Graphite nur die Metriken, die explizit in der Whitelist aufgeführt sind – Metriken der Blacklist werden entsprechend abgewiesen. Der Vorteil ist offensichtlich: Sie können explizit all jene Metriken herausfiltern, die nicht für Ihr Informationsbedürfnis relevant sind. Diese Filterfunktion aktivieren Sie in der "carbon.conf"-Datei mit dem "USE_WHITELIST"-Flag. Danach durchsucht Graphite das mit der Option "GRAPHITE_CONF_ DIR" definierte Verzeichnis nach den beiden Black- und Whitelist-Konfigurationen ("whitelist.conf" und "blacklist.conf"). Haben Sie keine Whitelist-Konfiguration angelegt oder ist diese leer, lässt die Software alle Metriken durch.
Bild 2: Grafanas Query-Editor ermöglich die die Integration von Graphite-Daten.
Metriken ein- und auslesen
Die Herausforderung beim Einsatz von Graphite besteht im Einlesen der unterschiedlichen Daten, wobei sich die Monitoringumgebung jedoch sehr flexibel zeigt. Sie können sich der drei bereits erwähnten Methoden Klartext, Pickle und AMQP bedienen. Die eingelesenen Daten wandern in die beiden Module Carbon sowie Carbon-Cache und werden von diesen verwaltet. Welche Methode Sie für das Speisen von Graphite verwenden, ist von der jeweiligen Umgebung und den zu verarbeitenden Daten abhängig. Ihnen stehen hierfür verschiedene Tools und APIs zur Verfügung. Bei Testdaten verwenden Sie am einfachsten das Klartextprotokoll, bei großen Datenmengen empfiehlt sich Pickle. AMQP ist die geeignete Methode, wenn Carbon auf einen Message Bus hört.
Der einfachste Weg stellt die Verwendung des Klartextprotokolls dar. Dabei müssen die gesendeten Daten das Format "<Metrischer Pfad> <Metrischer Wert> <Metrischer Zeitstempel>"verwenden. Carbon kümmert sich anschließend um die Übersetzung dieser Textzeile in eine Metrik, die Webinterface und Whisper-Datenbank verstehen. Zu Testzwecken nutzen Sie unter Unix das Programm "netcat", um einen Socket zu generieren und Daten an Carbon zu übermitteln:
PORT=2003
SERVER=graphite.system
echo "local.random.diceroll 4 `date +%s`" | nc ${SERVER} ${PORT}
Im Grunde dient Graphite dazu, numerische Daten zu sammeln und diese an Carbon zur Auswertung zu übermitteln. Dabei besitzt jede Datenreihe einen eindeutigen Bezeichner, der auf der metrischen Bezeichnung und verschiedenen Tags basiert. Die Entwicklung eines Bezeichnungssystems ist essenziell. Der zweite Schritt dient der Konfiguration der Datenaufbewahrung, dabei verschiedene Fragen zu beantworten: Wie oft werden die Daten produziert? Welche Genauigkeit ist gewünscht? Welchen Zeitraum wollen Sie erfassen?
Anschließend erzeugen Sie ein Namensschema, in dem Sie die "/opt/graphite/ conf/storage-schemas.conf"-Datei anpassen. Graphite verlangt das Nachrichtenformat, das aus dem Metrik-Namensraum, dem Wert, den Sie der Metrik zu diesem Zeitpunkt zuweisen wollen und dem Zeitstempel besteht. Hier ein einfaches Beispiel für die Verwendung dieses Formats:
echo "test.bash.stats 42 `date +%s`" | nc localhost 2003
Integration externer Software
Graphite ist für das Zusammenspiel mit rund einhundert verschiedenen Tools gerüstet. Die Entwickler stellen eine Übersicht der unterstützten Werkzeuge unter [4] zur Verfügung. Die Software spielt beispielsweise mit "collectd" zusammen, dem bekannten Daemon zum Sammeln von Systemdaten. Um collectd-Metriken an Carbon zu übermitteln, verwenden Sie das "write-graphite"-Plug-in von collectd.
Alternativ bezieht Graphite die Metriken aus den RRD-Dateien von collectd, indem Sie die RRD-Dateien zu "STORAGE_ DIR/rrd" hinzufügen. In der Praxis können Sie beispielsweise die Datei "host.name/load/load.rrd" von collectd mit "rrd/collectd/host_name/load/load.rrd" verknüpfen, um den Graph "collectd. host_name.load.load.{short,mid,long}term" zu generieren.
Daten visualisieren
Für die Visualisierung der Daten ist das Graphite-Dashboard zuständig und erlaubt die Darstellung verschiedener Quellen. Der Zugriff auf das Dashboard erfolgt über die URL "http://mein.graphite. host/dashboard", alternativ über den sogenannten Composer. Leider sind die Visualisierungsmöglichkeiten von Graphite recht beschränkt. Sie erlauben aber beispielsweise, Funktionen auf die Daten anzuwenden oder die Graphen von verschiedenen Hosts zu bündeln.
Doch wie erwähnt erweisen sich die integrierten Visualisierungsfunktionen in der Praxis als sperrig. Daher greifen die meisten Administratoren auf benutzerfreundlichere Werkzeuge zurück, die aussagekräftige Auswertungen liefern. Großer Beliebtheit erfreut sich Grafana [5], gerade auch deshalb, weil es über ein natives Plug-in für die Integration von Graphite-Datenquellen verfügt. Mit Hilfe des "Grafana Query Editor" gestaltet sich die Integration einfach.
Alarmierung einrichten
Das Monitoring von relevanten Systemen und die Visualisierung der Daten ist das eine, doch Administratoren müssen primär auf kritische Ereignisse reagieren können. Hierfür kommen typische Alarmierungs- und Benachrichtigungsfunktionen zum Einsatz. Per Definition inkludiert ein Monitoringsystem auch die Ausgabe von Warnhinweisen bei der Erfüllung spezifischer Werte, doch Graphite verfügt nicht über entsprechende Möglichkeiten. Hierfür sind Sie auf Drittprodukte angewiesen.
Wiederum gestaltet sich die Alert-Konfiguration beim Zusammenspiel mit Grafana als besonders einfach. Diese Umgebung verfügt über den Alerting-Manager, mit dem Sie das gewünschte Regelwerk anlegen. Dabei profitieren Sie von der Möglichkeit, dass Sie ein- und mehrdimensionale Regeln generieren können. Der Alerting-Manager stellt den Query-Manager zur Verfügung, der die Integration von Graphite-Metriken mit wenigen Mausklicks erlaubt.
Alternativ bietet sich der Einsatz eines Werkzeugs wie "graphite-beacon" [6]. Dabei handelt es sich um eine einfache Alarmierungsanwendung für Graphite, die asynchron arbeitet und Benachrichtigungen auf Basis von Graphite-Metriken versendet. Der Vorteil ist, dass es außer dem Tornado-Paket keine Abhängigkeiten aufweist und einfach zu implementieren ist. Zur Installation mit Pip verwenden Sie folgenden Befehl:
pip install graphite-beacon
Alternativ klappt das auch mit "apt-get":
apt-get update
apt-get install graphite-beacon
Die Konfiguration findet in einer "config.json"-Datei statt, die sich im gleichen Verzeichnis wie "graphite-beacon" befindet. Darin geben Sie zunächst die URL des Graphite-Systems an und legen mithilfe regulärer Ausdrücke fest, wann eine Warnung generiert wird. Außerdem müssen Sie einen E-Mail-Handler definieren, der für den E-Mail-Versand der Hinweise sorgt. Neben Graphite-Alert können Sie mit diesem Instrument für webbasierte Umgebungen URL-Warnungen konfigurieren.
Fazit
Die Graphite-Entwickler ordnen ihre Anwednung gerne als Monitoringwerkzeug ein – wohl auch, um eine größere Zielgruppe anzusprechen. Doch ein zweiter Blick zeigt, dass es sich primär um einen Aggregator handelt, der die verschiedensten Metriken zusammenführt. Diese Aufgabe bewältigt Graphite par excellence – nicht zuletzt wegen des umfassenden Ökosystems, das um das Tool herum entstanden ist. Sein ganzes Potenzial entfaltet Graphite allerdings erst im Zusammenspiel mit Visualisierungsspezialisten.
(jp)
Link-Codes
[1] Graphite: http://it-a.eu/n5z81/
[2] Synthesize: http://it-a.eu/n5z82/
[3] REsynthesize: http://it-a.eu/n5z83/
[4] Tools, die mit Graphite zusammenarbeiten: http://it-a.eu/n5z84/
[6] graphite-beacon: http://it-a.eu/n5z85/