#!/usr/bin/perl -w
# plotstat.pl
# Ralf Becker 2005
# $Id: plotstat.pl,v 1.1.2.1 2005/07/31 22:09:52 becker Exp $
use strict;
use POSIX qw(strftime tmpnam unlink ceil floor);
use CGI qw(param);
my $LOGDIR;
$LOGDIR="PATH";
my (@KNOWNHOSTS,$HOST);
sub log10($) {
my $ln=2.30258509299404568401;
return(log($_[0])/$ln);
}
sub log1024($) {
my $ln=6.93147180559945309417;
return(log($_[0])/$ln);
}
sub frac($) {
return($_[0]-floor($_[0]));
}
sub plot($) {
my $HOSTNAME = $_[0];
my ($TMP, $LOG);
my $DATE;
my ($LOAD1,$LOAD2,$LOAD3,$YMAX,$Y2MAX,$MEM,$Y1,$Y2,$Y2TICS,$Y2LABEL);
my ($FKTCMD,$PLTCMD);
my ($EXP,$MR,$BASE1,$BASE2);
my $N;
$TMP=tmpnam();
$DATE=(strftime "%d%m%Y",localtime);
$LOG=$LOGDIR.$HOSTNAME."_".$DATE;
# set y-range
$YMAX=1;
$Y2MAX=1;
unless(open FIN,"<".$LOG) { print STDERR "$LOG: $!"; return -1;};
while (<FIN>) {
($LOAD1,$LOAD2,$LOAD3,$MEM) = (split("\ ",$_))[1,2,3,5];
if ($LOAD1 > $YMAX) {
$YMAX=$LOAD1;
}
if ($MEM > $Y2MAX) {
$Y2MAX=$MEM;
}
}
close FIN;
# set marker lines
$FKTCMD="";
$PLTCMD="";
if ($YMAX > 1) {
for ($N=1; $N < $YMAX; ++$N) {
$FKTCMD=$FKTCMD."; f".$N."(x) = ".$N;
$PLTCMD=$PLTCMD.", f".$N."(x) notitle with l 0";
}
$YMAX="\*";
}
# calculate y2tics
$MR=floor(log1024($Y2MAX));
SWITCH: {
if ($MR == 0)
{ $Y2LABEL="KB"; $BASE1=1; last SWITCH };
if ($MR == 1)
{ $Y2LABEL="MB"; $BASE1=1024; last SWITCH };
if ($MR >= 2)
{ $Y2LABEL="GB"; $BASE1=(1024*1024); last SWITCH };
}
$_=log10($Y2MAX/5/$BASE1);
$EXP=10**ceil($_);
$BASE2=10**frac($_);
SWITCH: {
if ($BASE2 <= 1.5)
{ $BASE2 = 1.0; last SWITCH };
if ((1.5 < $BASE2) && ($BASE2 <= 2.1))
{ $BASE2 = 2.0; last SWITCH };
if ((2.1 < $BASE2) && ($BASE2 <= 3.5))
{ $BASE2 = 2.5; last SWITCH };
if ((3.5 < $BASE2) && ($BASE2 <= 7.0))
{ $BASE2 = 5; last SWITCH };
if (7.0 < $BASE2)
{ $BASE2 = 1.0; last SWITCH };
}
print STDERR $HOSTNAME." ".$BASE1."\n";
print STDERR $HOSTNAME." ".$BASE2."\n";
$BASE2=$BASE2*$EXP;
$BASE1=$BASE1*$BASE2;
if ($BASE1 > $Y2MAX) {
$BASE1/=10;
$BASE2/=10;
}
$Y2TICS="( \'".$BASE2."\' ".$BASE1;
for ($N=2; $N <= 6; $N++) {
$Y2TICS.=", \'".$N*$BASE2."\' ".$N*$BASE1." ";
}
$Y2TICS.=")";
print STDERR $HOSTNAME." ".$Y2MAX."\n";
print STDERR $HOSTNAME." ".$EXP."\n";
print STDERR $HOSTNAME." ".$BASE1."\n";
print STDERR $HOSTNAME." ".$BASE2."\n";
print STDERR $HOSTNAME." ".$Y2TICS."\n";
# gnuplot output
open FOUT,">".$TMP or die "$TMP: $!";
print FOUT "set terminal png small\n";
print FOUT "set output\n";
print FOUT "\n";
print FOUT "set title \"".$HOSTNAME."\" 0.000000,0.000000 \n";
print FOUT "set size 0.7\n";
print FOUT "\n";
print FOUT "set xdata time\n";
print FOUT "set format x \"%H.%M\"\n";
print FOUT "set key\n";
print FOUT "set xlabel \"time\" 0.000000,0.000000 \n";
print FOUT "set timefmt \"%H:\%M\"\n";
print FOUT "set xrange [\"00:00\":\"23:59\"] noreverse nowriteback\n";
print FOUT "\n";
print FOUT "set yrange [ 0.00000 : ".$YMAX." ] noreverse nowriteback\n";
print FOUT "set y2range [0:".$Y2MAX."]\n";
print FOUT "set ylabel \"load\" 0.000000,0.000000 \n";
print FOUT "set y2label \"memory [".$Y2LABEL."]\" 0.000000,0.000000 \n";
print FOUT "set ytics nomirror\n";
print FOUT "set y2tics ".$Y2TICS."\n";
print FOUT "\n";
print FOUT $FKTCMD."\n";
print FOUT "plot \"".$LOG."\" using 1:2 title \"load\" with linespoints".$PLTCMD.", \"".$LOG."\" using 1:5 axes x1y2 title \"mem\" w lp lt 2 ";
#print FOUT "set output \"".$PNG."\"\n";
#print FOUT "set size 1.5\n";
#print FOUT "replot\n";
close FOUT;
# flush stdout
$|=1;
print STDOUT "Content-type: image/png\n\n";
system("/home/local/becker/bin/gnuplot $TMP");
unlink $TMP;
return 0;
}
# empty plot
sub plotdummy($) {
my $HOSTNAME = $_[0];
my $TMP;
$TMP=tmpnam();
open FOUT,">".$TMP or die "$TMP: $!";
print FOUT "set terminal png small\n";
print FOUT "set output\n";
print FOUT "\n";
print FOUT "set title \"".$HOSTNAME."\" 0.000000,0.000000 \n";
print FOUT "set size 0.7\n";
print FOUT "\n";
print FOUT "set xdata time\n";
print FOUT "set format x \"%H.%M\"\n";
print FOUT "set key\n";
print FOUT "set xlabel \"time\" 0.000000,0.000000 \n";
print FOUT "set timefmt \"%H:\%M\"\n";
print FOUT "set xrange [\"00:00\":\"23:59\"] noreverse nowriteback\n";
print FOUT "\n";
print FOUT "set yrange [ 0.00000 : 1.0 ] noreverse nowriteback\n";
print FOUT "set y2range [ 0.00000 : 1048576 ] noreverse nowriteback\n";
print FOUT "set ylabel \"load\" 0.000000,0.000000 \n";
print FOUT "set y2label \"memory [GB]\" 0.000000,0.000000 \n";
print FOUT "set ytics nomirror\n";
print FOUT "set y2tics ('0.5' 524288,'1.0' 1048576,'1.5' 1572864,'2.0' 2097152,'2.5' 2621440,'3.0' 3145728,'3.5' 3670016,'4.0' 4194304, '4.5' 4718592, '5.0' 5242880)\n";
print FOUT "set label \"no data available\" at \"9:00\",0.5\n";
print FOUT "\n";
print FOUT "plot 0\n";
close FOUT;
# flush stdout
$|=1;
print STDOUT "Content-type: image/png\n\n";
system("/home/local/becker/bin/gnuplot $TMP");
unlink $TMP;
}
# main
$HOST = param("HOST");
if (plot($HOST) eq -1) {
plotdummy($HOST);
}
exit 0;
syntax highlighted by Code2HTML, v. 0.9.1