Serverüberwachung mit collectd und facette
Neben der Serverüberwachung mit Icinga/Nagios habe ich bisher immer Munin verwendet. Munin zeichnet Graphen z.B. für die aktuelle Serverlast (Load) oder die Belegung der Festplatten. Leider skaliert Munin nicht besonders gut. In festen Intervallen fragt Munin die verbundenen Clients nach neuen Daten und rendert neue Grafiken. Das dauert leider einigermaßen lang.
Eine ressourcensparendere Alternative ist collectd (https://collectd.org/).
Die Installation ist sehr einfach:
apt-get install collectd
Um eine zentrale Instanz zu schaffen, die Daten von anderen Systemen einsammelt reicht folgende Konfiguration auf dem Master aus:
#/etc/collectd/collectd.conf
FQDNLookup true
LoadPlugin logfile
LoadPlugin rrdtool
LoadPlugin network
Listen "10.0.0.1"
DataDir "/var/lib/collectd/rrd"
Include "/etc/collectd/filters.conf"
Include "/etc/collectd/thresholds.conf"
Auf den Clients installiert man collectd ebenfalls, hier reicht folgende Konfiguration:
#/etc/collectd/collectd.conf
FQDNLookup true
LoadPlugin logfile
LoadPlugin network
LoadPlugin cpu
LoadPlugin df
LoadPlugin disk
LoadPlugin ethstat
LoadPlugin interface
LoadPlugin load
LoadPlugin memory
LoadPlugin processes
LoadPlugin swap
LoadPlugin users
Server "10.0.0.1"
DataDir "/var/lib/collectd/rrd"
Include "/etc/collectd/filters.conf"
Include "/etc/collectd/thresholds.conf"
Mittels /etc/init.d/collectd restart
müssen nun alle Instanzen einmal neu gestartet werden und das lustige Datensammeln beginnt.
Leider liefert collectd keine so schöne Oberfläche zur Darstellung mit. Es gibt zwar ein paar CGI-Scripte und mittlerweile auch eine PHP-Variante, aber mit der gewohnten Munin-Darstellung können beide nicht mithalten, auch wenn einige Funktionen dabei sind die Munin nicht mitbringt.
Abhilfe hier schafft Facette. Hierbei handelt es sich um ein relativ junges Projekt, welches auch andere Datenquellen neben collectd unterstützt. Auf der Projektwebsite (https://facette.io/) kann ein fertiges Debianpaket heruntergeladen werden. Wer lieber selbst baut benötigt folgende Dependencies:
apt-get install build-essential golang-go librrd-dev pkg-config npm nodejs-legacy pandoc
Der Quellcode kann über die Github-Seite des Projekts (https://github.com/facette/facette|https://github.com/facette/facette) bezogen werden.
Vor der ersten Nutzung muss Facette zunächst mit collectd verheiratet werden:
#/etc/facette/providers/collectd.json
{
"connector": {
"type": "rrd",
"path": "/var/lib/collectd/rrd",
"pattern": "(?P[^/]+)/(?P.+).rrd"
},
"filters": [
{ "action": "sieve", "target": "metric", "pattern": "/average$" },
{ "action": "rewrite", "target": "metric", "pattern": "/average$", "into": "" },
{ "action": "rewrite", "target": "metric", "pattern": "/", "into": "." },
{ "action": "rewrite", "target": "metric", "pattern": "^cpu-(\d+)\.cpu-(.+)\.value$", "into": "cpu.$1.$2" },
{ "action": "rewrite", "target": "metric", "pattern": "^df-(.+)\.df_complex-(.+)\.value", "into": "df.$1.$2" },
{ "action": "rewrite", "target": "metric", "pattern": "^disk-(.+)\.disk_(.+)", "into": "disk.$1.$2" },
{ "action": "rewrite", "target": "metric", "pattern": "^entropy\.entropy", "into": "entropy" },
{ "action": "rewrite", "target": "metric", "pattern": "^interface-(.+)\.if_(.+)\.(.+)$", "into": "net.$1.$2.$3" },
{ "action": "rewrite", "target": "metric", "pattern": "^irq.irq-(.+)\.value$", "into": "irq.$1" },
{ "action": "rewrite", "target": "metric", "pattern": "^load\.load", "into": "load" },
{ "action": "rewrite", "target": "metric", "pattern": "^memory\.memory-(.+)\.value$", "into": "memory.$1" },
{ "action": "rewrite", "target": "metric", "pattern": "^processes\.ps_state-(.+)\.value$", "into": "proc.state.$1" },
{ "action": "rewrite", "target": "metric", "pattern": "^processes\.(.+)\.value$", "into": "proc.$1" },
{ "action": "rewrite", "target": "metric", "pattern": "^swap\.swap-(.+)\.value$", "into": "swap.$1" },
{ "action": "rewrite", "target": "metric", "pattern": "^swap\.swap_io-(.+)\.value$", "into": "swap.io.$1" },
{ "action": "rewrite", "target": "metric", "pattern": "^users\.users\.value", "into": "users.count" }
]
}
Nach dem Start über /etc/init.d/facette start
kann man mit der weiteren Einrichtung unter http://localhost:12003
beginnen.
Da Facette auch noch andere Datenquellen unterstützt muss man nun zunächst die gewünschten Graphen definieren. Hierbei helfen Metric
- und Source
-Gruppen. Außerdem können Templates für Graphen definiert werden. Dies erleichtert es zumindest einheitliche Graphen zu erzeugen, da man nur noch Platzhalter auffüllen braucht. Die erzeugten Graphen lassen sich dann zu einer Collection
zusammenfassen, die dann über die Startseite von Facette abgerufen werden können.
Details zur Templateerstellung finden sich unter: https://blog.facette.io/2015/03/23/dive-into-facette-graph-templates/
Wirklich schön ist das alles aber noch nicht gelöst. Wenn man sehr viele Maschinen verwalten möchte sollte man sich daher ein wenig mit der verfügbaren API (http://docs.facette.io/api/|http://docs.facette.io/api/) befassen um die Einrichtung zu automatisieren.
Die Mühe lohnt sich jedenfalls. Die Graphen sind optisch recht hübsch und zeigen vor allem die jeweiligen exakten Werte an, wenn man mit der Maus darüber fährt. Außerdem können einzelne Elemente dynamisch ein- und ausgeblendet werden, was die Übersichtlichkeit sehr verbessert.