Nachdem wir im letzten Beitrag RabbitMQ und Sensu installiert haben, brauchen wir jetzt eine Möglichkeit, alle gesammelten Daten zu visualisieren. Zu diesem Zweck beginnen wir mit Graphite, um kontinuierliche Daten zu plotten.

Die Installation von Graphite war ein ziemliches Abenteuer, da es schwer war, eine angemessene Installationsprozedur zu finden. Es gibt keine offiziellen RPMs, also musste ich meine eigenen bauen.

Mit dem Hinweis eines Kollegen konnte ich das Ganze mit der folgenden dreiteiligen Blog-Beitragsreihe erledigen:

Zuerst hole dir alle abhängige Software, die für das Bauen der RPMs und für den Betrieb von Graphite benötigt wird.

yum install -y gcc zlib-devel curl curl-devel openssl rpm-build gcc-c++ rpm-build python python-ldap python-memcached python-sqlite2 pycairo python-twisted Django django-tagging bitmap bitmap-fonts python-devel glibc-devel gcc-c++ openssl-devel python-zope-interface httpd memcached mod_wsgi

Auf meiner virtuellen Maschine brauchte ich auch wget:

yum install -y wget

Ein Experiment

Obwohl der Blogbeitrag Version 0.9.9 verwendete, versuchte ich Version 0.9.10. Du möchtest diese Schritte vielleicht überspringen - es hat bei mir nicht funktioniert und ich bin zu 0.9.9 zurückgekehrt.

Als normaler Benutzer führe folgendes aus:

cd
mkdir rpmbuild
mkdir rpmbuild/SOURCES
cd rpmbuild/SOURCES
wget http://launchpad.net/graphite/0.9/0.9.10/+download/whisper-0.9.10.tar.gz
wget http://launchpad.net/graphite/0.9/0.9.10/+download/carbon-0.9.10.tar.gz
wget http://launchpad.net/graphite/0.9/0.9.10/+download/graphite-web-0.9.10.tar.gz
cp carbon-0.9.10.tar.gz carbon-0.9.10.tar.gz.orig
cp graphite-web-0.9.10.tar.gz graphite-web-0.9.10.tar.gz.orig
cp whisper-0.9.10.tar.gz whisper-0.9.10.tar.gz.orig
tar -zxvf whisper-0.9.10.tar.gz
cd whisper-0.9.10
python setup.py bdist_rpm
rpm -ivh dist/whisper-0.9.10-1.src.rpm
cd..
cp whisper-0.9.10.tar.gz.orig whisper-0.9.10.tar.gz
cd../SPECS/

Bearbeite die spec-Datei, wenn du ein Suffix zur Release-Information hinzufügen oder eine Beschreibung ergänzen möchtest:

vi whisper.spec
rpmbuild -ba whisper.spec
sudo yum --nogpgcheck localinstall -y../RPMS/noarch/whisper-0.9.10-1.noarch.rpm

Mache jetzt das Gleiche für carbon und graphite:

cd ~/rpmbuild/SOURCES/
tar -zxvf graphite-web-0.9.10.tar.gz
cd graphite-web-0.9.10
python setup.py bdist_rpm

Ich bekam diesen Fehler:

error: error in 'post_install' option: 'distro/redhat/misc/postinstall' does not exist or is not a file

Ich suchte nach Dateien, die “distro” enthalten, mit grep -iR 'distro' *. Die Ergebnisse waren setup.cfg und MANIFEST.in, wo ich “distro” zu “dist” änderte. Der Befehl lief dann, aber das Verzeichnis “dist” existierte nicht. Ich entfernte alles und fuhr mit den 0.9.9-Versionen von whisper, carbon und graphite fort.

Die RPMs bauen und Graphite installieren

cd ~/rpmbuild/SOURCES
wget http://launchpad.net/graphite/0.9/0.9.9/+download/whisper-0.9.9.tar.gz
wget http://launchpad.net/graphite/0.9/0.9.9/+download/carbon-0.9.9.tar.gz
wget http://launchpad.net/graphite/0.9/0.9.9/+download/graphite-web-0.9.9.tar.gz
cp carbon-0.9.9.tar.gz carbon-0.9.9.tar.gz.orig
cp graphite-web-0.9.9.tar.gz graphite-web-0.9.9.tar.gz.orig
cp whisper-0.9.9.tar.gz whisper-0.9.9.tar.gz.orig
cd ~/rpmbuild/SOURCES/
tar -zxvf whisper-0.9.9.tar.gz
cd whisper-0.9.9
python setup.py bdist_rpm
rpm -ivh dist/whisper-0.9.9-1.src.rpm
cd..
cp whisper-0.9.9.tar.gz.orig whisper-0.9.9.tar.gz
cd../SPECS/
rpmbuild -ba whisper.spec
sudo yum --nogpgcheck localinstall -y../RPMS/noarch/whisper-0.9.9-1.noarch.rpm
cd ~/rpmbuild/SOURCES/
tar -zxvf graphite-web-0.9.9.tar.gz
cd graphite-web-0.9.9
python setup.py bdist_rpm
rpm -ivh dist/graphite-web-0.9.9-1.src.rpm
cd../
cp graphite-web-0.9.9.tar.gz.orig graphite-web-0.9.9.tar.gz
cd../SPECS/
rpmbuild -ba graphite-web.spec
sudo yum --nogpgcheck localinstall -y../RPMS/noarch/graphite-web-0.9.9-1.noarch.rpm
cd ~/rpmbuild/SOURCES/
tar -zxvf carbon-0.9.9.tar.gz
cd carbon-0.9.9
python setup.py bdist_rpm
rpm -ivh dist/carbon-0.9.9-1.src.rpm
cd..
cp carbon-0.9.9.tar.gz.orig carbon-0.9.9.tar.gz
cd../SPECS/
rpmbuild -ba carbon.spec
sudo yum --nogpgcheck localinstall -y../RPMS/noarch/carbon-0.9.9-1.noarch.rpm

