01 #!/usr/bin/perl 02 ############################# 03 # rrdload - Measure CPU Load 04 # Mike Schilli, 2004 05 # (m@perlmeister.com) 06 ############################# 07 use warnings; 08 use strict; 09 10 use RRDs; 11 use Getopt::Std; 12 13 getopts("ug", \my %opts); 14 15 my $DB = "/tmp/load.rrd"; 16 my $SERVER = "/www/htdocs"; 17 my $UPTIME = "uptime"; 18 19 if(! -f $DB) { 20 RRDs::create($DB, 21 "--step=300", 22 "DS:load:GAUGE:330:U:U", 23 "RRA:MAX:0.5:1:288", 24 "RRA:MAX:0.5:12:168", 25 "RRA:MAX:0.5:288:365", 26 ) or die "Create error: " . 27 "($RRDs::error)"; 28 } 29 30 if(exists $opts{u}) { 31 my $uptime = `$UPTIME`; 32 my ($load) = 33 ($uptime =~ /(\d\.\d+)/); 34 35 RRDs::update($DB, 36 time() . ":$load") or 37 die "Update error: " . 38 "($RRDs::error)"; 39 } 40 41 if(exists $opts{g}) { 42 RRDs::graph( 43 "$SERVER/load.png", 44 "--vertical-label=" . 45 "Load perlmeister.com", 46 "--start=" . 47 rrd_start_time(), 48 "--end=" . time(), 49 "DEF:myload=$DB:load:MAX", 50 "LINE2:myload#FF0000") or 51 die "graph failed " . 52 "($RRDs::error)"; 53 } 54 55 ############################# 56 sub rrd_start_time { 57 ############################# 58 my ($start, $step, $names, 59 $data) = 60 RRDs::fetch($DB, "MAX"); 61 62 foreach my $line (@$data) { 63 if(!defined $line->[0]) { 64 $start += $step; 65 next; 66 } 67 return $start; 68 } 69 }