Seite wählen

Graphite-API für Grafana und Icinga Web 2

von | Aug 9, 2019 | Graphite & Grafana, Linux, Python, Security

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/whisper 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.
Mehr Beiträge zum Thema Graphite & Grafana | Linux | Python | Security

Ansible – Loop over multiple tasks

The last time I wrote about Ansible and the possibility to use blocks to group multiple tasks. Which you can read here. Sadly this feature does not work with loop, so there is no clean way to loop over multiple tasks in a play without writing the same loop statement...

Kommentar in der Bash History

Heute stelle ich euch einen der „billigsten“ Tricks der Linux CLI vor, den erstaunlicherweise fast keiner kennt. Kennt ihr es nicht auch? Ihr benutzt ein Kommando in der bash und könnt euch das Kommando einfach nicht merken. Das gemeine daran: Wenn ihr euch das...

Squid 4 Proxy mit LDAP & MITM SSL-Bump

Im Zuge meiner Ausbildung bei NETWAYS durfte ich mich diese Woche mit Squid auseinandersetzen. Dabei merkte ich, dass man sich bezüglich LDAP & SSL-BUMP wirklich nur auf die offiziellen Squid Dokus und die Red Hat Dokus verlassen konnte. Squid ist ein Caching...

Veranstaltungen

Dez 01

Icinga 2 Fundamentals Training | Online

Dezember 1 @ 09:00 - Dezember 4 @ 17:00
Dez 03

DevOps Meetup

Dezember 3 @ 17:30 - 20:30
Dez 08

Terraform mit OpenStack Training | Online

Dezember 8 @ 09:00 - Dezember 9 @ 17:00
Dez 08

Icinga 2 Advanced Training | Online

Dezember 8 @ 09:00 - Dezember 10 @ 17:00
Dez 15

GitLab Training | Online

Dezember 15 @ 09:00 - Dezember 16 @ 17:00