Ziel dieses Posts ist es, am Ende die Metriken über die Graphite-API als Backend für Grafana und das Icinga-Web-2-Module graphite betreiben zu können.

Grafana übernimmt hierbei optional die Visualisierung über eigene Dashboards, was ansonsten Graphite-Web leistet. Für Icinga Web 2 ist Grafana nur erforderlich, falls nicht das Module graphite zum Einsatz kommen soll, sondern stattdessen grafana zur Darstellung im Icinga Web 2 verwendet werden sollte.

Die Graphite-API ist in Python implementiert und soll hierbei via HTTPS angesprochen werden. Zusätzlich ist der Zugriff via Basis-Authentifizierung zu beschränken. Dies alles überlassen wir dem Apache, auch die API lassen wir mittels WSGI im Apache laufen.

Der Vorteil gegenüber dem Graphite-Web liegt darin, die ganzen Django-Bibliotheken nicht zu benötigen und auch kein DB-Backend a la SQLite, MySQL oder PostgreSQL. Nachteil ist, das Projekt Graphite-API wird nicht vom Graphite-Team betrieben, somit ist die Pflege und Aktualität nicht sichergestellt.

Für RedHat basierte Systeme befindet sich das Paket graphite-api im EPEL-Repsitory, Debian liefert es aus seinen eigenen Repositories bereits selbst. Nachfolgend sind die Beispiele auf ein CentOS 7 angepasst beschrieben.

$ yum install -y graphite-api http mod-wsgi mod-ssl

In der Konfigurationsdatei /etc/graphite-api.yaml ist der Ort der whisper-DB-Dateien zu kontrollieren, da dieser je nach verwendeten Carbon-Cache variieren kann, hier verwendete ich einen go-carbon, der standardmäßig den Pfad /var/lib/graphite/wisper benutzt.

...
whisper:
  directories:
    - /var/lib/graphite/whisper
...
carbon:
  hosts:
    - 127.0.0.1:7002
  timeout: 1
  retry_delay: 15
  carbon_prefix: carbon
  replication_factor: 1
...

Voreingestellt ist der Eintrag zur Verwendung des Carbonlinks deaktiviert, sollen jedoch auch die Metriken, die noch nicht auf Platte persistiert worden sind, angezeigt werden, sind unter dem Abschnitt carbon die verwenden Carbon-Caches einzutragen.

Die Apache Konfiguration, die die Graphite-API mittels WSGI auf Port 8888 startet, könnte wie folgt ausschauen:

Listen 8888 https

<VirtualHost *:8888>
  SSLEngine On
  SSLCertificateFile /etc/httpd/conf/graphite.crt
  SSLCertificateKeyFile /etc/httpd/conf/graphite.key
  SSLCACertificateFile /etc/httpd/conf/graphite.crt
  WSGIDaemonProcess graphite-api processes=<#cpu> threads=<#cpu> display-name='%{GROUP}' inactivity-timeout=120
  WSGIProcessGroup graphite-api
  WSGIApplicationGroup %{GLOBAL}
  WSGIImportScript /var/www/wsgi-scripts/graphite-api.wsgi process-group=graphite-api application-group=%{GLOBAL}

  WSGIScriptAlias / /var/www/wsgi-scripts/graphite-api.wsgi

  <Directory /var/www/wsgi-scripts>
    AuthType Basic
    AuthName "Graphite API"
    AuthUserFile /etc/httpd/conf/htpasswd.graphite
    Require valid-user
  </Directory>
</VirtualHost>

Die ersten vier Zeilen beschäftigen sich mit der TLS-Verschlüsselung. Hier kommt als Test ein selbstsigniertes Zertifikat zum Einsatz. In Produktion ist selbstverständlich ein CA-signiertes Zertifikat zu verwenden. Als nächstes wird das WSGI konfiguriert, zu beachten ist, dass hier für die zu verwendende Anzahl an Prozessoren und Threads, der Platzhalter <#pcu> zu ersetzen ist.

Das Verzeichnis, in dem das WSGI-Skript liegt, wird via Basis-Auth abgesichert. Im Folgenden muss neben dem Zertifikat und der Passwortdatei für die Basis-Authentifizierung noch das Startskript mit Verzeichnis angelegt werden. Beim Verzeichnis für die variabel vom Graphite erzeugten Dateien ist außerdem die Berechtigung auf den Apache anzupassen.

$ openssl req -newkey rsa:2048 -nodes -keyout /etc/httpd/conf/graphite.key -x509 -days 365 -out /etc/httpd/conf/graphite.crt
$ install -m755 -d /var/www/wsgi-scripts
$ echo "from graphite_api.app import app as application" > /var/www/wsgi-scripts/graphite-api.wsgi
$ chown apache:apache /var/lib/graphite-api
$ htpasswd -c /etc/httpd/conf/htpasswd.graphite graphite

Schon sind wir fertig und können den Apache einem Neustart unterziehen bzw. ihn initial starten. In Grafana ist nun abschließend die Data Source bzw. im Icinga Web 2 das Backend des graphite Moduls entsprechend dem konfigurierten Socket und eingetragenen Basis-Benutzers zu konfigurieren.

Lennart Betz
Lennart Betz
Senior Consultant

Der diplomierte Mathematiker arbeitet bei NETWAYS im Bereich Consulting und bereichert seine Kunden mit seinem Wissen zu Icinga, Nagios und anderen Open Source Administrationstools. Im Büro erleuchtet Lennart seine Kollegen mit fundierten geschichtlichen Vorträgen die seinesgleichen suchen.