contrib/collection3: GenericStacked: Use stacking by default.
[collectd.git] / contrib / collection3 / lib / Collectd / Graph / Type / GenericStacked.pm
index 273d89e..c5114a8 100644 (file)
@@ -1,5 +1,20 @@
 package Collectd::Graph::Type::GenericStacked;
 
+# Copyright (C) 2008,2009  Florian octo Forster <octo at verplant.org>
+#
+# This program is free software; you can redistribute it and/or modify it under
+# the terms of the GNU General Public License as published by the Free Software
+# Foundation; only version 2 of the License is applicable.
+#
+# This program is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+# FOR A PARTICULAR PURPOSE.  See the GNU General Public License for more
+# details.
+#
+# You should have received a copy of the GNU General Public License along with
+# this program; if not, write to the Free Software Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
+
 use strict;
 use warnings;
 use base ('Collectd::Graph::Type');
@@ -32,11 +47,53 @@ sub getRRDArgs
   my $idents = $group->{$group[$index]};
   my $ds_name_len = 0;
 
+  my $ds = $obj->getDataSources ();
+  if (!$ds)
+  {
+    confess ("obj->getDataSources failed.");
+  }
+  if (@$ds != 1)
+  {
+    confess ("I can only work with RRD files that have "
+      . "exactly one data source!");
+  }
+  my $data_source = $ds->[0];
+
   my $rrd_title = $obj->getTitle ($idents->[0]);
 
   my $colors = $obj->{'rrd_colors'} || {};
   my @ret = ('-t', $rrd_title, @$rrd_opts);
 
+  my $ignore_unknown = $obj->{'ignore_unknown'} || 0;
+  if ($ignore_unknown)
+  {
+    if ($ignore_unknown =~ m/^(yes|true|on)$/i)
+    {
+      $ignore_unknown = 1;
+    }
+    else
+    {
+      $ignore_unknown = 0;
+    }
+  }
+
+  my $stacking = $obj->{'stacking'};
+  if ($stacking)
+  {
+    if ($stacking =~ m/^(no|false|off|none)$/i)
+    {
+      $stacking = 0;
+    }
+    else
+    {
+      $stacking = 1;
+    }
+  }
+  else # if (!$stacking)
+  {
+    $stacking = 1;
+  }
+
   if (defined $obj->{'rrd_vertical'})
   {
     push (@ret, '-v', $obj->{'rrd_vertical'});
@@ -47,6 +104,23 @@ sub getRRDArgs
     sort_idents_by_type_instance ($idents, $obj->{'custom_order'});
   }
 
+  if ($ignore_unknown)
+  {
+    my $new_idents = [];
+    for (@$idents)
+    {
+      if (exists ($obj->{'ds_names'}{$_->{'type_instance'}}))
+      {
+       push (@$new_idents, $_);
+      }
+    }
+
+    if (@$new_idents)
+    {
+      $idents = $new_idents;
+    }
+  }
+
   $obj->{'ds_names'} ||= {};
   my @names = map { $obj->{'ds_names'}{$_->{'type_instance'}} || $_->{'type_instance'} } (@$idents);
 
@@ -59,44 +133,55 @@ sub getRRDArgs
     {
       $ds_name_len = length ($names[$i]);
     }
-    
+
     # Escape colons _after_ the length has been checked.
     $names[$i] =~ s/:/\\:/g;
 
     push (@ret,
-      "DEF:min${i}=${filename}:value:MIN",
-      "DEF:avg${i}=${filename}:value:AVERAGE",
-      "DEF:max${i}=${filename}:value:MAX");
+      "DEF:min${i}=${filename}:${data_source}:MIN",
+      "DEF:avg${i}=${filename}:${data_source}:AVERAGE",
+      "DEF:max${i}=${filename}:${data_source}:MAX");
   }
 
-  for (my $i = @$idents - 1; $i >= 0; $i--)
+  if ($stacking)
   {
-    if ($i == (@$idents - 1))
+    for (my $i = @$idents - 1; $i >= 0; $i--)
     {
-      push (@ret,
-       "CDEF:cdef${i}=avg${i}");
+      if ($i == (@$idents - 1))
+      {
+        push (@ret,
+         "CDEF:cdef${i}=avg${i},UN,0,avg${i},IF");
+      }
+      else
+      {
+        my $j = $i + 1;
+        push (@ret,
+          "CDEF:cdef${i}=avg${i},UN,0,avg${i},IF,cdef${j},+");
+      }
     }
-    else
+
+    for (my $i = 0; $i < @$idents; $i++)
     {
-      my $j = $i + 1;
+      my $type_instance = $idents->[$i]{'type_instance'};
+      my $color = '000000';
+      if (exists $colors->{$type_instance})
+      {
+        $color = $colors->{$type_instance};
+      }
+
+      $color = get_faded_color ($color);
+
       push (@ret,
-       "CDEF:cdef${i}=cdef${j},avg${i},+");
+        "AREA:cdef${i}#${color}");
     }
   }
-
-  for (my $i = 0; $i < @$idents; $i++)
+  else # if (!$stacking)
   {
-    my $type_instance = $idents->[$i]{'type_instance'};
-    my $color = '000000';
-    if (exists $colors->{$type_instance})
+    for (my $i = @$idents - 1; $i >= 0; $i--)
     {
-      $color = $colors->{$type_instance};
+      push (@ret,
+        "CDEF:cdef${i}=avg${i}");
     }
-
-    $color = get_faded_color ($color);
-
-    push (@ret,
-      "AREA:cdef${i}#${color}");
   }
 
   for (my $i = 0; $i < @$idents; $i++)