diff --git a/snmp_standard/mode/cpu.pm b/snmp_standard/mode/cpu.pm index 2740b09d3..8d51e8c06 100644 --- a/snmp_standard/mode/cpu.pm +++ b/snmp_standard/mode/cpu.pm @@ -20,75 +20,96 @@ package snmp_standard::mode::cpu; -use base qw(centreon::plugins::mode); +use base qw(centreon::plugins::templates::counter); use strict; use warnings; +sub set_counters { + my ($self, %options) = @_; + + $self->{maps_counters_type} = [ + { name => 'cpu_avg', type => 0, cb_prefix_output => 'prefix_cpu_avg_output' }, + { name => 'cpu_core', type => 1, cb_prefix_output => 'prefix_cpu_core_output' } + ]; + + $self->{maps_counters}->{cpu_avg} = [ + { label => 'average', set => { + key_values => [ { name => 'average' }, { name => 'count' } ], + output_template => '%.2f %%', + perfdatas => [ + { label => 'total_cpu_avg', value => 'average_absolute', template => '%.2f', + min => 0, max => 100, unit => '%' }, + ], + } + }, + ]; + + $self->{maps_counters}->{cpu_core} = [ + { label => 'core', set => { + key_values => [ { name => 'cpu' }, { name => 'display' } ], + output_template => 'usage : %.2f %%', + perfdatas => [ + { label => 'cpu', value => 'cpu_absolute', template => '%.2f', + min => 0, max => 100, unit => '%', label_extra_instance => 1, instance_use => 'display_absolute' }, + ], + } + }, + + ]; +} + +sub prefix_cpu_avg_output { + my ($self, %options) = @_; + + return $self->{cpu_avg}->{count} . " CPU(s) average usage is "; +} + +sub prefix_cpu_core_output { + my ($self, %options) = @_; + + return "CPU '" . $options{instance_value}->{display} . "' "; +} + sub new { my ($class, %options) = @_; my $self = $class->SUPER::new(package => __PACKAGE__, %options); bless $self, $class; - + $self->{version} = '1.0'; $options{options}->add_options(arguments => - { - "warning:s" => { name => 'warning', }, - "critical:s" => { name => 'critical', }, + { }); return $self; } -sub check_options { +sub manage_selection { my ($self, %options) = @_; - $self->SUPER::init(%options); - if (($self->{perfdata}->threshold_validate(label => 'warning', value => $self->{option_results}->{warning})) == 0) { - $self->{output}->add_option_msg(short_msg => "Wrong warning threshold '" . $self->{option_results}->{warning} . "'."); - $self->{output}->option_exit(); - } - if (($self->{perfdata}->threshold_validate(label => 'critical', value => $self->{option_results}->{critical})) == 0) { - $self->{output}->add_option_msg(short_msg => "Wrong critical threshold '" . $self->{option_results}->{critical} . "'."); - $self->{output}->option_exit(); - } -} + $self->{cpu_avg} = {}; + $self->{cpu_core} = {}; -sub run { - my ($self, %options) = @_; - $self->{snmp} = $options{snmp}; - my $oid_cputable = '.1.3.6.1.2.1.25.3.3.1.2'; - my $result = $self->{snmp}->get_table(oid => $oid_cputable, nothing_quit => 1); - + my $result = $options{snmp}->get_table(oid => $oid_cputable, nothing_quit => 1); + my $cpu = 0; my $i = 0; - foreach my $key ($self->{snmp}->oid_lex_sort(keys %$result)) { + foreach my $key ($options{snmp}->oid_lex_sort(keys %$result)) { $key =~ /\.([0-9]+)$/; my $cpu_num = $1; - + $cpu += $result->{$key}; - - $self->{output}->output_add(long_msg => sprintf("CPU $i Usage is %.2f%%", $result->{$key})); - $self->{output}->perfdata_add(label => 'cpu' . $i, unit => '%', - value => sprintf("%.2f", $result->{$key}), - min => 0, max => 100); + $self->{cpu_core}->{$i} = { display => $i, + cpu => $result->{$key} }; + $i++; } my $avg_cpu = $cpu / $i; - my $exit_code = $self->{perfdata}->threshold_check(value => $avg_cpu, - threshold => [ { label => 'critical', 'exit_litteral' => 'critical' }, { label => 'warning', exit_litteral => 'warning' } ]); - $self->{output}->output_add(severity => $exit_code, - short_msg => sprintf("%s CPU(s) average usage is: %.2f%%", $i, $avg_cpu)); - $self->{output}->perfdata_add(label => 'total_cpu_avg', unit => '%', - value => sprintf("%.2f", $avg_cpu), - warning => $self->{perfdata}->get_perfdata_for_output(label => 'warning'), - critical => $self->{perfdata}->get_perfdata_for_output(label => 'critical'), - min => 0, max => 100); + $self->{cpu_avg} = { average => $avg_cpu, + count => $i }; - $self->{output}->display(); - $self->{output}->exit(); } 1; @@ -98,18 +119,26 @@ __END__ =head1 MODE Check system CPUs (HOST-RESOURCES-MIB) -(The average, over the last minute, of the percentage +(The average, over the last minute, of the percentage of time that this processor was not idle) =over 8 -=item B<--warning> +=item B<--warning-average> -Threshold warning in percent. +Warning threshold average CPU utilization. -=item B<--critical> +=item B<--critical-average> -Threshold critical in percent. +Critical threshold average CPU utilization. + +=item B<--warning-core> + +Warning thresholds for each CPU core + +=item B<--critical-core> + +Critical thresholds for each CPU core =back