Index: ossp-pkg/flow2rrd/ChangeLog RCS File: /v/ossp/cvs/ossp-pkg/flow2rrd/ChangeLog,v rcsdiff -q -kk '-r1.13' '-r1.14' -u '/v/ossp/cvs/ossp-pkg/flow2rrd/ChangeLog,v' 2>/dev/null --- ChangeLog 2004/12/29 15:22:00 1.13 +++ ChangeLog 2004/12/30 15:56:00 1.14 @@ -10,6 +10,10 @@ Changes between 0.9.1 and 0.9.2 (26-Dec-2004 to 27-Dec-2004): + *) Calculate a more reasonable Y axis auto-scaling based + on average numbers instead of maximum numbers. + [Ralf S. Engelschall] + *) Better formatting of legend by manually aligning elements in width-dependent number of columns and by prefixing elements with calculated average traffic. Index: ossp-pkg/flow2rrd/flow2rrd.pl RCS File: /v/ossp/cvs/ossp-pkg/flow2rrd/flow2rrd.pl,v rcsdiff -q -kk '-r1.18' '-r1.19' -u '/v/ossp/cvs/ossp-pkg/flow2rrd/flow2rrd.pl,v' 2>/dev/null --- flow2rrd.pl 2004/12/29 15:45:56 1.18 +++ flow2rrd.pl 2004/12/30 15:56:00 1.19 @@ -672,7 +672,7 @@ push(@args, @def); push(@args, @cdef); push(@args, @draw); - my ($rrd_averages, $rrd_xsize, $rrd_ysize) = RRDs::graph(@args); + my ($rrd_averages, $rrd_xsize, $rrd_ysize) = &rrd_graph(@args); my $err = RRDs::error(); die "failed to generate graph from RRD file: $err" if (defined($err)); } @@ -782,10 +782,49 @@ push(@args, @def); push(@args, @cdef); push(@args, @draw); - my ($rrd_averages, $rrd_xsize, $rrd_ysize) = RRDs::graph(@args); + my ($rrd_averages, $rrd_xsize, $rrd_ysize) = &rrd_graph(@args); my $err = RRDs::error(); die "failed to generate graph from RRD file: $err" if (defined($err)); } + + # render an RRD graph (frontend to RRDs::graph() function) + sub rrd_graph { + my (@args) = @_; + my ($rrd_results, $rrd_xsize, $rrd_ysize); + + # if no Y axis limits are specified, try to determine + # reasonable ones based on the calculated average values + # (instead of the maximum values RRDTool uses by default) + if (not grep { $_ =~ m/^--(?:upper|lower)-limit$/ } @args) { + my @a = @args; + @a = map { s/^GPRINT/PRINT/s; $_ } + grep { $_ !~ m/^(AREA|STACK|LINE|HRULE|VRULE):/ } + @a; + ($rrd_results, $rrd_xsize, $rrd_ysize) = RRDs::graph(@a); + my $err = RRDs::error(); + if (not defined($err)) { + my $print = join(" ", @{$rrd_results}); + if ($print =~ m/Total Average Traffic:\s+(\S+)\s+out\s+\/\s+(\S+)\s+in/s) { + my ($ulimit, $llimit) = (&canon($1), &canon($2)); + sub canon { + my ($limit) = @_; + if ($limit =~ m|^([+-]?\d+)k$|) { $limit = $1 * 1000; } + elsif ($limit =~ m|^([+-]?\d+)M$|) { $limit = $1 * 1000*1000; } + elsif ($limit =~ m|^([+-]?\d+)G$|) { $limit = $1 * 1000*1000*1000; } + return $limit; + } + $ulimit = int($ulimit * 1.5); + $llimit = int($llimit * 1.5); + push(@args, '--upper-limit', $ulimit); + push(@args, '--lower-limit', $llimit); + } + } + } + + # pass through the arguments to the RRDs::graph() function + ($rrd_results, $rrd_xsize, $rrd_ysize) = RRDs::graph(@args); + return ($rrd_results, $rrd_xsize, $rrd_ysize); + } } }