#!/usr/bin/perl
###########################################
# rrdload -- Measure CPU load over time
# Mike Schilli, 2004 (m@perlmeister.com)
###########################################
use warnings;
use strict;

use RRDs;
use Getopt::Std;

getopts("ug", \my %opts);

my $DB     = "/tmp/load.rrd";
my $SERVER = "/www/htdocs";
my $UPTIME = "uptime";

if(! -f $DB) {
  RRDs::create($DB, "--step=300",
    "DS:load:GAUGE:330:U:U", 
    "RRA:MAX:0.5:1:288",
    "RRA:MAX:0.5:12:168",
    "RRA:MAX:0.5:288:365",
  ) or die "Create error: ($RRDs::error)";
}

if(exists $opts{u}) {
    my $uptime = `$UPTIME`;
    my ($load) = ($uptime =~ /(\d\.\d+)/);

    RRDs::update($DB, time() . ":$load") or
        die "Update error: ($RRDs::error)";
}

if(exists $opts{g}) {
  RRDs::graph("$SERVER/load.png",
    "--vertical-label=Load perlmeister.com",
    "--start=" . rrd_start_time(),
    "--end=" . time(), 
    "DEF:myload=$DB:load:MAX",
    "LINE2:myload#FF0000") or
        die "graph failed ($RRDs::error)";
}

###########################################
sub rrd_start_time {
###########################################

    my ($start,$step,$names,$data) = 
                   RRDs::fetch($DB, "MAX");

    foreach my $line (@$data) {
      if(! defined $line->[0]) {
          $start += $step;
          next;
      }
      return $start;
    }
}
