rrdtool-Graphen skalieren

Ein Problem mit rrdtool ist die Skalierung der X-Achse, die so gelegt wird dass alle Datenpunkte gut in den Graphen passen. — Ist erstmal ein sinnvolles Verhalten, das gut implementiert ist und für viele Daten gute Ergebnisse liefert. Es stört aber wenn die Daten große Schwankungen und Ausreißer enthalten. Dann reicht z.Bsp. eine Lastspitze oder das Backup über’s Netz um den Graphen unbrauchbar zu machen, weil außer der Lastspitze garnichts mehr zu erkennen ist.

Um dem abzuhelfen hatte ich sogar mal die Skalierungsfunktion dahingehend geändert, dass nicht der Maximalwert, sondern das 99. Perzentil die Obergrenze bestimmt; dass also die größten Werte bei der Skalierung ignoriert werden. Das war aber alles nicht so schön und lag seitem in der Kategorie “Code-Schnipsel den ich mal überarbeiten muss bevor ich ihn vielleicht als Patch einreiche”.

Zu einer viel bessere Lösung führte mich die Tage ein Hinweis von Tobi Oetiker auf der Mailingliste: mit VDEF:var=datum,99,PERCENT lässt sich der Wert auch berechnen und dann mit PRINT ausgeben.

Damit lässt sich in einem Skript erst die gewünschte Obergrenze berechnen und dann mit --upper-limit auf alle Graphen der Datenreihe anwenden (ich erzeuge z.B. immer Graphen für Monat, Woche, Tag– da ist es gut wenn die gleich skaliert sind).

Jetzt aber zum eigentlichen, den nötigen Kommandos.

#! /usr/local/bin/bash

hostlist="fax"
times[1]="--start end-24h"
times[2]="--start end-8d"
common_options="-R light -a PNG -h 150 -w 500"

# Perzentil zur Skalierung
percentile=98
# Zeitraum zur Berechnung der Skalierung
percentile_time=--start end-8d

for host in $hostlist; do
  limit=`rrdtool graph netio.png ${percentile_time} 
    DEF:InOctets=${host}-netio.rrd:ifInOctets:AVERAGE 
    DEF:OutOctets=${host}-netio.rrd:ifOutOctets:AVERAGE 
    CDEF:pct0=InOctets,OutOctets,MAX,1024,/ 
    VDEF:pct=pct0,${percentile},PERCENT 
    'PRINT:pct:%lf' | tail -1`

  for i in 1 2; do
    rrdtool graph netio.png -t "${host} Network I/O" -v "KBytes/sec" 
      $common_options ${times[$i]} --upper-limit ${limit} --rigid 
      DEF:InOctets=${host}-netio.rrd:ifInOctets:AVERAGE   
      DEF:OutOctets=${host}-netio.rrd:ifOutOctets:AVERAGE 
      'AREA:InOctets#00FF00:Bandwith In ' 
      'LINE1:KBout#0000FF:Bandwith Out'
  done
done

Comments are closed.