Select Page

NETWAYS Blog

Better Late than never – Graphite-Web installation unter Debian 10 – Part 3

This entry is part 3 of 3 in the series Graphite-Web

Photo by Vita Vilcina on UnsplashHerzlich Willkommen,

wir verliessen unsere tapferen Helden in der letzten Episode bei der schwierigen Aufgabe, Timmy, dem schlauen Collie, die Installation von Graphite-Web via Django zu erklären. Nein, Scherz beiseite. Wir sind nun im finalen Teil unserer dreiteiligen Serie und steigen bei der Finalisierung der Graphite-Web-Installation ein.

Zuletzt hatten wir die Apache2-Konfig, welche wir in die /etc/apache2/sites-available abgelegt hatten, per apachectl -t validiert. Nun folgt die Initialisierung des eigentlichen Graphite-Web Contents.

Zuerst die Initialisierung der Graphitedb.

PYTHONPATH=/opt/graphite/webapp django-admin.py migrate --settings=graphite.settings --run-syncdb

Gefolgt von der Benutzererstellung für das Graphite-Web Frontend.

PYTHONPATH=/opt/graphite/webapp django-admin.py createsuperuser --settings=graphite.settings

Abschließend die Generierung der statischen Website-Elemente.

PYTHONPATH=/opt/graphite/webapp django-admin.py collectstatic --noinput --settings=graphite.settings

Nach der Generierung versorgen wir die Ordner und Dateien mit der korrekten Berechtigung chown -R www-data. /opt/graphite.

Um das Ganze nun in Betrieb zu nehmen, aktivieren wir im Apache2 noch die ssl also auch wsgi-Module. Des Weiteren aktivieren wir auch die graphite-web-ssl.conf

#>a2enmod ssl;
#>a2enmod wsgi;
#>a2ensite graphite-web-ssl.conf;

Somit sind die Voraussetzungen für den Apache2 aktiviert und wir müssen nur noch Sorge dafür tragen, dass die Komponenten bei einem Neustart automatisch initialisiert werden.

systemctl enable apache2 --now
systemctl enable go-carbon.service --now

Nun kann die Website von Graphite-Web unter der angegeben IP-Adresse aufgerufen werden, wo man bei erfolgreichem Ablauf folgende Website sehen sollte:

Aus dem Off hört man eine Stimme von Rodrigo, dem Plantagenbesitzer, der fordert, dass dieser How-to-Guide mit Centos 8.1 wiederholt wird. Ich bedanke mich für die Aufmerksamkeit und freue mich, Sie gern wieder zu einer weiteren Episode ‘curacon fuego del graphite con centos ocho’ begrüßen zu können.

Servus sagt David!

David Okon
David Okon
Senior Systems Engineer

Weltenbummler David hat aus Berlin fast den direkten Weg zu uns nach Nürnberg genommen. Bevor er hier anheuerte, gab es einen kleinen Schlenker nach Irland, England, Frankreich und in die Niederlande. Alles nur, damit er sein Know How als IHK Geprüfter DOSenöffner so sehr vertiefen konnte, dass er vom Apple Consultant den Sprung in unser Professional Services-Team wagen konnte. Er ist stolzer Papa eines Sohnemanns und bei uns mit der Mission unterwegs, unsere Kunden zu glücklichen Menschen zu machen.

Better Late than never – Graphite-Web-Installation unter Debian 10 – Part 2

This entry is part 2 of 3 in the series Graphite-Web

Willkommen zum zweiten Teil des Blogposts zur Graphite-Web-Installation unter Debian 10.

Wir springen hier direkt an die Stelle, an der wir aufgehört haben, und editieren die storage-schemas.conf unter /etc/go-carbon/

In der Storage-Schemas liegt das default-storage Schema:
Dadurch dass wir Icinga 2 installiert haben und auch dort Graphen generieren möchten, nehmen wir das folgende Schema:

[icinga_internals]
pattern = ^icinga\..*\.(max_check_attempts|reachable|current_attempt|execution_time|latency|state|state_type)
retentions = 5m:7d
[icinga_default]
pattern = ^icinga\.
retentions = 1m:2d,5m:10d,30m:90d,360m:4y

Damit haben wir die Konfiguration vom go-carbon in diesem Beispiel abgeschlossen.

Der nächste Schritt ist nun Whisper selbst und Graphite-Web.
Da das Graphite-Web immer noch Python-lastig ist, müssen wir einen kleinen Schritt im Voraus machen.

