close-339-cpu-per-core (#1107)

* close-339-cpu-per-core

+ Replace PR 1100 from @CPbN (many thanks!!)
[!] Break option declaration (--(critical[warning)-average instead of --(warning|critical)

* cosmetic adjustment
This commit is contained in:
Simon Bomm 2018-08-22 15:39:38 +02:00 committed by GitHub
parent 2e7597c8be
commit 6aaedf6a9c

View File

@ -20,75 +20,96 @@
package snmp_standard::mode::cpu; package snmp_standard::mode::cpu;
use base qw(centreon::plugins::mode); use base qw(centreon::plugins::templates::counter);
use strict; use strict;
use warnings; 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 { sub new {
my ($class, %options) = @_; my ($class, %options) = @_;
my $self = $class->SUPER::new(package => __PACKAGE__, %options); my $self = $class->SUPER::new(package => __PACKAGE__, %options);
bless $self, $class; bless $self, $class;
$self->{version} = '1.0'; $self->{version} = '1.0';
$options{options}->add_options(arguments => $options{options}->add_options(arguments =>
{ {
"warning:s" => { name => 'warning', },
"critical:s" => { name => 'critical', },
}); });
return $self; return $self;
} }
sub check_options { sub manage_selection {
my ($self, %options) = @_; my ($self, %options) = @_;
$self->SUPER::init(%options);
if (($self->{perfdata}->threshold_validate(label => 'warning', value => $self->{option_results}->{warning})) == 0) { $self->{cpu_avg} = {};
$self->{output}->add_option_msg(short_msg => "Wrong warning threshold '" . $self->{option_results}->{warning} . "'."); $self->{cpu_core} = {};
$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();
}
}
sub run {
my ($self, %options) = @_;
$self->{snmp} = $options{snmp};
my $oid_cputable = '.1.3.6.1.2.1.25.3.3.1.2'; 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 $cpu = 0;
my $i = 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]+)$/; $key =~ /\.([0-9]+)$/;
my $cpu_num = $1; my $cpu_num = $1;
$cpu += $result->{$key}; $cpu += $result->{$key};
$self->{cpu_core}->{$i} = { display => $i,
$self->{output}->output_add(long_msg => sprintf("CPU $i Usage is %.2f%%", $result->{$key})); cpu => $result->{$key} };
$self->{output}->perfdata_add(label => 'cpu' . $i, unit => '%',
value => sprintf("%.2f", $result->{$key}),
min => 0, max => 100);
$i++; $i++;
} }
my $avg_cpu = $cpu / $i; my $avg_cpu = $cpu / $i;
my $exit_code = $self->{perfdata}->threshold_check(value => $avg_cpu, $self->{cpu_avg} = { average => $avg_cpu,
threshold => [ { label => 'critical', 'exit_litteral' => 'critical' }, { label => 'warning', exit_litteral => 'warning' } ]); count => $i };
$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->{output}->display();
$self->{output}->exit();
} }
1; 1;
@ -98,18 +119,26 @@ __END__
=head1 MODE =head1 MODE
Check system CPUs (HOST-RESOURCES-MIB) 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) of time that this processor was not idle)
=over 8 =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 =back