From 55cd06bb9bf1c4119dac3c6d9a9dc8cc6d174ec4 Mon Sep 17 00:00:00 2001 From: UrBnW <40244829+UrBnW@users.noreply.github.com> Date: Tue, 19 May 2020 21:47:53 +0200 Subject: [PATCH] Enhance Checkpoint CPU mode --- network/checkpoint/snmp/mode/cpu.pm | 142 ++++++++++++++++------------ 1 file changed, 84 insertions(+), 58 deletions(-) diff --git a/network/checkpoint/snmp/mode/cpu.pm b/network/checkpoint/snmp/mode/cpu.pm index d34127b0d..55ae1110b 100644 --- a/network/checkpoint/snmp/mode/cpu.pm +++ b/network/checkpoint/snmp/mode/cpu.pm @@ -20,77 +20,96 @@ package network::checkpoint::snmp::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', nlabel => 'cpu.utilization.percentage', set => { + key_values => [ { name => 'average' }, { name => 'count' } ], + output_template => '%.2f %%', + perfdatas => [ + { label => 'total_cpu_avg', value => 'average', template => '%.2f', + min => 0, max => 100, unit => '%' }, + ], + } + }, + ]; + + $self->{maps_counters}->{cpu_core} = [ + { label => 'core', nlabel => 'core.cpu.utilization.percentage', set => { + key_values => [ { name => 'cpu' }, { name => 'display' } ], + output_template => 'usage : %.2f %%', + perfdatas => [ + { label => 'cpu', value => 'cpu', template => '%.2f', + min => 0, max => 100, unit => '%', label_extra_instance => 1, instance_use => 'display' }, + ], + } + }, + ]; +} + +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; $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(); + $self->{cpu_avg} = {}; + $self->{cpu_core} = {}; + + my $oid_cputable = '.1.3.6.1.4.1.2620.1.6.7.5.1.5'; + my $result = $options{snmp}->get_table(oid => $oid_cputable, nothing_quit => 1); + + my $cpu = 0; + my $i = 0; + foreach my $key ($options{snmp}->oid_lex_sort(keys %$result)) { + $key =~ /\.([0-9]+)$/; + my $cpu_num = $1; + + $cpu += $result->{$key}; + $self->{cpu_core}->{$i} = { + display => $i, + cpu => $result->{$key} + }; + + $i++; } - 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_procUsrTime = '.1.3.6.1.4.1.2620.1.6.7.2.1.0'; - my $oid_procSysTime = '.1.3.6.1.4.1.2620.1.6.7.2.2.0'; - my $oid_procIdleTime = '.1.3.6.1.4.1.2620.1.6.7.2.3.0'; - - my $result = $self->{snmp}->get_leef(oids => [$oid_procUsrTime, $oid_procSysTime, $oid_procIdleTime], nothing_quit => 1); - - my $totalCpuUsed = $result->{$oid_procUsrTime} + $result->{$oid_procSysTime}; - - my $exit = $self->{perfdata}->threshold_check(value => $totalCpuUsed, - threshold => [ { label => 'critical', 'exit_litteral' => 'critical' }, { label => 'warning', exit_litteral => 'warning' } ]); - $self->{output}->output_add(severity => $exit, - short_msg => sprintf("CPU Usage: %d (System: %d User: %d Idle: %d)", $totalCpuUsed, $result->{$oid_procSysTime}, $result->{$oid_procUsrTime}, $result->{$oid_procIdleTime} )); - $self->{output}->perfdata_add(label => "cpu", unit => '%', - value => $totalCpuUsed, - warning => $self->{perfdata}->get_perfdata_for_output(label => 'warning'), - critical => $self->{perfdata}->get_perfdata_for_output(label => 'critical'), - min => 0, max => 100); - $self->{output}->perfdata_add(label => "cpuUser", unit => '%', - value => $result->{$oid_procUsrTime}, - warning => $self->{perfdata}->get_perfdata_for_output(label => 'warning'), - critical => $self->{perfdata}->get_perfdata_for_output(label => 'critical'), - min => 0, max => 100); - $self->{output}->perfdata_add(label => "cpuSys", unit => '%', - value => $result->{$oid_procSysTime}, - warning => $self->{perfdata}->get_perfdata_for_output(label => 'warning'), - critical => $self->{perfdata}->get_perfdata_for_output(label => 'critical'), - min => 0, max => 100); - $self->{output}->perfdata_add(label => "cpuIdle", unit => '%', - value => $result->{$oid_procIdleTime}, - 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(); + my $avg_cpu = $cpu / $i; + $self->{cpu_avg} = { + average => $avg_cpu, + count => $i + }; } 1; @@ -99,19 +118,26 @@ __END__ =head1 MODE -Check firewall average cpu usage (system+user) (chkpnt.mib). +Check CPUs =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 =cut -