Wir definieren die Pfade im Voraus:

export PYTHONPATH="/opt/graphite/lib/:/opt/graphite/webapp/"

Danach erfolgt der allseits beliebte und gefürchtete pip-Aufruf:

pip install --no-binary=:all: https://github.com/graphite-project/whisper/tarball/1.1.6
pip install --no-binary=:all: https://github.com/graphite-project/graphite-web/tarball/1.1.6

Nach der Installation der beiden Komponenten wechseln wir in das /opt/graphite/webapp/graphite Verzeichnis und kopieren die local_settings.py.example, damit wir eine local_settings.py Datei haben, um die Einstellungen zu verändern.

SECRET_KEY = 'Sollte_durch_eine_zufällige_Zeichenkette_ersetzt_werden'
ALLOWED_HOSTS = [ '*' ]  // Für den Testzweck belassen wir es bei dem Asterisk, es sollte aber in Produktivumgebungen ersetzt werden durch die Maschinen welche mit dem Graphite sprechen dürfen.
TIME_ZONE = 'America/Los Angeles' // Die Zeitzone ist selbsterklärend
WHISPER_DIR = '/var/lib/graphite/whisper' // Das Whisper Datei Verzeichnis wo unserer Whisper Dateien liegen

Kleiner Hinweis wegen der Random-Zeichenkette:

Diese kann man mit dem folgenden Kommando erzeugen, wenn man möchte:

openssl rand -base64 32

Nun müssen wir noch den Ordner für unsere Whisper-Dateien anlegen und berechtigen.

mkdir -pv /var/lib/graphite/whisper
chown -Rf carbon. /var/lib/graphite/whisper

Daraufhin kopieren wir das Graphite.wsgi File um, damit es verwendbar ist.

cp /opt/graphite/conf/graphite.wsgi.example /opt/graphite/conf/graphite.wsgi

An dieser Stelle kommt nun die Konfiguration des Apache2. Wenn jemand eine nginx-Konfiguration braucht, bitte ich diese Personen, sich in der Community zu melden, damit wir auswerten können, wie viele Anfragen es gibt, um eine ‘Standard’-Konfig für die nächste Iteration dieses Blogposts zu erstellen. 🙂

Wir erstellen im Apache-Verzeichnis eine graphite-web-ssl.conf und befüllen diese mit dem folgenden Beispielinhalt. Dieser ist je nach Umgebung anzupassen.

cd /etc/apache2/sites-available/
vi graphite-web-ssl.conf

Inhalt der graphite-web-ssl.conf:

# Enable virtualhosts, perhaps by adding this to your server's config somewhere,
# probably the main httpd.conf
# NameVirtualHost *:443

# This line also needs to be in your server's config.
# LoadModule wsgi_module modules/mod_wsgi.so

# You need to manually edit this file to fit your needs.
# This configuration assumes the default installation prefix
# of /opt/graphite/, if you installed graphite somewhere else
# you will need to change all the occurrences of /opt/graphite/
# in this file to your chosen install location.

LoadModule wsgi_module modules/mod_wsgi.so

# XXX You need to set this up!
# Read http://code.google.com/p/modwsgi/wiki/ConfigurationDirectives#WSGISocketPrefix
# For example, create a directory /var/run/wsgi and use that.
WSGISocketPrefix /var/run/apache2/wsgi

# Base Configuration
ServerName localhost.local
DocumentRoot "/opt/graphite/webapp"

# Log Configuration
ErrorLog /opt/graphite/storage/log/webapp/error.log
CustomLog /opt/graphite/storage/log/webapp/access.log common

# SSL Configuration
SSLEngine On
SSLCertificateFile /etc/pki/tls/private/certificate.crt
SSLCertificateKeyFile /etc/pki/tls/private/certificate.key
SSLCertificateChainFile /etc/pki/tls/private/certificate.pem

# Graphite Related Configuration
# I've found that an equal number of processes & threads tends
# to show the best performance for Graphite (ymmv).
WSGIDaemonProcess graphite processes=5 threads=5 display-name='%{GROUP}' inactivity-timeout=120
WSGIProcessGroup graphite
WSGIApplicationGroup %{GLOBAL}
WSGIImportScript /opt/graphite/conf/graphite.wsgi process-group=graphite application-group=%{GLOBAL}

