273d89e63cabdd01c6addba1970d3273fe2bad0c
1 package Collectd::Graph::Type::GenericStacked;
3 use strict;
4 use warnings;
5 use base ('Collectd::Graph::Type');
7 use Collectd::Graph::Common (qw($ColorCanvas $ColorFullBlue $ColorHalfBlue
8 group_files_by_plugin_instance ident_to_filename sanitize_type_instance
9 get_faded_color sort_idents_by_type_instance));
11 return (1);
13 sub getGraphsNum
14 {
15 my $obj = shift;
16 my $group = group_files_by_plugin_instance (@{$obj->{'files'}});
18 return (scalar (keys %$group));
19 }
21 sub getRRDArgs
22 {
23 my $obj = shift;
24 my $index = shift;
26 my $group = group_files_by_plugin_instance (@{$obj->{'files'}});
27 my @group = sort (keys %$group);
29 my $rrd_opts = $obj->{'rrd_opts'} || [];
30 my $format = $obj->{'rrd_format'} || '%5.1lf';
32 my $idents = $group->{$group[$index]};
33 my $ds_name_len = 0;
35 my $rrd_title = $obj->getTitle ($idents->[0]);
37 my $colors = $obj->{'rrd_colors'} || {};
38 my @ret = ('-t', $rrd_title, @$rrd_opts);
40 if (defined $obj->{'rrd_vertical'})
41 {
42 push (@ret, '-v', $obj->{'rrd_vertical'});
43 }
45 if ($obj->{'custom_order'})
46 {
47 sort_idents_by_type_instance ($idents, $obj->{'custom_order'});
48 }
50 $obj->{'ds_names'} ||= {};
51 my @names = map { $obj->{'ds_names'}{$_->{'type_instance'}} || $_->{'type_instance'} } (@$idents);
53 for (my $i = 0; $i < @$idents; $i++)
54 {
55 my $ident = $idents->[$i];
56 my $filename = ident_to_filename ($ident);
58 if ($ds_name_len < length ($names[$i]))
59 {
60 $ds_name_len = length ($names[$i]);
61 }
63 # Escape colons _after_ the length has been checked.
64 $names[$i] =~ s/:/\\:/g;
66 push (@ret,
67 "DEF:min${i}=${filename}:value:MIN",
68 "DEF:avg${i}=${filename}:value:AVERAGE",
69 "DEF:max${i}=${filename}:value:MAX");
70 }
72 for (my $i = @$idents - 1; $i >= 0; $i--)
73 {
74 if ($i == (@$idents - 1))
75 {
76 push (@ret,
77 "CDEF:cdef${i}=avg${i}");
78 }
79 else
80 {
81 my $j = $i + 1;
82 push (@ret,
83 "CDEF:cdef${i}=cdef${j},avg${i},+");
84 }
85 }
87 for (my $i = 0; $i < @$idents; $i++)
88 {
89 my $type_instance = $idents->[$i]{'type_instance'};
90 my $color = '000000';
91 if (exists $colors->{$type_instance})
92 {
93 $color = $colors->{$type_instance};
94 }
96 $color = get_faded_color ($color);
98 push (@ret,
99 "AREA:cdef${i}#${color}");
100 }
102 for (my $i = 0; $i < @$idents; $i++)
103 {
104 my $type_instance = $idents->[$i]{'type_instance'};
105 my $ds_name = sprintf ("%-*s", $ds_name_len, $names[$i]);
106 my $color = '000000';
107 if (exists $colors->{$type_instance})
108 {
109 $color = $colors->{$type_instance};
110 }
111 push (@ret,
112 "LINE1:cdef${i}#${color}:${ds_name}",
113 "GPRINT:min${i}:MIN:${format} Min,",
114 "GPRINT:avg${i}:AVERAGE:${format} Avg,",
115 "GPRINT:max${i}:MAX:${format} Max,",
116 "GPRINT:avg${i}:LAST:${format} Last\\l");
117 }
119 return (\@ret);
120 }
122 sub getGraphArgs
123 {
124 my $obj = shift;
125 my $index = shift;
127 my $group = group_files_by_plugin_instance (@{$obj->{'files'}});
128 my @group = sort (keys %$group);
130 my $idents = $group->{$group[$index]};
132 my @args = ();
133 for (qw(hostname plugin plugin_instance type))
134 {
135 if (defined ($idents->[0]{$_}))
136 {
137 push (@args, $_ . '=' . $idents->[0]{$_});
138 }
139 }
141 return (join (';', @args));
142 } # getGraphArgs
145 # vim: set shiftwidth=2 softtabstop=2 tabstop=8 :