Perl Scripte für MRTG

Wormaus

Registered User
Hallo.

Ich habe mich in den letzten Tagen mal damit beschäftigt, MRTG und diverse "Plugins" mir anzuschauen und auf einem meiner Rootserver einzurichen.
... War dann doch auch garnicht so schwer wie ich anfangs dachte ;)
Im Grossen und Ganzen habe ich auch verstanden, wie das ganze vom Prinzip her funktioniert.
Nach dem MRTG habe ich jetzt schon einige "Plugins" (scripte, die werte auslesen&umrechnen / Configs, die diese Werte dann mit weiteren Einstellungen/Vorgaben an MRTG zur darstellung des Graphs übergeben.
(Ist doch vom prinzip her ganz easy, oder ? ;) )

Nun bin ich selber, was Python, Perl & co angeht ein richtiges "Greenhorn" da ich damit noch nichts (programmtechnisch) zu tun hatte. Das einzige, was ich in der Richtung kann ist, Scripte mir anzugucken, überlegen wie es funktionieren sollte und diese dann evtl. etwas umzubauen / anzupassen.
(Also wirklich nur "Kleckerkrams")

Jetzt hatte ich einen Perl-Script im Netz gefunden, der mir die Werte für die RAM-Nutzung zur übernahme von MRTG in entsprechender Form ausgeben sollte. Dieses funktionierte vom Prinzip her, aber die Werte stimmten Hinten und Vorne nicht annähernd.
Ein Kumpel aus einem Spieleclan (von einem Spiel das aich auch aktiv spiele) hat sich dann auf mein "Fragen in die Runde" dann das Script mal kurz angeschaut und mir gleich ein komplett neues perlscript zurückgeschickt. (Das auf demselben Prinzip beruht). Dieses habe ich dann wiederum nochmals an meine Bedürfnisse angepasst. (welche Werte ausgelesen werden und wie sie mathematisch zu verarbeiten/berechnen sind).

Hier das Perlscript zur Abfrage der Speichervariablen und der Mathematischen Bearbeitung / Ausgabe am Ende:
"mrtg-meminfo.pl"
Code:
#!/usr/bin/perl -w
#
# Small script to print used/free RAM, by "The Lion", modifyed by "Wormaus".
# 
# Public domain

use strict;

my $memtotal;
my $memfree;
my $highfree;
my $lowfree;
my $pagecache;
my $buffers;

open MEMINFO, '<', '/proc/meminfo' or die "open: $!, stopped";

while (<MEMINFO>)
{
  if (/^MemTotal:\s+(\d+)\s/i)
  {
    $memtotal = $1;
  }
  elsif (/^MemFree:\s+(\d+)\s/i)
  {
    $memfree = $1;
  }
  elsif (/^HighFree:\s+(\d+)\s/i)
  {
    $highfree = $1;
  }
  elsif (/^LowFree:\s+(\d+)\s/i)
  {
    $lowfree = $1;
  }
  elsif (/^Buffers:\s+(\d+)\s/i)
  {
    $buffers = $1;
  }
  elsif (/^Cached:\s+(\d+)\s/i)
  {
    $pagecache = $1;
  }
}

die "Error while reading values from /proc/meminfo, stopped"
  unless defined($memtotal) && defined($memfree) && defined($buffers)
      && defined($pagecache);

close MEMINFO;

$memfree += ( $buffers + $pagecache + $highfree + $lowfree )* 1000 ;
my $memused = ( $memtotal * 1000 ) - $memfree;

print $memfree . "\n" . $memused . "\n";

... und hier die MRTG-Config-Datei dazu:
mrtg-meminfo.cfg
Code:
### Free Mem

WorkDir: /srv/www/mrtg/mrtg-mem
IconDir: /mrtg/
Interval: 5