# XXX You will need to create this file! There is a graphite.wsgi.example
# file in this directory that you can safely use, just copy it to graphite.wgsi
WSGIScriptAlias / /opt/graphite/conf/graphite.wsgi

# XXX To serve static files, either:
# * Install the whitenoise Python package (pip install whitenoise)
# * Collect static files in a directory by running:
# django-admin.py collectstatic --noinput --settings=graphite.settings
# And set an alias to serve static files with Apache:
Alias /static/ /opt/graphite/static/

########################
# URL-prefixed install #
########################
# If using URL_PREFIX in local_settings for URL-prefixed install (that is not located at "/"))
# your WSGIScriptAlias line should look like the following (e.g. URL_PREFX="/graphite"

# WSGIScriptAlias /graphite /srv/graphite-web/conf/graphite.wsgi/graphite
# Alias /graphite/static /opt/graphite/webapp/content
# <Location "/graphite/static/">
# SetHandler None
#

# XXX In order for the django admin site media to work you
# must change @DJANGO_ROOT@ to be the path to your django
# installation, which is probably something like:
# /usr/lib/python2.6/site-packages/django
Alias /media/ "@DJANGO_ROOT@/contrib/admin/media/"

# The graphite.wsgi file has to be accessible by apache. It won't
# be visible to clients because of the DocumentRoot though.

Order deny,allow
Allow from all

= 2.4>
Require all granted

Order deny,allow
Allow from all

= 2.4>
Require all granted

Abschließend überprüfen wir die Konfig mit

apachectl -t

Hier erreichen wir nun den spannenden Teil (Cliffhanger) der Graphite-Web-Installation, und wie zuletzt um den Spannungsbogen zu erhöhen,
bitte ich um etwas Geduld, da im finalen und letzten spannenden Teil dieser Serie wir Graphite-Web initialisieren werden.

Bis dahin mit einem Servus

David

David Okon
David Okon
Senior Systems Engineer

Weltenbummler David hat aus Berlin fast den direkten Weg zu uns nach Nürnberg genommen. Bevor er hier anheuerte, gab es einen kleinen Schlenker nach Irland, England, Frankreich und in die Niederlande. Alles nur, damit er sein Know How als IHK Geprüfter DOSenöffner so sehr vertiefen konnte, dass er vom Apple Consultant den Sprung in unser Professional Services-Team wagen konnte. Er ist stolzer Papa eines Sohnemanns und bei uns mit der Mission unterwegs, unsere Kunden zu glücklichen Menschen zu machen.

Better Late than never – Graphite-Web-Installation unter Debian 10 – Part 1

This entry is part 1 of 3 in the series Graphite-Web

Hallo erstmal und vielen Dank für die Aufmerksamkeit.

Wie ich leider schon viel zu oft angekündigt hatte in den Kommentaren zu meinen häufig angeschauten Artikel Graphite mit Debian 9, reiche ich mit diesem Blogpost mein Versprechen mal ein.

Die Voraussetzungen sind fast die Gleichen wie im alten Blogpost, aber dank unserer Community und deren Mithilfe verfeinert. Ich verweise gern an dieser Stelle auf unsere Community, welche gern & freundlich weiterhilft: Icinga Community.

Nun aber zum Inhalt. Prämisse ist, dass wir eine Icinga2-Installation auf einem frischen Debian 10 (Codename Buster) haben. Die Installation von Icinga2 wird hier explizit nicht erklärt.

Ich liste die Schritte mit auf, werde aber im Gegenzug nur die Graphite-spezifischen Schritte erklären.

Beginnen wir mit der Basisinstallation, sprich den Paketen, welche man braucht und die relativ selbsterklärend sind.

apt-get update -y
apt install gnupg2 vim nagios-plugins-standard nagios-plugins-contrib apache2 -y
wget -O -https://packages.icinga.com/icinga.key | apt-key add -
echo -e "deb http://packages.icinga.com/debian icinga-buster main\ndeb-src http://packages.icinga.com/debian icinga-buster main\n" >> /etc/apt/sources.list
apt-get update -y
apt install python-dev libcairo2-dev libffi-dev build-essential python-pip python-sqlite libapache2-mod-wsgi golang -y
apt install icinga2 -y

Somit wären die ersten Vorarbeiten geleistet. Ab diesem Schritt werden wir für das Graphite-Web nun zuerst Zertifikate generieren.

