1 package Collectd::Graph::Type::GenericIO;
3 use strict;
4 use warnings;
5 use base ('Collectd::Graph::Type');
7 use Carp ('confess');
9 use Collectd::Graph::Common (qw($ColorCanvas ident_to_filename get_faded_color));
11 return (1);
13 sub getRRDArgs
14 {
15 my $obj = shift;
16 my $index = shift;
18 my $ident = $obj->{'files'}[$index] || confess ("Unknown index $index");
19 my $filename = ident_to_filename ($ident);
21 my $rrd_opts = $obj->{'rrd_opts'} || [];
22 my $rrd_title = $obj->getTitle ($ident);
23 my $format = $obj->{'rrd_format'} || '%5.1lf%s';
25 my $ds_list = $obj->getDataSources ();
26 my $ds_names = $obj->{'ds_names'};
27 if (!$ds_names)
28 {
29 $ds_names = {};
30 }
32 my $colors = $obj->{'rrd_colors'} || {};
33 my @ret = ('-t', $rrd_title, @$rrd_opts);
35 if (defined $obj->{'rrd_vertical'})
36 {
37 push (@ret, '-v', $obj->{'rrd_vertical'});
38 }
40 if (@$ds_list != 2)
41 {
42 my $num = 0 + @$ds_list;
43 confess ("Expected two data sources, but there is/are $num");
44 }
46 my $rx_ds = $ds_list->[0];
47 my $tx_ds = $ds_list->[1];
49 my $rx_ds_name = $ds_names->{$rx_ds} || $rx_ds;
50 my $tx_ds_name = $ds_names->{$tx_ds} || $tx_ds;
52 my $rx_color_fg = $colors->{$rx_ds} || '0000ff';
53 my $tx_color_fg = $colors->{$tx_ds} || '00b000';
55 my $rx_color_bg = get_faded_color ($rx_color_fg);
56 my $tx_color_bg = get_faded_color ($tx_color_fg);
57 my $overlap_color = get_faded_color ($rx_color_bg, background => $tx_color_bg);
59 $filename =~ s#:#\\:#g;
60 $rx_ds =~ s#:#\\:#g;
61 $tx_ds =~ s#:#\\:#g;
62 $rx_ds_name =~ s#:#\\:#g;
63 $tx_ds_name =~ s#:#\\:#g;
65 if ($obj->{'scale'})
66 {
67 my $factor = $obj->{'scale'};
69 push (@ret,
70 "DEF:min_rx_raw=${filename}:${rx_ds}:MIN",
71 "DEF:avg_rx_raw=${filename}:${rx_ds}:AVERAGE",
72 "DEF:max_rx_raw=${filename}:${rx_ds}:MAX",
73 "DEF:min_tx_raw=${filename}:${tx_ds}:MIN",
74 "DEF:avg_tx_raw=${filename}:${tx_ds}:AVERAGE",
75 "DEF:max_tx_raw=${filename}:${tx_ds}:MAX",
76 "CDEF:min_rx=min_rx_raw,${factor},*",
77 "CDEF:avg_rx=avg_rx_raw,${factor},*",
78 "CDEF:max_rx=max_rx_raw,${factor},*",
79 "CDEF:min_tx=min_tx_raw,${factor},*",
80 "CDEF:avg_tx=avg_tx_raw,${factor},*",
81 "CDEF:max_tx=max_tx_raw,${factor},*");
82 }
83 else # (!$obj->{'scale'})
84 {
85 push (@ret,
86 "DEF:min_rx=${filename}:${rx_ds}:MIN",
87 "DEF:avg_rx=${filename}:${rx_ds}:AVERAGE",
88 "DEF:max_rx=${filename}:${rx_ds}:MAX",
89 "DEF:min_tx=${filename}:${tx_ds}:MIN",
90 "DEF:avg_tx=${filename}:${tx_ds}:AVERAGE",
91 "DEF:max_tx=${filename}:${tx_ds}:MAX");
92 }
94 push (@ret,
95 "CDEF:overlap=avg_rx,avg_tx,LT,avg_rx,avg_tx,IF",
96 "AREA:avg_rx#${rx_color_bg}",
97 "AREA:avg_tx#${tx_color_bg}",
98 "AREA:overlap#${overlap_color}",
99 "LINE1:avg_rx#${rx_color_fg}:${rx_ds_name}",
100 "GPRINT:min_rx:MIN:${format} Min,",
101 "GPRINT:avg_rx:AVERAGE:${format} Avg,",
102 "GPRINT:max_rx:MAX:${format} Max,",
103 "GPRINT:avg_rx:LAST:${format} Last\\l",
104 "LINE1:avg_tx#${tx_color_fg}:${tx_ds_name}",
105 "GPRINT:min_tx:MIN:${format} Min,",
106 "GPRINT:avg_tx:AVERAGE:${format} Avg,",
107 "GPRINT:max_tx:MAX:${format} Max,",
108 "GPRINT:avg_tx:LAST:${format} Last\\l");
110 return (\@ret);
111 } # getRRDArgs
113 # vim: set shiftwidth=2 softtabstop=2 tabstop=8 :