Fahre mit Teil zwei der Blog-Beitragsreihe fort, um Graphite einzurichten.

Konfiguration

Der Beitrag installiert einige Abhängigkeiten (eine teilweise Wiederholung dessen, was wir bereits getan haben). RPMS werden auch installiert, aber das haben wir bereits abgedeckt.

Als Nächstes richte carbon und graphite-web Konfigurationsdateien ein:

cd /opt/graphite/conf/
sudo cp graphite.wsgi.example graphite.wsgi
sudo cp storage-schemas.conf.example storage-schemas.conf
sudo cp carbon.conf.example carbon.conf
cd../webapp/graphite
sudo cp local_settings.py.example local_settings.py

Bearbeite local_settings.py:

sudo vim local_settings.py

Ich habe die folgenden Zeilen hinzugefügt/auskommentiert/bearbeitet:

TIME_ZONE = 'Europe/Berlin'
MEMCACHE_HOSTS = ['127.0.0.1:11211']

Erstelle die Django-Datenbank:

sudo python /opt/graphite/webapp/graphite/manage.py syncdb

Du wirst gefragt, ob du einen Superuser erstellen möchtest. Ich habe “nein” geantwortet.

Als Nächstes: Apache und mod_wsgi. Ich hatte diese bereits installiert, aber wenn du sie brauchst, führe sudo yum install -y httpd mod_wsgi aus.

Erstelle /etc/httpd/conf.d/graphite.conf wie im Blogbeitrag beschrieben.

Lass /etc/httpd/conf.d/wsgi.conf so aussehen:

LoadModule wsgi_module modules/mod_wsgi.so
WSGISocketPrefix /var/run/wsgi

Setze die Eigentümerschaft für das storage-Verzeichnis:

chown -R apache:apache /opt/graphite/storage/

Erstelle ein Start/Stop-Skript /etc/init.d/carbon-cache wie im Beitrag beschrieben und mache es ausführbar:

sudo chmod +x /etc/init.d/carbon-cache

Starte die Dienste als root:

service memcached start
service carbon-cache start
service httpd start

Teste die Webapp, indem du deinen Browser auf http://localhost:9080 richtest. Meine Ports unterscheiden sich, weil ich Vagrant mit Port-Forwarding verwende.

Anfangs funktionierte es nicht. In /var/log/httpd/graphite_error_log sah ich:

IOError: [Errno 13] Permission denied: '/opt/graphite/storage/log/webapp/info.log'

Die Datei existierte nicht, und es war ein Berechtigungsproblem. Nach einigem Suchen führte ich aus:

chown -R apache:apache /opt/graphite/storage

Das behob es - die Webapp funktionierte. (Ich dachte, ich hätte diesen Befehl bereits vorher ausgeführt.)

Daten in Graphite einspeisen

Jetzt holen wir uns einige Daten und visualisieren sie. Der letzte Teil des Blogbeitrags erklärt das im Detail.

Graphite lauscht auf den Ports 2003 und 2004 für eingehende Daten. Du kannst das überprüfen, indem du nmap -v -sT localhost ausführst. Das Format der Daten ist: Objekt Wert Zeitstempel.

Ich wiederhole hier nicht das Beispiel des Blogbeitrags; stattdessen hier ein Beispiel mit einem Sensu-Community-Plugin:

$ gem install sensu-plugin --no-rdoc --no-ri
$ cd /etc/sensu/plugins
$ wget https://raw.github.com/sensu/sensu-community-plugins/master/plugins/system/cpu-metrics.rb
$ chmod +x cpu-metrics.rb

Füge den folgenden Abschnitt zu /etc/sensu/conf.d/client.json hinzu:

{
	...
	"checks": {
		...
		"cpu_metrics": {
			"type": "metric",
 		"handlers": ["graphite"],
 		"command": "/etc/sensu/plugins/cpu-metrics.rb --scheme stats.:::name:::",
 		"interval": 60,
 		"subscribers": [ "webservers" ]
		}
	}
}

In Graphite habe ich dann einige dieser Metriken ausgewählt, um sie auf dem Dashboard zu visualisieren:

Damit ist dieser Artikel abgeschlossen. Der ursprüngliche Blogbeitrag zeigt weitere Möglichkeiten, Daten zu sammeln und in Graphite einzuspeisen - schau ihn dir an!

Fertig für heute.