Wir befinden uns im Jahr 2020. Da sollte zumindest jede sinnvolle Website ein Sicherheitszertifikat mitbringen, vor allem wenn es sich im freien Internet präsentiert. Ich promote hier an dieser Stelle auch nicht “Let’s Encrypt”, weil ich es nicht mag. Es gibt bereits 1001 und mehr Seiten, die bereits darauf eingehen und ich will/möchte mich da nicht einreihen.

Ich halte die händische Zertifikatsgenerierung mal hier als Alternative hoch.

Es fängt unter Debian schon mit der Erstellung der Ordner an.

mkdir -pv /etc/pki/tls/private

Innerhalb des Ordners erzeugen wir uns einen Zertifikatsschlüssel.

openssl genrsa -out certificate.key 2048

Hinweis: 4096 ist ein Wert, der akzeptabel ist. >4096 kann durchaus für die meisten internen Sicherheitsanforderungen nötig sein.

2048 ist hier also nur ein Beispielwert, kein Muss-Wert.

Danach erzeugen wir mit dem Schlüssel eine Signierungsanfrage für ein neues Zertifikat.

openssl req -new -key certificate.key -out certificate.csr -subj "/C=DE/ST=Somewhere1/L=Somewhere/O=Somewhere Company GmbH/OU=IT/CN=localhost.localdomain/emailAddress=admin@somewhere.com"

Wem nun die Frage nach den hier verwendeten Parametern kommt aus einem Ubuntu Guide aus der Community von mir selbst kopiert, hier die Erklärung:


Explanation of the -subj parameters:

Parameter Explanation
/C Country
/ST State
/L Location
/O Organization
/OU Organizational Unit
/CN Common Name
/emailAddress self explanatory

Mit den so erhaltenen Key & CSR erstellen wir nun ein Zertifikat.

openssl x509 -req -days 395 -in certificate.csr -signkey certificate.key -out certificate.crt

Damit hätten wir den Zertifikats-Part an dieser Stelle abgeschlossen. Nun geht es weiter zum Carbon-Teil dieses Blogposts.
Mir war es aktuell auch mit guten ‘Google-Fu’ nicht möglich, eine aktuellere Quelle zu finden als “https://github.com/lomik/go-carbon/”.
Aktuell ist auf der Graphite-Seite carbon 1.16, aber ich kann nicht sagen, ob beide “feature equal” sind.

Also wenn jemand etwas Neueres findet, bitte in der Community melden 🙂


wget https://github.com/lomik/go-carbon/releases/download/v0.14.0/go-carbon_0.14.0_amd64.deb
dkpg -i go-carbon_0.14.0_amd64.deb

Nach der Installation des Paketes muss natürlich die Konfiguration angepasst werden.

Also editieren wir die go-carbon.conf & storage-schemas.conf in /etc/go-carbon/.

go-carbon.conf:
max-cpu = 4 (default) // Sollte an die Möglichkeiten des Rechners angepasst werden
data-dir = "/var/lib/graphite/whisper" // Dies ist das Datenverzeichnis wo die Whisper Dateien abgelegt werden hier sollte man bedenken das dies im laufe der Zeit anwächst.
write-strategy = "max" // Um die CPU zu entlasten sollte hier "noop" gewählt werden.
\[udp\] = ... // In diesem Beispiel verwenden wir udp nicht also sollte der gesamte Block auskommentiert werden.
\[tcp\] = ... // Ist in diesem Beispiel unser Transport Protokoll
listen = ":2003" // Ist der Port auf den go-carbon hört sollte um die IP der Maschine ergänzt werden auf der er läuft `beispielhaft` hier "127.0.0.1:2003"

An der Stelle eine kleine Unterbrechung. Es geht weiter in dem folgenden Blogpost:Better Late than never – Graphite-Web-Installation unter Debian 10 – Part 2

Mit freundlichem Gruß

David

David Okon
David Okon
Senior Systems Engineer

Weltenbummler David hat aus Berlin fast den direkten Weg zu uns nach Nürnberg genommen. Bevor er hier anheuerte, gab es einen kleinen Schlenker nach Irland, England, Frankreich und in die Niederlande. Alles nur, damit er sein Know How als IHK Geprüfter DOSenöffner so sehr vertiefen konnte, dass er vom Apple Consultant den Sprung in unser Professional Services-Team wagen konnte. Er ist stolzer Papa eines Sohnemanns und bei uns mit der Mission unterwegs, unsere Kunden zu glücklichen Menschen zu machen.