Target[machine]: `/srv/www/mrtg/mrtg-mem/mrtg-meminfo.pl`
MaxBytes[machine]: 1001744000 
Options[machine]: gauge, growright
YLegend[machine]: Memory
ShortLegend[machine]: Byte
LegendO[machine]: Mem Used:
LegendI[machine]: &nbsp;Mem Free:
Title[machine]: MYSERVER Memory
PageTop[machine]: <H1>Memory usage for MYSERVER-NICK</H1>
 <TABLE>
    <TR><TD>System:</TD>     <TD>MYSERVER-NICK</TD></TR>
    <TR><TD>Maintainer:</TD> <TD>my "NickName" or whatever i wnat"</TD></TR>
 </TABLE>
Legend1[machine]: Free memory
Legend2[machine]: Used Memory

Mit "[machine]" wird festgelegt, dass diese Werte die "[machine]"-Werte sind, also sozusagebn mit einem eindeutigen Namen versehen, damit sie weiterhin zugeordnet werden können.
"MaxBytes" gibt den oberen Grenzwert an, was an RAM da ist, in meinem fall 1 GB. ( = 100% im Graph )
Mit den "Legend..." Namen gibt man den Typ an, der als Einheit in der vom MRTG ausgegebenen html-Seite genannt werden soll, bzw. dessen Erklärung.
"ShortLegend" gibt die Einheit an, als welche der Graph dargestellt werden soll.
... ist im Grossen und Ganzen sehr einfach und quasi selbsterklärend :)

------------------------------------------------------------------------

Mit diesem Perl-Scrip kann man so allerlei Sachen auslesen, die halt in einer Form vorliegen, wie die Speichernutzungsangaben in "../proc/meminfo"

Code:
MemTotal:      1001744 kB
MemFree:         70312 kB
Buffers:         19720 kB
Cached:         831076 kB
SwapCached:       8244 kB
Active:         161984 kB
Inactive:       736396 kB
HighTotal:       97152 kB
HighFree:          264 kB
LowTotal:       904592 kB
LowFree:         70048 kB
SwapTotal:     2104432 kB
SwapFree:      2073640 kB
Dirty:             100 kB
Writeback:           0 kB
Mapped:          52260 kB
Slab:            25820 kB
CommitLimit:   2605304 kB
Committed_AS:   269684 kB
PageTables:       1112 kB
VmallocTotal:   114680 kB
VmallocUsed:      3068 kB
VmallocChunk:   111536 kB
HugePages_Total:     0
HugePages_Free:      0
Hugepagesize:     4096 kB

======================================================
Ich denke, das war etwas nützliches für Einige von Euch.

Jetzt noch eine Frage:
Hat jemand ein solch einfaches Script um das "loadavg" entsprechend auszulesen und auszugeben? Dieses liegt direkt als "Einzeiler" vor und ich hab keinen plan, wie ich den in "Blöcke" aufteilen kann damit ich die aufeinanderfolgenden Werte entsprechend ausgeben lassen kann.

loadavg
Code:
0.19 0.14 0.11 2/98 24268
Kurz die Zeile erklärt, für diejenigen, die es nicht wissen:
0.19 load, gemittelt auf 1 Minute, alle 5 Sekunden neu gemessen
0.14 gemittelt auf 5 Minuten
0.11 gemittelt auf 15 Minuten
2/98 zwei tasks (Prozeß) von insgesamt 98 sind "Runnable"
24268 war/ist die letzte PID des Systems

Ich hätte gerne die erste Zahl (aktuelle loadavg) und die aktiven Prozesse.
In diesem Fall wäre die Ausgabe:
Code:
0.19
2

Den Graph würde ich hierbei alle 60 Sekunden aktualisieren lassen
(mrtg mit configfile via cronjob alle 60 sekunden ausführen)

... und noch einen hätte ich gerne: CPU-Auslastung. Da ahbe ich nun garkeinen Plan, was ich da woher nehmen sollte, bzw. welche Werte aus "../proc/cpuinfo" entsprechend relevant sind.

Villeicht hat der Eine oder Andere noch ein solches kleines einfaches Script auf Halde?

Danke und Gruss aus Berlin: Wormaus
 
Back
Top