[rrd-users] Problems graphing
Laura McCord
mccordl at southwestern.edu
Fri Sep 26 22:23:11 CEST 2008
Thanks for the suggestions. I'll try that and see if I can get it closer
to working.
Thanks!
Laura
Joshua Keroes wrote:
> See below
>
> On Fri, Sep 26, 2008 at 8:05 AM, Laura McCord
> <mccordl at southwestern.edu <mailto:mccordl at southwestern.edu>> wrote:
>
> I have my data loaded into an array but everytime I try to graph the
> data I get a "Can't call method "png" on an undefined value...
>
> I am using Perl and the Graph module to produce a bar graph. Here is a
> sample of my data and my source code. Perhaps someone will notice
> what I
> am doing wrong.
>
> Thanks.
>
>
> Here is some sample data:
>
> Fri Sep 26 00:00:00 2008 0.1
> Fri Sep 26 01:00:00 2008 0.0
> Fri Sep 26 02:00:00 2008 0.1
> Fri Sep 26 03:00:00 2008 0.1
> Fri Sep 26 04:00:00 2008 0.2
> Fri Sep 26 05:00:00 2008 0.1
> Fri Sep 26 06:00:00 2008 0.2
> Fri Sep 26 07:00:00 2008 0.1
> Fri Sep 26 08:00:00 2008 0.2
> Fri Sep 26 09:00:00 2008 0.2
> Fri Sep 26 10:00:00 2008 0.2
>
> Here is a snippet of code:
>
>
> # Got use strict; use warnings; in your code? They'll help.
>
>
>
> #Every Hour
> my $res = '60';
>
> # Start on Sep 1st
> my $start_t = "1220227200";
>
>
> # This is really Aug 31
>
>
> my $start_t_res = int($start_t/$res)*$res;
>
>
> # And if you start to --start from this time, then you've just
> overflowed time_t and you're trying to start at Wed Dec 31 15:59:59
> 1969, or time 0.
>
>
>
> #End on Today's Date
> my $end_t = "(int($start_t/$res)*$res)";
>
>
> # unused. But you don't want to quote it anyway. That won't work.
>
>
>
> my ($start,$step,$names,$data) =
> RRDs::fetch("stats.rrd","AVERAGE","-r","$res","-s",
> "$start_t_res","-e","now");
>
>
> # see above about starting at wrong time.
>
>
>
> print "Start: ", scalar localtime($start), " ($start)\n";
> print "Step size: $step seconds\n";
> print "DS names: ", join (", ", @$names)."\n";
> print "Data points: ", $#$data + 1, "\n";
>
>
> # Try scalar @data here instead.
>
> # Consider renaming @array1 to @timestamps and @array2 to @values or
> # better: @whatever_those_values_actually_are. That makes it easier for
> # us to read your code.
> #
> # There are faster ways to do this, but if it works, then I'll skip
> over it for the most part.
> # The only point I'll make is that if there are multiple DS's in your
> RRD, then you'll
> # only see the last one because the inner foreach loop will overwrite
> all of the prior
> # values in @line with just the last.
> #
>
> print "Data:\n";
> foreach my $line (@$data) {
> $start += $step;
> $min++;
> #Here I am only loading hourly data into the array
> if($min == 60){
> $array1[$i] = localtime($start);
> foreach my $val (@$line) {
> $array2[$i] = $val;
> }
> $i++;
> $min=0;
> }
> }
>
> for($i=0;$i < @array1; $i++){
> print $array1[$i]." ";
> printf "%12.1f ", $array2[$i];
> print "\n";
> }
>
>
> # I prefer something like this here:
> #
> # for my $i (0..$#timestamps) {
> # printf "$timestamps[$i]: %12.1f\n", $values[$i];
> # }
>
> @actualdata = (\@array1,\@array2);
>
>
> # Let's comment the above line out and ...
>
>
>
> my $graph = new GD::Graph::bars;
> $graph->set(
> x_label => 'Date/Time',
> y_label => 'Messages',
> title => 'Dropped Messages',
> y_max_value => 10,
> y_tick_number => 1,
> y_label_skip => 1,
>
> # shadows
> bar_spacing => 10,
> shadow_depth => 4,
> shadowclr => 'dred',
>
> transparent => 0,
> ) or warn $graph->error;
>
>
> my $image = $graph->plot(\@actualdata)->png();
>
> # ...move it down here where it's a little closer to the action thusly:
> #
> # my $image = $graph->plot( [\@timestamps, \@values] )->png;
>
> Maybe that'll get you a little closer.
>
> Good luck,
> Joshua
>
More information about the rrd-users
mailing list