From 8f3877cec6e0b00df55446828422af545464445b Mon Sep 17 00:00:00 2001 From: Florian Forster Date: Fri, 13 Mar 2009 15:39:38 +0100 Subject: [PATCH] contrib/collection3: Add graph for "Table space" graphs. --- contrib/collection3/etc/collection.conf | 9 + .../collection3/lib/Collectd/Graph/Common.pm | 21 ++ .../lib/Collectd/Graph/Type/TableSize.pm | 236 ++++++++++++++++++ 3 files changed, 266 insertions(+) create mode 100644 contrib/collection3/lib/Collectd/Graph/Type/TableSize.pm diff --git a/contrib/collection3/etc/collection.conf b/contrib/collection3/etc/collection.conf index b703e9f7..272ae68e 100644 --- a/contrib/collection3/etc/collection.conf +++ b/contrib/collection3/etc/collection.conf @@ -462,6 +462,15 @@ GraphWidth 400 Color cached 0000ff Color used ff0000 + + Module TableSize + DataSources value + DSName value Bytes + RRDTitle "Table size ({instance})" + RRDVerticalLabel "Size [Bytes]" +# RRDOptions ... + RRDFormat "%5.1lf%s" + Module GenericStacked DataSources value diff --git a/contrib/collection3/lib/Collectd/Graph/Common.pm b/contrib/collection3/lib/Collectd/Graph/Common.pm index 0deefd63..b445c8e4 100644 --- a/contrib/collection3/lib/Collectd/Graph/Common.pm +++ b/contrib/collection3/lib/Collectd/Graph/Common.pm @@ -36,6 +36,7 @@ $ColorHalfBlue = 'B7B7F7'; get_timespan_selection get_host_selection get_plugin_selection + get_random_color get_faded_color sort_idents_by_type_instance type_to_module_name @@ -516,6 +517,26 @@ sub _color_to_string return (sprintf ('%02hx%02hx%02hx', map { int (255.0 * $_) } @{$_[0]})); } # _color_to_string +sub get_random_color +{ + my ($r, $g, $b) = (rand (), rand ()); + my $min = 0.0; + my $max = 1.0; + + if (($r + $g) < 1.0) + { + $min = 1.0 - ($r + $g); + } + else + { + $max = 2.0 - ($r + $g); + } + + $b = $min + (rand () * ($max - $min)); + + return (_color_to_string ([$r, $g, $b])); +} # get_random_color + sub get_faded_color { my $fg = shift; diff --git a/contrib/collection3/lib/Collectd/Graph/Type/TableSize.pm b/contrib/collection3/lib/Collectd/Graph/Type/TableSize.pm new file mode 100644 index 00000000..495f42a0 --- /dev/null +++ b/contrib/collection3/lib/Collectd/Graph/Type/TableSize.pm @@ -0,0 +1,236 @@ +package Collectd::Graph::Type::TableSize; + +# Copyright (C) 2008,2009 Florian octo Forster +# +# 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'); + +use Collectd::Graph::Common (qw($ColorCanvas $ColorFullBlue $ColorHalfBlue + ident_to_filename sanitize_type_instance + get_random_color sort_idents_by_type_instance)); + +use RRDs (); + +return (1); + +sub _get_last_value +{ + my $ident = shift; + my $value = undef; + my $filename = ident_to_filename ($ident); + my ($start ,$step ,$names ,$data) = RRDs::fetch ($filename, 'AVERAGE', '-s', '-3600'); + if (my $errmsg = RRDs::error ()) + { + print STDERR "RRDs::fetch ($filename) failed: $errmsg\n"; + return; + } + + for (@$data) + { + my $line = $_; + + for (@$line) + { + my $ds = $_; + + if (defined ($ds)) + { + $value = $ds; + } + } + } # for (@$data) + + return ($value); +} # _get_last_value + +sub getLastValues +{ + my $obj = shift; + my $last_value = {}; + + if (exists ($obj->{'last_value'})) + { + return ($obj->{'last_value'}); + } + + for (@{$obj->{'files'}}) + { + my $file = $_; + + $last_value->{$file} = _get_last_value ($file); + } + $obj->{'last_value'} = $last_value; + return ($obj->{'last_value'}); +} # getLastValues + +sub _group_files +{ + my $obj = shift; + my $data = []; + my @files; + my $last_values + + $last_values = $obj->getLastValues (); + + @files = sort + { + if (!defined ($last_values->{$a}) && !defined ($last_values->{$b})) + { + return (0); + } + elsif (!defined ($last_values->{$a})) + { + return (1); + } + elsif (!defined ($last_values->{$b})) + { + return (-1); + } + else + { + return ($last_values->{$a} <=> $last_values->{$b}); + } + } (@{$obj->{'files'}}); + + for (my $i = 0; $i < @files; $i++) + { + my $file = $files[$i]; + my $j = int ($i / 10); + + $data->[$j] ||= []; + push (@{$data->[$j]}, $file); + } + + return ($data); +} # _group_files + +sub getGraphsNum +{ + my $obj = shift; + my $group = _group_files ($obj); + + return (0 + @$group); +} + +sub getRRDArgs +{ + my $obj = shift; + my $index = shift; + + my $group = _group_files ($obj); + + my $rrd_opts = $obj->{'rrd_opts'} || []; + my $format = $obj->{'rrd_format'} || '%5.1lf'; + + my $idents = $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); + + if (defined $obj->{'rrd_vertical'}) + { + push (@ret, '-v', $obj->{'rrd_vertical'}); + } + + if ($obj->{'custom_order'}) + { + sort_idents_by_type_instance ($idents, $obj->{'custom_order'}); + } + + $obj->{'ds_names'} ||= {}; + my @names = map { $obj->{'ds_names'}{$_->{'type_instance'}} || $_->{'type_instance'} } (@$idents); + + for (my $i = 0; $i < @$idents; $i++) + { + my $ident = $idents->[$i]; + my $filename = ident_to_filename ($ident); + + if ($ds_name_len < length ($names[$i])) + { + $ds_name_len = length ($names[$i]); + } + + # Escape colons _after_ the length has been checked. + $names[$i] =~ s/:/\\:/g; + + push (@ret, + "DEF:min${i}=${filename}:${data_source}:MIN", + "DEF:avg${i}=${filename}:${data_source}:AVERAGE", + "DEF:max${i}=${filename}:${data_source}:MAX"); + } + + for (my $i = 0; $i < @$idents; $i++) + { + my $type_instance = $idents->[$i]{'type_instance'}; + my $ds_name = sprintf ("%-*s", $ds_name_len, $names[$i]); + my $color = '000000'; + if (exists $colors->{$type_instance}) + { + $color = $colors->{$type_instance}; + } + else + { + $color = get_random_color (); + } + push (@ret, + "LINE1:avg${i}#${color}:${ds_name}", + "GPRINT:min${i}:MIN:${format} Min,", + "GPRINT:avg${i}:AVERAGE:${format} Avg,", + "GPRINT:max${i}:MAX:${format} Max,", + "GPRINT:avg${i}:LAST:${format} Last\\l"); + } + + return (\@ret); +} + +sub getGraphArgs +{ + my $obj = shift; + my $index = shift; + + my $group = _group_files ($obj); + my $idents = $group->[$index]; + + my @args = (); + for (qw(hostname plugin plugin_instance type)) + { + if (defined ($idents->[0]{$_})) + { + push (@args, $_ . '=' . $idents->[0]{$_}); + } + } + push (@args, "index=$index"); + + return (join (';', @args)); +} # getGraphArgs + +# vim: set shiftwidth=2 softtabstop=2 tabstop=8 : -- 2.30.2