1
0
Fork 0
mirror of https://github.com/munin-monitoring/contrib.git synced 2025-07-25 18:38:30 +00:00

Determining whether a virtual interface, small visual improvements (labels), a small code compaction

This commit is contained in:
Gorlow Maxim aka Sheridan 2010-07-16 11:28:13 +02:00 committed by Steve Schnepp
parent 6552dd3fb3
commit b6024a5599

View file

@ -19,6 +19,8 @@ WiFi interface signal and noise
WiFi interface link quality WiFi interface link quality
Interface utilisation Interface utilisation
Virtual interface names prefixes with '~'
=head1 CONFIGURATION =head1 CONFIGURATION
This plugin is configurable environment variables. This plugin is configurable environment variables.
@ -36,8 +38,8 @@ Example:
env.protect_peaks yes env.protect_peaks yes
Protect peak: Protect peak:
1. Protect wifi signal and noise values, all values > 0 print as nan 1. Protect wifi signal and noise values, all values > 0 print as NaN
2. protect all percent values. All values > 100 print as nan 2. protect all percent values. All values > 100 print as NaN
3. Protect bps values. env.if_max_bps must be set. All values > max_bps prints as 0 3. Protect bps values. env.if_max_bps must be set. All values > max_bps prints as 0
4. protect pps values. env.if_max_bps must be set. All values > max_bps/minimal packet size, prints as 0 4. protect pps values. env.if_max_bps must be set. All values > max_bps/minimal packet size, prints as 0
@ -234,7 +236,7 @@ my $graphs =
# 'field' - exists field, must be included in graph # 'field' - exists field, must be included in graph
# 'name' => '' - field name # 'name' => '' - field name
# } # }
# 'peack_protect' => protect peaks. Using munin field.max and field.min and truncate data to nan # 'peack_protect' => protect peaks. Using munin field.max and field.min and truncate data to NaN
# protect types # protect types
# 'max_interface_bps' - maximum: max interface bps (if configured), minimum - zero # 'max_interface_bps' - maximum: max interface bps (if configured), minimum - zero
# 'packet_size_range' - maximum: mtu, minimum: minimal packet size (may be configured) # 'packet_size_range' - maximum: mtu, minimum: minimal packet size (may be configured)
@ -277,7 +279,7 @@ my $fields =
'negative' => 'negative' =>
{ {
'type' => 'dummy', 'type' => 'dummy',
'value' => 'nan' 'value' => 'NaN'
}, },
'difference' => 'per_secund' 'difference' => 'per_secund'
}, },
@ -345,7 +347,7 @@ my $fields =
'negative' => 'negative' =>
{ {
'type' => 'dummy', 'type' => 'dummy',
'value' => 'nan' 'value' => 'NaN'
}, },
'difference' => 'count' 'difference' => 'count'
}, },
@ -433,7 +435,7 @@ my $fields =
'negative' => 'negative' =>
{ {
'type' => 'dummy', 'type' => 'dummy',
'value' => 'nan' 'value' => 'NaN'
}, },
'difference' => 'count' 'difference' => 'count'
}, },
@ -455,7 +457,7 @@ my $fields =
'negative' => 'negative' =>
{ {
'type' => 'dummy', 'type' => 'dummy',
'value' => 'nan' 'value' => 'NaN'
}, },
'difference' => 'count' 'difference' => 'count'
}, },
@ -477,7 +479,7 @@ my $fields =
'negative' => 'negative' =>
{ {
'type' => 'dummy', 'type' => 'dummy',
'value' => 'nan' 'value' => 'NaN'
}, },
'difference' => 'count' 'difference' => 'count'
}, },
@ -499,7 +501,7 @@ my $fields =
'negative' => 'negative' =>
{ {
'type' => 'dummy', 'type' => 'dummy',
'value' => 'nan' 'value' => 'NaN'
}, },
'difference' => 'count' 'difference' => 'count'
}, },
@ -919,7 +921,7 @@ my $fields =
'negative' => 'negative' =>
{ {
'type' => 'dummy', 'type' => 'dummy',
'value' => 'nan' 'value' => 'NaN'
}, },
'difference' => 'count' 'difference' => 'count'
}, },
@ -958,7 +960,7 @@ my $fields =
'negative' => 'negative' =>
{ {
'type' => 'dummy', 'type' => 'dummy',
'value' => 'nan' 'value' => 'NaN'
}, },
'difference' => 'count' 'difference' => 'count'
}, },
@ -997,7 +999,7 @@ my $fields =
'negative' => 'negative' =>
{ {
'type' => 'dummy', 'type' => 'dummy',
'value' => 'nan' 'value' => 'NaN'
}, },
'difference' => 'count' 'difference' => 'count'
}, },
@ -1072,7 +1074,7 @@ exit(0);
sub get_file_content sub get_file_content
{ {
my $file = $_[0]; my $file = $_[0];
return 'nan' if (-z $file); return 'NaN' if (-z $file);
open (FH, '<', $file) or die "$! $file \n"; open (FH, '<', $file) or die "$! $file \n";
my $content = <FH>; my $content = <FH>;
close (FH); close (FH);
@ -1111,12 +1113,15 @@ sub get_interfaces
elsif($suff eq 'G') { $bps = $num * 1000 * 1000 * 1000 / 8; } elsif($suff eq 'G') { $bps = $num * 1000 * 1000 * 1000 / 8; }
$interfaces->{$if}{'bps'} = $bps; $interfaces->{$if}{'bps'} = $bps;
} }
if (-e sprintf("/sys/devices/virtual/net/%s", $if)) { $interfaces->{$if}{'virtual'} = 1; }
$interfaces->{$if}{'name'} = exists($interfaces->{$if}{'virtual'}) ? sprintf("~%s", $if) : $if;
} }
my ($maxlen, $tl) = (0, 0);
for (keys %{$interfaces}) { $tl = length($interfaces->{$_}{'name'}); $maxlen = $tl if $tl > $maxlen; }
for (keys %{$interfaces}) { $interfaces->{$_}{'name'} = sprintf("[%${maxlen}s]", $interfaces->{$_}{'name'}); }
} }
else else { die "$ifpath not exists\n"; }
{
die "$ifpath not exists\n";
}
return $interfaces; return $interfaces;
} }
@ -1188,7 +1193,6 @@ sub check_field_avialability
{ {
my $file = $fields->{$field}{'source'}{'location'}; my $file = $fields->{$field}{'source'}{'location'};
$file =~ s/:if:/$if/g; $file =~ s/:if:/$if/g;
#print "File source: $file\n";
$fields->{$field}{'avialable'}{$if} = 1 if (-e $file); $fields->{$field}{'avialable'}{$if} = 1 if (-e $file);
} }
#---------------------------- calculated ---------------- #---------------------------- calculated ----------------
@ -1198,7 +1202,7 @@ sub check_field_avialability
if($fields->{$field}{'source'}{'calculated'}{'type'} eq 'percent') if($fields->{$field}{'source'}{'calculated'}{'type'} eq 'percent')
{ {
my %avialable; my %avialable;
foreach my $a ('full', 'part') for my $a ('full', 'part')
{ {
if($fields->{$field}{'source'}{'calculated'}{$a}{'source'} eq 'interface') if($fields->{$field}{'source'}{'calculated'}{$a}{'source'} eq 'interface')
{ {
@ -1215,7 +1219,7 @@ sub check_field_avialability
elsif($fields->{$field}{'source'}{'calculated'}{'type'} eq 'division') elsif($fields->{$field}{'source'}{'calculated'}{'type'} eq 'division')
{ {
my %avialable; my %avialable;
foreach my $a ('dividend', 'divider') for my $a ('dividend', 'divider')
{ {
if($fields->{$field}{'source'}{'calculated'}{$a}{'source'} eq 'interface') if($fields->{$field}{'source'}{'calculated'}{$a}{'source'} eq 'interface')
{ {
@ -1232,7 +1236,7 @@ sub check_field_avialability
elsif($fields->{$field}{'source'}{'calculated'}{'type'} eq 'sum') elsif($fields->{$field}{'source'}{'calculated'}{'type'} eq 'sum')
{ {
my $count = 0; my $count = 0;
foreach my $a (@{$fields->{$field}{'source'}{'calculated'}{'sum'}}) for my $a (@{$fields->{$field}{'source'}{'calculated'}{'sum'}})
{ {
$count++ if (check_field_avialability($if, $a)); $count++ if (check_field_avialability($if, $a));
} }
@ -1240,7 +1244,6 @@ sub check_field_avialability
} }
} }
} }
#printf("field %s from if %s - %savialable\n", $field, $if, $fields->{$field}{'avialable'}{$if} ? '' : "un");
return $fields->{$field}{'avialable'}{$if}; return $fields->{$field}{'avialable'}{$if};
} }
@ -1266,7 +1269,7 @@ sub concat_names
} }
if (exists($interfaces->{$if})) if (exists($interfaces->{$if}))
{ {
$name = sprintf ("[%s] %s", $if, $name); $name = sprintf ("%s %s", $interfaces->{$if}{'name'}, $name);
} }
return $name; return $name;
} }
@ -1277,10 +1280,10 @@ sub generate_field
my ($config, $graph_name, $field, $if, $is_general_graph) = @_[0..4]; my ($config, $graph_name, $field, $if, $is_general_graph) = @_[0..4];
return '' unless(check_field_avialability($if, $field)); return '' unless(check_field_avialability($if, $field));
my $field_graph_name = $is_general_graph ? sprintf("%s_%s", $if, $field) : $field; my $field_graph_name = $is_general_graph ? sprintf("%s_%s", $if, $field) : $field;
foreach my $option (keys %{$fields->{$field}{'munin'}}) for my $option (keys %{$fields->{$field}{'munin'}})
{ {
next if exists($config->{$graph_name}{'fields'}{$field_graph_name}{$option}); next if exists($config->{$graph_name}{'fields'}{$field_graph_name}{$option});
$config->{$graph_name}{'fields'}{$field_graph_name}{$option} = replace_if_template($fields->{$field}{'munin'}{$option}, $if); $config->{$graph_name}{'fields'}{$field_graph_name}{$option} = replace_if_template($fields->{$field}{'munin'}{$option}, $interfaces->{$if}{'name'});
} }
if(exists($fields->{$field}{'cdef'})) if(exists($fields->{$field}{'cdef'}))
{ {
@ -1311,13 +1314,13 @@ sub generate_field
# Fix field label on general graphs # Fix field label on general graphs
if ($is_general_graph and not $config->{$graph_name}{'fields'}{$field_graph_name}{'label'} =~ m/$if/) if ($is_general_graph and not $config->{$graph_name}{'fields'}{$field_graph_name}{'label'} =~ m/$if/)
{ {
$config->{$graph_name}{'fields'}{$field_graph_name}{'label'} = sprintf ("[%s] %s", $if, $fields->{$field}{'munin'}{'label'}); $config->{$graph_name}{'fields'}{$field_graph_name}{'label'} = sprintf ("%s %s", $interfaces->{$if}{'name'}, $fields->{$field}{'munin'}{'label'});
} }
# do peaks protect # do peaks protect
if($protect_peacks ne 'no' and exists($fields->{$field}{'peack_protect'})) if($protect_peacks ne 'no' and exists($fields->{$field}{'peack_protect'}))
{ {
my $range = get_peak_range($field, $if); my $range = get_peak_range($field, $if);
foreach my $a (qw(min max)) for my $a (qw(min max))
{ {
if (exists($range->{$a})) if (exists($range->{$a}))
{ {
@ -1336,9 +1339,9 @@ sub generate_graph
my $graph_name = $is_general_graph ? $graph : sprintf("%s.%s", $graph, $if); my $graph_name = $is_general_graph ? $graph : sprintf("%s.%s", $graph, $if);
if($is_general_graph) if($is_general_graph)
{ {
foreach my $field (@{$graphs->{$graph}{'general_fields'}}) for my $field (@{$graphs->{$graph}{'general_fields'}})
{ {
foreach my $general_if (keys %{$interfaces}) for my $general_if (keys %{$interfaces})
{ {
my $res_field = generate_field($config, $graph_name, $field, $general_if, 1); my $res_field = generate_field($config, $graph_name, $field, $general_if, 1);
push(@order, $res_field) if $res_field ne ''; push(@order, $res_field) if $res_field ne '';
@ -1347,7 +1350,7 @@ sub generate_graph
} }
else else
{ {
foreach my $field (@{$graphs->{$graph}{'per_if_fields'}}) for my $field (@{$graphs->{$graph}{'per_if_fields'}})
{ {
my $res_field = generate_field($config, $graph_name, $field, $if, 0); my $res_field = generate_field($config, $graph_name, $field, $if, 0);
push(@order, $res_field) if $res_field ne ''; push(@order, $res_field) if $res_field ne '';
@ -1355,9 +1358,9 @@ sub generate_graph
} }
if(scalar(@order) > 0) if(scalar(@order) > 0)
{ {
foreach my $option (keys %{$graphs->{$graph}{'munin'}}) for my $option (keys %{$graphs->{$graph}{'munin'}})
{ {
$config->{$graph_name}{'graph'}{$option} = replace_if_template($graphs->{$graph}{'munin'}{$option}, $is_general_graph ? 'All interfaces' : $if); $config->{$graph_name}{'graph'}{$option} = replace_if_template($graphs->{$graph}{'munin'}{$option}, $is_general_graph ? 'All interfaces' : $interfaces->{$if}{'name'});
} }
$config->{$graph_name}{'graph'}{'order'} = join(' ', @order); # if scalar(@order) > 1; $config->{$graph_name}{'graph'}{'order'} = join(' ', @order); # if scalar(@order) > 1;
unless($is_general_graph) unless($is_general_graph)
@ -1372,7 +1375,7 @@ sub generate_graphs
{ {
my ($config, $graph) = @_[0..1]; my ($config, $graph) = @_[0..1];
generate_graph($config, $graph, '', 1); generate_graph($config, $graph, '', 1);
foreach my $if (keys %{$interfaces}) for my $if (keys %{$interfaces})
{ {
generate_graph($config, $graph, $if, 0); generate_graph($config, $graph, $if, 0);
} }
@ -1383,21 +1386,18 @@ sub print_config
{ {
my $config = {}; my $config = {};
my $graph; my $graph;
foreach $graph (keys %{$graphs}) for $graph (keys %{$graphs}) { generate_graphs($config, $graph); }
{
generate_graphs($config, $graph);
}
#-------------------- print --------------- #-------------------- print ---------------
foreach $graph (sort keys %{$config}) for $graph (sort keys %{$config})
{ {
printf ("multigraph %s\n", $graph); printf ("multigraph %s\n", $graph);
foreach my $option (sort keys %{$config->{$graph}{'graph'}}) for my $option (sort keys %{$config->{$graph}{'graph'}})
{ {
printf ("graph_%s %s\n", $option, $config->{$graph}{'graph'}{$option}); printf ("graph_%s %s\n", $option, $config->{$graph}{'graph'}{$option});
} }
foreach my $field (sort keys %{$config->{$graph}{'fields'}}) for my $field (sort keys %{$config->{$graph}{'fields'}})
{ {
foreach my $type (sort keys %{$config->{$graph}{'fields'}{$field}}) for my $type (sort keys %{$config->{$graph}{'fields'}{$field}})
{ {
printf ("%s.%s %s\n", $field, $type, $config->{$graph}{'fields'}{$field}{$type}); printf ("%s.%s %s\n", $field, $type, $config->{$graph}{'fields'}{$field}{$type});
} }
@ -1456,13 +1456,13 @@ sub protect_data_peak
return $value if ( return $value if (
$protect_peacks ne 'no' or $protect_peacks ne 'no' or
( (
$value ne 'nan' and $value ne 'NaN' and
exists($range->{'max'}) and exists($range->{'max'}) and
$value <= $range->{'max'} and $value <= $range->{'max'} and
$value >= $range->{'min'} $value >= $range->{'min'}
) )
); );
return 'nan'; return 'NaN';
} }
# --------------------------------- loading or calculating fields values ---------------------------- # --------------------------------- loading or calculating fields values ----------------------------
@ -1474,7 +1474,7 @@ sub get_field_data
# ---------------------------- file source ------------------------------------------------------------ # ---------------------------- file source ------------------------------------------------------------
if($fields->{$field}{'source'}{'type'} eq 'file' and not exists($raw_data->{$if}{$field})) if($fields->{$field}{'source'}{'type'} eq 'file' and not exists($raw_data->{$if}{$field}))
{ {
$raw_data->{$if}{$field} = get_file_content(replace_if_template($fields->{$field}{'source'}{'location'}, $if));; $raw_data->{$if}{$field} = get_file_content(replace_if_template($fields->{$field}{'source'}{'location'}, $if));
$data->{$if}{$field} = calc_diff($raw_data, $raw_prev_data, $if, $field); $data->{$if}{$field} = calc_diff($raw_data, $raw_prev_data, $if, $field);
} }
# ---------------------------- calculated source ------------------------------------------------------------ # ---------------------------- calculated source ------------------------------------------------------------
@ -1484,7 +1484,7 @@ sub get_field_data
if($fields->{$field}{'source'}{'calculated'}{'type'} eq 'percent') if($fields->{$field}{'source'}{'calculated'}{'type'} eq 'percent')
{ {
my $percents = {}; my $percents = {};
foreach my $pf (qw(full part)) for my $pf (qw(full part))
{ {
if ($fields->{$field}{'source'}{'calculated'}{$pf}{'source'} eq 'interface') if ($fields->{$field}{'source'}{'calculated'}{$pf}{'source'} eq 'interface')
{ {
@ -1501,7 +1501,7 @@ sub get_field_data
if($fields->{$field}{'source'}{'calculated'}{'type'} eq 'division') if($fields->{$field}{'source'}{'calculated'}{'type'} eq 'division')
{ {
my $division = {}; my $division = {};
foreach my $df (qw(dividend divider)) for my $df (qw(dividend divider))
{ {
if ($fields->{$field}{'source'}{'calculated'}{$df}{'source'} eq 'interface') if ($fields->{$field}{'source'}{'calculated'}{$df}{'source'} eq 'interface')
{ {
@ -1512,13 +1512,13 @@ sub get_field_data
$division->{$df} = get_field_data($data, $raw_data, $raw_prev_data, $if, $fields->{$field}{'source'}{'calculated'}{$df}{'name'}); $division->{$df} = get_field_data($data, $raw_data, $raw_prev_data, $if, $fields->{$field}{'source'}{'calculated'}{$df}{'name'});
} }
} }
$data->{$if}{$field} = $division->{'divider'} != 0 ? $division->{'dividend'}/$division->{'divider'} : 'nan'; $data->{$if}{$field} = $division->{'divider'} != 0 ? $division->{'dividend'}/$division->{'divider'} : 'NaN';
} }
# -------------------------------- sum --------------------------- # -------------------------------- sum ---------------------------
if($fields->{$field}{'source'}{'calculated'}{'type'} eq 'sum') if($fields->{$field}{'source'}{'calculated'}{'type'} eq 'sum')
{ {
my $sum = 0; my $sum = 0;
foreach my $s (@{$fields->{$field}{'source'}{'calculated'}{'sum'}}) for my $s (@{$fields->{$field}{'source'}{'calculated'}{'sum'}})
{ {
$sum += get_field_data($data, $raw_data, $raw_prev_data, $if, $s); $sum += get_field_data($data, $raw_data, $raw_prev_data, $if, $s);
} }
@ -1558,16 +1558,16 @@ sub print_values
my $raw_prev_data = restore_state_data(); my $raw_prev_data = restore_state_data();
my $values = {}; my $values = {};
$raw_data->{'timestamp'} = time(); $raw_data->{'timestamp'} = time();
foreach my $graph (keys %{$graphs}) { for my $graph (keys %{$graphs}) {
foreach my $field (@{$graphs->{$graph}{'general_fields'}}) { for my $field (@{$graphs->{$graph}{'general_fields'}}) {
foreach my $if (keys %{$interfaces}) { for my $if (keys %{$interfaces}) {
prepare_value($values, $field, sprintf("%s_%s", $if, $field), $graph, $if, $data, $raw_data, $raw_prev_data); } } } prepare_value($values, $field, sprintf("%s_%s", $if, $field), $graph, $if, $data, $raw_data, $raw_prev_data); } } }
foreach my $if (keys %{$interfaces}) for my $if (keys %{$interfaces})
{ {
foreach my $graph (keys %{$graphs}) for my $graph (keys %{$graphs})
{ {
my $graph_name = sprintf("%s.%s", $graph, $if); my $graph_name = sprintf("%s.%s", $graph, $if);
foreach my $field (@{$graphs->{$graph}{'per_if_fields'}}) for my $field (@{$graphs->{$graph}{'per_if_fields'}})
{ {
prepare_value($values, $field, $field, $graph_name, $if, $data, $raw_data, $raw_prev_data); prepare_value($values, $field, $field, $graph_name, $if, $data, $raw_data, $raw_prev_data);
} }
@ -1576,10 +1576,10 @@ sub print_values
save_state_data($raw_data); save_state_data($raw_data);
exit (0) unless defined ($raw_prev_data); # first update need just for collect and save data exit (0) unless defined ($raw_prev_data); # first update need just for collect and save data
# ------------------------ print ------------------------ # ------------------------ print ------------------------
foreach my $graph (sort (keys %{$values})) for my $graph (sort (keys %{$values}))
{ {
printf ("multigraph %s\n", $graph); printf ("multigraph %s\n", $graph);
foreach my $field (sort keys %{$values->{$graph}}) for my $field (sort keys %{$values->{$graph}})
{ {
printf("%s.value %s\n", $field, $values->{$graph}{$field}); printf("%s.value %s\n", $field, $values->{$graph}{$field});
} }