bk99.de entertain the web since 1997

MRTG ohne SNMP: Graphen aus eigenen Skripten

Zusammenfassung

Ab 2007 zeigte bk99.de MRTG-Graphen zu DSL, LAN, WLAN, VPN, Temperaturen, Speicher und Last meiner Rechner, erzeugt nicht per SNMP, sondern mit kleinen Shell-Skripten. Die versprochene Anleitung dazu habe ich nie geschrieben; stattdessen hat ein Leser in den Kommentaren mein Skript auf einen Bruchteil der Programmaufrufe gekürzt. Dieser Beitrag holt beides nach, erklärt das Prinzip der externen Skripte und zeigt, was heute an die Stelle von MRTG getreten ist.

Was MRTG ist

MRTG, der Multi Router Traffic Grapher, entstand Mitte der 1990er-Jahre bei Tobias Oetiker. Laut seinem Beitrag auf der LISA 1998 begann alles 1994 an der De Montfort University: Über tausend Rechner teilten sich eine langsame Internetleitung, und man wollte sehen, wie ausgelastet sie war. MRTG fragte dazu alle fünf Minuten die Bytezähler des Routers per SNMP ab und zeichnete daraus Graphen für Tag, Woche, Monat und Jahr. Die typischen grün-blauen Graphen waren jahrelang in vielen Rechenzentren zu sehen.

Meine Graphen von 2007

Auf mrtg.bk99.de liefen Graphen für ADSL, LAN, WLAN und den VPN-Tunnel nach Hause, für die Temperaturen der Festplatten und für Speicher, Swap, Last, Prozesse, Uptime und offene TCP-Verbindungen des Servers. SNMP brauchte ich dafür nicht: MRTG kann statt eines Routers auch ein beliebiges Programm abfragen. Das Programm muss nur vier Zeilen ausgeben, zwei Zahlen für „herein“ und „hinaus“, eine Uptime und einen Namen.

# mrtg.hddtemp.cfg
Target[hddtemp]: `/etc/mrtg/scripts/bash.sh hddtemp`
Title[hddtemp]: HDD temp for Hödur
PageTop[hddtemp]: Temperatur
YLegend[hddtemp]: Temperatur
ShortLegend[hddtemp]:
LegendI[hddtemp]: /dev/sda
LegendO[hddtemp]: /dev/sdb

Wichtig sind die Backticks um den Befehl. Für die Festplatten bedeutete „herein“ die Temperatur von /dev/sda und „hinaus“ die von /dev/sdb; MRTG ist es egal, was die beiden Zahlen bedeuten.

Die Anleitung, die nie kam

Im Blog stand „eine ausführliche Anleitung gibt es bald hier“. Anfang 2008 kam die erste Nachfrage in den Kommentaren, ich versprach die Skripte für dieselbe Woche, im April folgte die nächste Nachfrage. Im September 2008 nahm jemand anderes die Sache selbst in die Hand und schrieb unter der Überschrift „Wurstelei“ einen Kommentar, der besser war als alles, was ich geplant hatte.

Mein Skript holte jeden Wert mit einer Kette aus cat, grep, sed und cut. Der Kommentar zeigte, dass awk alles auf einmal erledigt:

# vorher: vier Programme für einen Wert
INDATA=`cat /proc/loadavg | cut -d " " -f2 | sed "s/\.//g" | sed "s/^0*//g"`

# nachher: eines
awk '{print $2*100"\n"$3*100}' /proc/loadavg

Der Vorschlag fasste alle Messarten in einem Skript mit case zusammen. Hier eine leicht bereinigte Fassung: Die Netzwerkschnittstelle wird über ihren genauen Namen gefunden, damit eth0 nicht auch veth0 trifft, und das Skript setzt LC_ALL=C. Das ist kein Detail: Beim Test auf einem deutsch eingestellten Debian lieferte mawk für die Last 0 statt 15, weil es „0.15“ mit Komma als Dezimaltrenner erwartete.

#!/bin/sh
# mrtg_check.sh TYP [PARAMETER] - gibt vier Zeilen für MRTG aus
# Punkt als Dezimaltrenner, sonst liest awk unter deutscher Locale 0.15 als 0
export LC_ALL=C
TYPE=$1
PARAM=$2
[ -z "$TYPE" ] && { echo 'Kein TYP angegeben.'; exit 1; }
case $TYPE in
  load)       # Last der letzten 5 und 15 Minuten, mal 100
    awk '{print $2*100"\n"$3*100}' /proc/loadavg ;;
  processes)  # gesamte und laufende Prozesse
    awk -F'[/ ]' '{print $(NF-1)"\n"$(NF-2)}' /proc/loadavg ;;
  network)    # empfangene und gesendete Bytes einer Schnittstelle
    [ -z "$PARAM" ] && { echo 'Keine Schnittstelle angegeben.'; exit 1; }
    awk -F'[: ]+' -v ifc="$PARAM" '$2 == ifc {print $3"\n"$11}' /proc/net/dev ;;
  *)
    echo "Unbekannter TYP: $TYPE"; exit 1 ;;
esac
uptime | awk -F, '{print $1","$2}'
echo "$TYPE"

Meine Antwort damals: Ich wollte halt Graphen erzeugen, aber Respekt, sehr schön gekürzt. Achtzehn Jahre später gebe ich zu, dass die Kurzfassung auch die bessere Anleitung ist.

Was sich seitdem geändert hat

MRTG gibt es noch, die letzte Version 2.17.10 stammt von 2022. Schon 1998 beschrieb Oetiker RRDtool als Kern der nächsten Generation; darauf bauten später Cacti, Munin und viele andere auf. In neuen Installationen hat sich ein anderes Modell durchgesetzt: Prometheus fragt Zielsysteme ab, der Node Exporter liefert Hunderte Werte eines Linux-Rechners fertig aus, und Grafana zeichnet die Graphen.

Die Idee meiner Skripte lebt dort weiter. Der Textfile-Collector des Node Exporters liest Dateien ein, die ein beliebiges Skript regelmäßig schreibt, so wie MRTG früher die vier Zeilen las. Festplattentemperaturen liefert heute meist smartctl oder der Kernel-Treiber drivetemp. Und ein Kommentar, der ein Skript von sieben Programmaufrufen auf einen kürzt, ist immer noch das schönste Feedback, das man bekommen kann.

Zahlen im Überblick

  • MRTG entstand aus einem Problem von 1994 an der De Montfort University und fragte alle fünf Minuten Zähler ab.
  • Externe Skripte für MRTG geben vier Zeilen aus: zwei Zahlen, eine Uptime und einen Namen.
  • Der Kommentar von 2008 ersetzte bis zu sieben Programmaufrufe durch einen einzigen awk-Aufruf.
  • Die letzte MRTG-Version 2.17.10 erschien im Januar 2022.

Referenzen

Bemerkungen

  • Dieser Beitrag stand ursprünglich am 3. Februar 2007 in meinem alten Plone-Blog und wurde 2008 zuletzt bearbeitet. 2026 habe ich ihn mit den Leserkommentaren aus dem Webarchiv geholt und überarbeitet; die Namen und Adressen der Kommentatoren lasse ich weg.
  • Mein eigenes Skript bash.sh ist im Webarchiv nicht erhalten. Die Graphen auf mrtg.bk99.de gibt es nicht mehr.

Originalbeitrag im Webarchiv