diff --git a/snmp_standard/mode/processcount.pm b/snmp_standard/mode/processcount.pm index 008b8e9f3..dd8fc1cb3 100644 --- a/snmp_standard/mode/processcount.pm +++ b/snmp_standard/mode/processcount.pm @@ -59,6 +59,9 @@ sub new { "process-status:s" => { name => 'process_status', default => 'running|runnable' }, "memory" => { name => 'memory', }, "cpu" => { name => 'cpu', }, + "top" => { name => 'top', }, + "top-num:s" => { name => 'top_num', default => 5 }, + "top-size:s" => { name => 'top_size', default => 52428800 }, # 50MB }); $self->{statefile_cache} = centreon::plugins::statefile->new(%options); $self->{filter4md5} = ''; @@ -114,20 +117,45 @@ sub check_options { } } +my $oids = { + name => '.1.3.6.1.2.1.25.4.2.1.2', # hrSWRunName + path => '.1.3.6.1.2.1.25.4.2.1.4', # hrSWRunPath + args => '.1.3.6.1.2.1.25.4.2.1.5', # hrSWRunParameters (Warning: it's truncated. (128 characters)) + status => '.1.3.6.1.2.1.25.4.2.1.7', # hrSWRunStatus +}; +my $oid_hrSWRunPerfMem = '.1.3.6.1.2.1.25.5.1.1.2'; +my $oid_hrSWRunPerfCPU = '.1.3.6.1.2.1.25.5.1.1.1'; + +sub check_top { + my ($self, %options) = @_; + + my %data = (); + foreach (keys %{$self->{results}->{$oids->{name}}}) { + if (/^$oids->{name}\.(.*)/ && + defined($self->{results}->{$oid_hrSWRunPerfMem}->{$oid_hrSWRunPerfMem . '.' . $1})) { + $data{$self->{results}->{$oids->{name}}->{$_}} = 0 if (!defined($data{$self->{results}->{$oids->{name}}->{$_}})); + $data{$self->{results}->{$oids->{name}}->{$_}} += $self->{results}->{$oid_hrSWRunPerfMem}->{$oid_hrSWRunPerfMem . '.' . $1} * 1024; + } + } + + my $i = 1; + foreach my $name (sort { $data{$b} <=> $data{$a} } keys %data) { + last if ($i > $self->{option_results}->{top_num}); + last if ($data{$name} < $self->{option_results}->{top_size}); + + my ($mem_value, $amem_unit) = $self->{perfdata}->change_bytes(value => $data{$name}); + $self->{output}->output_add(long_msg => sprintf("Top %d '%s' memory usage: %s %s", $i, $name, $mem_value, $amem_unit)); + $self->{output}->perfdata_add(label => 'top_' . $name, unit => 'B', + value => $data{$name}, + min => 0); + $i++; + } +} + sub run { my ($self, %options) = @_; # $options{snmp} = snmp object $self->{snmp} = $options{snmp}; - - my $oids = { - name => '.1.3.6.1.2.1.25.4.2.1.2', # hrSWRunName - path => '.1.3.6.1.2.1.25.4.2.1.4', # hrSWRunPath - args => '.1.3.6.1.2.1.25.4.2.1.5', # hrSWRunParameters (Warning: it's truncated. (128 characters)) - status => '.1.3.6.1.2.1.25.4.2.1.7', # hrSWRunStatus - }; - - my $oid_hrSWRunPerfMem = '.1.3.6.1.2.1.25.5.1.1.2'; - my $oid_hrSWRunPerfCPU = '.1.3.6.1.2.1.25.5.1.1.1'; my $oid2check_filter; # To have a better order @@ -153,9 +181,15 @@ sub run { } } - my $result = $self->{snmp}->get_table(oid => $oids->{$oid2check_filter}); + my $oids_multiple_table = [ { oid => $oids->{$oid2check_filter} } ]; + if (defined($self->{option_results}->{top})) { + push @{$oids_multiple_table}, { oid => $oids->{name} }; + push @{$oids_multiple_table}, { oid => $oid_hrSWRunPerfMem }; + } + $self->{results} = $self->{snmp}->get_multiple_table(oids => $oids_multiple_table); + my $result = $self->{results}->{$oids->{$oid2check_filter}}; my $instances_keep = {}; - foreach my $key ($self->{snmp}->oid_lex_sort(keys %$result)) { + foreach my $key ($self->{snmp}->oid_lex_sort(keys %{$result})) { my $option_val = $self->{option_results}->{'process_' . $oid2check_filter}; if ($oid2check_filter eq 'status') { @@ -229,7 +263,7 @@ sub run { my ($total_mem_value, $total_mem_unit) = $self->{perfdata}->change_bytes(value => $total_memory); $self->{output}->output_add(severity => $exit, short_msg => sprintf("Total memory usage: %s", $total_mem_value . " " . $total_mem_unit)); - $self->{output}->perfdata_add(label => 'mem_total', + $self->{output}->perfdata_add(label => 'mem_total', unit => 'B', value => $total_memory, warning => $self->{perfdata}->get_perfdata_for_output(label => 'warning_mem_total'), critical => $self->{perfdata}->get_perfdata_for_output(label => 'critical_mem_total'), @@ -239,7 +273,7 @@ sub run { my ($avg_mem_value, $avg_mem_unit) = $self->{perfdata}->change_bytes(value => $total_memory / $num_processes_match); $self->{output}->output_add(severity => $exit, short_msg => sprintf("Average memory usage: %.2f %s", $avg_mem_value, $avg_mem_unit)); - $self->{output}->perfdata_add(label => 'mem_avg', + $self->{output}->perfdata_add(label => 'mem_avg', unit => 'B', value => sprintf("%.2f", $total_memory / $num_processes_match), warning => $self->{perfdata}->get_perfdata_for_output(label => 'warning_avg_total'), critical => $self->{perfdata}->get_perfdata_for_output(label => 'critical_avg_total'), @@ -292,6 +326,8 @@ sub run { $self->{statefile_cache}->write(data => $datas); } + $self->check_top() if (defined($self->{option_results}->{top})); + $self->{output}->display(); $self->{output}->exit(); } @@ -380,6 +416,18 @@ Check memory. Check cpu usage. Should be used with fix processes. if processes pid changes too much, the plugin can compute values. +=item B<--top> + +Enable top memory usage display. + +=item B<--top-num> + +Number of processes in the top (Default: 5). + +=item B<--top-size> + +Minimum memory usage to be in the top (Default: 52428800 -> 50 MB). + =back =cut