Monitoring mit Grafana und Prometheus
Die Überwachung von Diensten ist häufig fest in der Hand von Icinga
oder Nagios
. Aber neben dieser Überwachung ist es oft praktisch auch historische Daten zur Auslastung von Ressourcen zu haben, z.B. um neue Anschaffungen anschaulich rechtfertigen zu können. Aber auch bei der Fehlersuche sind solche Daten mitunter hilfreich. Warum ist der Datenbankserver immer Freitags zwischen 10:00 und 11:00 Uhr so langsam? Wieviel Speicherplatz wird im Schnitt pro Woche zusätzlich belegt und wann sind die Laufwerke voll? Wieviel Traffic verursachen wir eigentlich im Monat? Wieviele Datenbankabfragen verarbeiten wir eigentlich täglich?
Wenn es um die grafische Auswertung solcher Daten geht, ist Grafana
deutlich leistungsfähiger als reine Überwachungsssysteme. Die Graphen werden on demand im Browser erzeugt, was gegenüber anderer Lösungen wie z.B. munin
einige Rechenzeit auf dem Monitoring-Server einspart. Die auszuwertenden Daten können über verschiedene Quellen bereitgestellt werden. In dieser Anleitung übernimmt diese Aufgabe Prometheus
. Andere Tools hierfür wären z.B. collectd
als Datensammler und influxdb
als Datenbank. Grafana kann auch mehrere Datenquellen miteinander kombinieren.
Grafana
Die Installation ist sehr einfach, da entsprechende Pakete für Debian bereitstehen.
echo “deb https://packagecloud.io/grafana/stable/debian/ jessie main” >> /etc/apt/sources.list.d/grafana.list
curl https://packagecloud.io/gpg.key | sudo apt-key add –
apt-get install -y apt-transport-https
apt-get update
apt-get install grafana
systemctl daemon-reload
systemctl start grafana-server
systemctl status grafana-server
systemctl enable grafana-server.service
Anschließend ist Grafana auf dem Port 3000
per Browser erreichbar. Die Logindaten lauten admin:admin
. Die weitere Konfiguration z.B. das Anbinden von Datenquellen kann über das Webinterface von Grafana erfolgen. Über verschiedene Dashboards können dann die gewünschten Graphen erzeugt werden, die Dashboards dienen einer thematischen Unterteilung. Der Zugriff auf die Dashboards kann für einzelne Benutzer erlaubt oder verboten werden.
Prometheus
Die Installation von Prometheus ist ebenfalls unkompliziert. Es stehen fertige Docker-Buildfiles zur Verfügung, alternativ Dateien für Verwaltungstools wie Ansible, SaltStack und Chef: https://prometheus.io/docs/introduction/install/
Natürlich kann man die Installation auch manuell durchführen:
cd /opt/
wget https://github.com/prometheus/prometheus/releases/download/v1.5.2/prometheus-1.5.2.linux-amd64.tar.gz
tar xvfz prometheus-*.tar.gz
cd prometheus-*
Die Konfiguration erfolgt über die Datei prometheus.yml
:
global:
scrape_interval: 15s # By default, scrape targets every 15 seconds.
# Attach these labels to any time series or alerts when communicating with
# external systems (federation, remote storage, Alertmanager).
external_labels:
monitor: ‘codelab-monitor’
# A scrape configuration containing exactly one endpoint to scrape:
# Here it’s Prometheus itself.
scrape_configs:
# The job name is added as a label `job=` to any timeseries scraped from this config.
– job_name: ‘prometheus’
# Override the global default and scrape targets from this job every 5 seconds.
scrape_interval: 5s
static_configs:
– targets: [‘localhost:9090’]
Der Start erfolgt mittels: ./prometheus -config.file=prometheus.yml
Welche Daten Prometheus über ein System sammeln kann hängt davon ab welche sog. exporter
zur Verfügung stehen. In der Regel sind Exporter eigene Dienste, die über einen TCP-Port mittels HTTP abgefragt werden können. Eine, unvollständige, Liste von Exportern findet sich unter: https://prometheus.io/docs/instrumenting/exporters/
Die Exporter laufen auf den zu überwachenden Systemen, Prometheus selbst auf einem zentralen Monitor-System auf dem auch Grafana installiert sein kann. Sofern unterschiedliche Betriebssysteme überwacht werden sollen, die unterschiedliche Init-Systeme verwenden, empfiehlt sich der Einsatz von supervisord
zum Start der Exporter:
apt-get install supervisor
Für jeden Exporter wird eine Startdatei in /etc/supervisor/conf.d/
abgelegt:
[program:node-exporter]
user=node-exporter
command=/usr/local/bin/node_exporter -collectors.enabled “diskstats,filefd,filesystem,loadavg,meminfo,netdev,stat,textfile,time,vmstat” -collector.textfile.directory=/var/lib/node_exporter/textfile_collector/ -collector.filesystem.ignored-fs-types “^(sys|proc|tmp)fs$” -collector.diskstats.ignored-devices “^(ram|loop|fp|nvme\\d+n\\d+p)\\d+$”
directory=/usr/local/bin/
stdout_logfile=/var/log/supervisor/node-exporter.log
stderr_logfile=/var/log/supervisor/node-exporter_err.log
autostart=true
autorestart=true
Der Dienst kann anschließend gestartet werden:
supervisorctl update
supervisorctl reload
supervisorctl start node-exporter
supervisorctl status node-exporter
Nun muss Prometheus noch über die prometheus.yml
gesagt werden, dass der Exporter auf dem entsprechenden Client abgefragt werden soll:
– job_name: ‘node_exporter’
static_configs:
– targets: [ ‘10.0.1.2:9100’ ]
labels:
hostname: ‘client1’
– targets: [ ‘10.0.1.3:9100’ ]
labels:
hostname: ‘client2’
– targets: [ ‘10.0.1.4:9100’ ]
labels:
hostname: ‘client3’
Für jeden weiteren Exporter werden weitere Einträge mit dem entsprechenden Port des Exporters angelegt. Nach einem Neustart von Prometheus werden die Daten erfasst und gespeichert.
Konfiguration
In Grafana kann nun ein neuer Data Source
-Eintrag angelegt werden:
Da in unserem Beispiel Grafana auf dem gleichen System läuft wie Prometheus können wir auf eine Authentifizierung verzichten, sollten aber darauf achten, dass Prometheus nur auf dem lokalen Interface erreichbar ist.
Anschließend können neue Graphen über ein Dashboard angelegt oder fertige Dashboards importiert werden. Eine Sammlung findet sich unter: https://grafana.net/dashboards
Als Filter für die Suche sollte darauf geachtet werden als Data Source
den Eintrag Prometheus
auszuwählen.