LinHES Forums
http://forum.linhes.org/

rrdtool and disk space
http://forum.linhes.org/viewtopic.php?f=5&t=13457
Page 1 of 1

Author:  chrisj [ Fri Jan 12, 2007 6:33 am ]
Post subject:  rrdtool and disk space

Has anyone hacked together a script to grap disk space ?

Just asking before I start to make one.

Author:  chrisj [ Fri Jan 19, 2007 5:56 am ]
Post subject: 

I hide no shame in the fact that this is one of my first perl scripts and my very first time using rrdtool , but it seems to work just fine.

With the current rrd scripts I had to add drive info to the script, which I fear will make upgrading harder to I have opted to use a settings file.

you will need to add it to the current cron job and add the graphs to your html pages as well ( I'm working on a new php one that just adds the avable graphs)

I hope this works for you.

/etc/rddsettings.cfg
Code:
DISKDEV=sda1:
DISKDEV=sda2:tv
DISKDEV=sdb1:video
DISKDEV=hdg1:video2
DISKDEV=hdh1:video3

/usr/local/bin/rrd_diskusage.pl
Code:
#!/usr/bin/perl
#             rrd_diskusage.pl  devicename1 [devicename2 ....]     partition usage
#               or
#             rrd_diskusage.pl  <without parameters>
#                           in this case we get the devicenames from
#               /etc/rddsettings.cfg
#
#
# extended devicename format:
#
#  <device>:<mountpoint or other useful name>
#
#
#            example: (without extended devicename format)
#             rrd_diskusage.pl  hda1 hda3 hda4
#
#
#            example: (with extended devicename format)
#             rrd_diskusage.pl  hda1:/ hda3:/usr  hda4:blablub
#


#use strict;

use RRDs;

# define location of rrdtool databases
my $rrd = '/var/lib/rrd';
my $rrdlog = '/var/lib/rrd';

# define location of images
my $graphs = '/var/www/rrdtool';

my $rrdDatabaseName = '';
my $rrdMyDatabasePath = '/var/lib/rrd';

#
my $rrdDatabasePath;

#print STDERR "$rrdDatabasePath";

#
my @rrdDevs;
if ((scalar @ARGV) > 0) {
  @rrdDevs = @ARGV;
} else {

  # open input file
  open(inFH, "< /etc/rddsettings.cfg")  or usage();
  while (defined (my $inLine = <inFH>)) {
    #print STDERR "$inLine";
    if ($inLine =~/^DISKDEV=/o) {
      (my $devname = $inLine) =~ s/^DISKDEV=//og;
      chomp $devname;
      push(@rrdDevs, $devname);
    }
  }

  close(inFH);
}

#extract names
# to avoid a lot of emails from cron when not configured
if (exists $ENV{'RRD_SILENT'}) {
  exit 0  if ((scalar @rrdDevs) == 0);
} else {
  usage() if ((scalar @rrdDevs) == 0);
}

#..............................................................................

# fill the databases
fill_rrd ();

#..............................................................................
sub create_rrd($) {

  my $rrdFile = $_[0];
  #print STDERR "create: $rrdFile\n";

  # awaiting an update every 300 secs
  my $rrdStep = 300;

  # data source = ...GAUGE, max 600 sec wait before UNKNOWN,
  #   no min, no max
  # 0.5:1: average value calc. with 1 entry = 300sec
  # 0.5:5: average value calc. with 5 entries = 5*300sec

  # h36    = 3600*36     => 129600sec/300      => 432
  # d7a2   = 3600*24*7   => 604800sec/300 /2   => 1008; 10min average
  # d30a6  = 3600*24*30  => 2592000sec/300 /6  => 1440; 30min average
  # d365a12= 3600*24*365 => 31536000sec/300 /12=> 8760; 1h    average

  # d7a6   = 3600*24*7   => 604800sec/300 /6   => 336;  30min max
  # d30a12 = 3600*24*30  => 2592000sec/300 /12 => 720;  1h    max
  # d365a24= 3600*24*365 => 31536000sec/300 /24=> 4380; 2h    max
  RRDs::create("$rrdFile",
               '--step', $rrdStep,

               'DS:used:GAUGE:'     .($rrdStep*2).':0:U',
               'DS:avail:GAUGE:' .($rrdStep*2).':0:U',

               'RRA:AVERAGE:0.5:1:432',
               'RRA:AVERAGE:0.5:2:1008',
               'RRA:AVERAGE:0.5:6:1440',
               'RRA:AVERAGE:0.5:12:8760',

               'RRA:MAX:0.5:6:336',
               'RRA:MAX:0.5:12:720',
               'RRA:MAX:0.5:24:4380'
              );

  my $ERR = RRDs::error;
  die "ERROR while creating $rrdFile: $ERR\n" if $ERR;
}

#..............................................................................
sub update_rrd ($$$$$){

  my $rrdFile  = $_[0];
  #my $dataTime = $_[1];
  #my $used     = $_[2];
  #my $avail    = $_[3];
  my $device  = $_[4];


# print STDERR "update: $rrdFile, dataTime=$_[1], used=$_[2], avail=$_[3]\n";

 updategraph ('day',$rrdFile,$device);
 updategraph ('week',$rrdFile,$device);
 updategraph ('month',$rrdFile,$device);
 updategraph ('year',$rrdFile,$device);

  RRDs::update("$rrdFile", $_[1].':'.$_[2].':'.$_[3]);
  my $ERR = RRDs::error;
  die "ERROR while updating $rrdFile: $ERR\n" if $ERR;
}
sub fill_rrd () {

  #print STDERR @rrdDevs;

  # extract the data from df
  my $rrdTime = time;
  my @dfLines = `df`;

#  print STDERR @dfLines;

  foreach my $dfLine (@dfLines) {
    chomp $dfLine;
    foreach my $rrdDev (@rrdDevs) {
      my $realDev;
      my $extDev  ='';
      if ($rrdDev =~ /^(.+)\:(.+)/) {
        $realDev  = $1;
        $extDev   = '.'. $2;
        $extDev   =~ s:/:\,:og;
      } else {
        $realDev  = $rrdDev;
      }

      my $rrdFile  = "$rrdMyDatabasePath" . "/usage_" . $realDev . "." . "rrd";
      my $device = $realDev ;
#      print STDERR $realDev . " - " . $extDev . "\n";
#      print STDERR "[$dfLine]\n";

      if ($dfLine =~ /$realDev\s+\d+\s+(\d+)+\s+(\d+)/g ) {

        my $usedM = sprintf("%d",$1/1024);
        #print STDERR "$1  / 1024 = $usedM\n";

        my $availM = sprintf("%d",$2/1024);
        #print STDERR "$2  / 1024 = $availM\n";

        # fill database
        create_rrd($rrdFile) if not -w $rrdFile;

        update_rrd($rrdFile,
                   $rrdTime,
                   $usedM,
                   $availM,
                   $device)  if -w $rrdFile;
      }
    }
  }
}

#..............................................................................
#..............................................................................

sub updategraph {
        my $period    = $_[0];
        my $rrdfile    = $_[1];
        my $realDev    = $_[2];

        RRDs::graph ("$graphs/usage-$realDev-$period.png",
                "--start", "-1$period", "-aPNG", "-i", "-z",
                "--alt-y-grid", "-w 600", "-h 100", "-l 0", "-u 100", "-r",
                "--color", "SHADEA#EAE9EE",
                "--color", "SHADEB#EAE9EE",
                "--color", "BACK#EAE9EE",
                "--vertical-label", "partition used (%)",
                "-t $realDev disk usage  per $period",
                "-b", 1024,
                "DEF:used=$rrdfile:used:AVERAGE",
                "DEF:avail=$rrdfile:avail:AVERAGE",
                "CDEF:total=used,avail,+",
                "CDEF:usedpct=100,used,total,/,*",
                "CDEF:availpct=100,avail,total,/,*",
                "AREA:usedpct#0000FF:used disk",
                "STACK:availpct#00FF00:free disk\\j",
                "GPRINT:avail:LAST:free disk\\:%9.1lf MB",
                "GPRINT:used:LAST:used disk\\:%9.1lf MB",
                "GPRINT:total:LAST:total disk\\:%9.1lf MB\\j",
                "GPRINT:usedpct:MAX:maximal used disk\\:%3.2lf%%",
                "GPRINT:usedpct:AVERAGE:average used disk\\:%3.2lf%%",
                "GPRINT:usedpct:LAST:current used disk\\:%3.2lf%%\\j",
                "GPRINT:availpct:MAX:maximal free disk\\:%3.2lf%%",
                "GPRINT:availpct:AVERAGE:average free disk\\:%3.2lf%%",
                "GPRINT:availpct:LAST:current free disk\\:%3.2lf%%\\j");
                $ERROR = RRDs::error;
                print "Error in RRD::graph for disk: $ERROR\n" if $ERROR;
}


Page 1 of 1 All times are UTC - 6 hours
Powered by phpBB® Forum Software © phpBB Group
http://www.phpbb.com/