Merge pull request #1 from centreon/master

pull
This commit is contained in:
omercier 2018-01-10 17:14:48 +01:00 committed by GitHub
commit ef60aae678
249 changed files with 23206 additions and 3693 deletions

View File

@ -0,0 +1,367 @@
#
# Copyright 2017 Centreon (http://www.centreon.com/)
#
# Centreon is a full-fledged industry-strength solution that meets
# the needs in IT infrastructure and application monitoring for
# service performance.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
package apps::backup::veeam::local::mode::jobstatus;
use base qw(centreon::plugins::templates::counter);
use strict;
use warnings;
use centreon::common::powershell::veeam::jobstatus;
use centreon::plugins::misc;
my $instance_mode;
sub custom_status_threshold {
my ($self, %options) = @_;
my $status = 'ok';
my $message;
eval {
local $SIG{__WARN__} = sub { $message = $_[0]; };
local $SIG{__DIE__} = sub { $message = $_[0]; };
# To exclude some OK
if (defined($instance_mode->{option_results}->{ok_status}) && $instance_mode->{option_results}->{ok_status} ne '' &&
eval "$instance_mode->{option_results}->{ok_status}") {
$status = 'ok';
} elsif (defined($instance_mode->{option_results}->{critical_status}) && $instance_mode->{option_results}->{critical_status} ne '' &&
eval "$instance_mode->{option_results}->{critical_status}") {
$status = 'critical';
} elsif (defined($instance_mode->{option_results}->{warning_status}) && $instance_mode->{option_results}->{warning_status} ne '' &&
eval "$instance_mode->{option_results}->{warning_status}") {
$status = 'warning';
}
};
if (defined($message)) {
$self->{output}->output_add(long_msg => 'filter status issue: ' . $message);
}
return $status;
}
sub custom_status_output {
my ($self, %options) = @_;
my $msg = 'status : ' . $self->{result_values}->{status} . ' [type: ' . $self->{result_values}->{type} . ']';
return $msg;
}
sub custom_status_calc {
my ($self, %options) = @_;
$self->{result_values}->{status} = $options{new_datas}->{$self->{instance} . '_status'};
$self->{result_values}->{display} = $options{new_datas}->{$self->{instance} . '_display'};
$self->{result_values}->{type} = $options{new_datas}->{$self->{instance} . '_type'};
$self->{result_values}->{is_running} = $options{new_datas}->{$self->{instance} . '_is_running'};
return 0;
}
sub custom_long_threshold {
my ($self, %options) = @_;
my $status = 'ok';
my $message;
eval {
local $SIG{__WARN__} = sub { $message = $_[0]; };
local $SIG{__DIE__} = sub { $message = $_[0]; };
if (defined($instance_mode->{option_results}->{critical_long}) && $instance_mode->{option_results}->{critical_long} ne '' &&
eval "$instance_mode->{option_results}->{critical_long}") {
$status = 'critical';
} elsif (defined($instance_mode->{option_results}->{warning_long}) && $instance_mode->{option_results}->{warning_long} ne '' &&
eval "$instance_mode->{option_results}->{warning_long}") {
$status = 'warning';
}
};
if (defined($message)) {
$self->{output}->output_add(long_msg => 'filter status issue: ' . $message);
}
return $status;
}
sub custom_long_output {
my ($self, %options) = @_;
my $msg = 'started since : ' . centreon::plugins::misc::change_seconds(value => $self->{result_values}->{elapsed});
return $msg;
}
sub custom_long_calc {
my ($self, %options) = @_;
$self->{result_values}->{status} = $options{new_datas}->{$self->{instance} . '_status'};
$self->{result_values}->{display} = $options{new_datas}->{$self->{instance} . '_display'};
$self->{result_values}->{elapsed} = $options{new_datas}->{$self->{instance} . '_elapsed'};
$self->{result_values}->{type} = $options{new_datas}->{$self->{instance} . '_type'};
$self->{result_values}->{is_running} = $options{new_datas}->{$self->{instance} . '_is_running'};
return -11 if ($self->{result_values}->{is_running} != 1);
return 0;
}
sub set_counters {
my ($self, %options) = @_;
$self->{maps_counters_type} = [
{ name => 'global', type => 0 },
{ name => 'job', type => 1, cb_prefix_output => 'prefix_job_output', message_multiple => 'All jobs are ok', skipped_code => { -11 => 1, -10 => 1 } },
];
$self->{maps_counters}->{global} = [
{ label => 'total', set => {
key_values => [ { name => 'total' } ],
output_template => 'Total Jobs : %s',
perfdatas => [
{ label => 'total', value => 'total_absolute', template => '%s', min => 0 },
],
}
},
];
$self->{maps_counters}->{job} = [
{ label => 'status', threshold => 0, set => {
key_values => [ { name => 'status' }, { name => 'display' }, { name => 'type' }, { name => 'is_running' } ],
closure_custom_calc => $self->can('custom_status_calc'),
closure_custom_output => $self->can('custom_status_output'),
closure_custom_perfdata => sub { return 0; },
closure_custom_threshold_check => $self->can('custom_status_threshold'),
}
},
{ label => 'long', threshold => 0, set => {
key_values => [ { name => 'status' }, { name => 'display' }, { name => 'elapsed' }, { name => 'type' }, { name => 'is_running' } ],
closure_custom_calc => $self->can('custom_long_calc'),
closure_custom_output => $self->can('custom_long_output'),
closure_custom_perfdata => sub { return 0; },
closure_custom_threshold_check => $self->can('custom_long_threshold'),
}
},
];
}
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 =>
{
"timeout:s" => { name => 'timeout', default => 50 },
"command:s" => { name => 'command', default => 'powershell.exe' },
"command-path:s" => { name => 'command_path' },
"command-options:s" => { name => 'command_options', default => '-InputFormat none -NoLogo -EncodedCommand' },
"no-ps" => { name => 'no_ps' },
"ps-exec-only" => { name => 'ps_exec_only' },
"filter-name:s" => { name => 'filter_name' },
"filter-type:s" => { name => 'filter_type' },
"filter-end-time:s" => { name => 'filter_end_time', default => 86400 },
"filter-start-time:s" => { name => 'filter_start_time' },
"ok-status:s" => { name => 'ok_status', default => '' },
"warning-status:s" => { name => 'warning_status', default => '' },
"critical-status:s" => { name => 'critical_status', default => '%{is_running} == 0 and not %{status} =~ /Success/i' },
"warning-long:s" => { name => 'warning_long' },
"critical-long:s" => { name => 'critical_long' },
});
return $self;
}
sub check_options {
my ($self, %options) = @_;
$self->SUPER::check_options(%options);
$instance_mode = $self;
$self->change_macros();
}
sub prefix_job_output {
my ($self, %options) = @_;
return "Job '" . $options{instance_value}->{display} . "' ";
}
sub change_macros {
my ($self, %options) = @_;
foreach (('ok_status', 'warning_status', 'critical_status', 'warning_long', 'critical_long')) {
if (defined($self->{option_results}->{$_})) {
$self->{option_results}->{$_} =~ s/%\{(.*?)\}/\$self->{result_values}->{$1}/g;
}
}
}
sub manage_selection {
my ($self, %options) = @_;
my $ps = centreon::common::powershell::veeam::jobstatus::get_powershell(
no_ps => $self->{option_results}->{no_ps});
$self->{option_results}->{command_options} .= " " . $ps;
my ($stdout) = centreon::plugins::misc::execute(output => $self->{output},
options => $self->{option_results},
command => $self->{option_results}->{command},
command_path => $self->{option_results}->{command_path},
command_options => $self->{option_results}->{command_options});
if (defined($self->{option_results}->{ps_exec_only})) {
$self->{output}->output_add(severity => 'OK',
short_msg => $stdout);
$self->{output}->display(nolabel => 1, force_ignore_perfdata => 1, force_long_output => 1);
$self->{output}->exit();
}
#[name = xxxx ][type = Backup ][isrunning = False ][result = Success ][creationTimeUTC = 1512875246.2 ][endTimeUTC = 1512883615.377 ]
#[name = xxxx ][type = Backup ][isrunning = False ][result = ][creationTimeUTC = ][endTimeUTC = ]
#[name = xxxx ][type = BackupSync ][isrunning = True ][result = None ][creationTimeUTC = 1513060425.027 ][endTimeUTC = -2208992400 ]
#is_running = 2 (never running)
$self->{global} = { total => 0 };
$self->{job} = {};
my $current_time = time();
foreach my $line (split /\n/, $stdout) {
next if ($line !~ /^\[name\s*=(.*?)\]\[type\s*=(.*?)\]\[isrunning\s*=(.*?)\]\[result\s*=(.*?)\]\[creationTimeUTC\s*=(.*?)\]\[endTimeUTC\s*=(.*?)\]/i);
my ($name, $type, $is_running, $result, $start_time, $end_time) = (centreon::plugins::misc::trim($1),
centreon::plugins::misc::trim($2), centreon::plugins::misc::trim($3), centreon::plugins::misc::trim($4),
centreon::plugins::misc::trim($5), centreon::plugins::misc::trim($6));
if (defined($self->{option_results}->{filter_name}) && $self->{option_results}->{filter_name} ne '' &&
$name !~ /$self->{option_results}->{filter_name}/) {
$self->{output}->output_add(long_msg => "skipping job '" . $name . "': no matching filter.", debug => 1);
next;
}
if (defined($self->{option_results}->{filter_type}) && $self->{option_results}->{filter_type} ne '' &&
$type !~ /$self->{option_results}->{filter_type}/) {
$self->{output}->output_add(long_msg => "skipping job '" . $name . "': no matching filter type.", debug => 1);
next;
}
if (defined($self->{option_results}->{filter_end_time}) && $self->{option_results}->{filter_end_time} =~ /[0-9]+/ &&
defined($end_time) && $end_time =~ /[0-9]+/ && $end_time < $current_time - $self->{option_results}->{filter_end_time}) {
$self->{output}->output_add(long_msg => "skipping job '" . $name . "': end time too old.", debug => 1);
next;
}
if (defined($self->{option_results}->{filter_start_time}) && $self->{option_results}->{filter_start_time} =~ /[0-9]+/ &&
defined($start_time) && $start_time =~ /[0-9]+/ && $start_time < $current_time - $self->{option_results}->{filter_start_time}) {
$self->{output}->output_add(long_msg => "skipping job '" . $name . "': start time too old.", debug => 1);
next;
}
my $elapsed_time;
$elapsed_time = $current_time - $start_time if ($start_time =~ /[0-9]/);
$self->{job}->{$name} = {
display => $name,
elapsed => $elapsed_time,
type => $type,
is_running => ($is_running =~ /True/) ? 1 : ($start_time !~ /[0-9]/ ? 2 : 0),
status => $result ne '' ? $result : '-',
};
$self->{global}->{total}++;
}
}
1;
__END__
=head1 MODE
Check job status.
=over 8
=item B<--timeout>
Set timeout time for command execution (Default: 50 sec)
=item B<--no-ps>
Don't encode powershell. To be used with --command and 'type' command.
=item B<--command>
Command to get information (Default: 'powershell.exe').
Can be changed if you have output in a file. To be used with --no-ps option!!!
=item B<--command-path>
Command path (Default: none).
=item B<--command-options>
Command options (Default: '-InputFormat none -NoLogo -EncodedCommand').
=item B<--ps-exec-only>
Print powershell output.
=item B<--filter-name>
Filter job name (can be a regexp).
=item B<--filter-type>
Filter job type (can be a regexp).
=item B<--filter-start-time>
Filter job with start time greater than current time less value in seconds.
=item B<--filter-end-time>
Filter job with end time greater than current time less value in seconds (Default: 86400).
=item B<--ok-status>
Set ok threshold for status (Default: '')
Can used special variables like: %{display}, %{status}, %{type}, %{is_running}.
=item B<--warning-status>
Set warning threshold for status (Default: '')
Can used special variables like: %{display}, %{status}, %{type}, %{is_running}.
=item B<--critical-status>
Set critical threshold for status (Default: '%{is_running} == 0 and not %{status} =~ /Success/i').
Can used special variables like: %{display}, %{status}, %{type}, %{is_running}.
=item B<--warning-long>
Set warning threshold for long jobs (Default: none)
Can used special variables like: %{display}, %{status}, %{type}, %{elapsed}.
=item B<--critical-long>
Set critical threshold for long jobs (Default: none).
Can used special variables like: %{display}, %{status}, %{type}, %{elapsed}.
=item B<--warning-total>
Set warning threshold for total jobs.
=item B<--critical-total>
Set critical threshold for total jobs.
=back
=cut

View File

@ -0,0 +1,163 @@
#
# Copyright 2017 Centreon (http://www.centreon.com/)
#
# Centreon is a full-fledged industry-strength solution that meets
# the needs in IT infrastructure and application monitoring for
# service performance.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
package apps::backup::veeam::local::mode::listjobs;
use base qw(centreon::plugins::mode);
use strict;
use warnings;
use centreon::common::powershell::veeam::listjobs;
use centreon::plugins::misc;
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 =>
{
"timeout:s" => { name => 'timeout', default => 50 },
"command:s" => { name => 'command', default => 'powershell.exe' },
"command-path:s" => { name => 'command_path' },
"command-options:s" => { name => 'command_options', default => '-InputFormat none -NoLogo -EncodedCommand' },
"no-ps" => { name => 'no_ps' },
"ps-exec-only" => { name => 'ps_exec_only' },
"filter-name:s" => { name => 'filter_name' },
});
return $self;
}
sub check_options {
my ($self, %options) = @_;
$self->SUPER::init(%options);
}
sub run {
my ($self, %options) = @_;
$self->manage_selection(%options);
foreach (sort keys %{$self->{jobs}}) {
$self->{output}->output_add(long_msg => "'" . $_ . "' [type = " . $self->{jobs}->{$_}->{type} . "]");
}
$self->{output}->output_add(severity => 'OK',
short_msg => 'List jobs:');
$self->{output}->display(nolabel => 1, force_ignore_perfdata => 1, force_long_output => 1);
$self->{output}->exit();
}
sub disco_format {
my ($self, %options) = @_;
$self->{output}->add_disco_format(elements => ['name', 'type']);
}
sub disco_show {
my ($self, %options) = @_;
$self->manage_selection(%options);
foreach (sort keys %{$self->{jobs}}) {
$self->{output}->add_disco_entry(
name => $_,
type => $self->{jobs}->{$_}->{type},
);
}
}
sub manage_selection {
my ($self, %options) = @_;
my $ps = centreon::common::powershell::veeam::listjobs::get_powershell(
no_ps => $self->{option_results}->{no_ps});
$self->{option_results}->{command_options} .= " " . $ps;
my ($stdout) = centreon::plugins::misc::execute(output => $self->{output},
options => $self->{option_results},
command => $self->{option_results}->{command},
command_path => $self->{option_results}->{command_path},
command_options => $self->{option_results}->{command_options});
if (defined($self->{option_results}->{ps_exec_only})) {
$self->{output}->output_add(severity => 'OK',
short_msg => $stdout);
$self->{output}->display(nolabel => 1, force_ignore_perfdata => 1, force_long_output => 1);
$self->{output}->exit();
}
$self->{jobs} = {};
my @lines = split /\n/, $stdout;
foreach my $line (@lines) {
next if ($line !~ /^\[name\s*=(.*?)\]\[type\s*=(.*?)\]/i);
my ($name, $type) = (centreon::plugins::misc::trim($1), centreon::plugins::misc::trim($2));
if (defined($self->{option_results}->{filter_name}) && $self->{option_results}->{filter_name} ne '' &&
$name !~ /$self->{option_results}->{filter_name}/i) {
$self->{output}->output_add(long_msg => "skipping job '" . $name . "': no type or no matching filter type", debug => 1);
next;
}
$self->{jobs}->{$name} = { type => $type };
}
}
1;
__END__
=head1 MODE
List jobs.
=over 8
=item B<--timeout>
Set timeout time for command execution (Default: 50 sec)
=item B<--no-ps>
Don't encode powershell. To be used with --command and 'type' command.
=item B<--command>
Command to get information (Default: 'powershell.exe').
Can be changed if you have output in a file. To be used with --no-ps option!!!
=item B<--command-path>
Command path (Default: none).
=item B<--command-options>
Command options (Default: '-InputFormat none -NoLogo -EncodedCommand').
=item B<--ps-exec-only>
Print powershell output.
=item B<--filter-name>
Filter job name (can be a regexp).
=back
=cut

View File

@ -18,7 +18,7 @@
# limitations under the License.
#
package apps::voip::asterisk::remote::plugin;
package apps::backup::veeam::local::plugin;
use strict;
use warnings;
@ -26,28 +26,24 @@ use base qw(centreon::plugins::script_simple);
sub new {
my ($class, %options) = @_;
my $self = $class->SUPER::new(package => __PACKAGE__, %options);
bless $self, $class;
$self->{version} = '1.1';
$self->{version} = '0.1';
%{$self->{modes}} = (
'showpeers' => 'apps::voip::asterisk::remote::mode::showpeers',
'dahdistatus' => 'apps::voip::asterisk::remote::mode::dahdistatus',
'activecalls' => 'apps::voip::asterisk::remote::mode::activecalls',
'externalcalls' => 'apps::voip::asterisk::remote::mode::externalcalls',
);
'job-status' => 'apps::backup::veeam::local::mode::jobstatus',
'list-jobs' => 'apps::backup::veeam::local::mode::listjobs',
);
return $self;
}
1;
__END__
=head1 PLUGIN DESCRIPTION
Check Asterisk through AMI interface (AMI socket; telnet perl module required)
Check Veeam through powershell.
=cut

View File

@ -98,20 +98,20 @@ sub run {
short_msg => "'$config': cannot parse xml");
next;
}
my %failover_finded = ();
my %file_finded = ();
my %failover_found = ();
my %file_found = ();
my $temporary;
foreach my $node ($xml->findnodes('/centreonBroker/output')) {
my %load = ();
foreach my $element ($node->getChildrenByTagName('*')) {
if ($element->nodeName eq 'failover') {
$failover_finded{$element->textContent} = 1;
$failover_found{$element->textContent} = 1;
} elsif ($element->nodeName =~ /^(name|type|path)$/) {
$load{$element->nodeName} = $element->textContent;
}
}
if (defined($load{type}) && $load{type} eq 'file') {
$file_finded{$load{name}} = {%load};
$file_found{$load{name}} = {%load};
}
}
@ -123,10 +123,10 @@ sub run {
# Check failovers
my $current_total = 0;
foreach my $failover (sort keys %failover_finded) {
next if (!defined($file_finded{$failover}));
foreach my $failover (sort keys %failover_found) {
next if (!defined($file_found{$failover}));
my ($status, $total, $size) = $self->check_directory(config => $config, path => $file_finded{$failover}->{path});
my ($status, $total, $size) = $self->check_directory(config => $config, path => $file_found{$failover}->{path});
next if (!$status);
$current_total += $total;

View File

@ -1,4 +1,5 @@
# Copyright 2016 Centreon (http://www.centreon.com/)
#
# Copyright 2017 Centreon (http://www.centreon.com/)
#
# Centreon is a full-fledged industry-strength solution that meets
# the needs in IT infrastructure and application monitoring for

View File

@ -1,5 +1,5 @@
#
# Copyright 2016 Centreon (http://www.centreon.com/)
# Copyright 2017 Centreon (http://www.centreon.com/)
#
# Centreon is a full-fledged industry-strength solution that meets
# the needs in IT infrastructure and application monitoring for

View File

@ -0,0 +1,278 @@
#
# Copyright 2017 Centreon (http://www.centreon.com/)
#
# Centreon is a full-fledged industry-strength solution that meets
# the needs in IT infrastructure and application monitoring for
# service performance.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
package apps::haproxy::snmp::mode::backendusage;
use base qw(centreon::plugins::templates::counter);
use strict;
use warnings;
use Digest::MD5 qw(md5_hex);
my $instance_mode;
sub custom_status_threshold {
my ($self, %options) = @_;
my $status = 'ok';
my $message;
eval {
local $SIG{__WARN__} = sub { $message = $_[0]; };
local $SIG{__DIE__} = sub { $message = $_[0]; };
if (defined($instance_mode->{option_results}->{critical_status}) && $instance_mode->{option_results}->{critical_status} ne '' &&
eval "$instance_mode->{option_results}->{critical_status}") {
$status = 'critical';
} elsif (defined($instance_mode->{option_results}->{warning_status}) && $instance_mode->{option_results}->{warning_status} ne '' &&
eval "$instance_mode->{option_results}->{warning_status}") {
$status = 'warning';
}
};
if (defined($message)) {
$self->{output}->output_add(long_msg => 'filter status issue: ' . $message);
}
return $status;
}
sub custom_status_output {
my ($self, %options) = @_;
my $msg = 'status : ' . $self->{result_values}->{status};
return $msg;
}
sub custom_status_calc {
my ($self, %options) = @_;
$self->{result_values}->{status} = $options{new_datas}->{$self->{instance} . '_alBackendStatus'};
$self->{result_values}->{display} = $options{new_datas}->{$self->{instance} . '_display'};
return 0;
}
sub set_counters {
my ($self, %options) = @_;
$self->{maps_counters_type} = [
{ name => 'backend', type => 1, cb_prefix_output => 'prefix_backend_output', message_multiple => 'All backends are ok' },
];
$self->{maps_counters}->{backend} = [
{ label => 'status', threshold => 0, set => {
key_values => [ { name => 'alBackendStatus' }, { name => 'display' } ],
closure_custom_calc => $self->can('custom_status_calc'),
closure_custom_output => $self->can('custom_status_output'),
closure_custom_perfdata => sub { return 0; },
closure_custom_threshold_check => $self->can('custom_status_threshold'),
}
},
{ label => 'current-queue', set => {
key_values => [ { name => 'alBackendQueueCur' }, { name => 'display' } ],
output_template => 'Current queue : %s',
perfdatas => [
{ label => 'current_queue', value => 'alBackendQueueCur_absolute', template => '%s',
min => 0, label_extra_instance => 1, instance_use => 'display_absolute' },
],
}
},
{ label => 'current-sessions', set => {
key_values => [ { name => 'alBackendSessionCur' }, { name => 'display' } ],
output_template => 'Current sessions : %s',
perfdatas => [
{ label => 'current_sessions', value => 'alBackendSessionCur_absolute', template => '%s',
min => 0, label_extra_instance => 1, instance_use => 'display_absolute' },
],
}
},
{ label => 'total-sessions', set => {
key_values => [ { name => 'alBackendSessionTotal', diff => 1 }, { name => 'display' } ],
output_template => 'Total sessions : %s',
perfdatas => [
{ label => 'total_connections', value => 'alBackendSessionTotal_absolute', template => '%s',
min => 0, label_extra_instance => 1, instance_use => 'display_absolute' },
],
}
},
{ label => 'traffic-in', set => {
key_values => [ { name => 'alBackendBytesIN', diff => 1 }, { name => 'display' } ],
output_template => 'Traffic In : %s %s/s',
per_second => 1, output_change_bytes => 2,
perfdatas => [
{ label => 'traffic_in', value => 'alBackendBytesIN_per_second', template => '%.2f',
min => 0, unit => 'b/s', label_extra_instance => 1, instance_use => 'display_absolute' },
],
}
},
{ label => 'traffic-out', set => {
key_values => [ { name => 'alBackendBytesOUT', diff => 1 }, { name => 'display' } ],
output_template => 'Traffic Out : %s %s/s',
per_second => 1, output_change_bytes => 2,
perfdatas => [
{ label => 'traffic_out', value => 'alBackendBytesOUT_per_second', template => '%.2f',
min => 0, unit => 'b/s', label_extra_instance => 1, instance_use => 'display_absolute' },
],
}
},
];
}
sub new {
my ($class, %options) = @_;
my $self = $class->SUPER::new(package => __PACKAGE__, %options, statefile => 1);
bless $self, $class;
$self->{version} = '1.0';
$options{options}->add_options(arguments =>
{
"filter-name:s" => { name => 'filter_name' },
"warning-status:s" => { name => 'warning_status', default => '' },
"critical-status:s" => { name => 'critical_status', default => '%{status} !~ /UP/i' },
});
return $self;
}
sub check_options {
my ($self, %options) = @_;
$self->SUPER::check_options(%options);
$instance_mode = $self;
$self->change_macros();
}
sub prefix_backend_output {
my ($self, %options) = @_;
return "Backend '" . $options{instance_value}->{display} . "' ";
}
sub change_macros {
my ($self, %options) = @_;
foreach (('warning_status', 'critical_status')) {
if (defined($self->{option_results}->{$_})) {
$self->{option_results}->{$_} =~ s/%\{(.*?)\}/\$self->{result_values}->{$1}/g;
}
}
}
my $mapping = {
alBackendName => { oid => '.1.3.6.1.4.1.23263.4.2.1.3.3.1.3' },
alBackendQueueCur => { oid => '.1.3.6.1.4.1.23263.4.2.1.3.3.1.4' },
alBackendSessionCur => { oid => '.1.3.6.1.4.1.23263.4.2.1.3.3.1.7' },
alBackendSessionTotal => { oid => '.1.3.6.1.4.1.23263.4.2.1.3.3.1.10' },
alBackendBytesIN => { oid => '.1.3.6.1.4.1.23263.4.2.1.3.3.1.12' },
alBackendBytesOUT => { oid => '.1.3.6.1.4.1.23263.4.2.1.3.3.1.13' },
alBackendStatus => { oid => '.1.3.6.1.4.1.23263.4.2.1.3.3.1.20' },
};
sub manage_selection {
my ($self, %options) = @_;
if ($options{snmp}->is_snmpv1()) {
$self->{output}->add_option_msg(short_msg => "Need to use SNMP v2c or v3.");
$self->{output}->option_exit();
}
$self->{backend} = {};
my $snmp_result = $options{snmp}->get_multiple_table(
oids => [
{ oid => $mapping->{alBackendName}->{oid} },
{ oid => $mapping->{alBackendQueueCur}->{oid} },
{ oid => $mapping->{alBackendSessionCur}->{oid} },
{ oid => $mapping->{alBackendSessionTotal}->{oid} },
{ oid => $mapping->{alBackendBytesIN}->{oid} },
{ oid => $mapping->{alBackendBytesOUT}->{oid} },
{ oid => $mapping->{alBackendStatus}->{oid} },
],
return_type => 1, nothing_quit => 1);
foreach my $oid (keys %{$snmp_result}) {
next if ($oid !~ /^$mapping->{alBackendName}->{oid}\.(.*)$/);
my $instance = $1;
my $result = $options{snmp}->map_instance(mapping => $mapping, results => $snmp_result, instance => $instance);
if (defined($self->{option_results}->{filter_name}) && $self->{option_results}->{filter_name} ne '' &&
$result->{alBackendName} !~ /$self->{option_results}->{filter_name}/) {
$self->{output}->output_add(long_msg => "skipping '" . $result->{wgPolicyName} . "': no matching filter.", debug => 1);
next;
}
$result->{alBackendBytesIN} *= 8;
$result->{alBackendBytesOUT} *= 8;
$self->{backend}->{$instance} = { display => $result->{alBackendName},
%$result
};
}
if (scalar(keys %{$self->{backend}}) <= 0) {
$self->{output}->add_option_msg(short_msg => "No backend found.");
$self->{output}->option_exit();
}
$self->{cache_name} = "haproxy_" . $self->{mode} . '_' . $options{snmp}->get_hostname() . '_' . $options{snmp}->get_port() . '_' .
(defined($self->{option_results}->{filter_counters}) ? md5_hex($self->{option_results}->{filter_counters}) : md5_hex('all')) . '_' .
(defined($self->{option_results}->{filter_name}) ? md5_hex($self->{option_results}->{filter_name}) : md5_hex('all'));
}
1;
__END__
=head1 MODE
Check backend usage.
=over 8
=item B<--filter-counters>
Only display some counters (regexp can be used).
Example: --filter-counters='^total-sessions$'
=item B<--filter-name>
Filter backend name (can be a regexp).
=item B<--warning-status>
Set warning threshold for status.
Can used special variables like: %{status}, %{display}
=item B<--critical-status>
Set critical threshold for status (Default: '%{status} !~ /UP/i').
Can used special variables like: %{status}, %{display}
=item B<--warning-*>
Threshold warning.
Can be: 'total-sessions', 'current-sessions', 'current-queue',
'traffic-in' (b/s), 'traffic-out' (b/s).
=item B<--critical-*>
Threshold critical.
Can be: 'total-sessions', 'current-sessions', 'current-queue',
'traffic-in' (b/s), 'traffic-out' (b/s).
=back
=cut

View File

@ -0,0 +1,267 @@
#
# Copyright 2017 Centreon (http://www.centreon.com/)
#
# Centreon is a full-fledged industry-strength solution that meets
# the needs in IT infrastructure and application monitoring for
# service performance.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
package apps::haproxy::snmp::mode::frontendusage;
use base qw(centreon::plugins::templates::counter);
use strict;
use warnings;
use Digest::MD5 qw(md5_hex);
my $instance_mode;
sub custom_status_threshold {
my ($self, %options) = @_;
my $status = 'ok';
my $message;
eval {
local $SIG{__WARN__} = sub { $message = $_[0]; };
local $SIG{__DIE__} = sub { $message = $_[0]; };
if (defined($instance_mode->{option_results}->{critical_status}) && $instance_mode->{option_results}->{critical_status} ne '' &&
eval "$instance_mode->{option_results}->{critical_status}") {
$status = 'critical';
} elsif (defined($instance_mode->{option_results}->{warning_status}) && $instance_mode->{option_results}->{warning_status} ne '' &&
eval "$instance_mode->{option_results}->{warning_status}") {
$status = 'warning';
}
};
if (defined($message)) {
$self->{output}->output_add(long_msg => 'filter status issue: ' . $message);
}
return $status;
}
sub custom_status_output {
my ($self, %options) = @_;
my $msg = 'status : ' . $self->{result_values}->{status};
return $msg;
}
sub custom_status_calc {
my ($self, %options) = @_;
$self->{result_values}->{status} = $options{new_datas}->{$self->{instance} . '_alFrontendStatus'};
$self->{result_values}->{display} = $options{new_datas}->{$self->{instance} . '_display'};
return 0;
}
sub set_counters {
my ($self, %options) = @_;
$self->{maps_counters_type} = [
{ name => 'frontend', type => 1, cb_prefix_output => 'prefix_frontend_output', message_multiple => 'All frontends are ok' },
];
$self->{maps_counters}->{frontend} = [
{ label => 'status', threshold => 0, set => {
key_values => [ { name => 'alFrontendStatus' }, { name => 'display' } ],
closure_custom_calc => $self->can('custom_status_calc'),
closure_custom_output => $self->can('custom_status_output'),
closure_custom_perfdata => sub { return 0; },
closure_custom_threshold_check => $self->can('custom_status_threshold'),
}
},
{ label => 'current-sessions', set => {
key_values => [ { name => 'alFrontendSessionCur' }, { name => 'display' } ],
output_template => 'Current sessions : %s',
perfdatas => [
{ label => 'current_sessions', value => 'alFrontendSessionCur_absolute', template => '%s',
min => 0, label_extra_instance => 1, instance_use => 'display_absolute' },
],
}
},
{ label => 'total-sessions', set => {
key_values => [ { name => 'alFrontendSessionTotal', diff => 1 }, { name => 'display' } ],
output_template => 'Total sessions : %s',
perfdatas => [
{ label => 'total_connections', value => 'alFrontendSessionTotal_absolute', template => '%s',
min => 0, label_extra_instance => 1, instance_use => 'display_absolute' },
],
}
},
{ label => 'traffic-in', set => {
key_values => [ { name => 'alFrontendBytesIN', diff => 1 }, { name => 'display' } ],
output_template => 'Traffic In : %s %s/s',
per_second => 1, output_change_bytes => 2,
perfdatas => [
{ label => 'traffic_in', value => 'alFrontendBytesIN_per_second', template => '%.2f',
min => 0, unit => 'b/s', label_extra_instance => 1, instance_use => 'display_absolute' },
],
}
},
{ label => 'traffic-out', set => {
key_values => [ { name => 'alFrontendBytesOUT', diff => 1 }, { name => 'display' } ],
output_template => 'Traffic Out : %s %s/s',
per_second => 1, output_change_bytes => 2,
perfdatas => [
{ label => 'traffic_out', value => 'alFrontendBytesOUT_per_second', template => '%.2f',
min => 0, unit => 'b/s', label_extra_instance => 1, instance_use => 'display_absolute' },
],
}
},
];
}
sub new {
my ($class, %options) = @_;
my $self = $class->SUPER::new(package => __PACKAGE__, %options, statefile => 1);
bless $self, $class;
$self->{version} = '1.0';
$options{options}->add_options(arguments =>
{
"filter-name:s" => { name => 'filter_name' },
"warning-status:s" => { name => 'warning_status', default => '' },
"critical-status:s" => { name => 'critical_status', default => '%{status} !~ /OPEN/i' },
});
return $self;
}
sub check_options {
my ($self, %options) = @_;
$self->SUPER::check_options(%options);
$instance_mode = $self;
$self->change_macros();
}
sub prefix_frontend_output {
my ($self, %options) = @_;
return "Frontend '" . $options{instance_value}->{display} . "' ";
}
sub change_macros {
my ($self, %options) = @_;
foreach (('warning_status', 'critical_status')) {
if (defined($self->{option_results}->{$_})) {
$self->{option_results}->{$_} =~ s/%\{(.*?)\}/\$self->{result_values}->{$1}/g;
}
}
}
my $mapping = {
alFrontendName => { oid => '.1.3.6.1.4.1.23263.4.2.1.3.2.1.3' },
alFrontendSessionCur => { oid => '.1.3.6.1.4.1.23263.4.2.1.3.2.1.4' },
alFrontendSessionTotal => { oid => '.1.3.6.1.4.1.23263.4.2.1.3.2.1.7' },
alFrontendBytesIN => { oid => '.1.3.6.1.4.1.23263.4.2.1.3.2.1.8' },
alFrontendBytesOUT => { oid => '.1.3.6.1.4.1.23263.4.2.1.3.2.1.9' },
alFrontendStatus => { oid => '.1.3.6.1.4.1.23263.4.2.1.3.2.1.13' },
};
sub manage_selection {
my ($self, %options) = @_;
if ($options{snmp}->is_snmpv1()) {
$self->{output}->add_option_msg(short_msg => "Need to use SNMP v2c or v3.");
$self->{output}->option_exit();
}
$self->{frontend} = {};
my $snmp_result = $options{snmp}->get_multiple_table(
oids => [
{ oid => $mapping->{alFrontendName}->{oid} },
{ oid => $mapping->{alFrontendSessionCur}->{oid} },
{ oid => $mapping->{alFrontendSessionTotal}->{oid} },
{ oid => $mapping->{alFrontendBytesIN}->{oid} },
{ oid => $mapping->{alFrontendBytesOUT}->{oid} },
{ oid => $mapping->{alFrontendStatus}->{oid} },
],
return_type => 1, nothing_quit => 1);
foreach my $oid (keys %{$snmp_result}) {
next if ($oid !~ /^$mapping->{alFrontendName}->{oid}\.(.*)$/);
my $instance = $1;
my $result = $options{snmp}->map_instance(mapping => $mapping, results => $snmp_result, instance => $instance);
if (defined($self->{option_results}->{filter_name}) && $self->{option_results}->{filter_name} ne '' &&
$result->{alFrontendName} !~ /$self->{option_results}->{filter_name}/) {
$self->{output}->output_add(long_msg => "skipping '" . $result->{wgPolicyName} . "': no matching filter.", debug => 1);
next;
}
$result->{alFrontendBytesIN} *= 8;
$result->{alFrontendBytesOUT} *= 8;
$self->{frontend}->{$instance} = { display => $result->{alFrontendName},
%$result
};
}
if (scalar(keys %{$self->{frontend}}) <= 0) {
$self->{output}->add_option_msg(short_msg => "No frontend found.");
$self->{output}->option_exit();
}
$self->{cache_name} = "haproxy_" . $self->{mode} . '_' . $options{snmp}->get_hostname() . '_' . $options{snmp}->get_port() . '_' .
(defined($self->{option_results}->{filter_counters}) ? md5_hex($self->{option_results}->{filter_counters}) : md5_hex('all')) . '_' .
(defined($self->{option_results}->{filter_name}) ? md5_hex($self->{option_results}->{filter_name}) : md5_hex('all'));
}
1;
__END__
=head1 MODE
Check frontend usage.
=over 8
=item B<--filter-counters>
Only display some counters (regexp can be used).
Example: --filter-counters='^total-connections$'
=item B<--filter-name>
Filter backend name (can be a regexp).
=item B<--warning-status>
Set warning threshold for status.
Can used special variables like: %{status}, %{display}
=item B<--critical-status>
Set critical threshold for status (Default: '%{status} !~ /OPEN/i').
Can used special variables like: %{status}, %{display}
=item B<--warning-*>
Threshold warning.
Can be: 'total-sessions', 'current-sessions',
'traffic-in' (b/s), 'traffic-out' (b/s).
=item B<--critical-*>
Threshold critical.
Can be: 'total-sessions', 'current-sessions',
'traffic-in' (b/s), 'traffic-out' (b/s).
=back
=cut

View File

@ -0,0 +1,49 @@
#
# Copyright 2017 Centreon (http://www.centreon.com/)
#
# Centreon is a full-fledged industry-strength solution that meets
# the needs in IT infrastructure and application monitoring for
# service performance.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
package apps::haproxy::snmp::plugin;
use strict;
use warnings;
use base qw(centreon::plugins::script_snmp);
sub new {
my ($class, %options) = @_;
my $self = $class->SUPER::new(package => __PACKAGE__, %options);
bless $self, $class;
$self->{version} = '1.0';
%{$self->{modes}} = (
'backend-usage' => 'apps::haproxy::snmp::mode::backendusage',
'frontend-usage' => 'apps::haproxy::snmp::mode::frontendusage',
);
return $self;
}
1;
__END__
=head1 PLUGIN DESCRIPTION
Check haproxy software in SNMP.
=cut

View File

@ -38,11 +38,13 @@ sub custom_status_threshold {
local $SIG{__WARN__} = sub { $message = $_[0]; };
local $SIG{__DIE__} = sub { $message = $_[0]; };
if (defined($instance_mode->{option_results}->{critical_status}) && $instance_mode->{option_results}->{critical_status} ne '' &&
eval "$instance_mode->{option_results}->{critical_status}") {
my $label = $self->{label};
$label =~ s/-/_/g;
if (defined($instance_mode->{option_results}->{'critical_' . $label}) && $instance_mode->{option_results}->{'critical_' . $label} ne '' &&
eval "$instance_mode->{option_results}->{'critical_' . $label}") {
$status = 'critical';
} elsif (defined($instance_mode->{option_results}->{warning_status}) && $instance_mode->{option_results}->{warning_status} ne '' &&
eval "$instance_mode->{option_results}->{warning_status}") {
} elsif (defined($instance_mode->{option_results}->{'warning_' . $label}) && $instance_mode->{option_results}->{'warning_' . $label} ne '' &&
eval "$instance_mode->{option_results}->{'warning_' . $label}") {
$status = 'warning';
}
};
@ -74,6 +76,23 @@ sub custom_status_calc {
return 0;
}
sub custom_integrationservice_output {
my ($self, %options) = @_;
my $msg = $self->{result_values}->{output_label} . ' : ' . $self->{result_values}->{service_status};
return $msg;
}
sub custom_integrationservice_calc {
my ($self, %options) = @_;
$self->{result_values}->{output_label} = $options{extra_options}->{output_label};
$self->{result_values}->{service_status} = $options{new_datas}->{$self->{instance} . '_' . $options{extra_options}->{name_status}};
$self->{result_values}->{vm} = $options{new_datas}->{$self->{instance} . '_vm'};
$self->{result_values}->{status} = $options{new_datas}->{$self->{instance} . '_status'};
return 0;
}
sub set_counters {
my ($self, %options) = @_;
@ -91,6 +110,51 @@ sub set_counters {
closure_custom_threshold_check => $self->can('custom_status_threshold'),
}
},
{ label => 'osshutdown-status', threshold => 0, set => {
key_values => [ { name => 'status' }, { name => 'vm' }, { name => 'operatingsystemshutdownenabled' } ],
closure_custom_calc => $self->can('custom_integrationservice_calc'),
closure_custom_calc_extra_options => { output_label => 'Operating System Shutdown', name_status => 'operatingsystemshutdownenabled' },
closure_custom_output => $self->can('custom_integrationservice_output'),
closure_custom_perfdata => sub { return 0; },
closure_custom_threshold_check => $self->can('custom_status_threshold'),
}
},
{ label => 'timesync-status', threshold => 0, set => {
key_values => [ { name => 'status' }, { name => 'vm' }, { name => 'timesynchronizationenabled' } ],
closure_custom_calc => $self->can('custom_integrationservice_calc'),
closure_custom_calc_extra_options => { output_label => 'Time Synchronization', name_status => 'timesynchronizationenabled' },
closure_custom_output => $self->can('custom_integrationservice_output'),
closure_custom_perfdata => sub { return 0; },
closure_custom_threshold_check => $self->can('custom_status_threshold'),
}
},
{ label => 'dataexchange-status', threshold => 0, set => {
key_values => [ { name => 'status' }, { name => 'vm' }, { name => 'dataexchangeenabled' } ],
closure_custom_calc => $self->can('custom_integrationservice_calc'),
closure_custom_calc_extra_options => { output_label => 'Data Exchange', name_status => 'dataexchangeenabled' },
closure_custom_output => $self->can('custom_integrationservice_output'),
closure_custom_perfdata => sub { return 0; },
closure_custom_threshold_check => $self->can('custom_status_threshold'),
}
},
{ label => 'heartbeat-status', threshold => 0, set => {
key_values => [ { name => 'status' }, { name => 'vm' }, { name => 'heartbeatenabled' } ],
closure_custom_calc => $self->can('custom_integrationservice_calc'),
closure_custom_calc_extra_options => { output_label => 'Heartbeat', name_status => 'heartbeatenabled' },
closure_custom_output => $self->can('custom_integrationservice_output'),
closure_custom_perfdata => sub { return 0; },
closure_custom_threshold_check => $self->can('custom_status_threshold'),
}
},
{ label => 'backup-status', threshold => 0, set => {
key_values => [ { name => 'status' }, { name => 'vm' }, { name => 'backupenabled' } ],
closure_custom_calc => $self->can('custom_integrationservice_calc'),
closure_custom_calc_extra_options => { output_label => 'Backup', name_status => 'backupenabled' },
closure_custom_output => $self->can('custom_integrationservice_output'),
closure_custom_perfdata => sub { return 0; },
closure_custom_threshold_check => $self->can('custom_status_threshold'),
}
},
];
}
@ -124,6 +188,16 @@ sub new {
"filter-status:s" => { name => 'filter_status' },
"warning-status:s" => { name => 'warning_status', default => '' },
"critical-status:s" => { name => 'critical_status', default => '%{vmaddition} =~ /not detected/i' },
"warning-osshutdown-status:s" => { name => 'warning_osshutdown_status', default => '' },
"critical-osshutdown-status:s" => { name => 'critical_osshutdown_status', default => '' },
"warning-timesync-status:s" => { name => 'warning_timesync_status', default => '' },
"critical-timesync-status:s" => { name => 'critical_timesync_status', default => '' },
"warning-dataexchange-status:s" => { name => 'warning_dataexchange_status', default => '' },
"critical-dataexchange-status:s" => { name => 'critical_dataexchange_status', default => '' },
"warning-heartbeat-status:s" => { name => 'warning_heartbeat_status', default => '' },
"critical-heartbeat-status:s" => { name => 'critical_heartbeat_status', default => '' },
"warning-backup-status:s" => { name => 'warning_backup_status', default => '' },
"critical-backup-status:s" => { name => 'critical_backup_status', default => '' },
});
return $self;
}
@ -148,7 +222,9 @@ sub check_options {
sub change_macros {
my ($self, %options) = @_;
foreach (('warning_status', 'critical_status')) {
foreach (('warning_status', 'critical_status', 'warning_osshutdown_status', 'critical_osshutdown_status',
'warning_timesync_status', 'critical_timesync_status', 'warning_dataexchange_status', 'critical_dataexchange_status',
'warning_heartbeat_status', 'critical_heartbeat_status', 'warning_backup_status', 'critical_backup_status')) {
if (defined($self->{option_results}->{$_})) {
$self->{option_results}->{$_} =~ s/%\{(.*?)\}/\$self->{result_values}->{$1}/g;
}

View File

@ -98,7 +98,7 @@ sub manage_selection {
my ($self, %options) = @_;
$self->{cg} = {};
my $snmp_result = $options{snmp}->get_table(oid => $oid_i3IgInfo, start => $oid_i3IgSipActiveCallsCount, end => ,
my $snmp_result = $options{snmp}->get_table(oid => $oid_i3IgInfo, start => $oid_i3IgSipActiveCallsCount,
nothing_quit => 1);
foreach my $oid (keys %{$snmp_result}) {

View File

@ -148,7 +148,7 @@ sub manage_selection {
$self->{output}->option_exit();
}
$self->{cache_name} = "hibernate_" . $self->{mode} . '_' . md5_hex($options{custom}->{url}) . '_' .
$self->{cache_name} = "hibernate_" . $self->{mode} . '_' . md5_hex($options{custom}->get_connection_info()) . '_' .
(defined($self->{option_results}->{filter_counters}) ? md5_hex($self->{option_results}->{filter_counters}) : md5_hex('all')) . '_' .
(defined($self->{option_results}->{filter_name}) ? md5_hex($self->{option_results}->{filter_name}) : md5_hex('all'));
}

View File

@ -0,0 +1,164 @@
#
# Copyright 2017 Centreon (http://www.centreon.com/)
#
# Centreon is a full-fledged industry-strength solution that meets
# the needs in IT infrastructure and application monitoring for
# service performance.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
package apps::java::jboss::jmx::mode::datasourceusage;
use base qw(centreon::plugins::templates::counter);
use strict;
use warnings;
use Digest::MD5 qw(md5_hex);
sub set_counters {
my ($self, %options) = @_;
$self->{maps_counters_type} = [
{ name => 'datasource', type => 1, cb_prefix_output => 'prefix_ds_output', message_multiple => 'All datasources are ok' },
];
$self->{maps_counters}->{datasource} = [
{ label => 'active-con', set => {
key_values => [ { name => 'ActiveCount' }, { name => 'display' } ],
output_template => 'Current Active Connections : %s',
perfdatas => [
{ label => 'active_con', value => 'ActiveCount_absolute', template => '%s', min => 0,
label_extra_instance => 1, instance_use => 'display_absolute' },
],
}
},
{ label => 'available-con', set => {
key_values => [ { name => 'AvailableCount' }, { name => 'display' } ],
output_template => 'Current Available Connections : %s',
perfdatas => [
{ label => 'available_con', value => 'AvailableCount_absolute', template => '%s', min => 0,
label_extra_instance => 1, instance_use => 'display_absolute' },
],
}
},
{ label => 'in-use-con', set => {
key_values => [ { name => 'InUseCount' }, { name => 'display' } ],
output_template => 'Current In Use Connections : %s',
perfdatas => [
{ label => 'in_use_con', value => 'InUseCount_absolute', template => '%s', min => 0,
label_extra_instance => 1, instance_use => 'display_absolute' },
],
}
},
{ label => 'created-con', set => {
key_values => [ { name => 'CreatedCount', diff => 1 }, { name => 'display' } ],
output_template => 'Created Connections : %s',
perfdatas => [
{ label => 'created_con', value => 'CreatedCount_absolute', template => '%s', min => 0,
label_extra_instance => 1, instance_use => 'display_absolute' },
],
}
},
];
}
sub prefix_ds_output {
my ($self, %options) = @_;
return "Datasource '" . $options{instance_value}->{display} . "' ";
}
sub new {
my ($class, %options) = @_;
my $self = $class->SUPER::new(package => __PACKAGE__, %options, statefile => 1);
bless $self, $class;
$self->{version} = '1.0';
$options{options}->add_options(arguments =>
{
"filter-name:s" => { name => 'filter_name' },
});
return $self;
}
sub manage_selection {
my ($self, %options) = @_;
my $request = [
{ mbean => "jboss.jca:name=*,service=ManagedConnectionPool", attributes =>
[ { name => 'AvailableConnectionCount' }, { name => 'ConnectionCount' }, { name => 'ConnectionCreatedCount' }, { name => 'InUseConnectionCount' } ] },
{ mbean => "jboss.as:data-source=*,statistics=pool,subsystem=datasources", attributes =>
[ { name => 'AvailableCount' }, { name => 'ActiveCount' }, { name => 'CreatedCount' }, { name => 'InUseCount' } ] },
];
my $result = $options{custom}->get_attributes(request => $request, nothing_quit => 1);
$self->{datasource} = {};
foreach my $key (keys %$result) {
$key =~ /(?:[:,])(?:name|data-source)=(.*?)(?:,|$)/;
my $ds_name = $1;
$ds_name =~ s/^"(.*)"$/$1/;
if (defined($self->{option_results}->{filter_name}) && $self->{option_results}->{filter_name} ne '' &&
$ds_name !~ /$self->{option_results}->{filter_name}/) {
$self->{output}->output_add(long_msg => "skipping '" . $ds_name . "': no matching filter.", debug => 1);
next;
}
$self->{datasource}->{$ds_name} = {
display => $ds_name,
AvailableCount => defined($result->{$key}->{AvailableConnectionCount}) ? $result->{$key}->{AvailableConnectionCount} : $result->{$key}->{AvailableCount},
ActiveCount => defined($result->{$key}->{ConnectionCount}) ? $result->{$key}->{ConnectionCount} : $result->{$key}->{ActiveCount},
CreatedCount => defined($result->{$key}->{ConnectionCreatedCount}) ? $result->{$key}->{ConnectionCreatedCount} : $result->{$key}->{CreatedCount},
InUseCount => defined($result->{$key}->{InUseConnectionCount}) ? $result->{$key}->{InUseConnectionCount} : $result->{$key}->{InUseCount},
};
}
$self->{cache_name} = "jboss_" . $self->{mode} . '_' . md5_hex($options{custom}->get_connection_info()) . '_' .
(defined($self->{option_results}->{filter_counters}) ? md5_hex($self->{option_results}->{filter_counters}) : md5_hex('all')) . '_' .
(defined($self->{option_results}->{filter_name}) ? md5_hex($self->{option_results}->{filter_name}) : md5_hex('all'));
}
1;
__END__
=head1 MODE
Check data sources usage.
=over 8
=item B<--filter-counters>
Only display some counters (regexp can be used).
Example: --filter-counters='num-active'
=item B<--filter-name>
Filter datasource name (can be a regexp).
=item B<--warning-*>
Threshold warning.
Can be: 'active-con', 'available-con', 'created-con', 'in-use-con'.
=item B<--critical-*>
Threshold critical.
Can be: 'active-con', 'available-con', 'created-con', 'in-use-con'.
=back
=cut

View File

@ -0,0 +1,123 @@
#
# Copyright 2017 Centreon (http://www.centreon.com/)
#
# Centreon is a full-fledged industry-strength solution that meets
# the needs in IT infrastructure and application monitoring for
# service performance.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
package apps::java::jboss::jmx::mode::listdatasources;
use base qw(centreon::plugins::mode);
use strict;
use warnings;
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 =>
{
"filter-name:s" => { name => 'filter_name' },
});
$self->{ds} = {};
return $self;
}
sub check_options {
my ($self, %options) = @_;
$self->SUPER::init(%options);
}
sub manage_selection {
my ($self, %options) = @_;
my $request = [
{ mbean => "jboss.jca:name=*,service=ManagedConnectionPool", attributes =>
[ { name => 'ConnectionCount' } ] },
{ mbean => "jboss.as:data-source=*,statistics=pool,subsystem=datasources", attributes =>
[ { name => 'ActiveCount' } ] },
];
my $result = $options{custom}->get_attributes(request => $request);
foreach my $mbean (keys %{$result}) {
$mbean =~ /(?:[:,])(?:data-source|name)=(.*?)(?:,|$)/;
my $name = $1;
$name =~ s/^"(.*)"$/$1/;
if (defined($self->{option_results}->{filter_name}) && $self->{option_results}->{filter_name} ne '' &&
$name !~ /$self->{option_results}->{filter_name}/) {
$self->{output}->output_add(long_msg => "skipping '" . $name . "': no matching filter.", debug => 1);
next;
}
$self->{ds}->{$name} = {
name => $name,
};
}
}
sub run {
my ($self, %options) = @_;
$self->manage_selection(%options);
foreach my $instance (sort keys %{$self->{ds}}) {
$self->{output}->output_add(long_msg => '[name = ' . $self->{ds}->{$instance}->{name} . "]");
}
$self->{output}->output_add(severity => 'OK',
short_msg => 'List data sources:');
$self->{output}->display(nolabel => 1, force_ignore_perfdata => 1, force_long_output => 1);
$self->{output}->exit();
}
sub disco_format {
my ($self, %options) = @_;
$self->{output}->add_disco_format(elements => ['name']);
}
sub disco_show {
my ($self, %options) = @_;
$self->manage_selection(%options);
foreach my $instance (sort keys %{$self->{ds}}) {
$self->{output}->add_disco_entry(
%{$self->{ds}->{$instance}}
);
}
}
1;
__END__
=head1 MODE
List data sources.
=over 8
=item B<--filter-name>
Filter by name (can be a regexp).
=back
=cut

View File

@ -0,0 +1,54 @@
#
# Copyright 2017 Centreon (http://www.centreon.com/)
#
# Centreon is a full-fledged industry-strength solution that meets
# the needs in IT infrastructure and application monitoring for
# service performance.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
package apps::java::jboss::jmx::plugin;
use strict;
use warnings;
use base qw(centreon::plugins::script_custom);
sub new {
my ($class, %options) = @_;
my $self = $class->SUPER::new(package => __PACKAGE__, %options);
bless $self, $class;
$self->{version} = '0.1';
%{$self->{modes}} = (
'class-count' => 'centreon::common::jvm::mode::classcount',
'datasource-usage' => 'apps::java::jboss::jmx::mode::datasourceusage',
'list-datasources' => 'apps::java::jboss::jmx::mode::listdatasources',
'memory' => 'centreon::common::jvm::mode::memory',
'memory-detailed' => 'centreon::common::jvm::mode::memorydetailed',
'threads' => 'centreon::common::jvm::mode::threads',
);
$self->{custom_modes}{jolokia} = 'centreon::common::protocols::jmx::custom::jolokia';
return $self;
}
1;
__END__
=head1 PLUGIN DESCRIPTION
Check Jboss in JMX. Need Jolokia agent.
=cut

View File

@ -131,7 +131,7 @@ sub manage_selection {
$self->{output}->option_exit();
}
$self->{cache_name} = "solr_" . $self->{mode} . '_' . md5_hex($options{custom}->{url}) . '_' .
$self->{cache_name} = "solr_" . $self->{mode} . '_' . md5_hex($options{custom}->get_connection_info()) . '_' .
(defined($self->{option_results}->{filter_counters}) ? md5_hex($self->{option_results}->{filter_counters}) : md5_hex('all')) . '_' .
(defined($self->{option_results}->{filter_name}) ? md5_hex($self->{option_results}->{filter_name}) : md5_hex('all'));
}

View File

@ -128,7 +128,7 @@ sub manage_selection {
$self->{output}->option_exit();
}
$self->{cache_name} = "solr_" . $self->{mode} . '_' . md5_hex($options{custom}->{url}) . '_' .
$self->{cache_name} = "solr_" . $self->{mode} . '_' . md5_hex($options{custom}->get_connection_info()) . '_' .
(defined($self->{option_results}->{filter_counters}) ? md5_hex($self->{option_results}->{filter_counters}) : md5_hex('all')) . '_' .
(defined($self->{option_results}->{filter_name}) ? md5_hex($self->{option_results}->{filter_name}) : md5_hex('all'));
}

View File

@ -141,7 +141,7 @@ sub manage_selection {
$self->{output}->option_exit();
}
$self->{cache_name} = "zookeeper_" . $self->{mode} . '_' . md5_hex($options{custom}->{url}) . '_' .
$self->{cache_name} = "zookeeper_" . $self->{mode} . '_' . md5_hex($options{custom}->get_connection_info()) . '_' .
(defined($self->{option_results}->{filter_counters}) ? md5_hex($self->{option_results}->{filter_counters}) : md5_hex('all'));
}

View File

@ -0,0 +1,184 @@
#
# Copyright 2017 Centreon (http://www.centreon.com/)
#
# Centreon is a full-fledged industry-strength solution that meets
# the needs in IT infrastructure and application monitoring for
# service performance.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
package apps::kingdee::eas::custom::api;
use strict;
use warnings;
use centreon::plugins::http;
sub new {
my ($class, %options) = @_;
my $self = {};
bless $self, $class;
if (!defined($options{output})) {
print "Class Custom: Need to specify 'output' argument.\n";
exit 3;
}
if (!defined($options{options})) {
$options{output}->add_option_msg(short_msg => "Class Custom: Need to specify 'options' argument.");
$options{output}->option_exit();
}
if (!defined($options{noptions})) {
$options{options}->add_options(arguments =>
{
"hostname:s@" => { name => 'hostname', },
"proto:s@" => { name => 'proto' },
"port:s@" => { name => 'port', },
"username:s@" => { name => 'username', },
"password:s@" => { name => 'password', },
"proxyurl:s@" => { name => 'proxyurl', },
"timeout:s@" => { name => 'timeout', },
});
}
$options{options}->add_help(package => __PACKAGE__, sections => 'REST API OPTIONS', once => 1);
$self->{output} = $options{output};
$self->{mode} = $options{mode};
$self->{http} = centreon::plugins::http->new(output => $self->{output});
return $self;
}
sub set_options {
my ($self, %options) = @_;
$self->{option_results} = $options{option_results};
}
sub set_defaults {
my ($self, %options) = @_;
foreach (keys %{$options{default}}) {
if ($_ eq $self->{mode}) {
for (my $i = 0; $i < scalar(@{$options{default}->{$_}}); $i++) {
foreach my $opt (keys %{$options{default}->{$_}[$i]}) {
if (!defined($self->{option_results}->{$opt}[$i])) {
$self->{option_results}->{$opt}[$i] = $options{default}->{$_}[$i]->{$opt};
}
}
}
}
}
}
sub check_options {
my ($self, %options) = @_;
$self->{hostname} = (defined($self->{option_results}->{hostname})) ? shift(@{$self->{option_results}->{hostname}}) : undef;
$self->{username} = (defined($self->{option_results}->{username})) ? shift(@{$self->{option_results}->{username}}) : '';
$self->{password} = (defined($self->{option_results}->{password})) ? shift(@{$self->{option_results}->{password}}) : '';
$self->{proto} = (defined($self->{option_results}->{proto})) ? shift(@{$self->{option_results}->{proto}}) : 'http';
$self->{port} = (defined($self->{option_results}->{port})) ? shift(@{$self->{option_results}->{port}}) : 80;
$self->{timeout} = (defined($self->{option_results}->{timeout})) ? shift(@{$self->{option_results}->{timeout}}) : 10;
$self->{proxyurl} = (defined($self->{option_results}->{proxyurl})) ? shift(@{$self->{option_results}->{proxyurl}}) : undef;
if (!defined($self->{hostname})) {
$self->{output}->add_option_msg(short_msg => "Need to specify hostname option.");
$self->{output}->option_exit();
}
if (!defined($self->{hostname}) ||
scalar(@{$self->{option_results}->{hostname}}) == 0) {
return 0;
}
return 1;
}
sub build_options_for_httplib {
my ($self, %options) = @_;
$self->{option_results}->{hostname} = $self->{hostname};
$self->{option_results}->{timeout} = $self->{timeout};
$self->{option_results}->{port} = $self->{port};
$self->{option_results}->{proto} = $self->{proto};
$self->{option_results}->{proxyurl} = $self->{proxyurl};
$self->{option_results}->{credentials} = 1;
$self->{option_results}->{username} = $self->{username};
$self->{option_results}->{password} = $self->{password};
}
sub settings {
my ($self, %options) = @_;
$self->build_options_for_httplib();
$self->{http}->set_options(%{$self->{option_results}});
}
sub request {
my ($self, %options) = @_;
$self->settings();
my $content = $self->{http}->request(url_path => $options{path});
$content =~ s/^\s|\s+$//g;
return $content;
}
1;
__END__
=head1 NAME
KINGDEE REST API
=head1 SYNOPSIS
KINGDEE Rest API custom mode
=head1 REST API OPTIONS
=over 8
=item B<--hostname>
Kingdee hostname.
=item B<--proto>
Specify https if needed.
=item B<--username>
Kingdee username.
=item B<--password>
Kingdee password.
=item B<--proxyurl>
Proxy URL if any.
=item B<--timeout>
Set HTTP timeout in seconds (Default: '10').
=back
=head1 DESCRIPTION
B<custom>.
=cut

View File

@ -0,0 +1,111 @@
#
# Copyright 2017 Centreon (http://www.centreon.com/)
#
# Centreon is a full-fledged industry-strength solution that meets
# the needs in IT infrastructure and application monitoring for
# service performance.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
# Author : CHEN JUN , aladdin.china@gmail.com
package apps::kingdee::eas::mode::activeusers;
use base qw(centreon::plugins::mode);
use strict;
use warnings;
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 =>
{
"urlpath:s" => { name => 'url_path', default => "/easportal/tools/nagios/checkactiveusers.jsp" },
"warning:s" => { name => 'warning' },
"critical:s" => { name => 'critical' },
});
return $self;
}
sub check_options {
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();
}
}
sub run {
my ($self, %options) = @_;
my $webcontent = $options{custom}->request(path => $self->{option_results}->{url_path});
if ($webcontent !~ /.*ActiveUsers_1m=.*/i) {
$self->{output}->output_add(
severity => 'UNKNOWN',
short_msg => "Cannot find eas actvie users info."
);
$self->{output}->option_exit();
}
my @activeusers = split(" ",$webcontent);
my $info;
foreach $info (@activeusers) {
if ($info =~ /(.*)=(.*)/) {
my ($counttype, $num) = ($1, $2);
$self->{output}->output_add(severity => "ok", short_msg => $info);
$self->{output}->perfdata_add(label => $counttype, unit => '',value => $num);
}
}
$self->{output}->display();
$self->{output}->exit();
}
1;
__END__
=head1 MODE
Check eas active users info.
=over 8
=item B<--urlpath>
Set path to get status page. (Default: '/easportal/tools/nagios/checkclassloading.jsp')
=item B<--warning>
Warning Threshold.
=item B<--critical>
Critical Threshold.
=back
=cut

View File

@ -0,0 +1,126 @@
#
# Copyright 2017 Centreon (http://www.centreon.com/)
#
# Centreon is a full-fledged industry-strength solution that meets
# the needs in IT infrastructure and application monitoring for
# service performance.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
# Author : CHEN JUN , aladdin.china@gmail.com
package apps::kingdee::eas::mode::classloading;
use base qw(centreon::plugins::mode);
use strict;
use warnings;
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 =>
{
"urlpath:s" => { name => 'url_path', default => "/easportal/tools/nagios/checkclassloading.jsp" },
"warning:s" => { name => 'warning' },
"critical:s" => { name => 'critical' },
});
return $self;
}
sub check_options {
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();
}
}
sub run {
my ($self, %options) = @_;
my $webcontent = $options{custom}->request(path => $self->{option_results}->{url_path});
if ($webcontent !~ /(LoadedClassCount|UnloadedClassCount)/i) {
$self->{output}->output_add(
severity => 'UNKNOWN',
short_msg => "Cannot find classloading status."
);
$self->{output}->option_exit();
}
my ($loadedclasscount, $unloadedclasscount) = (0, 0);
if ($webcontent =~ /LoadedClassCount=\s*(\d+)/mi) {
$loadedclasscount = $1;
}
if ($webcontent =~ /UnloadedClassCount=\s*(\d+)/mi) {
$unloadedclasscount = $1;
}
my $exit = $self->{perfdata}->threshold_check(value => $loadedclasscount,
threshold => [ { label => 'critical', 'exit_litteral' => 'critical' },
{ label => 'warning', 'exit_litteral' => 'warning' } ]);
$self->{output}->output_add(severity => $exit, short_msg => sprintf("ClassLoaded: %d", $loadedclasscount));
$self->{output}->output_add(severity => $exit, short_msg => sprintf("ClassUnloaded: %d", $unloadedclasscount));
$self->{output}->perfdata_add(label => "LoadedClassCount", unit => '',
value => sprintf("%d", $loadedclasscount),
warning => $self->{perfdata}->get_perfdata_for_output(label => 'warning'),
critical => $self->{perfdata}->get_perfdata_for_output(label => 'critical'),
);
$self->{output}->perfdata_add(label => "c[UnloadedClassCount]", unit => '',
value => sprintf("%d", $unloadedclasscount),
);
$self->{output}->display();
$self->{output}->exit();
}
1;
__END__
=head1 MODE
Check EAS application classLoading status.
=over 8
=item B<--urlpath>
Set path to get status page. (Default: '/easportal/tools/nagios/checkclassloading.jsp')
=item B<--warning>
Warning Threshold for class loaded
=item B<--critical>
Critical Threshold for class unloaded
=back
=cut

View File

@ -0,0 +1,174 @@
#
# Copyright 2017 Centreon (http://www.centreon.com/)
#
# Centreon is a full-fledged industry-strength solution that meets
# the needs in IT infrastructure and application monitoring for
# service performance.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
# Author : CHEN JUN , aladdin.china@gmail.com
package apps::kingdee::eas::mode::datasource;
use base qw(centreon::plugins::mode);
use strict;
use warnings;
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 =>
{
"urlpath:s" => { name => 'url_path', default => "/easportal/tools/nagios/checkdatasources.jsp" },
"datasource:s" => { name => 'datasource' },
"warning:s" => { name => 'warning' },
"critical:s" => { name => 'critical' },
});
return $self;
}
sub check_options {
my ($self, %options) = @_;
$self->SUPER::init(%options);
if (!defined($self->{option_results}->{datasource}) || $self->{option_results}->{datasource} eq "") {
$self->{output}->add_option_msg(short_msg => "Missing datasource name.");
$self->{output}->option_exit();
}
$self->{option_results}->{url_path} .= "?ds=" . $self->{option_results}->{datasource};
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();
}
}
sub run {
my ($self, %options) = @_;
my $webcontent = $options{custom}->request(path => $self->{option_results}->{url_path});
if ($webcontent !~ /^Name=/i) {
$self->{output}->output_add(
severity => 'UNKNOWN',
short_msg => "Cannot find datasource \'" . $self->{option_results}->{datasource} . "\' status."
);
}
my $init_pool_size = -1;
my $max_pool_size = -1;
my $idle_timeout = -1;
my $cur_conn_count = -1;
my $cur_avail_conn_count = -1;
my $max_conn_count = -1;
my $create_count = -1;
my $close_count = -1;
$init_pool_size = $1 if $webcontent =~ /InitialPoolSize=(\d+)\s/i;
$max_pool_size = $1 if $webcontent =~ /MaxPoolSize=(\d+)\s/i;
$idle_timeout = $1 if $webcontent =~ /IdleTimeout=(\d+)\s/i;
$cur_conn_count = $1 if $webcontent =~ /CurrentConnectionCount=(\d+)\s/i;
$cur_avail_conn_count = $1 if $webcontent =~ /CurrentAvailableConnectionCount=(\d+)\s/i;
$max_conn_count = $1 if $webcontent =~ /MaxConnectionCount=(\d+)\s/i;
$create_count = $1 if $webcontent =~ /CreateCount=(\d+)\s/i;
$close_count = $1 if $webcontent =~ /CloseCount=(\d+)\s/i;
my $active_conn_count = $cur_conn_count - $cur_avail_conn_count;
$self->{output}->output_add(severity => "ok", short_msg => sprintf("InitialPoolSize: %d", $init_pool_size));
$self->{output}->output_add(severity => "ok", short_msg => sprintf("MaxPoolSize: %d", $max_pool_size));
$self->{output}->output_add(severity => "ok", short_msg => sprintf("IdleTimeout: %d", $idle_timeout));
my $exit = $self->{perfdata}->threshold_check(value => $active_conn_count, threshold => [ { label => 'critical', exit_litteral => 'critical' }, { label => 'warning', exit_litteral => 'warning' } ]);
$self->{output}->output_add(severity => $exit, short_msg => sprintf("ActiveConnectionCount: %d", $active_conn_count));
$self->{output}->output_add(severity => "ok", short_msg => sprintf("CurrentConnectionCount: %d", $cur_conn_count));
#$self->{output}->output_add(severity => "ok", short_msg => sprintf("CurrentAvailableConnectionCount: %d", $cur_avail_conn_count));
$self->{output}->output_add(severity => "ok", short_msg => sprintf("MaxConnectionCount: %d", $max_conn_count));
$self->{output}->output_add(severity => "ok", short_msg => sprintf("CreateCount: %d", $create_count));
$self->{output}->output_add(severity => "ok", short_msg => sprintf("CloseCount: %d", $close_count));
$self->{output}->perfdata_add(label => "InitPoolSize", unit => '',
value => sprintf("%d", $init_pool_size),
);
$self->{output}->perfdata_add(label => "MaxPoolSize", unit => '',
value => sprintf("%d", $max_pool_size),
);
$self->{output}->perfdata_add(label => "IdleTimeout", unit => '',
value => sprintf("%d", $idle_timeout),
);
$self->{output}->perfdata_add(label => "ActiveConnectionCount", unit => '',
value => sprintf("%d", $active_conn_count),
warning => $self->{perfdata}->get_perfdata_for_output(label => 'warning'),
critical => $self->{perfdata}->get_perfdata_for_output(label => 'critical'),
);
$self->{output}->perfdata_add(label => "CurrentConnectionCount", unit => '',
value => sprintf("%d", $cur_conn_count),
);
#$self->{output}->perfdata_add(label => "CurrentAvailableConnectionCount", unit => '',
# value => sprintf("%d", $cur_avail_conn_count),
# );
$self->{output}->perfdata_add(label => "MaxConnectionCount", unit => '',
value => sprintf("%d", $max_conn_count),
);
$self->{output}->perfdata_add(label => "c[CreateCount]", unit => '',
value => sprintf("%d", $create_count),
);
$self->{output}->perfdata_add(label => "c[CloseCount]", unit => '',
value => sprintf("%d", $close_count),
);
$self->{output}->display();
$self->{output}->exit();
}
1;
__END__
=head1 MODE
Check EAS application datasource status.
=over 8
=item B<--urlpath>
Specify path to get status page. (Default: '/easportal/tools/nagios/checkdatasources.jsp')
=item B<--datasource>
Specify the datasource name.
=item B<--warning>
Warning Threshold for active connection count.
=item B<--critical>
Critical Threshold for active connection count.
=back
=cut

View File

@ -0,0 +1,108 @@
#
# Copyright 2017 Centreon (http://www.centreon.com/)
#
# Centreon is a full-fledged industry-strength solution that meets
# the needs in IT infrastructure and application monitoring for
# service performance.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
# Author : CHEN JUN , aladdin.china@gmail.com
package apps::kingdee::eas::mode::easlicense;
use base qw(centreon::plugins::mode);
use strict;
use warnings;
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 =>
{
"urlpath:s" => { name => 'url_path', default => "/easportal/tools/nagios/checkeaslicense.jsp" },
"warning:s" => { name => 'warning' },
"critical:s" => { name => 'critical' },
});
return $self;
}
sub check_options {
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();
}
}
sub run {
my ($self, %options) = @_;
my $webcontent = $options{custom}->request(path => $self->{option_results}->{url_path});
if ($webcontent !~ /.*BOS=.*/i) {
$self->{output}->output_add(severity => 'UNKNOWN',
short_msg => "Cannot find eas license usage info.");
$self->{output}->option_exit();
}
my @licenseinfo = split(" ",$webcontent);
my $info;
foreach $info (@licenseinfo) {
if ($info =~ /(.*)=(.*)/) {
my ($modname, $num) = ($1, $2);
$self->{output}->output_add(severity => "ok", short_msg => $info);
$self->{output}->perfdata_add(label => $modname, unit => '',value => $num);
}
}
$self->{output}->display();
$self->{output}->exit();
}
1;
__END__
=head1 MODE
Check eas license usage info.
=over 8
=item B<--urlpath>
Set path to get status page. (Default: '/easportal/tools/nagios/checkclassloading.jsp')
=item B<--warning>
Warning Threshold.
=item B<--critical>
Critical Threshold.
=back
=cut

View File

@ -0,0 +1,186 @@
#
# Copyright 2017 Centreon (http://www.centreon.com/)
#
# Centreon is a full-fledged industry-strength solution that meets
# the needs in IT infrastructure and application monitoring for
# service performance.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
# Author : CHEN JUN , aladdin.china@gmail.com
package apps::kingdee::eas::mode::httphandler;
use base qw(centreon::plugins::mode);
use strict;
use warnings;
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 => {
"urlpath:s" => { name => 'url_path', default => "/easportal/tools/nagios/checkhttphandler.jsp" },
"warning:s" => { name => 'warning' },
"critical:s" => { name => 'critical' },
}
);
return $self;
}
sub check_options {
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();
}
}
sub run {
my ($self, %options) = @_;
my $webcontent = $options{custom}->request(path => $self->{option_results}->{url_path});
if ($webcontent !~ /MaxThreads=\d+/i) {
$self->{output}->output_add(
severity => 'UNKNOWN',
short_msg => "Cannot find httphandler status in response: '" . $webcontent . "'"
);
$self->{output}->option_exit();
}
my ($maxthreads, $minsparethreads, $maxsparethreads, $maxqueuesize, $idletimeout, $processedcount) = (0, 0, 0, 0, 0, 0);
my ($currentthreadcount, $availablethreadcount, $busythreadcount, $maxavailablethreadcount, $maxbusythreadcount) = (0, 0, 0, 0, 0);
my ($maxprocessedtime, $createcount, $destroycount) = (0, 0, 0);
$maxthreads = $1 if $webcontent =~ /MaxThreads=(\d+)/mi ;
$minsparethreads = $1 if $webcontent =~ /MinSpareThreads=(\d+)/mi ;
$maxsparethreads = $1 if $webcontent =~ /MaxSpareThreads=(\d+)/mi ;
$maxqueuesize = $1 if $webcontent =~ /MaxQueueSize=(\d+)/mi ;
$idletimeout = $1 if $webcontent =~ /IdleTimeout=(\d+)/mi ;
$processedcount = $1 if $webcontent =~ /ProcessedCount=(\d+)/mi ;
$currentthreadcount = $1 if $webcontent =~ /CurrentThreadCount=(\d+)/mi ;
$availablethreadcount = $1 if $webcontent =~ /AvailableThreadCount=(\d+)/mi ;
$busythreadcount = $1 if $webcontent =~ /BusyThreadCount=(\d+)/mi ;
$maxavailablethreadcount = $1 if $webcontent =~ /MaxAvailableThreadCount=(\d+)/mi ;
$maxbusythreadcount = $1 if $webcontent =~ /MaxBusyThreadCount=(\d+)/mi ;
$maxprocessedtime = $1 if $webcontent =~ /MaxProcessedTime=(\d+)/mi ;
$createcount = $1 if $webcontent =~ /CreateCount=(\d+)/mi ;
$destroycount = $1 if $webcontent =~ /DestroyCount=(\d+)/mi ;
$self->{output}->output_add(severity => "ok", short_msg => sprintf("MaxThreads: %d", $maxthreads));
$self->{output}->output_add(severity => "ok", short_msg => sprintf("MinSpareThreads: %d", $minsparethreads));
$self->{output}->output_add(severity => "ok", short_msg => sprintf("MaxSpareThreads: %d", $maxsparethreads));
$self->{output}->output_add(severity => "ok", short_msg => sprintf("MaxQueueSize: %d", $maxqueuesize));
$self->{output}->output_add(severity => "ok", short_msg => sprintf("IdleTimeout: %ds", $idletimeout));
$self->{output}->output_add(severity => "ok", short_msg => sprintf("ProcessedCount: %d", $processedcount));
$self->{output}->output_add(severity => "ok", short_msg => sprintf("CurrentThreadCount: %d", $currentthreadcount));
$self->{output}->output_add(severity => "ok", short_msg => sprintf("AvailableThreadCount: %d", $availablethreadcount));
my $exit = $self->{perfdata}->threshold_check(value => $busythreadcount, threshold => [ { label => 'critical', exit_litteral => 'critical' }, { label => 'warning', exit_litteral => 'warning' } ]);
$self->{output}->output_add(severity => $exit, short_msg => sprintf("BusyThreadCount: %d", $busythreadcount));
$self->{output}->output_add(severity => "ok", short_msg => sprintf("MaxAvailableThreadCount: %d", $maxavailablethreadcount));
$self->{output}->output_add(severity => "ok", short_msg => sprintf("MaxBusyThreadCount: %d", $maxbusythreadcount));
$self->{output}->output_add(severity => "ok", short_msg => sprintf("MaxProcessedTime: %dms", $maxprocessedtime));
$self->{output}->output_add(severity => "ok", short_msg => sprintf("CreateCount: %d", $createcount));
$self->{output}->output_add(severity => "ok", short_msg => sprintf("DestroyCount: %d", $destroycount));
$self->{output}->perfdata_add(label => "MaxThreads", unit => '',
value => sprintf("%d", $maxthreads),
);
$self->{output}->perfdata_add(label => "MinSpareThreads", unit => '',
value => sprintf("%d", $minsparethreads),
);
$self->{output}->perfdata_add(label => "MaxSpareThreads", unit => '',
value => sprintf("%d", $maxsparethreads),
);
$self->{output}->perfdata_add(label => "MaxQueueSize", unit => '',
value => sprintf("%d", $maxqueuesize),
);
$self->{output}->perfdata_add(label => "IdleTimeout", unit => 's',
value => sprintf("%d", $idletimeout),
);
$self->{output}->perfdata_add(label => "c[ProcessedCount]", unit => '',
value => sprintf("%d", $processedcount),
);
$self->{output}->perfdata_add(label => "CurrentThreadCount", unit => '',
value => sprintf("%d", $currentthreadcount),
);
$self->{output}->perfdata_add(label => "AvailableThreadCount", unit => '',
value => sprintf("%d", $availablethreadcount),
);
$self->{output}->perfdata_add(label => "BusyThreadCount", unit => '',
value => sprintf("%d", $busythreadcount),
warning => $self->{perfdata}->get_perfdata_for_output(label => 'warning'),
critical => $self->{perfdata}->get_perfdata_for_output(label => 'critical'),
);
$self->{output}->perfdata_add(label => "MaxAvailableThreadCount", unit => '',
value => sprintf("%d", $maxavailablethreadcount),
);
$self->{output}->perfdata_add(label => "MaxBusyThreadCount", unit => '',
value => sprintf("%d", $maxbusythreadcount),
);
$self->{output}->perfdata_add(label => "MaxProcessedTime", unit => 'ms',
value => sprintf("%d", $maxprocessedtime),
);
$self->{output}->perfdata_add(label => "c[CreateCount]", unit => '',
value => sprintf("%d", $createcount),
);
$self->{output}->perfdata_add(label => "c[DestroyCount]", unit => '',
value => sprintf("%d", $destroycount),
);
$self->{output}->display();
$self->{output}->exit();
}
1;
__END__
=head1 MODE
Check EAS instance httphandler(Apusic) threads pool status.
=over 8
=item B<--urlpath>
Set path to get status page. (Default: '/easportal/tools/nagios/checkhttphandler.jsp')
=item B<--warning>
Warning Threshold for busy thread count.
=item B<--critical>
Critical Threshold for busy thread count.
=back
=cut

View File

@ -0,0 +1,115 @@
#
# Copyright 2017 Centreon (http://www.centreon.com/)
#
# Centreon is a full-fledged industry-strength solution that meets
# the needs in IT infrastructure and application monitoring for
# service performance.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
# Author : CHEN JUN , aladdin.china@gmail.com
package apps::kingdee::eas::mode::ibmjvmgc;
use base qw(centreon::plugins::mode);
use strict;
use warnings;
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 =>
{
"urlpath:s" => { name => 'url_path', default => "/easportal/tools/nagios/checkgc_j9gen.jsp" },
"warning:s" => { name => 'warning' },
"critical:s" => { name => 'critical' },
});
return $self;
}
sub check_options {
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();
}
}
sub run {
my ($self, %options) = @_;
my $webcontent = $options{custom}->request(path => $self->{option_results}->{url_path});
if ($webcontent !~ /CollectionCount=\d+/mi) {
$self->{output}->output_add(
severity => 'UNKNOWN',
short_msg => "Cannot find ibm jdk j9 gc status."
);
$self->{output}->option_exit();
}
my ($collectioncount, $collectiontime) = (0, 0);
($collectioncount, $collectiontime) = ($1, $2) if ($webcontent =~ /CollectionCount=(\d+)\sCollectionTime=(\d+)/mi);
$self->{output}->output_add(severity => "ok", short_msg => sprintf("CollectionCount: %d", $collectioncount));
$self->{output}->output_add(severity => "ok", short_msg => sprintf("CollectionTime: %dms", $collectiontime));
$self->{output}->perfdata_add(label => "c[CollectionCount]", unit => '',
value => sprintf("%d", $collectioncount),
);
$self->{output}->perfdata_add(label => "c[CollectionTime]", unit => 'ms',
value => sprintf("%d", $collectiontime),
);
$self->{output}->display();
$self->{output}->exit();
}
1;
__END__
=head1 MODE
Check EAS application jvm gc status.
=over 8
=item B<--urlpath>
Set path to get status page. (Default: '/easportal/tools/nagios/checkgc_j9.jsp')
=item B<--warning>
Warning Threshold for class loaded
=item B<--critical>
Critical Threshold for class unloaded
=back
=cut

View File

@ -0,0 +1,129 @@
#
# Copyright 2017 Centreon (http://www.centreon.com/)
#
# Centreon is a full-fledged industry-strength solution that meets
# the needs in IT infrastructure and application monitoring for
# service performance.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
# Author : CHEN JUN , aladdin.china@gmail.com
package apps::kingdee::eas::mode::javaruntime;
use base qw(centreon::plugins::mode);
use strict;
use warnings;
use POSIX;
use centreon::plugins::misc;
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 =>
{
"urlpath:s" => { name => 'url_path', default => "/easportal/tools/nagios/checkjavaruntime.jsp" },
"warning:s" => { name => 'warning' },
"critical:s" => { name => 'critical' },
});
return $self;
}
sub check_options {
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();
}
}
sub run {
my ($self, %options) = @_;
my $webcontent = $options{custom}->request(path => $self->{option_results}->{url_path});
if ($webcontent !~ /VmName=/mi) {
$self->{output}->output_add(
severity => 'UNKNOWN',
short_msg => "Cannot find java runtime status."
);
$self->{output}->option_exit();
}
my $vmname = $1 if $webcontent =~ /VmName=\'(.*?)\'/i;
my $specversion = $1 if $webcontent =~ /SpecVersion=([\d\.]+)/i;
my $vmversion = $1 if $webcontent =~ /VmVersion=(.*?)\s/i;
my $vender = $1 if $webcontent =~ /VmVendor=\'(.*?)\'/i;
my $uptime = $1 if $webcontent =~ /Uptime=(\d*)/i; #unit:ms
my $startime = $1 if $webcontent =~ /StartTime=(\d*)/i;
my $exit = $self->{perfdata}->threshold_check(value => $uptime / 1000, threshold => [
{ label => 'critical', 'exit_litteral' => 'critical' },
{ label => 'warning', exit_litteral => 'warning' } ]);
$self->{output}->output_add(severity => $exit, short_msg => sprintf("Uptime: %s",
centreon::plugins::misc::change_seconds(value => floor($uptime / 1000), start => 'd'))
);
$self->{output}->output_add(severity => $exit, short_msg => sprintf("%s %s (build %s), %s",
$vmname ,$specversion, $vmversion,$vender)
);
$self->{output}->perfdata_add(label => "Uptime", unit => 's',
value => sprintf("%d", floor($uptime / 1000)),
warning => $self->{perfdata}->get_perfdata_for_output(label => 'warning'),
critical => $self->{perfdata}->get_perfdata_for_output(label => 'critical'),
);
$self->{output}->perfdata_add(label => "SpecVersion", unit => '',
value => sprintf("%s", $specversion),
);
$self->{output}->display();
$self->{output}->exit();
}
1;
__END__
=head1 MODE
Check EAS application java runtime status.
=over 8
=item B<--urlpath>
Set path to get status page. (Default: '/easportal/tools/nagios/checkjavaruntime.jsp')
=item B<--warning>
Warning Threshold for uptime (sec)
=item B<--critical>
Critical Threshold for uptime (sec)
=back
=cut

View File

@ -0,0 +1,322 @@
#
# Copyright 2017 Centreon (http://www.centreon.com/)
#
# Centreon is a full-fledged industry-strength solution that meets
# the needs in IT infrastructure and application monitoring for
# service performance.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
# Author : CHEN JUN , aladdin.china@gmail.com
package apps::kingdee::eas::mode::memory;
use base qw(centreon::plugins::mode);
use strict;
use warnings;
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 => {
"urlpath:s" => { name => 'url_path', default => "/easportal/tools/nagios/checkmemory.jsp" },
"warning-heap:s" => { name => 'warning-heap' , default => ",,,"},
"warning-nonheap:s" => { name => 'warning-nonheap' , default => ",,,"},
"critical-heap:s" => { name => 'critical-heap' , default => ",,,"},
"critical-nonheap:s" => { name => 'critical-nonheap' , default => ",,,"},
}
);
return $self;
}
sub check_options {
my ( $self, %options ) = @_;
$self->SUPER::init(%options);
($self->{warn_init_heap}, $self->{warn_max_heap}, $self->{warn_used_heap}, $self->{warn_committed_heap})
= split /,/, $self->{option_results}->{"warning-heap"};
($self->{warn_init_nonheap}, $self->{warn_max_nonheap}, $self->{warn_used_nonheap}, $self->{warn_committed_nonheap})
= split /,/, $self->{option_results}->{"warning-nonheap"};
($self->{crit_init_heap}, $self->{crit_max_heap}, $self->{crit_used_heap}, $self->{crit_committed_heap})
= split /,/, $self->{option_results}->{"critical-heap"};
($self->{crit_init_nonheap}, $self->{crit_max_nonheap}, $self->{crit_used_nonheap}, $self->{crit_committed_nonheap})
= split /,/, $self->{option_results}->{"critical-nonheap"};
# warning-heap
if (($self->{perfdata}->threshold_validate(label => 'warn_init_heap', value => $self->{warn_init_heap})) == 0) {
$self->{output}->add_option_msg(short_msg => "Wrong warning-heap init threshold '" . $self->{warn_init_heap} . "'.");
$self->{output}->option_exit();
}
if (($self->{perfdata}->threshold_validate(label => 'warn_max_heap', value => $self->{warn_max_heap})) == 0) {
$self->{output}->add_option_msg(short_msg => "Wrong warning-heap max threshold '" . $self->{warn_max_heap} . "'.");
$self->{output}->option_exit();
}
if (($self->{perfdata}->threshold_validate(label => 'warn_used_heap', value => $self->{warn_used_heap})) == 0) {
$self->{output}->add_option_msg(short_msg => "Wrong warning-heap used threshold '" . $self->{warn_used_heap} . "'.");
$self->{output}->option_exit();
}
if (($self->{perfdata}->threshold_validate(label => 'warn_committed_heap', value => $self->{warn_committed_heap})) == 0) {
$self->{output}->add_option_msg(short_msg => "Wrong warning-heap committed threshold '" . $self->{warn_committed_heap} . "'.");
$self->{output}->option_exit();
}
# waring-nonheap
if (($self->{perfdata}->threshold_validate(label => 'warn_init_nonheap', value => $self->{warn_init_nonheap})) == 0) {
$self->{output}->add_option_msg(short_msg => "Wrong warning-nonheap init threshold '" . $self->{warn_init_nonheap} . "'.");
$self->{output}->option_exit();
}
if (($self->{perfdata}->threshold_validate(label => 'warn_max_nonheap', value => $self->{warn_max_nonheap})) == 0) {
$self->{output}->add_option_msg(short_msg => "Wrong warning-nonheap max threshold '" . $self->{warn_max_nonheap} . "'.");
$self->{output}->option_exit();
}
if (($self->{perfdata}->threshold_validate(label => 'warn_used_nonheap', value => $self->{warn_used_nonheap})) == 0) {
$self->{output}->add_option_msg(short_msg => "Wrong warning-nonheap used threshold '" . $self->{warn_used_nonheap} . "'.");
$self->{output}->option_exit();
}
if (($self->{perfdata}->threshold_validate(label => 'warn_committed_nonheap', value => $self->{warn_committed_nonheap})) == 0) {
$self->{output}->add_option_msg(short_msg => "Wrong warning-nonheap committed threshold '" . $self->{warn_committed_nonheap} . "'.");
$self->{output}->option_exit();
}
# critical-heap
if (($self->{perfdata}->threshold_validate(label => 'crit_init_heap', value => $self->{crit_init_heap})) == 0) {
$self->{output}->add_option_msg(short_msg => "Wrong critical-heap init threshold '" . $self->{crit_init_heap} . "'.");
$self->{output}->option_exit();
}
if (($self->{perfdata}->threshold_validate(label => 'crit_max_heap', value => $self->{crit_max_heap})) == 0) {
$self->{output}->add_option_msg(short_msg => "Wrong critical-heap max threshold '" . $self->{crit_max_heap} . "'.");
$self->{output}->option_exit();
}
if (($self->{perfdata}->threshold_validate(label => 'crit_used_heap', value => $self->{crit_used_heap})) == 0) {
$self->{output}->add_option_msg(short_msg => "Wrong critical-heap used threshold '" . $self->{crit_used_heap} . "'.");
$self->{output}->option_exit();
}
if (($self->{perfdata}->threshold_validate(label => 'crit_committed_heap', value => $self->{crit_committed_heap})) == 0) {
$self->{output}->add_option_msg(short_msg => "Wrong critical-heap committed threshold '" . $self->{crit_committed_heap} . "'.");
$self->{output}->option_exit();
}
# critical-nonheap
if (($self->{perfdata}->threshold_validate(label => 'crit_init_nonheap', value => $self->{crit_init_nonheap})) == 0) {
$self->{output}->add_option_msg(short_msg => "Wrong critical-nonheap init threshold '" . $self->{crit_init_nonheap} . "'.");
$self->{output}->option_exit();
}
if (($self->{perfdata}->threshold_validate(label => 'crit_max_nonheap', value => $self->{crit_max_nonheap})) == 0) {
$self->{output}->add_option_msg(short_msg => "Wrong critical-nonheap max threshold '" . $self->{crit_max_nonheap} . "'.");
$self->{output}->option_exit();
}
if (($self->{perfdata}->threshold_validate(label => 'crit_used_nonheap', value => $self->{crit_used_nonheap})) == 0) {
$self->{output}->add_option_msg(short_msg => "Wrong critical-nonheap used threshold '" . $self->{crit_used_nonheap} . "'.");
$self->{output}->option_exit();
}
if (($self->{perfdata}->threshold_validate(label => 'crit_committed_nonheap', value => $self->{crit_committed_nonheap})) == 0) {
$self->{output}->add_option_msg(short_msg => "Wrong critical-nonheap committed threshold '" . $self->{crit_committed_nonheap} . "'.");
$self->{output}->option_exit();
}
}
sub run {
my ( $self, %options ) = @_;
my $webcontent = $options{custom}->request(path => $self->{option_results}->{url_path});
if ($webcontent !~ /(^Type=HeapMemoryUsage|^Type=NonHeapMemoryUsage)/mi) {
$self->{output}->output_add(
severity => 'UNKNOWN',
short_msg => "Cannot find heap or nonheap memory usage status."
);
$self->{output}->option_exit();
}
my ( $init_heap, $max_heap, $used_heap, $committed_heap ) = ( 0, 0, 0, 0 );
my ( $init_nonheap, $max_nonheap, $used_nonheap, $committed_nonheap ) = ( 0, 0, 0, 0 );
if ( $webcontent =~ /^Type=HeapMemoryUsage\sinit=(\d+)\smax=(\d+)\sused=(\d+)\scommitted=(\d+)/mi ){
( $init_heap, $max_heap, $used_heap, $committed_heap ) = ( $1, $2, $3, $4 );
$self->{output}->output_add(
severity => 'ok',
short_msg => sprintf(
"Heap Memory: init %d , max %d ,used %d ,commited %d",
$init_heap, $max_heap, $used_heap, $committed_heap
)
);
}
if ( $webcontent =~ /^Type=NonHeapMemoryUsage\sinit=(\d+)\smax=(-{0,1}\d+)\sused=(\d+)\scommitted=(\d+)/mi ){
( $init_nonheap, $max_nonheap, $used_nonheap, $committed_nonheap ) = ( $1, $2, $3, $4 );
$self->{output}->output_add(
severity => 'ok',
short_msg => sprintf(
"NonHeap Memory: init %d , max %d ,used %d ,commited %d",
$init_nonheap, $max_nonheap,
$used_nonheap, $committed_nonheap
)
);
}
my $exit = $self->{perfdata}->threshold_check(value => $init_heap,
threshold => [ { label => 'crit_init_heap', 'exit_litteral' => 'critical' },
{ label => 'warn_init_heap', 'exit_litteral' => 'warning' } ]);
if ($exit ne "ok"){
$self->{output}->output_add(
severity => $exit,
short_msg => sprintf("Init Heap: %d", $init_heap)
);
}
$exit = $self->{perfdata}->threshold_check(value => $max_heap,
threshold => [ { label => 'crit_max_heap', 'exit_litteral' => 'critical' },
{ label => 'warn_max_heap', 'exit_litteral' => 'warning' } ]);
if ($exit ne "ok"){
$self->{output}->output_add(
severity => $exit,
short_msg => sprintf("Max Heap: %d", $max_heap)
);
}
$exit = $self->{perfdata}->threshold_check(value => $used_heap,
threshold => [ { label => 'crit_used_heap', 'exit_litteral' => 'critical' },
{ label => 'warn_used_heap', 'exit_litteral' => 'warning' } ]);
if ($exit ne "ok"){
$self->{output}->output_add(
severity => $exit,
short_msg => sprintf("Used Heap: %d", $used_heap)
);
}
$exit = $self->{perfdata}->threshold_check(value => $committed_heap,
threshold => [ { label => 'crit_committed_heap', 'exit_litteral' => 'critical' },
{ label => 'warn_committed_heap', 'exit_litteral' => 'warning' } ]);
if ($exit ne "ok"){
$self->{output}->output_add(
severity => $exit,
short_msg => sprintf("Committed Heap: %d", $committed_heap)
);
}
$exit = $self->{perfdata}->threshold_check(value => $init_nonheap,
threshold => [ { label => 'crit_init_nonheap', 'exit_litteral' => 'critical' },
{ label => 'warn_init_nonheap', 'exit_litteral' => 'warning' } ]);
if ($exit ne "ok"){
$self->{output}->output_add(
severity => $exit,
short_msg => sprintf("Init NonHeap: %d", $init_nonheap)
);
}
$exit = $self->{perfdata}->threshold_check(value => $max_nonheap,
threshold => [ { label => 'crit_max_nonheap', 'exit_litteral' => 'critical' },
{ label => 'warn_max_nonheap', 'exit_litteral' => 'warning' } ]);
if ($exit ne "ok"){
$self->{output}->output_add(
severity => $exit,
short_msg => sprintf("Max NonHeap: %d", $max_nonheap)
);
}
$exit = $self->{perfdata}->threshold_check(value => $used_nonheap,
threshold => [ { label => 'crit_used_nonheap', 'exit_litteral' => 'critical' },
{ label => 'warn_used_nonheap', 'exit_litteral' => 'warning' } ]);
if ($exit ne "ok"){
$self->{output}->output_add(
severity => $exit,
short_msg => sprintf("Used NonHeap: %d", $used_nonheap)
);
}
$exit = $self->{perfdata}->threshold_check(value => $committed_nonheap,
threshold => [ { label => 'crit_committed_nonheap', 'exit_litteral' => 'critical' },
{ label => 'warn_committed_nonheap', 'exit_litteral' => 'warning' } ]);
if ($exit ne "ok"){
$self->{output}->output_add(
severity => $exit,
short_msg => sprintf("Committed NonHeap: %d", $committed_nonheap)
);
}
$self->{output}->perfdata_add(
label => "init_heap",
value => $init_heap,
warning => $self->{perfdata}->get_perfdata_for_output(label => 'warn_init_heap'),
critical => $self->{perfdata}->get_perfdata_for_output(label => 'crit_init_heap'),
);
$self->{output}->perfdata_add(
label => "max_heap",
value => $max_heap,
warning => $self->{perfdata}->get_perfdata_for_output(label => 'warn_max_heap'),
critical => $self->{perfdata}->get_perfdata_for_output(label => 'crit_max_heap'),
);
$self->{output}->perfdata_add(
label => "used_heap",
value => $used_heap,
warning => $self->{perfdata}->get_perfdata_for_output(label => 'warn_used_heap'),
critical => $self->{perfdata}->get_perfdata_for_output(label => 'crit_used_heap'),
);
$self->{output}->perfdata_add(
label => "committed_heap",
value => $committed_heap,
warning => $self->{perfdata}->get_perfdata_for_output(label => 'warn_committed_heap'),
critical => $self->{perfdata}->get_perfdata_for_output(label => 'crit_committed_heap'),
);
$self->{output}->perfdata_add(
label => "init_nonheap",
value => $init_nonheap,
warning => $self->{perfdata}->get_perfdata_for_output(label => 'warn_init_nonheap'),
critical => $self->{perfdata}->get_perfdata_for_output(label => 'crit_init_nonheap'),
);
$self->{output}->perfdata_add(
label => "max_nonheap",
value => $max_nonheap,
warning => $self->{perfdata}->get_perfdata_for_output(label => 'warn_max_nonheap'),
critical => $self->{perfdata}->get_perfdata_for_output(label => 'crit_max_nonheap'),
);
$self->{output}->perfdata_add(
label => "used_nonheap",
value => $used_nonheap,
warning => $self->{perfdata}->get_perfdata_for_output(label => 'warn_used_nonheap'),
critical => $self->{perfdata}->get_perfdata_for_output(label => 'crit_used_nonheap'),
);
$self->{output}->perfdata_add(
label => "committed_nonheap",
value => $committed_nonheap,
warning => $self->{perfdata}->get_perfdata_for_output(label => 'warn_committed_nonheap'),
critical => $self->{perfdata}->get_perfdata_for_output(label => 'crit_committed_nonheap'),
);
$self->{output}->display();
$self->{output}->exit();
}
1;
__END__
=head1 MODE
Check EAS instance heap & nonheap memory usage.
=over 8
=item B<--urlpath>
Set path to get status page. (Default: '/easportal/tools/nagios/checkmemory.jsp')
=item B<--warning-*>
Warning Threshold (init,max,used,committed), '*' Can be: 'heap', 'nonheap'.
=item B<--critical-*>
Critical Threshold (init,max,used,committed), '*' Can be: 'heap', 'nonheap'.
=back
=cut

View File

@ -0,0 +1,185 @@
#
# Copyright 2017 Centreon (http://www.centreon.com/)
#
# Centreon is a full-fledged industry-strength solution that meets
# the needs in IT infrastructure and application monitoring for
# service performance.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
# Author : CHEN JUN , aladdin.china@gmail.com
package apps::kingdee::eas::mode::muxhandler;
use base qw(centreon::plugins::mode);
use strict;
use warnings;
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 => {
"urlpath:s" => { name => 'url_path', default => "/easportal/tools/nagios/checkmuxhandler.jsp" },
"warning:s" => { name => 'warning' },
"critical:s" => { name => 'critical' },
}
);
return $self;
}
sub check_options {
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();
}
}
sub run {
my ( $self, %options ) = @_;
my $webcontent = $options{custom}->request(path => $self->{option_results}->{url_path});
if ($webcontent !~ /MaxThreads=\d+/i) {
$self->{output}->output_add(
severity => 'UNKNOWN',
short_msg => "Cannot find httphandler status in response: '" . $webcontent . "'"
);
$self->{output}->option_exit();
}
my ($maxthreads, $minsparethreads, $maxsparethreads, $maxqueuesize, $idletimeout, $processedcount) = (0, 0, 0, 0, 0, 0);
my ($currentthreadcount, $availablethreadcount, $busythreadcount, $maxavailablethreadcount, $maxbusythreadcount) = (0, 0, 0, 0, 0);
my ($maxprocessedtime, $createcount, $destroycount) = (0, 0, 0);
$maxthreads = $1 if $webcontent =~ /MaxThreads=(\d+)/mi ;
$minsparethreads = $1 if $webcontent =~ /MinSpareThreads=(\d+)/mi ;
$maxsparethreads = $1 if $webcontent =~ /MaxSpareThreads=(\d+)/mi ;
$maxqueuesize = $1 if $webcontent =~ /MaxQueueSize=(\d+)/mi ;
$idletimeout = $1 if $webcontent =~ /IdleTimeout=(\d+)/mi ;
$processedcount = $1 if $webcontent =~ /ProcessedCount=(\d+)/mi ;
$currentthreadcount = $1 if $webcontent =~ /CurrentThreadCount=(\d+)/mi ;
$availablethreadcount = $1 if $webcontent =~ /AvailableThreadCount=(\d+)/mi ;
$busythreadcount = $1 if $webcontent =~ /BusyThreadCount=(\d+)/mi ;
$maxavailablethreadcount = $1 if $webcontent =~ /MaxAvailableThreadCount=(\d+)/mi ;
$maxbusythreadcount = $1 if $webcontent =~ /MaxBusyThreadCount=(\d+)/mi ;
$maxprocessedtime = $1 if $webcontent =~ /MaxProcessedTime=(\d+)/mi ;
$createcount = $1 if $webcontent =~ /CreateCount=(\d+)/mi ;
$destroycount = $1 if $webcontent =~ /DestroyCount=(\d+)/mi ;
$self->{output}->output_add(severity => "ok", short_msg => sprintf("MaxThreads: %d", $maxthreads));
$self->{output}->output_add(severity => "ok", short_msg => sprintf("MinSpareThreads: %d", $minsparethreads));
$self->{output}->output_add(severity => "ok", short_msg => sprintf("MaxSpareThreads: %d", $maxsparethreads));
$self->{output}->output_add(severity => "ok", short_msg => sprintf("MaxQueueSize: %d", $maxqueuesize));
$self->{output}->output_add(severity => "ok", short_msg => sprintf("IdleTimeout: %ds", $idletimeout));
$self->{output}->output_add(severity => "ok", short_msg => sprintf("ProcessedCount: %d", $processedcount));
$self->{output}->output_add(severity => "ok", short_msg => sprintf("CurrentThreadCount: %d", $currentthreadcount));
$self->{output}->output_add(severity => "ok", short_msg => sprintf("AvailableThreadCount: %d", $availablethreadcount));
my $exit = $self->{perfdata}->threshold_check(value => $busythreadcount, threshold => [ { label => 'critical', exit_litteral => 'critical' }, { label => 'warning', exit_litteral => 'warning' } ]);
$self->{output}->output_add(severity => $exit, short_msg => sprintf("BusyThreadCount: %d", $busythreadcount));
$self->{output}->output_add(severity => "ok", short_msg => sprintf("MaxAvailableThreadCount: %d", $maxavailablethreadcount));
$self->{output}->output_add(severity => "ok", short_msg => sprintf("MaxBusyThreadCount: %d", $maxbusythreadcount));
$self->{output}->output_add(severity => "ok", short_msg => sprintf("MaxProcessedTime: %dms", $maxprocessedtime));
$self->{output}->output_add(severity => "ok", short_msg => sprintf("CreateCount: %d", $createcount));
$self->{output}->output_add(severity => "ok", short_msg => sprintf("DestroyCount: %d", $destroycount));
$self->{output}->perfdata_add(label => "MaxThreads", unit => '',
value => sprintf("%d", $maxthreads),
);
$self->{output}->perfdata_add(label => "MinSpareThreads", unit => '',
value => sprintf("%d", $minsparethreads),
);
$self->{output}->perfdata_add(label => "MaxSpareThreads", unit => '',
value => sprintf("%d", $maxsparethreads),
);
$self->{output}->perfdata_add(label => "MaxQueueSize", unit => '',
value => sprintf("%d", $maxqueuesize),
);
$self->{output}->perfdata_add(label => "IdleTimeout", unit => 's',
value => sprintf("%d", $idletimeout),
);
$self->{output}->perfdata_add(label => "c[ProcessedCount]", unit => '',
value => sprintf("%d", $processedcount),
);
$self->{output}->perfdata_add(label => "CurrentThreadCount", unit => '',
value => sprintf("%d", $currentthreadcount),
);
$self->{output}->perfdata_add(label => "AvailableThreadCount", unit => '',
value => sprintf("%d", $availablethreadcount),
);
$self->{output}->perfdata_add(label => "BusyThreadCount", unit => '',
value => sprintf("%d", $busythreadcount),
warning => $self->{perfdata}->get_perfdata_for_output(label => 'warning'),
critical => $self->{perfdata}->get_perfdata_for_output(label => 'critical'),
);
$self->{output}->perfdata_add(label => "MaxAvailableThreadCount", unit => '',
value => sprintf("%d", $maxavailablethreadcount),
);
$self->{output}->perfdata_add(label => "MaxBusyThreadCount", unit => '',
value => sprintf("%d", $maxbusythreadcount),
);
$self->{output}->perfdata_add(label => "MaxProcessedTime", unit => 'ms',
value => sprintf("%d", $maxprocessedtime),
);
$self->{output}->perfdata_add(label => "c[CreateCount]", unit => '',
value => sprintf("%d", $createcount),
);
$self->{output}->perfdata_add(label => "c[DestroyCount]", unit => '',
value => sprintf("%d", $destroycount),
);
$self->{output}->display();
$self->{output}->exit();
}
1;
__END__
=head1 MODE
Check EAS instance muxhandler(Apusic) threads pool status.
=over 8
=item B<--urlpath>
Set path to get status page. (Default: '/easportal/tools/nagios/checkmuxhandler.jsp')
=item B<--warning>
Warning Threshold for busy thread count.
=item B<--critical>
Critical Threshold for busy thread count.
=back
=cut

View File

@ -0,0 +1,123 @@
#
# Copyright 2017 Centreon (http://www.centreon.com/)
#
# Centreon is a full-fledged industry-strength solution that meets
# the needs in IT infrastructure and application monitoring for
# service performance.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
# Author : CHEN JUN , aladdin.china@gmail.com
package apps::kingdee::eas::mode::oraclejvmgc;
use base qw(centreon::plugins::mode);
use strict;
use warnings;
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 =>
{
"urlpath:s" => { name => 'url_path', default => "/easportal/tools/nagios/checkgc_ps.jsp" },
"warning:s" => { name => 'warning' },
"critical:s" => { name => 'critical' },
});
return $self;
}
sub check_options {
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();
}
}
sub run {
my ($self, %options) = @_;
my $webcontent = $options{custom}->request(path => $self->{option_results}->{url_path});
if ( $webcontent !~ /MinorGCCount=\d+/mi ) {
$self->{output}->output_add(
severity => 'UNKNOWN',
short_msg => "Cannot find jvm gc status."
);
$self->{output}->option_exit();
}
my ($minorgccount, $minorgctime, $fullgccount, $fullgctime) = (0, 0, 0, 0);
($minorgccount, $minorgctime, $fullgccount, $fullgctime) = ($1, $2, $3, $4) if ($webcontent =~ /MinorGCCount=(\d+)\sMinorGCTime=(\d+)\sFullGCCount=(\d+)\sFullGCTime=(\d+)/mi);
$self->{output}->output_add(severity => "ok", short_msg => sprintf("MinorGCCount: %d", $minorgccount));
$self->{output}->output_add(severity => "ok", short_msg => sprintf("MinorGCTime: %dms", $minorgctime));
$self->{output}->output_add(severity => "ok", short_msg => sprintf("FullGCCount: %d", $fullgccount));
$self->{output}->output_add(severity => "ok", short_msg => sprintf("FullGCTime: %dms", $fullgctime));
$self->{output}->perfdata_add(label => "c[MinorGCCount]", unit => '',
value => sprintf("%d", $minorgccount),
);
$self->{output}->perfdata_add(label => "c[MinorGCTime]", unit => 'ms',
value => sprintf("%d", $minorgctime),
);
$self->{output}->perfdata_add(label => "c[FullGCCount]", unit => '',
value => sprintf("%d", $fullgccount),
);
$self->{output}->perfdata_add(label => "c[FullGCTime]", unit => 'ms',
value => sprintf("%d", $fullgctime),
);
$self->{output}->display();
$self->{output}->exit();
}
1;
__END__
=head1 MODE
Check EAS application jvm gc status.
=over 8
=item B<--urlpath>
Set path to get status page. (Default: '/easportal/tools/nagios/checkgc_ps.jsp')
=item B<--warning>
Warning Threshold for class loaded
=item B<--critical>
Critical Threshold for class unloaded
=back
=cut

View File

@ -0,0 +1,125 @@
#
# Copyright 2017 Centreon (http://www.centreon.com/)
#
# Centreon is a full-fledged industry-strength solution that meets
# the needs in IT infrastructure and application monitoring for
# service performance.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
# Author : CHEN JUN , aladdin.china@gmail.com
package apps::kingdee::eas::mode::oracleksqltemptable;
use base qw(centreon::plugins::mode);
use strict;
use warnings;
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 =>
{
"urlpath:s" => { name => 'url_path', default => "/easportal/tools/nagios/checkoraclevt.jsp" },
"datasource:s" => { name => 'datasource' },
"warning:s" => { name => 'warning' },
"critical:s" => { name => 'critical' },
});
return $self;
}
sub check_options {
my ($self, %options) = @_;
$self->SUPER::init(%options);
if (!defined($self->{option_results}->{datasource}) || $self->{option_results}->{datasource} eq "") {
$self->{output}->add_option_msg(short_msg => "Missing datasource name.");
$self->{output}->option_exit();
}
$self->{option_results}->{url_path} .= "?ds=" . $self->{option_results}->{datasource};
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();
}
}
sub run {
my ($self, %options) = @_;
my $webcontent = $options{custom}->request(path => $self->{option_results}->{url_path});
if ($webcontent !~ /^COUNT.*?=\d+/i) {
$self->{output}->output_add(
severity => 'UNKNOWN',
short_msg => "Cannot find ksql temptable status."
);
$self->{output}->option_exit();
}
my $count = $1 if $webcontent =~ /^COUNT.*?=(\d+)/i;
my $exit = $self->{perfdata}->threshold_check(value => $count, threshold => [
{ label => 'critical', 'exit_litteral' => 'critical' },
{ label => 'warning', exit_litteral => 'warning' } ]);
$self->{output}->output_add(severity => $exit, short_msg => sprintf("KSQLTempTableCount: %d", $count));
$self->{output}->perfdata_add(label => "KSQLTempTableCount", unit => '',
value => sprintf("%d", $count),
warning => $self->{perfdata}->get_perfdata_for_output(label => 'warning'),
critical => $self->{perfdata}->get_perfdata_for_output(label => 'critical'),
);
$self->{output}->display();
$self->{output}->exit();
}
1;
__END__
=head1 MODE
Check ksql temp table count for specify datasource.
=over 8
=item B<--urlpath>
Set path to get status page. (Default: '/easportal/tools/nagios/checkoraclevt.jsp')
=item B<--datasource>
Specify the datasource name.
=item B<--warning>
Warning Threshold.
=item B<--critical>
Critical Threshold.
=back
=cut

View File

@ -0,0 +1,125 @@
#
# Copyright 2017 Centreon (http://www.centreon.com/)
#
# Centreon is a full-fledged industry-strength solution that meets
# the needs in IT infrastructure and application monitoring for
# service performance.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
# Author : CHEN JUN , aladdin.china@gmail.com
package apps::kingdee::eas::mode::oraclerecyclebin;
use base qw(centreon::plugins::mode);
use strict;
use warnings;
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 =>
{
"urlpath:s" => { name => 'url_path', default => "/easportal/tools/nagios/checkoraclerecyclebin.jsp" },
"datasource:s" => { name => 'datasource' },
"warning:s" => { name => 'warning' },
"critical:s" => { name => 'critical' },
});
return $self;
}
sub check_options {
my ($self, %options) = @_;
$self->SUPER::init(%options);
if (!defined($self->{option_results}->{datasource}) || $self->{option_results}->{datasource} eq "") {
$self->{output}->add_option_msg(short_msg => "Missing datasource name.");
$self->{output}->option_exit();
}
$self->{option_results}->{url_path} .= "?ds=" . $self->{option_results}->{datasource};
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();
}
}
sub run {
my ($self, %options) = @_;
my $webcontent = $options{custom}->request(path => $self->{option_results}->{url_path});
if ( $webcontent !~ /^COUNT.*?=\d+/i ) {
$self->{output}->output_add(
severity => 'UNKNOWN',
short_msg => "Cannot find oracle recyclebin status."
);
$self->{output}->option_exit();
}
my $count = $1 if $webcontent =~ /^COUNT.*?=(\d+)/i;
my $exit = $self->{perfdata}->threshold_check(value => $count, threshold => [
{ label => 'critical', 'exit_litteral' => 'critical' },
{ label => 'warning', exit_litteral => 'warning' } ]);
$self->{output}->output_add(severity => $exit, short_msg => sprintf("RecyclebinTableCount: %d", $count));
$self->{output}->perfdata_add(label => "RecyclebinTableCount", unit => '',
value => sprintf("%d", $count),
warning => $self->{perfdata}->get_perfdata_for_output(label => 'warning'),
critical => $self->{perfdata}->get_perfdata_for_output(label => 'critical'),
);
$self->{output}->display();
$self->{output}->exit();
}
1;
__END__
=head1 MODE
Check oracle recyclebin table count for specify datasource.
=over 8
=item B<--urlpath>
Set path to get status page. (Default: '/easportal/tools/nagios/checkoraclerecyclebin.jsp')
=item B<--datasource>
Specify the datasource name.
=item B<--warning>
Warning Threshold.
=item B<--critical>
Critical Threshold.
=back
=cut

View File

@ -0,0 +1,133 @@
#
# Copyright 2017 Centreon (http://www.centreon.com/)
#
# Centreon is a full-fledged industry-strength solution that meets
# the needs in IT infrastructure application monitoring for
# service performance.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions
# limitations under the License.
#
# Author : CHEN JUN , aladdin.china@gmail.com
package apps::kingdee::eas::mode::oracleredolog;
use base qw(centreon::plugins::mode);
use strict;
use warnings;
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 =>
{
"urlpath:s" => { name => 'url_path', default => "/easportal/tools/nagios/checkoracleredolog.jsp" },
"datasource:s" => { name => 'datasource' },
"warning:s" => { name => 'warning' },
"critical:s" => { name => 'critical' },
});
return $self;
}
sub check_options {
my ($self, %options) = @_;
$self->SUPER::init(%options);
if (!defined($self->{option_results}->{datasource}) || $self->{option_results}->{datasource} eq "") {
$self->{output}->add_option_msg(short_msg => "Missing datasource name.");
$self->{output}->option_exit();
}
$self->{option_results}->{url_path} .= "?ds=" . $self->{option_results}->{datasource};
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();
}
}
sub run {
my ($self, %options) = @_;
my $webcontent = $options{custom}->request(path => $self->{option_results}->{url_path});
if ($webcontent !~ /^STATUS=CURRENT/mi) {
$self->{output}->output_add(
severity => 'UNKNOWN',
short_msg => "Cannot find oracle redolog status."
);
$self->{output}->option_exit();
}
my ($activecount, $inactivecount, $currentcount) = (0, 0, 0);
$activecount = $1 if $webcontent =~ /^STATUS=ACTIVE\sCOUNT=(\d+)/mi ;
$inactivecount = $1 if $webcontent =~ /^STATUS=INACTIVE\sCOUNT=(\d+)/mi ;
$currentcount = $1 if $webcontent =~ /^STATUS=CURRENT\sCOUNT=(\d+)/mi ;
my $exit = $self->{perfdata}->threshold_check(value => $inactivecount, threshold => [
{ label => 'critical', 'exit_litteral' => 'critical' },
{ label => 'warning', exit_litteral => 'warning' } ]);
$self->{output}->output_add(severity => $exit, short_msg => sprintf("InactiveCount: %d", $inactivecount));
$self->{output}->output_add(severity => "ok", short_msg => sprintf("ActiveCount: %d", $activecount));
$self->{output}->output_add(severity => "ok", short_msg => sprintf("CurrentCount: %d", $currentcount));
$self->{output}->perfdata_add(label => "InactiveCount", unit => '',
value => sprintf("%d", $inactivecount),
warning => $self->{perfdata}->get_perfdata_for_output(label => 'warning'),
critical => $self->{perfdata}->get_perfdata_for_output(label => 'critical'),
);
$self->{output}->perfdata_add(label => "ActiveCount", unit => '',
value => sprintf("%d", $activecount));
$self->{output}->perfdata_add(label => "CurrentCount", unit => '',
value => sprintf("%d", $currentcount));
$self->{output}->display();
$self->{output}->exit();
}
1;
__END__
=head1 MODE
Check oracle redolog status .
=over 8
=item B<--urlpath>
Set path to get status page. (Default: '/easportal/tools/nagios/checkoracleredolog.jsp')
=item B<--datasource>
Specify the datasource name.
=item B<--warning>
Warning Threshold for INACTIVE count.
=item B<--critical>
Critical Threshold for INACTIVE count.
=back
=cut

View File

@ -0,0 +1,199 @@
#
# Copyright 2017 Centreon (http://www.centreon.com/)
#
# Centreon is a full-fledged industry-strength solution that meets
# the needs in IT infrastructure application monitoring for
# service performance.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions
# limitations under the License.
#
# Author : CHEN JUN , aladdin.china@gmail.com
package apps::kingdee::eas::mode::oraclesession;
use base qw(centreon::plugins::mode);
use strict;
use warnings;
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 =>
{
"urlpath:s" => { name => 'url_path', default => "/easportal/tools/nagios/checkoraclesession.jsp" },
"datasource:s" => { name => 'datasource' },
"warning:s" => { name => 'warning', default => "," },
"critical:s" => { name => 'critical', default => "," },
});
return $self;
}
sub check_options {
my ($self, %options) = @_;
$self->SUPER::init(%options);
if (!defined($self->{option_results}->{datasource}) || $self->{option_results}->{datasource} eq "") {
$self->{output}->add_option_msg(short_msg => "Missing datasource name.");
$self->{output}->option_exit();
}
$self->{option_results}->{url_path} .= "?ds=" . $self->{option_results}->{datasource};
($self->{warn_activecount}, $self->{warn_totalcount}) = split /,/, $self->{option_results}->{"warning"};
($self->{crit_activecount}, $self->{crit_totalcount}) = split /,/, $self->{option_results}->{"critical"};
# warning
if (($self->{perfdata}->threshold_validate(label => 'warn_activecount', value => $self->{warn_activecount})) == 0) {
$self->{output}->add_option_msg(short_msg => "Wrong warning activecount threshold '" . $self->{warn_activecount} . "'.");
$self->{output}->option_exit();
}
if (($self->{perfdata}->threshold_validate(label => 'warn_totalcount', value => $self->{warn_totalcount})) == 0) {
$self->{output}->add_option_msg(short_msg => "Wrong warning totalcount threshold '" . $self->{warn_totalcount} . "'.");
$self->{output}->option_exit();
}
# critical
if (($self->{perfdata}->threshold_validate(label => 'crit_activecount', value => $self->{crit_activecount})) == 0) {
$self->{output}->add_option_msg(short_msg => "Wrong critical activecount threshold '" . $self->{crit_activecount} . "'.");
$self->{output}->option_exit();
}
if (($self->{perfdata}->threshold_validate(label => 'crit_totalcount', value => $self->{crit_totalcount})) == 0) {
$self->{output}->add_option_msg(short_msg => "Wrong critical totalcount threshold '" . $self->{crit_totalcount} . "'.");
$self->{output}->option_exit();
}
}
sub run {
my ($self, %options) = @_;
my $webcontent = $options{custom}->request(path => $self->{option_results}->{url_path} . '&groupby=status');
if ($webcontent !~ /^STATUS=ACTIVE/mi) {
$self->{output}->output_add(
severity => 'UNKNOWN',
short_msg => "Cannot find oracle session info."
);
$self->{output}->option_exit();
}
my ($activecount, $inactivecount, $totalcount) = (0, 0, 0);
$activecount = $1 if $webcontent =~ /^STATUS=ACTIVE\sCOUNT=(\d+)/mi ;
$inactivecount = $1 if $webcontent =~ /^STATUS=INACTIVE\sCOUNT=(\d+)/mi ;
$totalcount = $activecount + $inactivecount;
$webcontent = $options{custom}->request(path => $self->{option_results}->{url_path} . '&groupby=wait_class&status=ACTIVE');
if ($webcontent !~ /^WAIT_CLASS=.*?COUNT=\d+/i) {
$self->{output}->output_add(
severity => 'UNKNOWN',
short_msg => "Cannot find oracle session info."
);
$self->{output}->option_exit();
}
my ($other, $queueing, $network, $administrative, $configuation, $commit) = (0, 0, 0, 0, 0, 0);
my ($application, $concurrency, $systemio, $userio, $scheduler, $idle) = (0, 0, 0, 0, 0, 0);
$other = $1 if $webcontent =~ /^WAIT_CLASS=Other\sCOUNT=(\d+)/mi;
$queueing = $1 if $webcontent =~ /^WAIT_CLASS=Queueing\sCOUNT=(\d+)/mi;
$network = $1 if $webcontent =~ /^WAIT_CLASS=Network\sCOUNT=(\d+)/mi;
$administrative = $1 if $webcontent =~ /^WAIT_CLASS=Administrative\sCOUNT=(\d+)/mi;
$configuation = $1 if $webcontent =~ /^WAIT_CLASS=Configuration\sCOUNT=(\d+)/mi;
$commit = $1 if $webcontent =~ /^WAIT_CLASS=Commit\sCOUNT=(\d+)/mi;
$application = $1 if $webcontent =~ /^WAIT_CLASS=Application\sCOUNT=(\d+)/mi;
$concurrency = $1 if $webcontent =~ /^WAIT_CLASS=Concurrency\sCOUNT=(\d+)/mi;
$systemio = $1 if $webcontent =~ /^WAIT_CLASS=\'System\sI\/O\'\sCOUNT=(\d+)/mi;
$userio = $1 if $webcontent =~ /^WAIT_CLASS='User\sI\/O\'\sCOUNT=(\d+)/mi;
$scheduler = $1 if $webcontent =~ /^WAIT_CLASS=Scheduler\sCOUNT=(\d+)/mi;
$idle = $1 if $webcontent =~ /^WAIT_CLASS=Idle\sCOUNT=(\d+)/mi;
my $cpuandwait = $idle + $network;
$self->{output}->output_add(severity => "ok", short_msg => sprintf("Other: %d", $other));
$self->{output}->output_add(severity => "ok", short_msg => sprintf("Queueing: %d", $queueing));
$self->{output}->output_add(severity => "ok", short_msg => sprintf("Administrative: %d", $administrative));
$self->{output}->output_add(severity => "ok", short_msg => sprintf("Configuration: %d", $configuation));
$self->{output}->output_add(severity => "ok", short_msg => sprintf("Commit: %d", $commit));
$self->{output}->output_add(severity => "ok", short_msg => sprintf("Application: %d", $application));
$self->{output}->output_add(severity => "ok", short_msg => sprintf("Concurrency: %d", $concurrency));
$self->{output}->output_add(severity => "ok", short_msg => sprintf("System I/O: %d", $systemio));
$self->{output}->output_add(severity => "ok", short_msg => sprintf("User I/O: %d", $userio));
$self->{output}->output_add(severity => "ok", short_msg => sprintf("Scheduler: %d", $scheduler));
$self->{output}->output_add(severity => "ok", short_msg => sprintf("CPU + CPU Wait: %d", $cpuandwait));
my $exit = $self->{perfdata}->threshold_check(value => $activecount, threshold => [ { label => 'crit_activecount', exit_litteral => 'critical' },
{ label => 'warn_activecount', exit_litteral => 'warning' } ]);
$self->{output}->output_add(severity => $exit, short_msg => sprintf("ActiveCount: %d", $activecount));
$exit = $self->{perfdata}->threshold_check(value => $totalcount, threshold => [ { label => 'crit_totalcount', exit_litteral => 'critical' },
{ label => 'warn_totalcount', exit_litteral => 'warning' } ]);
$self->{output}->output_add(severity => $exit, short_msg => sprintf("TotalCount: %d", $totalcount));
$self->{output}->perfdata_add(label => "Other", unit => '', value => sprintf("%d", $other));
$self->{output}->perfdata_add(label => "Queueing", unit => '', value => sprintf("%d", $queueing));
$self->{output}->perfdata_add(label => "Administrative", unit => '', value => sprintf("%d", $administrative));
$self->{output}->perfdata_add(label => "Configuration", unit => '', value => sprintf("%d", $configuation));
$self->{output}->perfdata_add(label => "Commit", unit => '', value => sprintf("%d", $commit));
$self->{output}->perfdata_add(label => "Application", unit => '', value => sprintf("%d", $application));
$self->{output}->perfdata_add(label => "Concurrency", unit => '', value => sprintf("%d", $concurrency));
$self->{output}->perfdata_add(label => "System I/O", unit => '', value => sprintf("%d", $systemio));
$self->{output}->perfdata_add(label => "User I/O", unit => '', value => sprintf("%d", $userio));
$self->{output}->perfdata_add(label => "Scheduler", unit => '', value => sprintf("%d", $scheduler));
$self->{output}->perfdata_add(label => "CPU + CPU Wait", unit => '', value => sprintf("%d", $cpuandwait));
$self->{output}->perfdata_add(label => "ActiveCount", unit => '',
value => sprintf("%d", $activecount),
warning => $self->{perfdata}->get_perfdata_for_output(label => 'warn_activecount'),
critical => $self->{perfdata}->get_perfdata_for_output(label => 'crit_activecount'),
);
$self->{output}->perfdata_add(label => "TotalCount", unit => '',
value => sprintf("%d", $totalcount),
warning => $self->{perfdata}->get_perfdata_for_output(label => 'warn_totalcount'),
critical => $self->{perfdata}->get_perfdata_for_output(label => 'crit_totalcount'),
);
$self->{output}->display();
$self->{output}->exit();
}
1;
__END__
=head1 MODE
Check oracle database session status.
=over 8
=item B<--urlpath>
Set path to get status page. (Default: '/easportal/tools/nagios/checkoraclesession.jsp')
=item B<--datasource>
Specify the datasource name.
=item B<--warning>
Warning Threshold. (activecount,totalcount) for example: --warning=50,200
=item B<--critical>
Critical Threshold. (activecount,totalcount) for example: --critical=100,300
=back
=cut

View File

@ -0,0 +1,156 @@
#
# Copyright 2017 Centreon (http://www.centreon.com/)
#
# Centreon is a full-fledged industry-strength solution that meets
# the needs in IT infrastructure application monitoring for
# service performance.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions
# limitations under the License.
#
# Author : CHEN JUN , aladdin.china@gmail.com
package apps::kingdee::eas::mode::oracletable;
use base qw(centreon::plugins::mode);
use strict;
use warnings;
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 =>
{
"urlpath:s" => { name => 'url_path', default => "/easportal/tools/nagios/checkoracletable.jsp" },
"datasource:s" => { name => 'datasource' },
"tablename:s" => { name => 'tablename' , default => "T_GL_VOUCHER"},
"actualrows:s" => { name => 'actualrows', default => "false" },
"warning:s" => { name => 'warning' },
"critical:s" => { name => 'critical' },
});
return $self;
}
sub check_options {
my ($self, %options) = @_;
$self->SUPER::init(%options);
if (!defined($self->{option_results}->{datasource}) || $self->{option_results}->{datasource} eq "") {
$self->{output}->add_option_msg(short_msg => "Missing datasource name.");
$self->{output}->option_exit();
}
$self->{option_results}->{url_path} .= "?ds=" . $self->{option_results}->{datasource}
. "\&tablename=" . $self->{option_results}->{tablename}
. "\&actual=" . $self->{option_results}->{actualrows};
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();
}
}
sub run {
my ($self, %options) = @_;
my $webcontent = $options{custom}->request(path => $self->{option_results}->{url_path});
if ($webcontent !~ /^TABLE_NAME=\w+/i) {
$self->{output}->output_add(
severity => 'UNKNOWN',
short_msg => "Cannot find oracle table status. \n" . $webcontent
);
$self->{output}->option_exit();
}
my ($num_rows, $actual_num_rows) = (-1, -1);
$num_rows = $1 if $webcontent =~ /NUM_ROWS=(\d+)/i;
$actual_num_rows = $1 if $webcontent =~ /ACTUAL_NUM_ROWS=(\d+)/i;
my $exit;
if ($actual_num_rows == -1) {
$exit = $self->{perfdata}->threshold_check(value => $num_rows, threshold => [
{ label => 'critical', 'exit_litteral' => 'critical' },
{ label => 'warning', exit_litteral => 'warning' } ]
);
$self->{output}->output_add(severity => $exit, short_msg => sprintf("NUM_ROWS: %d", $num_rows));
$self->{output}->perfdata_add(label => "NUM_ROWS", unit => '',
value => sprintf("%d", $num_rows),
warning => $self->{perfdata}->get_perfdata_for_output(label => 'warning'),
critical => $self->{perfdata}->get_perfdata_for_output(label => 'critical'),
);
} else {
$self->{output}->perfdata_add(label => "NUM_ROWS", unit => '', value => sprintf("%d", $num_rows));
$exit = $self->{perfdata}->threshold_check(value => $actual_num_rows, threshold => [
{ label => 'critical', 'exit_litteral' => 'critical' },
{ label => 'warning', exit_litteral => 'warning' } ]
);
$self->{output}->output_add(severity => $exit, short_msg => sprintf("ACTUAL_NUM_ROWS: %d", $actual_num_rows));
$self->{output}->perfdata_add(label => "ACTUAL_NUM_ROWS", unit => '',
value => sprintf("%d", $actual_num_rows),
warning => $self->{perfdata}->get_perfdata_for_output(label => 'warning'),
critical => $self->{perfdata}->get_perfdata_for_output(label => 'critical'),
);
}
$self->{output}->output_add(severity => $exit, short_msg => $webcontent);
$self->{output}->display();
$self->{output}->exit();
}
1;
__END__
=head1 MODE
Check oracle table info for specify datasource.
=over 8
=item B<--urlpath>
Set path to get status page. (Default: '/easportal/tools/nagios/checkoracletable.jsp')
=item B<--datasource>
Specify the datasource name.
=item B<--tablename>
Specify the table name , MUST BE uppercase.
=item B<--actualrows>
Specify whether check actual rows of table or not , true or false.
MAY have performance problem for large table if specify true.
=item B<--warning>
Warning Threshold for num_rows , or actual_num_rows if actualrows is true.
=item B<--critical>
Critical Threshold for num_rows , or actual_num_rows if actualrows is true.
=back
=cut

View File

@ -0,0 +1,115 @@
#
# Copyright 2017 Centreon (http://www.centreon.com/)
#
# Centreon is a full-fledged industry-strength solution that meets
# the needs in IT infrastructure application monitoring for
# service performance.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions
# limitations under the License.
#
# Author : CHEN JUN , aladdin.china@gmail.com
package apps::kingdee::eas::mode::oracleversion;
use base qw(centreon::plugins::mode);
use strict;
use warnings;
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 =>
{
"urlpath:s" => { name => 'url_path', default => "/easportal/tools/nagios/checkoracleversion.jsp" },
"datasource:s" => { name => 'datasource' },
"warning:s" => { name => 'warning' },
"critical:s" => { name => 'critical' },
});
return $self;
}
sub check_options {
my ($self, %options) = @_;
$self->SUPER::init(%options);
if (!defined($self->{option_results}->{datasource}) || $self->{option_results}->{datasource} eq "") {
$self->{output}->add_option_msg(short_msg => "Missing datasource name.");
$self->{output}->option_exit();
}
$self->{option_results}->{url_path} .= "?ds=" . $self->{option_results}->{datasource};
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();
}
}
sub run {
my ($self, %options) = @_;
my $webcontent = $options{custom}->request(path => $self->{option_results}->{url_path});
if ($webcontent !~ /^BANNER=/i) {
$self->{output}->output_add(
severity => 'UNKNOWN',
short_msg => "Cannot find oracle version info."
);
$self->{output}->option_exit();
}
my $banner = $1 if $webcontent =~ /^BANNER=\'(.*?)\'/i;
$self->{output}->output_add(severity => "ok", short_msg => $banner);
$self->{output}->display();
$self->{output}->exit();
}
1;
__END__
=head1 MODE
Check oracle database version.
=over 8
=item B<--urlpath>
Set path to get status page. (Default: '/easportal/tools/nagios/checkoracleversion.jsp')
=item B<--datasource>
Specify the datasource name.
=item B<--warning>
Warning Threshold.
=item B<--critical>
Critical Threshold.
=back
=cut

View File

@ -0,0 +1,269 @@
#
# Copyright 2017 Centreon (http://www.centreon.com/)
#
# Centreon is a full-fledged industry-strength solution that meets
# the needs in IT infrastructure and application monitoring for
# service performance.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
# Author : CHEN JUN , aladdin.china@gmail.com
package apps::kingdee::eas::mode::ormrpc;
use base qw(centreon::plugins::mode);
use strict;
use warnings;
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 => {
"urlpath:s" => { name => 'url_path', default => "/easportal/tools/nagios/checkrpc.jsp" },
"warning:s" => { name => 'warning' , default => ",,,,,,"},
"critical:s" => { name => 'critical' , default => ",,,,,,"},
}
);
return $self;
}
sub check_options {
my ( $self, %options ) = @_;
$self->SUPER::init(%options);
($self->{warn_activethreadcount}, $self->{warn_stubcount}, $self->{warn_proxycount}, $self->{warn_clientsessioncount} ,$self->{warn_serversessioncount} ,$self->{warn_invokecountpermin} ,$self->{warn_servicecountpermin})
= split /,/, $self->{option_results}->{"warning"};
($self->{crit_activethreadcount}, $self->{crit_stubcount}, $self->{crit_proxycount}, $self->{crit_clientsessioncount} ,$self->{crit_serversessioncount} ,$self->{crit_invokecountpermin} ,$self->{crit_servicecountpermin})
= split /,/, $self->{option_results}->{"critical"};
# warning
if (($self->{perfdata}->threshold_validate(label => 'warn_activethreadcount', value => $self->{warn_activethreadcount})) == 0) {
$self->{output}->add_option_msg(short_msg => "Wrong warning activethreadcount threshold '" . $self->{warn_activethreadcount} . "'.");
$self->{output}->option_exit();
}
if (($self->{perfdata}->threshold_validate(label => 'warn_stubcount', value => $self->{warn_stubcount})) == 0) {
$self->{output}->add_option_msg(short_msg => "Wrong warning stubcount threshold '" . $self->{warn_stubcount} . "'.");
$self->{output}->option_exit();
}
if (($self->{perfdata}->threshold_validate(label => 'warn_proxycount', value => $self->{warn_proxycount})) == 0) {
$self->{output}->add_option_msg(short_msg => "Wrong warning proxycount threshold '" . $self->{warn_proxycount} . "'.");
$self->{output}->option_exit();
}
if (($self->{perfdata}->threshold_validate(label => 'warn_clientsessioncount', value => $self->{warn_clientsessioncount})) == 0) {
$self->{output}->add_option_msg(short_msg => "Wrong warning clientsessioncount threshold '" . $self->{warn_clientsessioncount} . "'.");
$self->{output}->option_exit();
}
if (($self->{perfdata}->threshold_validate(label => 'warn_serversessioncount', value => $self->{warn_serversessioncount})) == 0) {
$self->{output}->add_option_msg(short_msg => "Wrong warning serversessioncount threshold '" . $self->{warn_serversessioncount} . "'.");
$self->{output}->option_exit();
}
if (($self->{perfdata}->threshold_validate(label => 'warn_invokecountpermin', value => $self->{warn_invokecountpermin})) == 0) {
$self->{output}->add_option_msg(short_msg => "Wrong warning invokecountpermin threshold '" . $self->{warn_invokecountpermin} . "'.");
$self->{output}->option_exit();
}
if (($self->{perfdata}->threshold_validate(label => 'warn_servicecountpermin', value => $self->{warn_servicecountpermin})) == 0) {
$self->{output}->add_option_msg(short_msg => "Wrong warning servicecountpermin threshold '" . $self->{warn_servicecountpermin} . "'.");
$self->{output}->option_exit();
}
# critical
if (($self->{perfdata}->threshold_validate(label => 'crit_activethreadcount', value => $self->{crit_activethreadcount})) == 0) {
$self->{output}->add_option_msg(short_msg => "Wrong critical activethreadcount threshold '" . $self->{crit_activethreadcount} . "'.");
$self->{output}->option_exit();
}
if (($self->{perfdata}->threshold_validate(label => 'crit_stubcount', value => $self->{crit_stubcount})) == 0) {
$self->{output}->add_option_msg(short_msg => "Wrong critical stubcount threshold '" . $self->{crit_stubcount} . "'.");
$self->{output}->option_exit();
}
if (($self->{perfdata}->threshold_validate(label => 'crit_proxycount', value => $self->{crit_proxycount})) == 0) {
$self->{output}->add_option_msg(short_msg => "Wrong critical proxycount threshold '" . $self->{crit_proxycount} . "'.");
$self->{output}->option_exit();
}
if (($self->{perfdata}->threshold_validate(label => 'crit_clientsessioncount', value => $self->{crit_clientsessioncount})) == 0) {
$self->{output}->add_option_msg(short_msg => "Wrong critical clientsessioncount threshold '" . $self->{crit_clientsessioncount} . "'.");
$self->{output}->option_exit();
}
if (($self->{perfdata}->threshold_validate(label => 'crit_serversessioncount', value => $self->{crit_serversessioncount})) == 0) {
$self->{output}->add_option_msg(short_msg => "Wrong critical serversessioncount threshold '" . $self->{crit_serversessioncount} . "'.");
$self->{output}->option_exit();
}
if (($self->{perfdata}->threshold_validate(label => 'crit_invokecountpermin', value => $self->{crit_invokecountpermin})) == 0) {
$self->{output}->add_option_msg(short_msg => "Wrong critical invokecountpermin threshold '" . $self->{crit_invokecountpermin} . "'.");
$self->{output}->option_exit();
}
if (($self->{perfdata}->threshold_validate(label => 'crit_servicecountpermin', value => $self->{crit_servicecountpermin})) == 0) {
$self->{output}->add_option_msg(short_msg => "Wrong critical servicecountpermin threshold '" . $self->{crit_servicecountpermin} . "'.");
$self->{output}->option_exit();
}
}
sub run {
my ( $self, %options ) = @_;
my $webcontent = $options{custom}->request(path => $self->{option_results}->{url_path});
if ($webcontent !~ /ActiveThreadCount=\d+/i) {
$self->{output}->output_add(
severity => 'UNKNOWN',
short_msg => "Cannot find ormrpc status in response: \'" . $webcontent . "\'"
);
$self->{output}->option_exit();
}
my ($activethreadcount, $stubcount, $proxycount, $clientsessioncount, $serversessioncount, $invokecountpermin, $servicecountpermin, $invokecount, $servicecount) = (0, 0, 0, 0, 0, 0, 0, 0, 0);
$activethreadcount = $1 if $webcontent =~ /ActiveThreadCount=(\d+)/mi ;
$stubcount = $1 if $webcontent =~ /StubCount=(\d+)/mi ;
$proxycount = $1 if $webcontent =~ /ProxyCount=(\d+)/mi ;
$clientsessioncount = $1 if $webcontent =~ /ClientSessionCount=(\d+)/mi ;
$serversessioncount = $1 if $webcontent =~ /ServerSessionCount=(\d+)/mi ;
$invokecountpermin = $1 if $webcontent =~ /ClientInvokeCountPerMinute=(\d+)/mi ;
$servicecountpermin = $1 if $webcontent =~ /ProcessedServiceCountPerMinute=(\d+)/mi ;
$invokecount = $1 if $webcontent =~ /ClientInvokeCount=(\d+)/mi ;
$servicecount = $1 if $webcontent =~ /ProcessedServiceCount=(\d+)/mi ;
my $exit = $self->{perfdata}->threshold_check(value => $activethreadcount,
threshold => [ { label => 'crit_activethreadcount', 'exit_litteral' => 'critical' },
{ label => 'warn_activethreadcount', 'exit_litteral' => 'warning' } ]);
$self->{output}->output_add(
severity => $exit,
short_msg => sprintf("ActiveTrheadCount: %d", $activethreadcount)
);
$exit = $self->{perfdata}->threshold_check(value => $stubcount,
threshold => [ { label => 'crit_stubcount', 'exit_litteral' => 'critical' },
{ label => 'warn_stubcount', 'exit_litteral' => 'warning' } ]);
$self->{output}->output_add(
severity => $exit,
short_msg => sprintf("StubCount: %d", $stubcount)
);
$exit = $self->{perfdata}->threshold_check(value => $proxycount,
threshold => [ { label => 'crit_proxycount', 'exit_litteral' => 'critical' },
{ label => 'warn_proxycount', 'exit_litteral' => 'warning' } ]);
$self->{output}->output_add(
severity => $exit,
short_msg => sprintf("ProxyCount: %d", $proxycount)
);
$exit = $self->{perfdata}->threshold_check(value => $clientsessioncount,
threshold => [ { label => 'crit_clientsessioncount', 'exit_litteral' => 'critical' },
{ label => 'warn_clientsessioncount', 'exit_litteral' => 'warning' } ]);
$self->{output}->output_add(
severity => $exit,
short_msg => sprintf("ClientSessionCount: %d", $clientsessioncount)
);
$exit = $self->{perfdata}->threshold_check(value => $serversessioncount,
threshold => [ { label => 'crit_serversessioncount', 'exit_litteral' => 'critical' },
{ label => 'warn_serversessioncount', 'exit_litteral' => 'warning' } ]);
$self->{output}->output_add(
severity => $exit,
short_msg => sprintf("ServerSessionCount: %d", $serversessioncount)
);
$exit = $self->{perfdata}->threshold_check(value => $invokecountpermin,
threshold => [ { label => 'crit_invokecountpermin', 'exit_litteral' => 'critical' },
{ label => 'warn_invokecountpermin', 'exit_litteral' => 'warning' } ]);
$self->{output}->output_add(
severity => $exit,
short_msg => sprintf("InvokeCountPerMinute: %d", $invokecountpermin)
);
$exit = $self->{perfdata}->threshold_check(value => $servicecountpermin,
threshold => [ { label => 'crit_servicecountpermin', 'exit_litteral' => 'critical' },
{ label => 'warn_servicecountpermin', 'exit_litteral' => 'warning' } ]);
$self->{output}->output_add(
severity => $exit,
short_msg => sprintf("ServiceCountPerMinute: %d", $servicecountpermin)
);
$self->{output}->perfdata_add(
label => "ActiveTrheadCount",
value => $activethreadcount,
warning => $self->{perfdata}->get_perfdata_for_output(label => 'warn_activethreadcount'),
critical => $self->{perfdata}->get_perfdata_for_output(label => 'crit_activethreadcount'),
);
$self->{output}->perfdata_add(
label => "StubCount",
value => $stubcount,
warning => $self->{perfdata}->get_perfdata_for_output(label => 'warn_stubcount'),
critical => $self->{perfdata}->get_perfdata_for_output(label => 'crit_stubcount'),
);
$self->{output}->perfdata_add(
label => "ProxyCount",
value => $proxycount,
warning => $self->{perfdata}->get_perfdata_for_output(label => 'warn_proxycount'),
critical => $self->{perfdata}->get_perfdata_for_output(label => 'crit_proxycount'),
);
$self->{output}->perfdata_add(
label => "ClientSessionCount",
value => $clientsessioncount,
warning => $self->{perfdata}->get_perfdata_for_output(label => 'warn_clientsessioncount'),
critical => $self->{perfdata}->get_perfdata_for_output(label => 'crit_clientsessioncount'),
);
$self->{output}->perfdata_add(
label => "ServerSessionCount",
value => $serversessioncount,
warning => $self->{perfdata}->get_perfdata_for_output(label => 'warn_serversessioncount'),
critical => $self->{perfdata}->get_perfdata_for_output(label => 'crit_serversessioncount'),
);
$self->{output}->perfdata_add(
label => "InvokeCount /min",
value => $invokecountpermin,
warning => $self->{perfdata}->get_perfdata_for_output(label => 'warn_invokecountpermin'),
critical => $self->{perfdata}->get_perfdata_for_output(label => 'crit_invokecountpermin'),
);
$self->{output}->perfdata_add(
label => "ServiceCount /min",
value => $servicecountpermin,
warning => $self->{perfdata}->get_perfdata_for_output(label => 'warn_servicecountpermin'),
critical => $self->{perfdata}->get_perfdata_for_output(label => 'crit_servicecountpermin'),
);
$self->{output}->perfdata_add(
label => "c[InvokeCount]",
value => $invokecount,
);
$self->{output}->perfdata_add(
label => "c[ServiceCount]",
value => $servicecount,
);
$self->{output}->display();
$self->{output}->exit();
}
1;
__END__
=head1 MODE
Check EAS instance orm rpc status.
=over 8
=item B<--urlpath>
Set path to get status page. (Default: '/easportal/tools/nagios/checkrpc.jsp')
=item B<--warning>
Warning Threshold (activethreadcount,stubcount,proxycount,clientsessioncount,serversessioncount,invokecountpermin,servicecountpermin).
=item B<--critical>
Critical Threshold (activethreadcount,stubcount,proxycount,clientsessioncount,serversessioncount,invokecountpermin,servicecountpermin).
=back
=cut

View File

@ -0,0 +1,170 @@
#
# Copyright 2017 Centreon (http://www.centreon.com/)
#
# Centreon is a full-fledged industry-strength solution that meets
# the needs in IT infrastructure and application monitoring for
# service performance.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
# Author : CHEN JUN , aladdin.china@gmail.com
package apps::kingdee::eas::mode::transaction;
use base qw(centreon::plugins::mode);
use strict;
use warnings;
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 =>
{
"urlpath:s" => { name => 'url_path', default => "/easportal/tools/nagios/checktransaction.jsp" },
"datasource:s" => { name => 'datasource' },
"warning:s" => { name => 'warning', default => "," },
"critical:s" => { name => 'critical', default => "," },
});
return $self;
}
sub check_options {
my ($self, %options) = @_;
$self->SUPER::init(%options);
($self->{warn_activecount}, $self->{warn_timeoutcount})
= split /,/, $self->{option_results}->{"warning"};
($self->{crit_activecount}, $self->{crit_timeoutcount})
= split /,/, $self->{option_results}->{"critical"};
# warning
if (($self->{perfdata}->threshold_validate(label => 'warn_activecount', value => $self->{warn_activecount})) == 0) {
$self->{output}->add_option_msg(short_msg => "Wrong warning activecount threshold '" . $self->{warn_activecount} . "'.");
$self->{output}->option_exit();
}
if (($self->{perfdata}->threshold_validate(label => 'warn_timeoutcount', value => $self->{warn_timeoutcount})) == 0) {
$self->{output}->add_option_msg(short_msg => "Wrong warning timeoutcount threshold '" . $self->{warn_timeoutcount} . "'.");
$self->{output}->option_exit();
}
# critical
if (($self->{perfdata}->threshold_validate(label => 'crit_activecount', value => $self->{crit_activecount})) == 0) {
$self->{output}->add_option_msg(short_msg => "Wrong critical activecount threshold '" . $self->{crit_activecount} . "'.");
$self->{output}->option_exit();
}
if (($self->{perfdata}->threshold_validate(label => 'crit_timeoutcount', value => $self->{crit_timeoutcount})) == 0) {
$self->{output}->add_option_msg(short_msg => "Wrong critical timeoutcount threshold '" . $self->{crit_timeoutcount} . "'.");
$self->{output}->option_exit();
}
}
sub run {
my ($self, %options) = @_;
my $webcontent = $options{custom}->request(path => $self->{option_results}->{url_path});
if ($webcontent !~ /TransactionCount=\d+/i) {
$self->{output}->output_add(
severity => 'UNKNOWN',
short_msg => "Cannot find transaction status."
);
}
my ($transactioncount, $totaltransactiontime, $committedcount, $rolledbackcount, $activecount, $maxtransactiontime, $defaulttimeout, $timeoutcount) = (0, 0, 0, 0, 0, 0, 0, 0);
$transactioncount = $1 if $webcontent =~ /TransactionCount=(\d+)\s/i;
$totaltransactiontime = $1 if $webcontent =~ /TotalTransactionTime=(\d+)\s/i;
$committedcount = $1 if $webcontent =~ /CommittedCount=(\d+)\s/i;
$rolledbackcount = $1 if $webcontent =~ /RolledbackCount=(\d+)\s/i;
$activecount = $1 if $webcontent =~ /ActiveCount=(\d+)\s/i;
$maxtransactiontime = $1 if $webcontent =~ /MaxTransactionTime=(\d+)\s/i;
$defaulttimeout = $1 if $webcontent =~ /DefaultTimeout=(\d+)\s/i;
$timeoutcount = $1 if $webcontent =~ /TimedOutCount=(\d+)\s/i;
my $exit = $self->{perfdata}->threshold_check(value => $activecount, threshold => [ { label => 'crit_activecount', exit_litteral => 'critical' },
{ label => 'warn_activecount', exit_litteral => 'warning' } ]);
$self->{output}->output_add(severity => $exit, short_msg => sprintf("ActiveCount: %d", $activecount));
$exit = $self->{perfdata}->threshold_check(value => $timeoutcount, threshold => [ { label => 'crit_timeoutcount', exit_litteral => 'critical' },
{ label => 'warn_timeoutcount', exit_litteral => 'warning' } ]);
$self->{output}->output_add(severity => $exit, short_msg => sprintf("TimedOutCount: %d", $timeoutcount));
$self->{output}->output_add(severity => "ok", short_msg => sprintf("CommittedCount: %d", $committedcount));
$self->{output}->output_add(severity => "ok", short_msg => sprintf("RolledbackCount: %d", $rolledbackcount));
$self->{output}->output_add(severity => "ok", short_msg => sprintf("TransactionCount: %d", $transactioncount));
$self->{output}->output_add(severity => "ok", short_msg => sprintf("TotalTransactionTime: %dms", $totaltransactiontime));
$self->{output}->output_add(severity => "ok", short_msg => sprintf("MaxTransactionTime: %dms", $maxtransactiontime));
$self->{output}->output_add(severity => "ok", short_msg => sprintf("DefaultTimeout: %ds", $defaulttimeout));
$self->{output}->perfdata_add(label => "ActiveCount", unit => '',
value => sprintf("%d", $activecount),
warning => $self->{perfdata}->get_perfdata_for_output(label => 'warn_activecount'),
critical => $self->{perfdata}->get_perfdata_for_output(label => 'crit_activecount'),
);
$self->{output}->perfdata_add(label => "TimedOutCount", unit => '',
value => sprintf("%d", $timeoutcount),
warning => $self->{perfdata}->get_perfdata_for_output(label => 'warn_timeoutcount'),
critical => $self->{perfdata}->get_perfdata_for_output(label => 'crit_timeoutcount'),
);
$self->{output}->perfdata_add(label => "c[CommittedCount]", unit => '',
value => sprintf("%d", $committedcount),
);
$self->{output}->perfdata_add(label => "c[RolledbackCount]", unit => '',
value => sprintf("%d", $rolledbackcount),
);
$self->{output}->perfdata_add(label => "c[TransactionCount]", unit => '',
value => sprintf("%d", $transactioncount),
);
$self->{output}->perfdata_add(label => "c[TotalTransactionTime]", unit => 'ms',
value => sprintf("%d", $totaltransactiontime),
);
$self->{output}->perfdata_add(label => "MaxTransactionTime", unit => 'ms',
value => sprintf("%d", $maxtransactiontime),
);
$self->{output}->perfdata_add(label => "DefaultTimeout", unit => 's',
value => sprintf("%d", $defaulttimeout),
);
$self->{output}->display();
$self->{output}->exit();
}
1;
__END__
=head1 MODE
Check EAS application EJB transaction status.
=over 8
=item B<--urlpath>
Set path to get status page. (Default: '/easportal/tools/nagios/checktransaction.jsp')
=item B<--warning>
Warning Threshold for (activecount,timeoutcount). for example : --warning=100,1
=item B<--critical>
Critical Threshold for (activecount,timeoutcount). for example : --critical=100,1
=back
=cut

View File

@ -0,0 +1,66 @@
#
# Copyright 2017 Centreon (http://www.centreon.com/)
#
# Centreon is a full-fledged industry-strength solution that meets
# the needs in IT infrastructure and application monitoring for
# service performance.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
package apps::kingdee::eas::plugin;
use strict;
use warnings;
use base qw(centreon::plugins::script_custom);
sub new {
my ($class, %options) = @_;
my $self = $class->SUPER::new(package => __PACKAGE__, %options);
bless $self, $class;
$self->{version} = '1.0';
%{$self->{modes}} = (
'classloading' => 'apps::kingdee::eas::mode::classloading',
'memory' => 'apps::kingdee::eas::mode::memory',
'javaruntime' => 'apps::kingdee::eas::mode::javaruntime',
'datasource' => 'apps::kingdee::eas::mode::datasource',
'httphandler' => 'apps::kingdee::eas::mode::httphandler',
'muxhandler' => 'apps::kingdee::eas::mode::muxhandler',
'transaction' => 'apps::kingdee::eas::mode::transaction',
'oraclejvmgc' => 'apps::kingdee::eas::mode::oraclejvmgc',
'ibmjvmgc' => 'apps::kingdee::eas::mode::ibmjvmgc',
'ormrpc' => 'apps::kingdee::eas::mode::ormrpc',
'easlicense' => 'apps::kingdee::eas::mode::easlicense',
'activeusers' => 'apps::kingdee::eas::mode::activeusers',
'oracleversion' => 'apps::kingdee::eas::mode::oracleversion',
'oraclesession' => 'apps::kingdee::eas::mode::oraclesession',
'oracletable' => 'apps::kingdee::eas::mode::oracletable',
'oraclerecyclebin' => 'apps::kingdee::eas::mode::oraclerecyclebin',
'oracleksqltemptable' => 'apps::kingdee::eas::mode::oracleksqltemptable',
'oracleredolog' => 'apps::kingdee::eas::mode::oracleredolog',
);
$self->{custom_modes}{api} = 'apps::kingdee::eas::custom::api';
return $self;
}
1;
__END__
=head1 PLUGIN DESCRIPTION
Check Kingdee EAS Application & DB Server Status .
=cut

View File

@ -0,0 +1,249 @@
#
# Copyright 2017 Centreon (http://www.centreon.com/)
#
# Centreon is a full-fledged industry-strength solution that meets
# the needs in IT infrastructure and application monitoring for
# service performance.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
package apps::nsclient::restapi::mode::query;
use base qw(centreon::plugins::mode);
use strict;
use warnings;
use centreon::plugins::http;
use JSON;
use URI::Encode;
sub new {
my ($class, %options) = @_;
my $self = $class->SUPER::new(package => __PACKAGE__, %options);
bless $self, $class;
$self->{version} = '1.1';
$options{options}->add_options(arguments =>
{
"hostname:s" => { name => 'hostname' },
"http-peer-addr:s" => { name => 'http_peer_addr' },
"port:s" => { name => 'port', default => 8443 },
"proto:s" => { name => 'proto', default => 'https' },
"credentials" => { name => 'credentials' },
"username:s" => { name => 'username' },
"password:s" => { name => 'password' },
"legacy-password:s" => { name => 'legacy_password' },
"proxyurl:s" => { name => 'proxyurl' },
"proxypac:s" => { name => 'proxypac' },
"timeout:s" => { name => 'timeout' },
"ssl-opt:s@" => { name => 'ssl_opt' },
"ssl:s" => { name => 'ssl' },
"command:s" => { name => 'command' },
"arg:s@" => { name => 'arg' },
"unknown-status:s" => { name => 'unknown_status', default => '%{http_code} < 200 or %{http_code} >= 300' },
"warning-status:s" => { name => 'warning_status' },
"critical-status:s" => { name => 'critical_status', default => '' },
});
$self->{http} = centreon::plugins::http->new(output => $self->{output});
return $self;
}
sub check_options {
my ($self, %options) = @_;
$self->SUPER::init(%options);
if (!defined($self->{option_results}->{command}) || $self->{option_results}->{command} eq '') {
$self->{output}->add_option_msg(short_msg => "Please set command option");
$self->{output}->option_exit();
}
if (defined($self->{option_results}->{legacy_password}) && $self->{option_results}->{legacy_password} ne '') {
$self->{http}->add_header(key => 'password', value => $self->{option_results}->{legacy_password});
}
$self->{http}->set_options(%{$self->{option_results}});
}
# Two kind of outputs.
# 1-
# {"header":{"source_id":""},"payload":[{"command":"check_centreon_plugins","lines":[{"message":"OK: Reboot Pending : False | 'value1'=10;;;; 'value2'=10;;;;\r\nlong1\r\nlong2"}],"result":"OK"}]}
# 2- Can be also "int_value".
# { "header":{"source_id":""},
# "payload": [
# {"command":"check_drivesize",
# "lines": [
# {"message":"OK All 1 drive(s) are ok",
# "perf":[
# {"alias":"C:\\ used",
# "float_value": {
# "critical":44.690621566027403,
# "maximum":49.656246185302734,
# "minimum":0.00000000000000000,
# "unit":"GB",
# "value":21.684593200683594,
# "warning":39.724996947683394}
# },
# {"alias":"C:\\ used %","float_value":{"critical":90.000000000000000,"maximum":100.00000000000000,"minimum":0.00000000000000000,"unit":"%","value":44.000000000000000,"warning":80.000000000000000}}]}],
# "result":"OK"}]}
sub nscp_output_perf {
my ($self, %options) = @_;
$self->{output}->output_add(severity => $options{result},
short_msg => $options{data}->{message});
foreach (@{$options{data}->{perf}}) {
my $perf = defined($_->{float_value}) ? $_->{float_value} : $_->{int_value};
my $printf_format = '%d';
$printf_format = '%.3f' if (defined($_->{float_value}));
$self->{output}->perfdata_add(label => $_->{alias}, unit => $perf->{unit},
value => sprintf($printf_format, $perf->{value}),
warning => defined($perf->{warning}) ? sprintf($printf_format, $perf->{warning}) : undef,
critical => defined($perf->{critical}) ? sprintf($printf_format, $perf->{critical}) : undef,
min => defined($perf->{minimum}) ? sprintf($printf_format, $perf->{minimum}) : undef,
max => defined($perf->{maximum}) ? sprintf($printf_format, $perf->{maximum}) : undef,
);
}
}
sub nscp_output_noperf {
my ($self, %options) = @_;
$self->{output}->output_add(severity => $options{result},
short_msg => $options{data}->{message});
}
sub check_nscp_result {
my ($self, %options) = @_;
my $decoded;
eval {
$decoded = decode_json($options{content});
};
if ($@) {
$self->{output}->add_option_msg(short_msg => "Cannot decode json response: $@");
$self->{output}->option_exit();
}
my $entry = $decoded->{payload}->[0];
$entry->{lines}->[0]->{message} =~ s/\r//msg;
if (defined($entry->{lines}->[0]->{perf})) {
$self->nscp_output_perf(result => $entry->{result}, data => $entry->{lines}->[0]);
$self->{output}->display(nolabel => 1);
} else {
$self->nscp_output_noperf(result => $entry->{result}, data => $entry->{lines}->[0]);
$self->{output}->display(nolabel => 1, force_ignore_perfdata => 1, force_long_output => 1);
}
}
sub run {
my ($self, %options) = @_;
my $uri = URI::Encode->new({encode_reserved => 1});
my ($encoded_args, $append) = ('', '');
if (defined($self->{option_results}->{arg})) {
foreach (@{$self->{option_results}->{arg}}) {
$encoded_args .= $append . $uri->encode($_);
$append = '&';
}
}
my ($content) = $self->{http}->request(url_path => '/query/' . $self->{option_results}->{command} . '?' . $encoded_args);
$self->{output}->output_add(long_msg => "nsclient return = " . $content, debug => 1);
$self->check_nscp_result(content => $content);
$self->{output}->exit();
}
1;
__END__
=head1 MODE
Query NSClient Rest API.
=over 8
=item B<--hostname>
IP Addr/FQDN of the host
=item B<--http-peer-addr>
Set the address you want to connect (Useful if hostname is only a vhost. no ip resolve)
=item B<--port>
Port used (Default: 8443)
=item B<--proto>
Specify https if needed (Default: 'https')
=item B<--credentials>
Specify this option if you access webpage over basic authentification
=item B<--username>
Specify username for basic authentification (Mandatory if --credentials is specidied)
=item B<--password>
Specify password for basic authentification (Mandatory if --credentials is specidied)
=item B<--legacy-password>
Specify password for old authentification system.
=item B<--proxyurl>
Proxy URL
=item B<--proxypac>
Proxy pac file (can be an url or local file)
=item B<--timeout>
Threshold for HTTP timeout (Default: 5)
=item B<--ssl-opt>
Set SSL Options (--ssl-opt="SSL_version => TLSv1" --ssl-opt="SSL_verify_mode => SSL_VERIFY_NONE").
=item B<--command>
Set command.
=item B<--arg>
Set arguments (Multiple option. Example: --arg='arg1')
=item B<--unknown-status>
Threshold warning for http response code.
(Default: '%{http_code} < 200 or %{http_code} >= 300')
=item B<--warning-status>
Threshold warning for http response code.
=item B<--critical-status>
Threshold critical for http response code.
=back
=cut

View File

@ -18,34 +18,31 @@
# limitations under the License.
#
package cloud::aws::mode::metrics::ec2instancecpu;
package apps::nsclient::restapi::plugin;
use strict;
use warnings;
use Exporter;
our @ISA = qw(Exporter);
our @EXPORT = qw(&cloudwatchCheck);
use base qw(centreon::plugins::script_simple);
my @Param;
sub new {
my ($class, %options) = @_;
my $self = $class->SUPER::new(package => __PACKAGE__, %options);
bless $self, $class;
$Param[0] = {
'NameSpace' => 'AWS/EC2',
'MetricName' => 'CPUUtilization',
'ObjectName' => 'InstanceId',
'Unit' => 'Percent',
'Labels' => {
'ShortOutput' => "CPU Usage is %.2f%%",
'LongOutput' => "CPU Usage is %.2f%%",
'PerfData' => 'cpu',
'Unit' => '%',
'Value' => "%.2f",
}
};
$self->{version} = '0.1';
%{$self->{modes}} = (
'query' => 'apps::nsclient::restapi::mode::query',
);
sub cloudwatchCheck {
my ($self) = @_;
@{ $self->{metric} } = @Param;
return $self;
}
1;
__END__
=head1 PLUGIN DESCRIPTION
Check nsclient Rest API.
=cut

View File

@ -1,5 +1,5 @@
#
# Copyright 2016 Centreon (http://www.centreon.com/)
# Copyright 2017 Centreon (http://www.centreon.com/)
#
# Centreon is a full-fledged industry-strength solution that meets
# the needs in IT infrastructure and application monitoring for

View File

@ -51,6 +51,7 @@ sub new {
"timeout:s" => { name => 'timeout' },
"no-follow" => { name => 'no_follow', },
"ssl:s" => { name => 'ssl', },
"ssl-opt:s@" => { name => 'ssl_opt' },
"cert-file:s" => { name => 'cert_file' },
"key-file:s" => { name => 'key_file' },
"cacert-file:s" => { name => 'cacert_file' },
@ -216,9 +217,9 @@ Threshold for HTTP timeout (Default: 5)
Do not follow http redirect
=item B<--ssl>
=item B<--ssl-opt>
Specify SSL version (example : 'sslv3', 'tlsv1'...)
Set SSL Options (--ssl-opt="SSL_version => TLSv1" --ssl-opt="SSL_verify_mode => SSL_VERIFY_NONE").
=item B<--cert-file>

View File

@ -54,6 +54,7 @@ sub new {
"header:s@" => { name => 'header' },
"get-param:s@" => { name => 'get_param' },
"timeout:s" => { name => 'timeout', default => 10 },
"ssl-opt:s@" => { name => 'ssl_opt' },
"ssl:s" => { name => 'ssl', },
"cert-file:s" => { name => 'cert_file' },
"key-file:s" => { name => 'key_file' },
@ -409,9 +410,9 @@ Specify password for basic authentification (Mandatory if --credentials is speci
Threshold for HTTP timeout (Default: 10)
=item B<--ssl>
=item B<--ssl-opt>
Specify SSL version (example : 'sslv3', 'tlsv1'...)
Set SSL Options (--ssl-opt="SSL_version => TLSv1" --ssl-opt="SSL_verify_mode => SSL_VERIFY_NONE").
=item B<--cert-file>

View File

@ -49,7 +49,8 @@ sub new {
"proxypac:s" => { name => 'proxypac' },
"timeout:s" => { name => 'timeout' },
"no-follow" => { name => 'no_follow', },
"ssl:s" => { name => 'ssl' },
"ssl:s" => { name => 'ssl' },
"ssl-opt:s@" => { name => 'ssl_opt' },
"cert-file:s" => { name => 'cert_file' },
"key-file:s" => { name => 'key_file' },
"cacert-file:s" => { name => 'cacert_file' },
@ -202,9 +203,9 @@ Threshold for HTTP timeout (Default: 5)
Do not follow http redirect
=item B<--ssl>
=item B<--ssl-opt>
Specify SSL version (example : 'sslv3', 'tlsv1'...)
Set SSL Options (--ssl-opt="SSL_version => TLSv1" --ssl-opt="SSL_verify_mode => SSL_VERIFY_NONE").
=item B<--cert-file>

View File

@ -53,6 +53,7 @@ sub new {
"proxypac:s" => { name => 'proxypac' },
"header:s@" => { name => 'header' },
"timeout:s" => { name => 'timeout', default => 10 },
"ssl-opt:s@" => { name => 'ssl_opt' },
"ssl:s" => { name => 'ssl', },
"cert-file:s" => { name => 'cert_file' },
"key-file:s" => { name => 'key_file' },
@ -436,9 +437,9 @@ Specify password for basic authentification (Mandatory if --credentials is speci
Threshold for HTTP timeout (Default: 10)
=item B<--ssl>
=item B<--ssl-opt>
Specify SSL version (example : 'sslv3', 'tlsv1'...)
Set SSL Options (--ssl-opt="SSL_version => TLSv1" --ssl-opt="SSL_verify_mode => SSL_VERIFY_NONE").
=item B<--cert-file>

View File

@ -142,7 +142,7 @@ sub check_value {
if ($self->{attributes}->{type} =~ /^counter$/i) {
if (!defined($self->{datas})) {
$self->{datas} = {};
$self->{statefile_cache}->read(statefile => "jmxstandard_" . $self->{mode} . '_' . md5_hex($self->{connector}->{url} . ' ' . $self->{option_results}->{mbean_pattern}));
$self->{statefile_cache}->read(statefile => "jmxstandard_" . $self->{mode} . '_' . md5_hex($self->{connector}->get_connection_info() . ' ' . $self->{option_results}->{mbean_pattern}));
}
my $old_timestamp = $self->{statefile_cache}->get(name => 'timestamp');

View File

@ -1,5 +1,5 @@
#
# Copyright 2016 Centreon (http://www.centreon.com/)
# Copyright 2017 Centreon (http://www.centreon.com/)
#
# Centreon is a full-fledged industry-strength solution that meets
# the needs in IT infrastructure and application monitoring for

View File

@ -18,7 +18,7 @@
# limitations under the License.
#
package snmp_standard::plugin;
package apps::protocols::snmp::plugin;
use strict;
use warnings;
@ -31,11 +31,11 @@ sub new {
$self->{version} = '0.1';
%{$self->{modes}} = (
'numeric-value' => 'snmp_standard::mode::numericvalue',
'string-value' => 'snmp_standard::mode::stringvalue',
'dynamic-command' => 'snmp_standard::mode::dynamiccommand',
'uptime' => 'snmp_standard::mode::uptime',
);
'dynamic-command' => 'snmp_standard::mode::dynamiccommand',
'numeric-value' => 'snmp_standard::mode::numericvalue',
'string-value' => 'snmp_standard::mode::stringvalue',
'uptime' => 'snmp_standard::mode::uptime',
);
return $self;
}
@ -46,6 +46,6 @@ __END__
=head1 PLUGIN DESCRIPTION
Check SNMP values (string, numeric or execute commands) or standard (uptime).
Check SNMP values (string, numeric or execute commands).
=cut

View File

@ -0,0 +1,158 @@
#
# Copyright 2017 Centreon (http://www.centreon.com/)
#
# Centreon is a full-fledged industry-strength solution that meets
# the needs in IT infrastructure and application monitoring for
# service performance.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
package apps::redis::cli::custom::rediscli;
use strict;
use warnings;
use Redis;
sub new {
my ($class, %options) = @_;
my $self = {};
bless $self, $class;
if (!defined($options{output})) {
print "Class Custom: Need to specify 'output' argument.\n";
exit 3;
}
if (!defined($options{options})) {
$options{output}->add_option_msg(short_msg => "Class Custom: Need to specify 'options' argument.");
$options{output}->option_exit();
}
if (!defined($options{noptions})) {
$options{options}->add_options(arguments =>
{
"hostname:s" => { name => 'hostname' },
"port:s" => { name => 'port' },
"password:s" => { name => 'password' },
});
}
$options{options}->add_help(package => __PACKAGE__, sections => 'REDIS CLI OPTIONS', once => 1);
$self->{output} = $options{output};
$self->{mode} = $options{mode};
return $self;
}
sub set_options {
my ($self, %options) = @_;
$self->{option_results} = $options{option_results};
}
sub set_defaults {
my ($self, %options) = @_;
foreach (keys %{$options{default}}) {
if ($_ eq $self->{mode}) {
for (my $i = 0; $i < scalar(@{$options{default}->{$_}}); $i++) {
foreach my $opt (keys %{$options{default}->{$_}[$i]}) {
if (!defined($self->{option_results}->{$opt}[$i])) {
$self->{option_results}->{$opt}[$i] = $options{default}->{$_}[$i]->{$opt};
}
}
}
}
}
}
sub check_options {
my ($self, %options) = @_;
$self->{hostname} = $self->{option_results}->{hostname};
$self->{port} = $self->{option_results}->{port};
$self->{password} = $self->{option_results}->{password};
if (!defined($self->{hostname})) {
$self->{output}->add_option_msg(short_msg => "Need to specify hostname argument.");
$self->{output}->option_exit();
}
if (!defined($self->{port})) {
$self->{output}->add_option_msg(short_msg => "Need to specify port argument.");
$self->{output}->option_exit();
}
return 0;
}
sub get_connection_info {
my ($self, %options) = @_;
return $self->{hostname} . ":" . $self->{port};
}
sub get_info {
my ($self, %options) = @_;
$self->{redis} = Redis->new(server => $self->{hostname} . ":" . $self->{port});
if (defined($self->{password})) {
$self->{redis}->auth($self->{password});
}
my $response = $self->{redis}->info;
my $items;
foreach my $attributes (keys %{$response}) {
$items->{$attributes} = $response->{$attributes};
}
$self->{redis}->quit();
return $items;
}
1;
__END__
=head1 NAME
REDIS CLI
=head1 SYNOPSIS
Redis Cli custom mode
=head1 REDIS CLI OPTIONS
=over 8
=item B<--hostname>
Redis hostname.
=item B<--port>
Redis port.
=item B<--password>
Redis password
=back
=head1 DESCRIPTION
B<custom>.
=cut

View File

@ -0,0 +1,141 @@
#
# Copyright 2017 Centreon (http://www.centreon.com/)
#
# Centreon is a full-fledged industry-strength solution that meets
# the needs in IT infrastructure and application monitoring for
# service performance.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
package apps::redis::cli::mode::clients;
use base qw(centreon::plugins::templates::counter);
use strict;
use warnings;
sub set_counters {
my ($self, %options) = @_;
$self->{maps_counters_type} = [
{ name => 'global', type => 0 },
];
$self->{maps_counters}->{global} = [
{ label => 'connected-clients', set => {
key_values => [ { name => 'connected_clients' } ],
output_template => 'Connected clients: %s',
perfdatas => [
{ label => 'connected_clients', value => 'connected_clients_absolute', template => '%s', min => 0 },
],
},
},
{ label => 'blocked-clients', set => {
key_values => [ { name => 'blocked_clients' } ],
output_template => 'Blocked clients: %s',
perfdatas => [
{ label => 'blocked_clients', value => 'blocked_clients_absolute', template => '%s', min => 0 },
],
},
},
{ label => 'client-longest-output-list', set => {
key_values => [ { name => 'client_longest_output_list' } ],
output_template => 'Client longest output list: %s',
perfdatas => [
{ label => 'client_longest_output_list', value => 'client_longest_output_list_absolute', template => '%s', min => 0 },
],
},
},
{ label => 'client-biggest-input-buf', set => {
key_values => [ { name => 'client_biggest_input_buf' } ],
output_template => 'Client biggest input buffer: %s',
perfdatas => [
{ label => 'client_biggest_input_buf', value => 'client_biggest_input_buf_absolute', template => '%s', min => 0 },
],
},
}
];
}
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 =>
{
});
return $self;
}
sub manage_selection {
my ($self, %options) = @_;
my $results = $options{custom}->get_info();
$self->{global} = {
connected_clients => $results->{connected_clients},
blocked_clients => $results->{blocked_clients},
client_longest_output_list => $results->{client_longest_output_list},
client_biggest_input_buf => $results->{client_biggest_input_buf},
};
}
1;
__END__
=head1 MODE
Check number of connected and blocked clients
=over 8
=item B<--warning-connected-clients>
Warning threshold for number of connected clients
=item B<--critical-connected-clients>
Critical threshold for number of connected clients
=item B<--warning-blocked-clients>
Warning threshold for number of blocked clients
=item B<--critical-blocked-clients>
Critical threshold for number of blocked clients
=item B<--warning-client-longest-output-list>
Warning threshold for longest output list among current client connections
=item B<--critical-client-longest-output-list>
Critical threshold for longest output list among current client connections
=item B<--warning-client-biggest-input-buf>
Warning threshold for biggest input buffer among current client connections
=item B<--critical-client-biggest-input-buf>
Critical threshold for biggest input buffer among current client connections
=back
=cut

View File

@ -0,0 +1,117 @@
#
# Copyright 2017 Centreon (http://www.centreon.com/)
#
# Centreon is a full-fledged industry-strength solution that meets
# the needs in IT infrastructure and application monitoring for
# service performance.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
package apps::redis::cli::mode::commands;
use base qw(centreon::plugins::templates::counter);
use strict;
use warnings;
use Digest::MD5 qw(md5_hex);
sub set_counters {
my ($self, %options) = @_;
$self->{maps_counters_type} = [
{ name => 'global', type => 0, cb_prefix_output => 'prefix_output' },
];
$self->{maps_counters}->{global} = [
{ label => 'processed-commands', set => {
key_values => [ { name => 'total_commands_processed', diff => 1 } ],
output_template => 'Processed: %s',
perfdatas => [
{ label => 'processed_commands', value => 'total_commands_processed_absolute', template => '%s', min => 0 },
],
},
},
{ label => 'ops-per-sec', set => {
key_values => [ { name => 'instantaneous_ops_per_sec' } ],
output_template => 'Processed per sec: %s',
perfdatas => [
{ label => 'ops_per_sec', value => 'instantaneous_ops_per_sec_absolute', template => '%s', min => 0, unit => 'ops/s' },
],
},
},
];
}
sub prefix_output {
my ($self, %options) = @_;
return "Number of commands: ";
}
sub new {
my ($class, %options) = @_;
my $self = $class->SUPER::new(package => __PACKAGE__, %options, statefile => 1);
bless $self, $class;
$self->{version} = '1.0';
$options{options}->add_options(arguments =>
{
});
return $self;
}
sub manage_selection {
my ($self, %options) = @_;
$self->{cache_name} = "redis_" . $self->{mode} . '_' . $options{custom}->get_connection_info() . '_' .
(defined($self->{option_results}->{filter_counters}) ? md5_hex($self->{option_results}->{filter_counters}) : md5_hex('all'));
my $results = $options{custom}->get_info();
$self->{global} = {
total_commands_processed => $results->{total_commands_processed},
instantaneous_ops_per_sec => $results->{instantaneous_ops_per_sec},
};
}
1;
__END__
=head1 MODE
Check commands number
=over 8
=item B<--warning-processed-commands>
Warning threshold for number of commands processed by the server
=item B<--critical-processed-commands>
Critical threshold for number of commands processed by the server
=item B<--warning-ops-per-sec>
Warning threshold for number of commands processed per second
=item B<--critical-ops-per-sec>
Critical threshold for number of commands processed per second
=back
=cut

View File

@ -0,0 +1,167 @@
#
# Copyright 2017 Centreon (http://www.centreon.com/)
#
# Centreon is a full-fledged industry-strength solution that meets
# the needs in IT infrastructure and application monitoring for
# service performance.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
package apps::redis::cli::mode::connections;
use base qw(centreon::plugins::templates::counter);
use strict;
use warnings;
use Digest::MD5 qw(md5_hex);
sub set_counters {
my ($self, %options) = @_;
$self->{maps_counters_type} = [
{ name => 'connections', type => 0, cb_prefix_output => 'prefix_connections_output' },
{ name => 'traffic', type => 0, cb_prefix_output => 'prefix_traffic_output' },
];
$self->{maps_counters}->{connections} = [
{ label => 'received-connections', set => {
key_values => [ { name => 'total_connections_received', diff => 1 } ],
output_template => 'Received: %s',
perfdatas => [
{ label => 'received_connections', value => 'total_connections_received_absolute', template => '%s', min => 0 },
],
},
},
{ label => 'rejected-connections', set => {
key_values => [ { name => 'rejected_connections', diff => 1 } ],
output_template => 'Rejected: %s',
perfdatas => [
{ label => 'rejected_connections', value => 'rejected_connections_absolute', template => '%s', min => 0 },
],
},
},
];
$self->{maps_counters}->{traffic} = [
{ label => 'traffic-in', set => {
key_values => [ { name => 'total_net_input_bytes', diff => 1 } ],
output_template => 'Traffic In: %s %s/s',
per_second => 1, output_change_bytes => 2,
perfdatas => [
{ label => 'traffic_in', value => 'total_net_input_bytes_per_second', template => '%d', min => 0, unit => 'b/s' },
],
},
},
{ label => 'traffic-out', set => {
key_values => [ { name => 'total_net_output_bytes', diff => 1 } ],
output_template => 'Traffic Out: %s %s/s',
per_second => 1, output_change_bytes => 2,
perfdatas => [
{ label => 'traffic_out', value => 'total_net_output_bytes_per_second', template => '%d', min => 0, unit => 'b/s' },
],
},
},
];
}
sub prefix_connections_output {
my ($self, %options) = @_;
return "Number of connections: ";
}
sub prefix_traffic_output {
my ($self, %options) = @_;
return "Network usage: ";
}
sub new {
my ($class, %options) = @_;
my $self = $class->SUPER::new(package => __PACKAGE__, %options, statefile => 1);
bless $self, $class;
$self->{version} = '1.0';
$options{options}->add_options(arguments =>
{
});
return $self;
}
sub manage_selection {
my ($self, %options) = @_;
$self->{cache_name} = "redis_" . $self->{mode} . '_' . $options{custom}->get_connection_info() . '_' .
(defined($self->{option_results}->{filter_counters}) ? md5_hex($self->{option_results}->{filter_counters}) : md5_hex('all'));
my $results = $options{custom}->get_info();
$self->{connections} = {
total_connections_received => $results->{total_connections_received},
rejected_connections => $results->{rejected_connections},
};
$self->{traffic} = {
total_net_input_bytes => $results->{total_net_input_bytes} * 8,
total_net_output_bytes => $results->{total_net_output_bytes} * 8,
};
}
1;
__END__
=head1 MODE
Check connections number and network usage
=over 8
=item B<--warning-received-connections>
Warning threshold for received connections
=item B<--critical-received-connections>
Critical threshold for received connections
=item B<--warning-rejected-connections>
Warning threshold for rejected connections
=item B<--critical-rejected-connections>
Critical threshold for rejected connections
=item B<--warning-traffic-in>
Warning threshold for inbound traffic (b/s)
=item B<--critical-traffic-in>
Critical threshold for inbound traffic (b/s)
=item B<--warning-traffic-out>
Warning threshold for outbound traffic (b/s)
=item B<--critical-traffic-out>
Critical thresholdfor outbound traffic (b/s)
=back
=cut

View File

@ -0,0 +1,169 @@
#
# Copyright 2017 Centreon (http://www.centreon.com/)
#
# Centreon is a full-fledged industry-strength solution that meets
# the needs in IT infrastructure and application monitoring for
# service performance.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
package apps::redis::cli::mode::cpu;
use base qw(centreon::plugins::templates::counter);
use strict;
use warnings;
use Digest::MD5 qw(md5_hex);
sub set_counters {
my ($self, %options) = @_;
$self->{maps_counters_type} = [
{ name => 'global', type => 0, cb_prefix_output => 'prefix_output' }
];
$self->{maps_counters}->{global} = [
{ label => 'sys', set => {
key_values => [ { name => 'used_cpu_sys', diff => 1 } ],
closure_custom_calc => $self->can('custom_usage_calc'), closure_custom_calc_extra_options => { label_ref => 'used_cpu_sys' },
output_template => 'System: %.2f %%', output_use => 'used_delta', threshold_use => 'used_delta',
per_second => 1,
perfdatas => [
{ label => 'sys', value => 'used_delta', template => '%.2f', min => 0, max => 100, unit => '%' },
],
}
},
{ label => 'user', set => {
key_values => [ { name => 'used_cpu_user', diff => 1 } ],
closure_custom_calc => $self->can('custom_usage_calc'), closure_custom_calc_extra_options => { label_ref => 'used_cpu_user' },
output_template => 'User: %.2f %%', output_use => 'used_delta', threshold_use => 'used_delta',
per_second => 1,
perfdatas => [
{ label => 'user', value => 'used_delta', template => '%.2f', min => 0, max => 100, unit => '%' },
],
}
},
{ label => 'sys-children', set => {
key_values => [ { name => 'used_cpu_sys_children', diff => 1 } ],
closure_custom_calc => $self->can('custom_usage_calc'), closure_custom_calc_extra_options => { label_ref => 'used_cpu_sys_children' },
output_template => 'System children: %.2f %%', output_use => 'used_delta', threshold_use => 'used_delta',
per_second => 1,
perfdatas => [
{ label => 'sys_children', value => 'used_delta', template => '%.2f', min => 0, max => 100, unit => '%' },
],
}
},
{ label => 'user-children', set => {
key_values => [ { name => 'used_cpu_user_children', diff => 1 } ],
closure_custom_calc => $self->can('custom_usage_calc'), closure_custom_calc_extra_options => { label_ref => 'used_cpu_user_children' },
output_template => 'User children: %.2f %%', output_use => 'used_delta', threshold_use => 'used_delta',
per_second => 1,
perfdatas => [
{ label => 'user_children', value => 'used_delta', template => '%.2f', min => 0, max => 100, unit => '%' },
],
}
},
];
}
sub prefix_output {
my ($self, %options) = @_;
return "CPU usage: ";
}
sub custom_usage_calc {
my ($self, %options) = @_;
my $delta_total = $options{new_datas}->{$self->{instance} . '_' . $options{extra_options}->{label_ref}} - $options{old_datas}->{$self->{instance} . '_' . $options{extra_options}->{label_ref}};
$self->{result_values}->{used_delta} = 100 * $delta_total / $options{delta_time};
return 0;
}
sub new {
my ($class, %options) = @_;
my $self = $class->SUPER::new(package => __PACKAGE__, %options, statefile => 1);
bless $self, $class;
$self->{version} = '1.0';
$options{options}->add_options(arguments =>
{
});
return $self;
}
sub manage_selection {
my ($self, %options) = @_;
$self->{cache_name} = "redis_" . $self->{mode} . '_' . $options{custom}->get_connection_info() . '_' .
(defined($self->{option_results}->{filter_counters}) ? md5_hex($self->{option_results}->{filter_counters}) : md5_hex('all'));
my $results = $options{custom}->get_info();
$self->{global} = {
used_cpu_sys => $results->{used_cpu_sys},
used_cpu_user => $results->{used_cpu_user},
used_cpu_sys_children => $results->{used_cpu_sys_children},
used_cpu_user_children => $results->{used_cpu_user_children},
};
}
1;
__END__
=head1 MODE
Check CPU utilization.
=over 8
=item B<--warning-sys>
Warning threshold for Sys CPU utilization
=item B<--critical-sys>
Critical threshold for Sys CPU utilization
=item B<--warning-user>
Warning threshold for User CPU utilization
=item B<--critical-user>
Critical threshold for User CPU utilization
=item B<--warning-sys-children>
Warning threshold for Sys Children CPU utilization
=item B<--critical-sys-children>
Critical threshold for Sys Children CPU utilization
=item B<--warning-user-children>
Warning threshold for User Children CPU utilization
=item B<--critical-user-children>
Critical threshold for User Children CPU utilization
=back
=cut

View File

@ -0,0 +1,356 @@
#
# Copyright 2017 Centreon (http://www.centreon.com/)
#
# Centreon is a full-fledged industry-strength solution that meets
# the needs in IT infrastructure and application monitoring for
# service performance.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
package apps::redis::cli::mode::memory;
use base qw(centreon::plugins::templates::counter);
use strict;
use warnings;
my $instance_mode;
sub custom_usage_perfdata {
my ($self, %options) = @_;
$self->{output}->perfdata_add(label => $self->{result_values}->{label}, unit => 'B',
value => $self->{result_values}->{used},
warning => $self->{perfdata}->get_perfdata_for_output(label => 'warning-' . $self->{result_values}->{label}, total => $self->{result_values}->{total}, cast_int => 1),
critical => $self->{perfdata}->get_perfdata_for_output(label => 'critical-' . $self->{result_values}->{label}, total => $self->{result_values}->{total}, cast_int => 1),
min => 0, max => $self->{result_values}->{total});
}
sub custom_usage_threshold {
my ($self, %options) = @_;
my ($exit, $threshold_value);
$threshold_value = $self->{result_values}->{used};
$threshold_value = $self->{result_values}->{free} if (defined($instance_mode->{option_results}->{free}));
if ($instance_mode->{option_results}->{units} eq '%') {
$threshold_value = $self->{result_values}->{prct_used};
$threshold_value = $self->{result_values}->{prct_free} if (defined($instance_mode->{option_results}->{free}));
}
$exit = $self->{perfdata}->threshold_check(value => $threshold_value, threshold => [ { label => 'critical-' . $self->{result_values}->{label}, exit_litteral => 'critical' }, { label => 'warning-' . $self->{result_values}->{label}, exit_litteral => 'warning' } ]);
return $exit;
}
sub custom_usage_output {
my ($self, %options) = @_;
my ($total_used_value, $total_used_unit) = $self->{perfdata}->change_bytes(value => $self->{result_values}->{used});
my $msg = sprintf($self->{result_values}->{display}.": %s (%.2f%%)",
$total_used_value . " " . $total_used_unit, $self->{result_values}->{prct_used});
return $msg;
}
sub custom_usage_calc {
my ($self, %options) = @_;
$self->{result_values}->{display} = $options{new_datas}->{$self->{instance} . '_display'};
$self->{result_values}->{label} = $options{new_datas}->{$self->{instance} . '_label'};
$self->{result_values}->{used} = $options{new_datas}->{$self->{instance} . '_used'};
$self->{result_values}->{total} = $options{new_datas}->{$self->{instance} . '_total'};
$self->{result_values}->{free} = $self->{result_values}->{total} - $self->{result_values}->{used};
$self->{result_values}->{prct_used} = $self->{result_values}->{used} * 100 / $self->{result_values}->{total};
$self->{result_values}->{prct_free} = 100 - $self->{result_values}->{prct_used};
return 0;
}
sub set_counters {
my ($self, %options) = @_;
$self->{maps_counters_type} = [
{ name => 'used', type => 0 },
{ name => 'rss', type => 0, skipped_code => { -10 => 1 } },
{ name => 'peak', type => 0, skipped_code => { -10 => 1 } },
{ name => 'overhead', type => 0, skipped_code => { -10 => 1 } },
{ name => 'startup', type => 0, skipped_code => { -10 => 1 } },
{ name => 'dataset', type => 0, skipped_code => { -10 => 1 } },
{ name => 'lua', type => 0, skipped_code => { -10 => 1 } },
{ name => 'stats', type => 0, cb_prefix_output => 'prefix_stats_output', skipped_code => { -10 => 1 } },
];
$self->{maps_counters}->{used} = [
{ label => 'used', set => {
key_values => [ { name => 'display' }, { name => 'label' }, { name => 'used' }, { name => 'total' } ],
closure_custom_calc => $self->can('custom_usage_calc'),
closure_custom_output => $self->can('custom_usage_output'),
closure_custom_perfdata => $self->can('custom_usage_perfdata'),
closure_custom_threshold_check => $self->can('custom_usage_threshold'),
}
},
];
$self->{maps_counters}->{rss} = [
{ label => 'rss', set => {
key_values => [ { name => 'display' }, { name => 'label' }, { name => 'used' }, { name => 'total' } ],
closure_custom_calc => $self->can('custom_usage_calc'),
closure_custom_output => $self->can('custom_usage_output'),
closure_custom_perfdata => $self->can('custom_usage_perfdata'),
closure_custom_threshold_check => $self->can('custom_usage_threshold'),
}
},
];
$self->{maps_counters}->{peak} = [
{ label => 'peak', set => {
key_values => [ { name => 'display' }, { name => 'label' }, { name => 'used' }, { name => 'total' } ],
closure_custom_calc => $self->can('custom_usage_calc'),
closure_custom_output => $self->can('custom_usage_output'),
closure_custom_perfdata => $self->can('custom_usage_perfdata'),
closure_custom_threshold_check => $self->can('custom_usage_threshold'),
}
},
];
$self->{maps_counters}->{overhead} = [
{ label => 'overhead', set => {
key_values => [ { name => 'display' }, { name => 'label' }, { name => 'used' }, { name => 'total' } ],
closure_custom_calc => $self->can('custom_usage_calc'),
closure_custom_output => $self->can('custom_usage_output'),
closure_custom_perfdata => $self->can('custom_usage_perfdata'),
closure_custom_threshold_check => $self->can('custom_usage_threshold'),
}
},
];
$self->{maps_counters}->{startup} = [
{ label => 'startup', set => {
key_values => [ { name => 'display' }, { name => 'label' }, { name => 'used' }, { name => 'total' } ],
closure_custom_calc => $self->can('custom_usage_calc'),
closure_custom_output => $self->can('custom_usage_output'),
closure_custom_perfdata => $self->can('custom_usage_perfdata'),
closure_custom_threshold_check => $self->can('custom_usage_threshold'),
}
},
];
$self->{maps_counters}->{dataset} = [
{ label => 'dataset', set => {
key_values => [ { name => 'display' }, { name => 'label' }, { name => 'used' }, { name => 'total' } ],
closure_custom_calc => $self->can('custom_usage_calc'),
closure_custom_output => $self->can('custom_usage_output'),
closure_custom_perfdata => $self->can('custom_usage_perfdata'),
closure_custom_threshold_check => $self->can('custom_usage_threshold'),
}
},
];
$self->{maps_counters}->{lua} = [
{ label => 'lua', set => {
key_values => [ { name => 'display' }, { name => 'label' }, { name => 'used' }, { name => 'total' } ],
closure_custom_calc => $self->can('custom_usage_calc'),
closure_custom_output => $self->can('custom_usage_output'),
closure_custom_perfdata => $self->can('custom_usage_perfdata'),
closure_custom_threshold_check => $self->can('custom_usage_threshold'),
}
},
];
$self->{maps_counters}->{stats} = [
{ label => 'fragmentation-ratio', set => {
key_values => [ { name => 'mem_fragmentation_ratio' } ],
output_template => 'Fragmentation ratio: %s',
perfdatas => [
{ label => 'fragmentation_ratio', value => 'mem_fragmentation_ratio_absolute', template => '%s', min => 0 },
],
},
},
{ label => 'defrag-running', set => {
key_values => [ { name => 'active_defrag_running' } ],
output_template => 'Defragmentation running: %s',
perfdatas => [
{ label => 'defrag_running', value => 'active_defrag_running_absolute', template => '%s', min => 0 },
],
},
},
{ label => 'lazyfree-pending-objects', set => {
key_values => [ { name => 'lazyfree_pending_objects' } ],
output_template => 'Lazyfree pending objects: %s',
perfdatas => [
{ label => 'lazyfree_pending_objects', value => 'lazyfree_pending_objects_absolute', template => '%s', min => 0 },
],
},
},
];
}
sub prefix_stats_output {
my ($self, %options) = @_;
return "Statistics: ";
}
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 =>
{
"units:s" => { name => 'units', default => '%' },
"free" => { name => 'free' },
});
return $self;
}
sub check_options {
my ($self, %options) = @_;
$self->SUPER::check_options(%options);
$instance_mode = $self;
}
my $metrics = {
used_memory => { label => 'used', display => 'Used' },
used_memory_rss => { label => 'rss', display => 'Rss' },
used_memory_peak => { label => 'peak', display => 'Peak' },
used_memory_overhead => { label => 'overhead', display => 'Overhead' },
used_memory_startup => { label => 'startup', display => 'Startup' },
used_memory_dataset => { label => 'dataset', display => 'Dataset' },
used_memory_lua => { label => 'lua', display => 'Lua' },
};
sub manage_selection {
my ($self, %options) = @_;
my $results = $options{custom}->get_info();
foreach my $type (keys %$metrics) {
next if (!defined($results->{$type}));
$self->{$metrics->{$type}->{label}} = { display => $metrics->{$type}->{display},
label => $metrics->{$type}->{label},
used => $results->{$type},
total => $results->{total_system_memory} };
}
$self->{stats} = {
mem_fragmentation_ratio => $results->{mem_fragmentation_ratio},
active_defrag_running => $results->{active_defrag_running},
lazyfree_pending_objects => $results->{lazyfree_pending_objects},
};
}
1;
__END__
=head1 MODE
Check memory utilization
=over 8
=item B<--units>
Units of thresholds (Default: '%') ('%', 'B').
=item B<--free>
Thresholds are on free space left.
=item B<--warning-used>
Warning threshold for Used memory utilization
=item B<--critical-used>
Critical threshold for Used memory utilization
=item B<--warning-rss>
Warning threshold for Rss memory utilization
=item B<--critical-rss>
Critical threshold for Rss memory utilization
=item B<--warning-peak>
Warning threshold for Peak memory utilization
=item B<--critical-peak>
Critical threshold for Peak memory utilization
=item B<--warning-overhead>
Warning threshold for Overhead memory utilization
=item B<--critical-overhead>
Critical threshold for Overhead memory utilization
=item B<--warning-startup>
Warning threshold for Startup memory utilization
=item B<--critical-startup>
Critical threshold for Startup memory utilization
=item B<--warning-dataset>
Warning threshold for Dataset memory utilization
=item B<--critical-dataset>
Critical threshold for Dataset memory utilization
=item B<--warning-lua>
Warning threshold for Lua memory utilization
=item B<--critical-lua>
Critical threshold for Lua memory utilization
=item B<--warning-fragmentation-ratio>
Warning threshold for Fragmentation Ratio
=item B<--critical-fragmentation-ratio>
Critical threshold for Fragmentation Ratio
=item B<--warning-defrag-running>
Warning threshold for Running Defragmentation
=item B<--critical-defrag-running>
Critical threshold for Running Defragmentation
=item B<--warning-lazyfree-pending-objects>
Warning threshold for Lazyfree Pending Objects
=item B<--critical-lazyfree-pending-objects>
Critical threshold for Lazyfree Pending Objects
=back
=cut

View File

@ -0,0 +1,218 @@
#
# Copyright 2017 Centreon (http://www.centreon.com/)
#
# Centreon is a full-fledged industry-strength solution that meets
# the needs in IT infrastructure and application monitoring for
# service performance.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
package apps::redis::cli::mode::persistence;
use base qw(centreon::plugins::templates::counter);
use strict;
use warnings;
my $instance_mode;
sub set_counters {
my ($self, %options) = @_;
$self->{maps_counters_type} = [
{ name => 'global', type => 0, skipped_code => { -10 => 1 } },
];
$self->{maps_counters}->{global} = [
{ label => 'status', threshold => 0, set => {
key_values => [ { name => 'status' }, { name => 'progress_status' } ],
closure_custom_calc => $self->can('custom_status_calc'),
closure_custom_output => $self->can('custom_status_output'),
closure_custom_perfdata => sub { return 0; },
closure_custom_threshold_check => $self->can('custom_status_threshold'),
}
},
{ label => 'changes', set => {
key_values => [ { name => 'rdb_changes_since_last_save' } ],
output_template => 'Number of changes since the last dump: %s',
perfdatas => [
{ label => 'changes', value => 'rdb_changes_since_last_save_absolute', template => '%s', min => 0 },
],
},
},
{ label => 'last-save', set => {
key_values => [ { name => 'rdb_last_save_time' }, { name => 'rdb_last_save_time_sec' } ],
output_template => 'Time since last successful save: %s',
perfdatas => [
{ label => 'last_save', value => 'rdb_last_save_time_sec_absolute', template => '%s', min => 0, unit => 's' },
],
},
},
{ label => 'save-size', set => {
key_values => [ { name => 'rdb_last_cow_size' } ],
output_template => 'Size of last save: %s %s',
output_change_bytes => 1,
perfdatas => [
{ label => 'save_size', value => 'rdb_last_cow_size_absolute', template => '%s', min => 0, unit => 'B' },
],
},
},
{ label => 'last-save-duration', set => {
key_values => [ { name => 'rdb_last_bgsave_time' } ],
output_template => 'Duration of last save: %s s',
perfdatas => [
{ label => 'last_save_duration', value => 'rdb_last_bgsave_time_absolute', template => '%s', min => 0, unit => 's' },
],
},
},
{ label => 'current-save-duration', set => {
key_values => [ { name => 'rdb_current_bgsave_time' } ],
output_template => 'Duration of current save: %s s',
perfdatas => [
{ label => 'current_save_duration', value => 'rdb_current_bgsave_time_absolute', template => '%s', min => 0, unit => 's' },
],
},
},
];
}
sub custom_status_threshold {
my ($self, %options) = @_;
my $status = 'ok';
my $message;
eval {
local $SIG{__WARN__} = sub { $message = $_[0]; };
local $SIG{__DIE__} = sub { $message = $_[0]; };
if (defined($instance_mode->{option_results}->{critical_status}) && $instance_mode->{option_results}->{critical_status} ne '' &&
eval "$instance_mode->{option_results}->{critical_status}") {
$status = 'critical';
} elsif (defined($instance_mode->{option_results}->{warning_status}) && $instance_mode->{option_results}->{warning_status} ne '' &&
eval "$instance_mode->{option_results}->{warning_status}") {
$status = 'warning';
}
};
if (defined($message)) {
$self->{output}->output_add(long_msg => 'filter status issue: ' . $message);
}
return $status;
}
sub custom_status_output {
my ($self, %options) = @_;
my $msg = sprintf("RDB save status is '%s' [progress status: %s]", $self->{result_values}->{status}, $self->{result_values}->{progress_status});
return $msg;
}
sub custom_status_calc {
my ($self, %options) = @_;
$self->{result_values}->{status} = $options{new_datas}->{$self->{instance} . '_status'};
$self->{result_values}->{progress_status} = $options{new_datas}->{$self->{instance} . '_progress_status'};
return 0;
}
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-status:s" => { name => 'warning_status', default => '%{sync_status} =~ /in progress/i' },
"critical-status:s" => { name => 'critical_status', default => '%{link_status} =~ /down/i' },
});
return $self;
}
sub check_options {
my ($self, %options) = @_;
$self->SUPER::check_options(%options);
$instance_mode = $self;
$self->change_macros();
}
sub change_macros {
my ($self, %options) = @_;
foreach (('warning_status', 'critical_status')) {
if (defined($self->{option_results}->{$_})) {
$self->{option_results}->{$_} =~ s/%\{(.*?)\}/\$self->{result_values}->{$1}/g;
}
}
}
my %map_status = (
0 => 'stopped',
1 => 'in progress',
);
sub manage_selection {
my ($self, %options) = @_;
my $results = $options{custom}->get_info();
$self->{global} = {
status => $results->{rdb_last_bgsave_status},
progress_status => $map_status{$results->{rdb_bgsave_in_progress}},
rdb_changes_since_last_save => $results->{rdb_changes_since_last_save},
rdb_last_save_time => centreon::plugins::misc::change_seconds(value => time() - $results->{rdb_last_save_time}),
rdb_last_save_time_sec => time() - $results->{rdb_last_save_time},
rdb_last_cow_size => $results->{rdb_last_cow_size},
rdb_last_bgsave_time => $results->{rdb_last_bgsave_time_sec},
rdb_current_bgsave_time => $results->{rdb_current_bgsave_time_sec}
};
}
1;
__END__
=head1 MODE
Check RDB persistence status.
=over 8
=item B<--warning-status>
Set warning threshold for status (Default: '%{progress_status} =~ /in progress/i').
Can used special variables like: %{progress_status}, %{status}
=item B<--critical-status>
Set critical threshold for status (Default: '%{status} =~ /fail/i').
Can used special variables like: %{progress_status}, %{status}
=item B<--warning-*>
Threshold warning.
Can be: 'changes', 'last-save', 'save-size',
'last-save-duration', 'current-save-duration'.
=item B<--critical-*>
Threshold critical.
Can be: 'changes', 'last-save', 'save-size',
'last-save-duration', 'current-save-duration'.
=back
=cut

View File

@ -0,0 +1,250 @@
#
# Copyright 2017 Centreon (http://www.centreon.com/)
#
# Centreon is a full-fledged industry-strength solution that meets
# the needs in IT infrastructure and application monitoring for
# service performance.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
package apps::redis::cli::mode::replication;
use base qw(centreon::plugins::templates::counter);
use strict;
use warnings;
my $instance_mode;
sub set_counters {
my ($self, %options) = @_;
$self->{maps_counters_type} = [
{ name => 'global', type => 0, skipped_code => { -10 => 1 } },
{ name => 'master', type => 0, skipped_code => { -10 => 1 } },
{ name => 'slave', type => 0, skipped_code => { -10 => 1 } },
];
$self->{maps_counters}->{global} = [
{ label => 'status', threshold => 0, set => {
key_values => [ { name => 'link_status' }, { name => 'sync_status' }, { name => 'role' }, { name => 'cluster_state' } ],
closure_custom_calc => $self->can('custom_status_calc'),
closure_custom_output => $self->can('custom_status_output'),
closure_custom_perfdata => sub { return 0; },
closure_custom_threshold_check => $self->can('custom_status_threshold'),
}
},
{ label => 'connected-slaves', set => {
key_values => [ { name => 'connected_slaves' } ],
output_template => 'Number of connected slaves: %s',
perfdatas => [
{ label => 'connected_slaves', value => 'connected_slaves_absolute', template => '%s', min => 0 },
],
},
},
];
$self->{maps_counters}->{master} = [
{ label => 'master-repl-offset', set => {
key_values => [ { name => 'master_repl_offset' } ],
output_template => 'Master replication offset: %s s',
perfdatas => [
{ label => 'master_repl_offset', value => 'master_repl_offset_absolute', template => '%s', min => 0, unit => 's' },
],
},
},
];
$self->{maps_counters}->{slave} = [
{ label => 'master-last-io', set => {
key_values => [ { name => 'master_last_io_seconds_ago' } ],
output_template => 'Last interaction with master: %s s',
perfdatas => [
{ label => 'master_last_io', value => 'master_last_io_seconds_ago_absolute', template => '%s', min => 0, unit => 's' },
],
},
},
{ label => 'slave-repl-offset', set => {
key_values => [ { name => 'slave_repl_offset' } ],
output_template => 'Slave replication offset: %s s',
perfdatas => [
{ label => 'slave_repl_offset', value => 'slave_repl_offset_absolute', template => '%s', min => 0, unit => 's' },
],
},
},
{ label => 'slave-priority', set => {
key_values => [ { name => 'slave_priority' } ],
output_template => 'Slave replication offset: %s s',
perfdatas => [
{ label => 'slave_priority', value => 'slave_priority_absolute', template => '%s' },
],
},
},
{ label => 'slave-read-only', set => {
key_values => [ { name => 'slave_read_only' } ],
output_template => 'Slave replication offset: %s s',
perfdatas => [
{ label => 'slave_read_only', value => 'slave_read_only_absolute', template => '%s' },
],
},
},
];
}
sub custom_status_threshold {
my ($self, %options) = @_;
my $status = 'ok';
my $message;
eval {
local $SIG{__WARN__} = sub { $message = $_[0]; };
local $SIG{__DIE__} = sub { $message = $_[0]; };
if (defined($instance_mode->{option_results}->{critical_status}) && $instance_mode->{option_results}->{critical_status} ne '' &&
eval "$instance_mode->{option_results}->{critical_status}") {
$status = 'critical';
} elsif (defined($instance_mode->{option_results}->{warning_status}) && $instance_mode->{option_results}->{warning_status} ne '' &&
eval "$instance_mode->{option_results}->{warning_status}") {
$status = 'warning';
}
};
if (defined($message)) {
$self->{output}->output_add(long_msg => 'filter status issue: ' . $message);
}
return $status;
}
sub custom_status_output {
my ($self, %options) = @_;
my $msg = sprintf("Node role is '%s' [cluster: %s]", $self->{result_values}->{role}, $self->{result_values}->{cluster_state});
if ($self->{result_values}->{role} eq 'slave') {
$msg .= sprintf(" [link status: %s] [sync status: %s]",
$self->{result_values}->{link_status}, $self->{result_values}->{sync_status});
}
return $msg;
}
sub custom_status_calc {
my ($self, %options) = @_;
$self->{result_values}->{role} = $options{new_datas}->{$self->{instance} . '_role'};
$self->{result_values}->{sync_status} = $options{new_datas}->{$self->{instance} . '_sync_status'};
$self->{result_values}->{link_status} = $options{new_datas}->{$self->{instance} . '_link_status'};
$self->{result_values}->{cluster_state} = $options{new_datas}->{$self->{instance} . '_cluster_state'};
return 0;
}
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-status:s" => { name => 'warning_status', default => '%{sync_status} =~ /in progress/i' },
"critical-status:s" => { name => 'critical_status', default => '%{link_status} =~ /down/i' },
});
return $self;
}
sub check_options {
my ($self, %options) = @_;
$self->SUPER::check_options(%options);
$instance_mode = $self;
$self->change_macros();
}
sub change_macros {
my ($self, %options) = @_;
foreach (('warning_status', 'critical_status')) {
if (defined($self->{option_results}->{$_})) {
$self->{option_results}->{$_} =~ s/%\{(.*?)\}/\$self->{result_values}->{$1}/g;
}
}
}
my %map_sync = (
0 => 'stopped',
1 => 'in progress',
);
my %map_cluster_state = (
0 => 'disabled',
1 => 'enabled',
);
sub manage_selection {
my ($self, %options) = @_;
my $results = $options{custom}->get_info();
$self->{global} = {
connected_slaves => $results->{connected_slaves},
role => $results->{role},
cluster_state => defined($results->{cluster_enabled}) ? $map_cluster_state{$results->{cluster_enabled}} : '-',
link_status => defined($results->{master_link_status}) ? $results->{master_link_status} : '-',
sync_status => defined($results->{master_sync_in_progress}) ? $map_sync{$results->{master_sync_in_progress}} : '-',
};
$self->{master} = { master_repl_offset => $results->{master_repl_offset} };
$self->{slave} = {
master_last_io_seconds_ago => $results->{master_last_io_seconds_ago},
slave_repl_offset => $results->{slave_repl_offset},
slave_priority => $results->{slave_priority},
slave_read_only => $results->{slave_read_only},
};
}
1;
__END__
=head1 MODE
Check replication status.
=over 8
=item B<--warning-status>
Set warning threshold for status (Default: '%{sync_status} =~ /in progress/i').
Can used special variables like: %{sync_status}, %{link_status}, %{cluster_state}
=item B<--critical-status>
Set critical threshold for status (Default: '%{link_status} =~ /down/i').
Can used special variables like: %{sync_status}, %{link_status}, %{cluster_state}
=item B<--warning-*>
Threshold warning.
Can be: 'connected-slaves', 'master-repl-offset',
'master-last-io', 'slave-priority', 'slave-read-only'.
=item B<--critical-*>
Threshold critical.
Can be: 'connected-slaves', 'master-repl-offset',
'master-last-io', 'slave-priority', 'slave-read-only'.
=back
=cut

View File

@ -0,0 +1,59 @@
#
# Copyright 2017 Centreon (http://www.centreon.com/)
#
# Centreon is a full-fledged industry-strength solution that meets
# the needs in IT infrastructure and application monitoring for
# service performance.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
package apps::redis::cli::plugin;
use strict;
use warnings;
use base qw(centreon::plugins::script_custom);
sub new {
my ($class, %options) = @_;
my $self = $class->SUPER::new(package => __PACKAGE__, %options);
bless $self, $class;
$self->{version} = '1.0';
%{$self->{modes}} = (
'clients' => 'apps::redis::cli::mode::clients',
'commands' => 'apps::redis::cli::mode::commands',
'connections' => 'apps::redis::cli::mode::connections',
'cpu' => 'apps::redis::cli::mode::cpu',
'memory' => 'apps::redis::cli::mode::memory',
'persistence' => 'apps::redis::cli::mode::persistence',
'replication' => 'apps::redis::cli::mode::replication',
);
$self->{custom_modes}{rediscli} = 'apps::redis::cli::custom::rediscli';
return $self;
}
sub init {
my ($self, %options) = @_;
$self->SUPER::init(%options);
}
1;
__END__
=head1 PLUGIN DESCRIPTION
Check Redis server through Perl Cli binding library.

View File

@ -0,0 +1,245 @@
#
# Copyright 2017 Centreon (http://www.centreon.com/)
#
# Centreon is a full-fledged industry-strength solution that meets
# the needs in IT infrastructure and application monitoring for
# service performance.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
package apps::redis::restapi::custom::api;
use strict;
use warnings;
use centreon::plugins::http;
use JSON::XS;
sub new {
my ($class, %options) = @_;
my $self = {};
bless $self, $class;
if (!defined($options{output})) {
print "Class Custom: Need to specify 'output' argument.\n";
exit 3;
}
if (!defined($options{options})) {
$options{output}->add_option_msg(short_msg => "Class Custom: Need to specify 'options' argument.");
$options{output}->option_exit();
}
if (!defined($options{noptions})) {
$options{options}->add_options(arguments =>
{
"interval:s@" => { name => 'interval' },
"hostname:s@" => { name => 'hostname' },
"port:s@" => { name => 'port' },
"proto:s@" => { name => 'proto' },
"username:s@" => { name => 'username' },
"password:s@" => { name => 'password' },
"proxyurl:s@" => { name => 'proxyurl' },
"timeout:s@" => { name => 'timeout' },
"ssl:s@" => { name => 'ssl' },
});
}
$options{options}->add_help(package => __PACKAGE__, sections => 'REST API OPTIONS', once => 1);
$self->{output} = $options{output};
$self->{mode} = $options{mode};
$self->{http} = centreon::plugins::http->new(output => $self->{output});
return $self;
}
sub set_options {
my ($self, %options) = @_;
$self->{option_results} = $options{option_results};
}
sub set_defaults {
my ($self, %options) = @_;
foreach (keys %{$options{default}}) {
if ($_ eq $self->{mode}) {
for (my $i = 0; $i < scalar(@{$options{default}->{$_}}); $i++) {
foreach my $opt (keys %{$options{default}->{$_}[$i]}) {
if (!defined($self->{option_results}->{$opt}[$i])) {
$self->{option_results}->{$opt}[$i] = $options{default}->{$_}[$i]->{$opt};
}
}
}
}
}
}
sub check_options {
my ($self, %options) = @_;
$self->{hostname} = (defined($self->{option_results}->{hostname})) ? shift(@{$self->{option_results}->{hostname}}) : undef;
$self->{port} = (defined($self->{option_results}->{port})) ? shift(@{$self->{option_results}->{port}}) : 9443;
$self->{proto} = (defined($self->{option_results}->{proto})) ? shift(@{$self->{option_results}->{proto}}) : 'https';
$self->{username} = (defined($self->{option_results}->{username})) ? shift(@{$self->{option_results}->{username}}) : '';
$self->{password} = (defined($self->{option_results}->{password})) ? shift(@{$self->{option_results}->{password}}) : '';
$self->{timeout} = (defined($self->{option_results}->{timeout})) ? shift(@{$self->{option_results}->{timeout}}) : 10;
$self->{proxyurl} = (defined($self->{option_results}->{proxyurl})) ? shift(@{$self->{option_results}->{proxyurl}}) : undef;
$self->{ssl} = (defined($self->{option_results}->{ssl})) ? shift(@{$self->{option_results}->{ssl}}) : 'tlsv1';
$self->{interval} = (defined($self->{option_results}->{interval})) ? shift(@{$self->{option_results}->{interval}}) : '15min';
if (!defined($self->{hostname})) {
$self->{output}->add_option_msg(short_msg => "Need to specify hostname option.");
$self->{output}->option_exit();
}
if (!defined($self->{hostname}) ||
scalar(@{$self->{option_results}->{hostname}}) == 0) {
return 0;
}
return 1;
}
sub build_options_for_httplib {
my ($self, %options) = @_;
$self->{option_results}->{hostname} = $self->{hostname};
$self->{option_results}->{timeout} = $self->{timeout};
$self->{option_results}->{port} = $self->{port};
$self->{option_results}->{proto} = $self->{proto};
$self->{option_results}->{proxyurl} = $self->{proxyurl};
$self->{option_results}->{credentials} = 1;
$self->{option_results}->{username} = $self->{username};
$self->{option_results}->{password} = $self->{password};
$self->{option_results}->{ssl} = $self->{ssl};
$self->{option_results}->{warning_status} = '';
$self->{option_results}->{critical_status} = '';
}
sub settings {
my ($self, %options) = @_;
$self->build_options_for_httplib();
$self->{http}->set_options(%{$self->{option_results}});
}
sub get_connection_info {
my ($self, %options) = @_;
return $self->{hostname} . ":" . $self->{port};
}
sub get_interval {
my ($self, %options) = @_;
return $self->{interval};
}
sub get {
my ($self, %options) = @_;
$self->settings();
my $response = $self->{http}->request(url_path => $options{path});
my $content;
eval {
$content = JSON::XS->new->utf8->decode($response);
};
if ($@) {
$self->{output}->add_option_msg(short_msg => "Cannot decode json response: $@");
$self->{output}->option_exit();
}
my $return;
if (ref($content) eq 'ARRAY') {
foreach my $uid (@$content) {
if (defined($uid->{errmsg})) {
$self->{output}->add_option_msg(short_msg => "Cannot get data: " . $uid->{errmsg});
$self->{output}->option_exit();
}
$return->{$uid->{uid}} = $uid;
}
} else {
if (defined($content->{errmsg})) {
$self->{output}->add_option_msg(short_msg => "Cannot get data: " . $content->{errmsg});
$self->{output}->option_exit();
}
$return = $content;
}
return $return;
}
1;
__END__
=head1 NAME
RedisLabs Enterprise Cluster REST API
=head1 SYNOPSIS
RedisLabs Enterprise Cluster Rest API custom mode
=head1 REST API OPTIONS
=over 8
=item B<--interval>
Time interval from which to retrieve statistics (Default: '15min').
Can be : '1sec', '10sec', '5min', '15min',
'1hour', '12hour', '1week'.
=item B<--hostname>
Cluster hostname.
=item B<--port>
Port used (Default: 9443)
=item B<--proto>
Specify https if needed (Default: 'https')
=item B<--username>
Cluster username.
=item B<--password>
Cluster password.
=item B<--proxyurl>
Proxy URL if any
=item B<--timeout>
Set HTTP timeout
=item B<--ssl>
SSL version (Default: tlsv1)
=back
=head1 DESCRIPTION
B<custom>.
=cut

View File

@ -0,0 +1,334 @@
#
# Copyright 2017 Centreon (http://www.centreon.com/)
#
# Centreon is a full-fledged industry-strength solution that meets
# the needs in IT infrastructure and application monitoring for
# service performance.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
package apps::redis::restapi::mode::clusterstats;
use base qw(centreon::plugins::templates::counter);
use strict;
use warnings;
use Digest::MD5 qw(md5_hex);
my $instance_mode;
sub custom_usage_perfdata {
my ($self, %options) = @_;
$self->{output}->perfdata_add(label => $self->{result_values}->{perf}, unit => 'B',
value => $self->{result_values}->{used},
warning => $self->{perfdata}->get_perfdata_for_output(label => 'warning-' . $self->{result_values}->{label}, total => $self->{result_values}->{total}, cast_int => 1),
critical => $self->{perfdata}->get_perfdata_for_output(label => 'critical-' . $self->{result_values}->{label}, total => $self->{result_values}->{total}, cast_int => 1),
min => 0, max => $self->{result_values}->{total});
}
sub custom_usage_threshold {
my ($self, %options) = @_;
my ($exit, $threshold_value);
$threshold_value = $self->{result_values}->{used};
$threshold_value = $self->{result_values}->{free} if (defined($instance_mode->{option_results}->{free}));
if ($instance_mode->{option_results}->{units} eq '%') {
$threshold_value = $self->{result_values}->{prct_used};
$threshold_value = $self->{result_values}->{prct_free} if (defined($instance_mode->{option_results}->{free}));
}
$exit = $self->{perfdata}->threshold_check(value => $threshold_value, threshold => [ { label => 'critical-' . $self->{result_values}->{label}, exit_litteral => 'critical' }, { label => 'warning-' . $self->{result_values}->{label}, exit_litteral => 'warning' } ]);
return $exit;
}
sub custom_usage_output {
my ($self, %options) = @_;
my ($used_value, $used_unit) = $self->{perfdata}->change_bytes(value => $self->{result_values}->{used});
my ($free_value, $free_unit) = $self->{perfdata}->change_bytes(value => $self->{result_values}->{free});
my ($total_value, $total_unit) = $self->{perfdata}->change_bytes(value => $self->{result_values}->{total});
my $msg = sprintf("%s usage: Total: %s Used: %s (%.2f%%) Free: %s (%.2f%%)", $self->{result_values}->{display},
$total_value . " " . $total_unit,
$used_value . " " . $used_unit, $self->{result_values}->{prct_used},
$free_value . " " . $free_unit, $self->{result_values}->{prct_free});
return $msg;
}
sub custom_usage_calc {
my ($self, %options) = @_;
$self->{result_values}->{label} = $options{extra_options}->{label};
$self->{result_values}->{perf} = $options{extra_options}->{perf};
$self->{result_values}->{display} = $options{extra_options}->{display};
$self->{result_values}->{free} = $options{new_datas}->{$self->{instance} . '_' . $options{extra_options}->{free}};
$self->{result_values}->{total} = $options{new_datas}->{$self->{instance} . '_' . $options{extra_options}->{total}};
if ($self->{result_values}->{total} != 0) {
$self->{result_values}->{used} = $self->{result_values}->{total} - $self->{result_values}->{free};
$self->{result_values}->{prct_used} = $self->{result_values}->{used} * 100 / $self->{result_values}->{total};
$self->{result_values}->{prct_free} = 100 - $self->{result_values}->{prct_used};
} else {
$self->{result_values}->{used} = '0';
$self->{result_values}->{prct_used} = '0';
$self->{result_values}->{prct_free} = '0';
}
return 0;
}
sub prefix_output {
my ($self, %options) = @_;
return "Cluster '" . $options{instance_value}->{name} . "' ";
}
sub set_counters {
my ($self, %options) = @_;
$self->{maps_counters_type} = [
{ name => 'cluster', type => 1, cb_prefix_output => 'prefix_output', message_multiple => 'All cluster counters are ok' },
];
$self->{maps_counters}->{cluster} = [
{ label => 'cpu-system', set => {
key_values => [ { name => 'cpu_system' } ],
output_template => 'Cpu system: %.2f %%',
perfdatas => [
{ label => 'cpu_system', value => 'cpu_system_absolute', template => '%.2f',
min => 0, max => 100, unit => '%' },
],
}
},
{ label => 'cpu-user', set => {
key_values => [ { name => 'cpu_user' } ],
output_template => 'Cpu user: %.2f %%',
perfdatas => [
{ label => 'cpu_user', value => 'cpu_user_absolute', template => '%.2f',
min => 0, max => 100, unit => '%' },
],
}
},
{ label => 'memory', set => {
key_values => [ { name => 'free_memory' }, { name => 'total_memory' } ],
closure_custom_calc => $self->can('custom_usage_calc'),
closure_custom_calc_extra_options => { display => 'Ram', label => 'memory', perf => 'memory',
free => 'free_memory', total => 'total_memory' },
closure_custom_output => $self->can('custom_usage_output'),
closure_custom_perfdata => $self->can('custom_usage_perfdata'),
closure_custom_threshold_check => $self->can('custom_usage_threshold'),
}
},
{ label => 'persistent-storage', set => {
key_values => [ { name => 'persistent_storage_free' }, { name => 'persistent_storage_size' } ],
closure_custom_calc => $self->can('custom_usage_calc'),
closure_custom_calc_extra_options => { display => 'Persistent storage', label => 'persistent-storage', perf => 'persistent_storage',
free => 'persistent_storage_free', total => 'persistent_storage_size' },
closure_custom_output => $self->can('custom_usage_output'),
closure_custom_perfdata => $self->can('custom_usage_perfdata'),
closure_custom_threshold_check => $self->can('custom_usage_threshold'),
}
},
{ label => 'ephemeral-storage', set => {
key_values => [ { name => 'ephemeral_storage_free' }, { name => 'ephemeral_storage_size' } ],
closure_custom_calc => $self->can('custom_usage_calc'),
closure_custom_calc_extra_options => { display => 'Ephemeral storage', label => 'ephemeral-storage', perf => 'ephemeral_storage',
free => 'ephemeral_storage_free', total => 'ephemeral_storage_size' },
closure_custom_output => $self->can('custom_usage_output'),
closure_custom_perfdata => $self->can('custom_usage_perfdata'),
closure_custom_threshold_check => $self->can('custom_usage_threshold'),
}
},
{ label => 'flash-storage', set => {
key_values => [ { name => 'bigstore_free' }, { name => 'bigstore_size' } ],
closure_custom_calc => $self->can('custom_usage_calc'),
closure_custom_calc_extra_options => { display => 'Flash storage', label => 'flash-storage', perf => 'flash_storage',
free => 'bigstore_free', total => 'bigstore_size' },
closure_custom_output => $self->can('custom_usage_output'),
closure_custom_perfdata => $self->can('custom_usage_perfdata'),
closure_custom_threshold_check => $self->can('custom_usage_threshold'),
}
},
{ label => 'flash-iops', set => {
key_values => [ { name => 'bigstore_iops' } ],
output_template => 'Flash IOPS: %s ops/s',
perfdatas => [
{ label => 'flash_iops', value => 'bigstore_iops_absolute', template => '%s',
min => 0, unit => 'ops/s' },
],
}
},
{ label => 'flash-throughput', set => {
key_values => [ { name => 'bigstore_throughput' } ],
output_template => 'Flash throughput: %s %s/s',
output_change_bytes => 1,
perfdatas => [
{ label => 'flash_throughput', value => 'bigstore_throughput_absolute', template => '%s',
min => 0, unit => 'B/s' },
],
}
},
{ label => 'connections', set => {
key_values => [ { name => 'conns' } ],
output_template => 'Connections: %s',
perfdatas => [
{ label => 'connections', value => 'conns_absolute', template => '%s',
min => 0 },
],
}
},
{ label => 'requests', set => {
key_values => [ { name => 'total_req' } ],
output_template => 'Requests rate: %s ops/s',
perfdatas => [
{ label => 'requests', value => 'total_req_absolute', template => '%s',
min => 0, unit => 'ops/s' },
],
}
},
{ label => 'traffic-in', set => {
key_values => [ { name => 'ingress' } ],
output_template => 'Traffic In: %s %s/s',
output_change_bytes => 2,
perfdatas => [
{ label => 'traffic_in', value => 'ingress_absolute', template => '%d', min => 0, unit => 'b/s' },
],
},
},
{ label => 'traffic-out', set => {
key_values => [ { name => 'egress' } ],
output_template => 'Traffic Out: %s %s/s',
output_change_bytes => 2,
perfdatas => [
{ label => 'traffic_out', value => 'egress_absolute', template => '%d', min => 0, unit => 'b/s' },
],
},
},
];
}
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 =>
{
"units:s" => { name => 'units', default => '%' },
"free" => { name => 'free' },
});
return $self;
}
sub check_options {
my ($self, %options) = @_;
$self->SUPER::check_options(%options);
$instance_mode = $self;
}
sub manage_selection {
my ($self, %options) = @_;
my $result = $options{custom}->get(path => '/v1/cluster/stats/last?interval='.$options{custom}->get_interval());
my $result2 = $options{custom}->get(path => '/v1/cluster');
my $result3 = $options{custom}->get(path => '/v1/nodes');
my $total_memory = 0;
my $persistent_storage_size = 0;
my $ephemeral_storage_size = 0;
my $bigstore_size = 0;
foreach my $node (keys $result3) {
if (defined($result3->{$node}->{total_memory})) {
$total_memory = $total_memory + $result3->{$node}->{total_memory};
}
if (defined($result3->{$node}->{persistent_storage_size})) {
$persistent_storage_size = $persistent_storage_size + $result3->{$node}->{persistent_storage_size};
}
if (defined($result3->{$node}->{ephemeral_storage_size})) {
$ephemeral_storage_size = $ephemeral_storage_size + $result3->{$node}->{ephemeral_storage_size};
}
if (defined($result3->{$node}->{bigstore_size})) {
$bigstore_size = $bigstore_size + $result3->{$node}->{bigstore_size};
}
}
$self->{cluster}->{$result2->{name}} = {
name => $result2->{name},
cpu_system => $result->{cpu_system} * 100,
cpu_user => $result->{cpu_user} * 100,
free_memory => $result->{free_memory},
total_memory => $total_memory,
persistent_storage_free => $result->{persistent_storage_free},
persistent_storage_size => $persistent_storage_size,
ephemeral_storage_free => $result->{ephemeral_storage_free},
ephemeral_storage_size => $ephemeral_storage_size,
bigstore_free => $result->{bigstore_free},
bigstore_size => $bigstore_size,
bigstore_iops => $result->{bigstore_iops},
bigstore_kv_ops => $result->{bigstore_kv_ops},
bigstore_throughput => $result->{bigstore_throughput},
conns => $result->{conns},
total_req => $result->{total_req},
ingress => $result->{ingress_bytes} * 8,
egress => $result->{egress_bytes} * 8,
};
}
1;
__END__
=head1 MODE
Check RedisLabs Enterprise Cluster statistics.
=over 8
=item B<--filter-counters>
Only display some counters (regexp can be used).
Example: --filter-counters='^cpu'
=item B<--units>
Units of thresholds (Default: '%') ('%', 'B').
=item B<--free>
Thresholds are on free space left.
=item B<--warning-*>
Threshold warning.
Can be: 'cpu-system', 'cpu-user',
'requests', 'memory', 'flash-storage',
'persistent-storage', 'ephemeral-storage',
'flash-iops', 'flash-throughput', 'connections',
'traffic-in', 'traffic-out'.
=item B<--critical-*>
Threshold critical.
Can be: 'cpu-system', 'cpu-user',
'requests', 'memory', 'flash-storage',
'persistent-storage', 'ephemeral-storage',
'flash-iops', 'flash-throughput', 'connections',
'traffic-in', 'traffic-out'.
=back
=cut

View File

@ -0,0 +1,610 @@
#
# Copyright 2017 Centreon (http://www.centreon.com/)
#
# Centreon is a full-fledged industry-strength solution that meets
# the needs in IT infrastructure and application monitoring for
# service performance.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
package apps::redis::restapi::mode::databasesstats;
use base qw(centreon::plugins::templates::counter);
use strict;
use warnings;
use Digest::MD5 qw(md5_hex);
my $instance_mode;
sub custom_usage_perfdata {
my ($self, %options) = @_;
$self->{output}->perfdata_add(label => $self->{result_values}->{perf}, unit => 'B',
value => $self->{result_values}->{used},
warning => $self->{perfdata}->get_perfdata_for_output(label => 'warning-' . $self->{result_values}->{label}, total => $self->{result_values}->{total}, cast_int => 1),
critical => $self->{perfdata}->get_perfdata_for_output(label => 'critical-' . $self->{result_values}->{label}, total => $self->{result_values}->{total}, cast_int => 1),
min => 0, max => $self->{result_values}->{total});
}
sub custom_usage_threshold {
my ($self, %options) = @_;
my ($exit, $threshold_value);
$threshold_value = $self->{result_values}->{used};
$threshold_value = $self->{result_values}->{free} if (defined($instance_mode->{option_results}->{free}));
if ($instance_mode->{option_results}->{units} eq '%') {
$threshold_value = $self->{result_values}->{prct_used};
$threshold_value = $self->{result_values}->{prct_free} if (defined($instance_mode->{option_results}->{free}));
}
$exit = $self->{perfdata}->threshold_check(value => $threshold_value, threshold => [ { label => 'critical-' . $self->{result_values}->{label}, exit_litteral => 'critical' }, { label => 'warning-' . $self->{result_values}->{label}, exit_litteral => 'warning' } ]);
return $exit;
}
sub custom_usage_output {
my ($self, %options) = @_;
my ($used_value, $used_unit) = $self->{perfdata}->change_bytes(value => $self->{result_values}->{used});
my ($free_value, $free_unit) = $self->{perfdata}->change_bytes(value => $self->{result_values}->{free});
my ($total_value, $total_unit) = $self->{perfdata}->change_bytes(value => $self->{result_values}->{total});
my $msg = sprintf("%s usage: Total: %s Used: %s (%.2f%%) Free: %s (%.2f%%)", $self->{result_values}->{display},
$total_value . " " . $total_unit,
$used_value . " " . $used_unit, $self->{result_values}->{prct_used},
$free_value . " " . $free_unit, $self->{result_values}->{prct_free});
return $msg;
}
sub custom_usage_calc {
my ($self, %options) = @_;
$self->{result_values}->{label} = $options{extra_options}->{label};
$self->{result_values}->{perf} = $options{extra_options}->{perf};
$self->{result_values}->{display} = $options{extra_options}->{display};
$self->{result_values}->{used} = $options{new_datas}->{$self->{instance} . '_' . $options{extra_options}->{used}};
$self->{result_values}->{total} = $options{new_datas}->{$self->{instance} . '_' . $options{extra_options}->{total}};
if ($self->{result_values}->{total} != 0) {
$self->{result_values}->{free} = $self->{result_values}->{total} - $self->{result_values}->{used};
$self->{result_values}->{prct_used} = $self->{result_values}->{used} * 100 / $self->{result_values}->{total};
$self->{result_values}->{prct_free} = 100 - $self->{result_values}->{prct_used};
} else {
$self->{result_values}->{used} = '0';
$self->{result_values}->{prct_used} = '0';
$self->{result_values}->{prct_free} = '0';
}
return 0;
}
sub custom_status_threshold {
my ($self, %options) = @_;
my $status = 'ok';
my $message;
eval {
local $SIG{__WARN__} = sub { $message = $_[0]; };
local $SIG{__DIE__} = sub { $message = $_[0]; };
if (defined($instance_mode->{option_results}->{critical_status}) && $instance_mode->{option_results}->{critical_status} ne '' &&
eval "$instance_mode->{option_results}->{critical_status}") {
$status = 'critical';
} elsif (defined($instance_mode->{option_results}->{warning_status}) && $instance_mode->{option_results}->{warning_status} ne '' &&
eval "$instance_mode->{option_results}->{warning_status}") {
$status = 'warning';
}
};
if (defined($message)) {
$self->{output}->output_add(long_msg => 'filter status issue: ' . $message);
}
return $status;
}
sub custom_status_output {
my ($self, %options) = @_;
my $msg = sprintf("Status is '%s' [type: %s] [shard list: %s] [backup status: %s] [export status: %s] [import status: %s]",
$self->{result_values}->{status},
$self->{result_values}->{type},
$self->{result_values}->{shard_list},
$self->{result_values}->{backup_status},
$self->{result_values}->{export_status},
$self->{result_values}->{import_status});
return $msg;
}
sub custom_status_calc {
my ($self, %options) = @_;
$self->{result_values}->{type} = $options{new_datas}->{$self->{instance} . '_type'};
$self->{result_values}->{status} = $options{new_datas}->{$self->{instance} . '_status'};
$self->{result_values}->{backup_status} = $options{new_datas}->{$self->{instance} . '_backup_status'};
$self->{result_values}->{export_status} = $options{new_datas}->{$self->{instance} . '_export_status'};
$self->{result_values}->{import_status} = $options{new_datas}->{$self->{instance} . '_import_status'};
$self->{result_values}->{shard_list} = $options{new_datas}->{$self->{instance} . '_shard_list'};
$self->{result_values}->{display} = $options{new_datas}->{$self->{instance} . '_display'};
return 0;
}
sub custom_cpu_output {
my ($self, %options) = @_;
my $msg = sprintf("%s CPU usage (user/system): %s/%s %%",
$self->{result_values}->{cpu},
$self->{result_values}->{user},
$self->{result_values}->{system});
return $msg;
}
sub custom_cpu_calc {
my ($self, %options) = @_;
$self->{result_values}->{display} = $options{new_datas}->{$self->{instance} . '_' . $options{extra_options}->{display}};
$self->{result_values}->{cpu} = $options{extra_options}->{cpu};
$self->{result_values}->{user} = $options{new_datas}->{$self->{instance} . '_' . $options{extra_options}->{user}};
$self->{result_values}->{system} = $options{new_datas}->{$self->{instance} . '_' . $options{extra_options}->{system}};
return 0;
}
sub custom_operations_output {
my ($self, %options) = @_;
my $msg = sprintf("%s operations rates (hits/misses/requests/responses): %s/%s/%s/%s ops/s",
$self->{result_values}->{operation},
$self->{result_values}->{hits},
$self->{result_values}->{misses},
$self->{result_values}->{req},
$self->{result_values}->{res});
return $msg;
}
sub custom_operations_calc {
my ($self, %options) = @_;
$self->{result_values}->{display} = $options{new_datas}->{$self->{instance} . '_' . $options{extra_options}->{display}};
$self->{result_values}->{operation} = $options{extra_options}->{operation};
$self->{result_values}->{hits} = $options{new_datas}->{$self->{instance} . '_' . $options{extra_options}->{hits}};
$self->{result_values}->{misses} = $options{new_datas}->{$self->{instance} . '_' . $options{extra_options}->{misses}};
$self->{result_values}->{req} = $options{new_datas}->{$self->{instance} . '_' . $options{extra_options}->{req}};
$self->{result_values}->{res} = $options{new_datas}->{$self->{instance} . '_' . $options{extra_options}->{res}};
return 0;
}
sub prefix_output {
my ($self, %options) = @_;
return "Database '" . $options{instance_value}->{display} . "' ";
}
sub set_counters {
my ($self, %options) = @_;
$self->{maps_counters_type} = [
{ name => 'databases', type => 1, cb_prefix_output => 'prefix_output', message_multiple => 'All databases counters are ok' },
];
$self->{maps_counters}->{databases} = [
{ label => 'status', threshold => 0, set => {
key_values => [ { name => 'status' }, { name => 'type' }, { name => 'backup_status' },
{ name => 'export_status' }, { name => 'import_status' }, { name => 'shard_list' }, { name => 'display' } ],
closure_custom_calc => $self->can('custom_status_calc'),
closure_custom_output => $self->can('custom_status_output'),
closure_custom_perfdata => sub { return 0; },
closure_custom_threshold_check => $self->can('custom_status_threshold'),
}
},
{ label => 'total-cpu', set => {
key_values => [ { name => 'shard_cpu_user' }, { name => 'shard_cpu_system' }, { name => 'display' } ],
closure_custom_calc => $self->can('custom_cpu_calc'),
closure_custom_calc_extra_options => { cpu => 'Total', user => 'shard_cpu_user',
system => 'shard_cpu_system', display => 'display' },
closure_custom_output => $self->can('custom_cpu_output'),
perfdatas => [
{ label => 'total_cpu_user', value => 'user', template => '%s',
min => 0, max => 100, unit => '%', label_extra_instance => 1, instance_use => 'display' },
{ label => 'total_cpu_system', value => 'system', template => '%s',
min => 0, max => 100, unit => '%', label_extra_instance => 1, instance_use => 'display' },
],
}
},
{ label => 'fork-cpu', set => {
key_values => [ { name => 'fork_cpu_user' }, { name => 'fork_cpu_system' }, { name => 'display' } ],
closure_custom_calc => $self->can('custom_cpu_calc'),
closure_custom_calc_extra_options => { cpu => 'Fork', user => 'fork_cpu_user',
system => 'fork_cpu_system', display => 'display' },
closure_custom_output => $self->can('custom_cpu_output'),
perfdatas => [
{ label => 'fork_cpu_user', value => 'user', template => '%s',
min => 0, max => 100, unit => '%', label_extra_instance => 1, instance_use => 'display' },
{ label => 'fork_cpu_system', value => 'system', template => '%s',
min => 0, max => 100, unit => '%', label_extra_instance => 1, instance_use => 'display' },
],
}
},
{ label => 'main-thread-cpu', set => {
key_values => [ { name => 'main_thread_cpu_user' }, { name => 'main_thread_cpu_system' }, { name => 'display' } ],
closure_custom_calc => $self->can('custom_cpu_calc'),
closure_custom_calc_extra_options => { cpu => 'Main thread', user => 'main_thread_cpu_user',
system => 'main_thread_cpu_system', display => 'display' },
closure_custom_output => $self->can('custom_cpu_output'),
perfdatas => [
{ label => 'main_thread_cpu_user', value => 'user', template => '%s',
min => 0, max => 100, unit => '%', label_extra_instance => 1, instance_use => 'display' },
{ label => 'main_thread_cpu_system', value => 'system', template => '%s',
min => 0, max => 100, unit => '%', label_extra_instance => 1, instance_use => 'display' },
],
}
},
{ label => 'memory', set => {
key_values => [ { name => 'used_memory' }, { name => 'memory_size' } ],
closure_custom_calc => $self->can('custom_usage_calc'),
closure_custom_calc_extra_options => { display => 'Memory', label => 'memory', perf => 'memory',
used => 'used_memory', total => 'memory_size' },
closure_custom_output => $self->can('custom_usage_output'),
closure_custom_perfdata => $self->can('custom_usage_perfdata'),
closure_custom_threshold_check => $self->can('custom_usage_threshold'),
}
},
{ label => 'mem-frag-ratio', set => {
key_values => [ { name => 'mem_frag_ratio' }, { name => 'display' } ],
output_template => 'Memory fragmentation ratio: %s',
perfdatas => [
{ label => 'mem_frag_ratio', value => 'mem_frag_ratio_absolute', template => '%s',
min => 0, label_extra_instance => 1, instance_use => 'display_absolute' },
],
}
},
{ label => 'connections', set => {
key_values => [ { name => 'conns' }, { name => 'display' } ],
output_template => 'Connections: %s',
perfdatas => [
{ label => 'connections', value => 'conns_absolute', template => '%s',
min => 0, label_extra_instance => 1, instance_use => 'display_absolute' },
],
}
},
{ label => 'total-rates', set => {
key_values => [ { name => 'total_hits' }, { name => 'total_misses' },
{ name => 'total_req' }, { name => 'total_res' }, { name => 'display' } ],
closure_custom_calc => $self->can('custom_operations_calc'),
closure_custom_calc_extra_options => { operation => 'Total', hits => 'total_hits', misses => 'total_misses',
req => 'total_req', res => 'total_res', display => 'display' },
closure_custom_output => $self->can('custom_operations_output'),
perfdatas => [
{ label => 'total_hits', value => 'hits', template => '%s',
min => 0, unit => 'ops/s', label_extra_instance => 1, instance_use => 'display' },
{ label => 'total_misses', value => 'misses', template => '%s',
min => 0, unit => 'ops/s', label_extra_instance => 1, instance_use => 'display' },
{ label => 'total_req', value => 'req', template => '%s',
min => 0, unit => 'ops/s', label_extra_instance => 1, instance_use => 'display' },
{ label => 'total_res', value => 'res', template => '%s',
min => 0, unit => 'ops/s', label_extra_instance => 1, instance_use => 'display' },
],
}
},
{ label => 'latency', set => {
key_values => [ { name => 'avg_latency' }, { name => 'display' } ],
output_template => 'Average latency: %.2f ms',
perfdatas => [
{ label => 'latency', value => 'avg_latency_absolute', template => '%.2f',
min => 0, unit => 'ms', label_extra_instance => 1, instance_use => 'display_absolute' },
],
}
},
{ label => 'other-rates', set => {
key_values => [ { name => 'other_hits' }, { name => 'other_misses' },
{ name => 'other_req' }, { name => 'other_res' }, { name => 'display' } ],
closure_custom_calc => $self->can('custom_operations_calc'),
closure_custom_calc_extra_options => { operation => 'Other', hits => 'other_hits', misses => 'other_misses',
req => 'other_req', res => 'other_res', display => 'display' },
closure_custom_output => $self->can('custom_operations_output'),
perfdatas => [
{ label => 'other_req', value => 'req', template => '%s',
min => 0, unit => 'ops/s', label_extra_instance => 1, instance_use => 'display' },
{ label => 'other_res', value => 'res', template => '%s',
min => 0, unit => 'ops/s', label_extra_instance => 1, instance_use => 'display' },
],
}
},
{ label => 'other-latency', set => {
key_values => [ { name => 'avg_other_latency' }, { name => 'display' } ],
output_template => 'Other latency: %.2f ms',
perfdatas => [
{ label => 'other_latency', value => 'avg_other_latency_absolute', template => '%.2f',
min => 0, unit => 'ms', label_extra_instance => 1, instance_use => 'display_absolute' },
],
}
},
{ label => 'keys', set => {
key_values => [ { name => 'no_of_keys' }, { name => 'display' } ],
output_template => 'Total keys: %s',
perfdatas => [
{ label => 'keys', value => 'no_of_keys_absolute', template => '%s',
min => 0, label_extra_instance => 1, instance_use => 'display_absolute' },
],
}
},
{ label => 'evicted-objects', set => {
key_values => [ { name => 'evicted_objects' }, { name => 'display' } ],
output_template => 'Evicted objects rate: %s evictions/sec',
perfdatas => [
{ label => 'evicted_objects', value => 'evicted_objects_absolute', template => '%s',
min => 0, unit => 'evictions/sec', label_extra_instance => 1, instance_use => 'display_absolute' },
],
}
},
{ label => 'expired-objects', set => {
key_values => [ { name => 'expired_objects' }, { name => 'display' } ],
output_template => 'Expired objects rate: %s expirations/sec',
perfdatas => [
{ label => 'expired_objects', value => 'expired_objects_absolute', template => '%s',
min => 0, unit => 'expirations/sec', label_extra_instance => 1, instance_use => 'display_absolute' },
],
}
},
{ label => 'read-rates', set => {
key_values => [ { name => 'read_hits' }, { name => 'read_misses' },
{ name => 'read_req' }, { name => 'read_res' }, { name => 'display' } ],
closure_custom_calc => $self->can('custom_operations_calc'),
closure_custom_calc_extra_options => { operation => 'Read', hits => 'read_hits', misses => 'read_misses',
req => 'read_req', res => 'read_res', display => 'display' },
closure_custom_output => $self->can('custom_operations_output'),
perfdatas => [
{ label => 'read_hits', value => 'hits', template => '%s',
min => 0, unit => 'ops/s', label_extra_instance => 1, instance_use => 'display' },
{ label => 'read_misses', value => 'misses', template => '%s',
min => 0, unit => 'ops/s', label_extra_instance => 1, instance_use => 'display' },
{ label => 'read_req', value => 'req', template => '%s',
min => 0, unit => 'ops/s', label_extra_instance => 1, instance_use => 'display' },
{ label => 'read_res', value => 'res', template => '%s',
min => 0, unit => 'ops/s', label_extra_instance => 1, instance_use => 'display' },
],
}
},
{ label => 'read-latency', set => {
key_values => [ { name => 'avg_read_latency' }, { name => 'display' } ],
output_template => 'Read latency: %.2f ms',
perfdatas => [
{ label => 'read_latency', value => 'avg_read_latency_absolute', template => '%.2f',
min => 0, unit => 'ms', label_extra_instance => 1, instance_use => 'display_absolute' },
],
}
},
{ label => 'write-rates', set => {
key_values => [ { name => 'write_hits' }, { name => 'write_misses' },
{ name => 'write_req' }, { name => 'write_res' }, { name => 'display' } ],
closure_custom_calc => $self->can('custom_operations_calc'),
closure_custom_calc_extra_options => { operation => 'Write', hits => 'write_hits', misses => 'write_misses',
req => 'write_req', res => 'write_res', display => 'display' },
closure_custom_output => $self->can('custom_operations_output'),
perfdatas => [
{ label => 'write_hits', value => 'hits', template => '%s',
min => 0, unit => 'ops/s', label_extra_instance => 1, instance_use => 'display' },
{ label => 'write_misses', value => 'misses', template => '%s',
min => 0, unit => 'ops/s', label_extra_instance => 1, instance_use => 'display' },
{ label => 'write_req', value => 'req', template => '%s',
min => 0, unit => 'ops/s', label_extra_instance => 1, instance_use => 'display' },
{ label => 'write_res', value => 'res', template => '%s',
min => 0, unit => 'ops/s', label_extra_instance => 1, instance_use => 'display' },
],
}
},
{ label => 'write-latency', set => {
key_values => [ { name => 'avg_write_latency' }, { name => 'display' } ],
output_template => 'Write latency: %.2f ms',
perfdatas => [
{ label => 'write_latency', value => 'avg_write_latency_absolute', template => '%.2f',
min => 0, unit => 'ms', label_extra_instance => 1, instance_use => 'display_absolute' },
],
}
},
{ label => 'traffic-in', set => {
key_values => [ { name => 'ingress' }, { name => 'display' } ],
output_template => 'Traffic In: %s %s/s',
output_change_bytes => 2,
perfdatas => [
{ label => 'traffic_in', value => 'ingress_absolute', template => '%d',
min => 0, unit => 'b/s', label_extra_instance => 1, instance_use => 'display_absolute' },
],
},
},
{ label => 'traffic-out', set => {
key_values => [ { name => 'egress' }, { name => 'display' } ],
output_template => 'Traffic Out: %s %s/s',
output_change_bytes => 2,
perfdatas => [
{ label => 'traffic_out', value => 'egress_absolute', template => '%d',
min => 0, unit => 'b/s', label_extra_instance => 1, instance_use => 'display_absolute' },
],
},
},
];
}
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 =>
{
"filter-database:s" => { name => 'filter_database' },
"units:s" => { name => 'units', default => '%' },
"free" => { name => 'free' },
"warning-status:s" => { name => 'warning_status', default => '' },
"critical-status:s" => { name => 'critical_status', default => '%{status} =~ /creation-failed/i | %{backup_status} =~ /failed/i |
%{export_status} =~ /failed/i | %{import_status} =~ /failed/i' },
});
return $self;
}
sub check_options {
my ($self, %options) = @_;
$self->SUPER::check_options(%options);
$instance_mode = $self;
$self->change_macros();
}
sub change_macros {
my ($self, %options) = @_;
foreach (('warning_status', 'critical_status')) {
if (defined($self->{option_results}->{$_})) {
$self->{option_results}->{$_} =~ s/%\{(.*?)\}/\$self->{result_values}->{$1}/g;
}
}
}
sub manage_selection {
my ($self, %options) = @_;
my $result = $options{custom}->get(path => '/v1/bdbs/stats/last?interval='.$options{custom}->get_interval());
my $result2 = $options{custom}->get(path => '/v1/bdbs');
foreach my $database (keys $result) {
if (defined($self->{option_results}->{filter_database}) && $self->{option_results}->{filter_database} ne '' &&
$database !~ /$self->{option_results}->{filter_database}/) {
$self->{output}->output_add(long_msg => "skipping database '" . $database . "': no matching filter.", debug => 1);
next;
}
my $shard_list = '-';
if (@{$result2->{$database}->{shard_list}}) {
$shard_list = join(", ", @{$result2->{$database}->{shard_list}});
}
$self->{databases}->{$database} = {
display => $result2->{$database}->{name},
status => defined($result2->{$database}->{status}) ? $result2->{$database}->{status} : '-',
type => defined($result2->{$database}->{type}) ? $result2->{$database}->{type} : '-',
backup_status => defined($result2->{$database}->{backup_status}) ? $result2->{$database}->{backup_status} : '-',
export_status => defined($result2->{$database}->{export_status}) ? $result2->{$database}->{export_status} : '-',
import_status => defined($result2->{$database}->{import_status}) ? $result2->{$database}->{import_status} : '-',
shard_list => $shard_list,
shard_cpu_user => $result->{$database}->{shard_cpu_user} * 100,
shard_cpu_system => $result->{$database}->{shard_cpu_system} * 100,
main_thread_cpu_user => $result->{$database}->{main_thread_cpu_user} * 100,
main_thread_cpu_system => $result->{$database}->{main_thread_cpu_system} * 100,
fork_cpu_user => $result->{$database}->{fork_cpu_user} * 100,
fork_cpu_system => $result->{$database}->{fork_cpu_system} * 100,
used_memory => $result->{$database}->{used_memory},
memory_size => $result2->{$database}->{memory_size},
mem_frag_ratio => $result->{$database}->{mem_frag_ratio},
conns => $result->{$database}->{conns},
total_req => defined($result->{$database}->{total_req}) ? $result->{$database}->{total_req} : $result->{$database}->{instantaneous_ops_per_sec},
total_res => $result->{$database}->{total_res},
total_hits => $result->{$database}->{read_hits} + $result->{$database}->{write_hits},
total_misses => $result->{$database}->{read_misses} + $result->{$database}->{write_misses},
avg_latency => defined($result2->{$database}->{avg_latency}) ? $result->{$database}->{avg_latency} * 1000 : '0',
other_req => $result->{$database}->{other_req},
other_res => $result->{$database}->{other_res},
other_hits => '-',
other_misses => '-',
avg_other_latency => defined($result2->{$database}->{avg_other_latency}) ? $result->{$database}->{avg_other_latency} * 1000 : '0',
no_of_keys => $result->{$database}->{no_of_keys},
evicted_objects => $result->{$database}->{evicted_objects},
expired_objects => $result->{$database}->{expired_objects},
read_hits => $result->{$database}->{read_hits},
read_misses => $result->{$database}->{read_misses},
read_req => $result->{$database}->{read_req},
read_res => $result->{$database}->{read_res},
write_hits => $result->{$database}->{write_hits},
write_misses => $result->{$database}->{write_misses},
write_req => $result->{$database}->{write_req},
write_res => $result->{$database}->{write_res},
avg_read_latency => defined($result2->{$database}->{avg_read_latency}) ? $result->{$database}->{avg_read_latency} * 1000 : '0',
avg_write_latency => defined($result2->{$database}->{avg_write_latency}) ? $result->{$database}->{avg_write_latency} * 1000 : '0',
ingress => $result->{$database}->{ingress_bytes} * 8,
egress => $result->{$database}->{egress_bytes} * 8,
};
if (scalar(keys %{$self->{databases}}) <= 0) {
$self->{output}->add_option_msg(short_msg => 'No databases detected, check your filter ? ');
$self->{output}->option_exit();
}
}
}
1;
__END__
=head1 MODE
Check RedisLabs Enterprise Cluster databases statistics.
=over 8
=item B<--filter-counters>
Only display some counters (regexp can be used).
Example: --filter-counters='rate|latency'
=item B<--warning-status>
Set warning threshold for status.
Can used special variables like: %{status}, %{type},
%{backup_status}, %{export_status}, %{shard_list}.
'status' can be: 'pending', 'active', 'active-change-pending',
'delete-pending', 'import-pending', 'creation-failed', 'recovery'.
'type' can be: 'redis', 'memcached'.
'backup_status' can be: 'exporting', 'succeeded', 'failed'.
'export_status' can be: 'exporting', 'succeeded', 'failed'.
'import_status' can be: 'idle', 'initializing', 'importing',
'succeeded', 'failed'.
=item B<--critical-status>
Set critical threshold for status (Default: '%{status} =~ /creation-failed/i |
%{backup_status} =~ /failed/i | %{export_status} =~ /failed/i |
%{import_status} =~ /failed/i').
Can used special variables like: %{status}, %{type},
%{backup_status}, %{export_status}, %{shard_list}.
'status' can be: 'pending', 'active', 'active-change-pending',
'delete-pending', 'import-pending', 'creation-failed', 'recovery'.
'type' can be: 'redis', 'memcached'.
'backup_status' can be: 'exporting', 'succeeded', 'failed'.
'' can be: 'exporting', 'succeeded', 'failed'.
'import_status' can be: 'idle', 'initializing', 'importing',
'succeeded', 'failed'.
=item B<--warning-*>
Threshold warning.
Can be: 'total-cpu', 'fork-cpu', 'main-thread-cpu',
'memory', 'mem-frag-ratio', 'connections',
'total-rates', 'latency', 'other-rates', 'other-latency',
'keys', 'evicted-objects', 'expired-objects',
'read-rates', 'read-latency',
'write-rates', 'write-latency',
'traffic-in', 'traffic-out'.
=item B<--critical-*>
Threshold critical.
Can be: 'total-cpu', 'fork-cpu', 'main-thread-cpu',
'memory', 'mem-frag-ratio', 'connections',
'total-rates', 'latency', 'other-rates', 'other-latency',
'keys', 'evicted-objects', 'expired-objects',
'read-rates', 'read-latency',
'write-rates', 'write-latency',
'traffic-in', 'traffic-out'.
=back
=cut

View File

@ -0,0 +1,99 @@
#
# Copyright 2017 Centreon (http://www.centreon.com/)
#
# Centreon is a full-fledged industry-strength solution that meets
# the needs in IT infrastructure and application monitoring for
# service performance.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
package apps::redis::restapi::mode::listdatabases;
use base qw(centreon::plugins::mode);
use strict;
use warnings;
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 =>
{
});
return $self;
}
sub check_options {
my ($self, %options) = @_;
$self->SUPER::init(%options);
}
sub manage_selection {
my ($self, %options) = @_;
$self->{databases} = $options{custom}->get(path => '/v1/bdbs');
}
sub run {
my ($self, %options) = @_;
$self->manage_selection(%options);
foreach my $database_uid (sort keys %{$self->{databases}}) {
$self->{output}->output_add(long_msg => '[uid = ' . $database_uid . "] [name = '" . $self->{databases}->{$database_uid}->{name} . "']" .
" [type = '" . $self->{databases}->{$database_uid}->{type} . "']" .
" [status = '" . $self->{databases}->{$database_uid}->{status} . "']"
);
}
$self->{output}->output_add(severity => 'OK',
short_msg => 'List databases:');
$self->{output}->display(nolabel => 1, force_ignore_perfdata => 1, force_long_output => 1);
$self->{output}->exit();
}
sub disco_format {
my ($self, %options) = @_;
$self->{output}->add_disco_format(elements => ['uid', 'name', 'type', 'status']);
}
sub disco_show {
my ($self, %options) = @_;
$self->manage_selection(%options);
foreach my $database_uid (sort keys %{$self->{databases}}) {
$self->{output}->add_disco_entry(name => $self->{databases}->{$database_uid}->{name},
type => $self->{databases}->{$database_uid}->{type},
status => $self->{databases}->{$database_uid}->{status},
uid => $database_uid,
);
}
}
1;
__END__
=head1 MODE
List databases.
=over 8
=back
=cut

View File

@ -0,0 +1,94 @@
#
# Copyright 2017 Centreon (http://www.centreon.com/)
#
# Centreon is a full-fledged industry-strength solution that meets
# the needs in IT infrastructure and application monitoring for
# service performance.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
package apps::redis::restapi::mode::listnodes;
use base qw(centreon::plugins::mode);
use strict;
use warnings;
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 =>
{
});
return $self;
}
sub check_options {
my ($self, %options) = @_;
$self->SUPER::init(%options);
}
sub manage_selection {
my ($self, %options) = @_;
$self->{nodes} = $options{custom}->get(path => '/v1/nodes');
}
sub run {
my ($self, %options) = @_;
$self->manage_selection(%options);
foreach my $node_uid (sort keys %{$self->{nodes}}) {
$self->{output}->output_add(long_msg => '[uid = ' . $node_uid . "] [status = '" . $self->{nodes}->{$node_uid}->{status} . "']");
}
$self->{output}->output_add(severity => 'OK',
short_msg => 'List nodes:');
$self->{output}->display(nolabel => 1, force_ignore_perfdata => 1, force_long_output => 1);
$self->{output}->exit();
}
sub disco_format {
my ($self, %options) = @_;
$self->{output}->add_disco_format(elements => ['uid', 'status']);
}
sub disco_show {
my ($self, %options) = @_;
$self->manage_selection(%options);
foreach my $node_uid (sort keys %{$self->{nodes}}) {
$self->{output}->add_disco_entry(status => $self->{nodes}->{$node_uid}->{status},
uid => $node_uid,
);
}
}
1;
__END__
=head1 MODE
List nodes.
=over 8
=back
=cut

View File

@ -0,0 +1,99 @@
#
# Copyright 2017 Centreon (http://www.centreon.com/)
#
# Centreon is a full-fledged industry-strength solution that meets
# the needs in IT infrastructure and application monitoring for
# service performance.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
package apps::redis::restapi::mode::listshards;
use base qw(centreon::plugins::mode);
use strict;
use warnings;
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 =>
{
});
return $self;
}
sub check_options {
my ($self, %options) = @_;
$self->SUPER::init(%options);
}
sub manage_selection {
my ($self, %options) = @_;
$self->{shards} = $options{custom}->get(path => '/v1/shards');
}
sub run {
my ($self, %options) = @_;
$self->manage_selection(%options);
foreach my $shard_uid (sort keys %{$self->{shards}}) {
$self->{output}->output_add(long_msg => '[uid = ' . $shard_uid . "] [role = '" . $self->{shards}->{$shard_uid}->{role} . "']" .
" [detailed_status = '" . $self->{shards}->{$shard_uid}->{detailed_status} . "']" .
" [status = '" . $self->{shards}->{$shard_uid}->{status} . "']"
);
}
$self->{output}->output_add(severity => 'OK',
short_msg => 'List shards:');
$self->{output}->display(nolabel => 1, force_ignore_perfdata => 1, force_long_output => 1);
$self->{output}->exit();
}
sub disco_format {
my ($self, %options) = @_;
$self->{output}->add_disco_format(elements => ['uid', 'role', 'detailed_status', 'status']);
}
sub disco_show {
my ($self, %options) = @_;
$self->manage_selection(%options);
foreach my $shard_uid (sort keys %{$self->{shards}}) {
$self->{output}->add_disco_entry(role => $self->{shards}->{$shard_uid}->{role},
detailed_status => $self->{shards}->{$shard_uid}->{detailed_status},
status => $self->{shards}->{$shard_uid}->{status},
uid => $shard_uid,
);
}
}
1;
__END__
=head1 MODE
List shards.
=over 8
=back
=cut

View File

@ -0,0 +1,445 @@
#
# Copyright 2017 Centreon (http://www.centreon.com/)
#
# Centreon is a full-fledged industry-strength solution that meets
# the needs in IT infrastructure and application monitoring for
# service performance.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
package apps::redis::restapi::mode::nodesstats;
use base qw(centreon::plugins::templates::counter);
use strict;
use warnings;
use Digest::MD5 qw(md5_hex);
my $instance_mode;
sub custom_usage_perfdata {
my ($self, %options) = @_;
$self->{output}->perfdata_add(label => $self->{result_values}->{perf}, unit => 'B',
value => $self->{result_values}->{used},
warning => $self->{perfdata}->get_perfdata_for_output(label => 'warning-' . $self->{result_values}->{label}, total => $self->{result_values}->{total}, cast_int => 1),
critical => $self->{perfdata}->get_perfdata_for_output(label => 'critical-' . $self->{result_values}->{label}, total => $self->{result_values}->{total}, cast_int => 1),
min => 0, max => $self->{result_values}->{total});
}
sub custom_usage_threshold {
my ($self, %options) = @_;
my ($exit, $threshold_value);
$threshold_value = $self->{result_values}->{used};
$threshold_value = $self->{result_values}->{free} if (defined($instance_mode->{option_results}->{free}));
if ($instance_mode->{option_results}->{units} eq '%') {
$threshold_value = $self->{result_values}->{prct_used};
$threshold_value = $self->{result_values}->{prct_free} if (defined($instance_mode->{option_results}->{free}));
}
$exit = $self->{perfdata}->threshold_check(value => $threshold_value, threshold => [ { label => 'critical-' . $self->{result_values}->{label}, exit_litteral => 'critical' }, { label => 'warning-' . $self->{result_values}->{label}, exit_litteral => 'warning' } ]);
return $exit;
}
sub custom_usage_output {
my ($self, %options) = @_;
my ($used_value, $used_unit) = $self->{perfdata}->change_bytes(value => $self->{result_values}->{used});
my ($free_value, $free_unit) = $self->{perfdata}->change_bytes(value => $self->{result_values}->{free});
my ($total_value, $total_unit) = $self->{perfdata}->change_bytes(value => $self->{result_values}->{total});
my $msg = sprintf("%s usage: Total: %s Used: %s (%.2f%%) Free: %s (%.2f%%)", $self->{result_values}->{display},
$total_value . " " . $total_unit,
$used_value . " " . $used_unit, $self->{result_values}->{prct_used},
$free_value . " " . $free_unit, $self->{result_values}->{prct_free});
return $msg;
}
sub custom_usage_calc {
my ($self, %options) = @_;
$self->{result_values}->{label} = $options{extra_options}->{label};
$self->{result_values}->{perf} = $options{extra_options}->{perf};
$self->{result_values}->{display} = $options{extra_options}->{display};
$self->{result_values}->{free} = $options{new_datas}->{$self->{instance} . '_' . $options{extra_options}->{free}};
$self->{result_values}->{total} = $options{new_datas}->{$self->{instance} . '_' . $options{extra_options}->{total}};
if ($self->{result_values}->{total} != 0) {
$self->{result_values}->{used} = $self->{result_values}->{total} - $self->{result_values}->{free};
$self->{result_values}->{prct_used} = $self->{result_values}->{used} * 100 / $self->{result_values}->{total};
$self->{result_values}->{prct_free} = 100 - $self->{result_values}->{prct_used};
} else {
$self->{result_values}->{used} = '0';
$self->{result_values}->{prct_used} = '0';
$self->{result_values}->{prct_free} = '0';
}
return 0;
}
sub custom_status_threshold {
my ($self, %options) = @_;
my $status = 'ok';
my $message;
eval {
local $SIG{__WARN__} = sub { $message = $_[0]; };
local $SIG{__DIE__} = sub { $message = $_[0]; };
if (defined($instance_mode->{option_results}->{critical_status}) && $instance_mode->{option_results}->{critical_status} ne '' &&
eval "$instance_mode->{option_results}->{critical_status}") {
$status = 'critical';
} elsif (defined($instance_mode->{option_results}->{warning_status}) && $instance_mode->{option_results}->{warning_status} ne '' &&
eval "$instance_mode->{option_results}->{warning_status}") {
$status = 'warning';
}
};
if (defined($message)) {
$self->{output}->output_add(long_msg => 'filter status issue: ' . $message);
}
return $status;
}
sub custom_status_output {
my ($self, %options) = @_;
my $msg = sprintf("Status is '%s' [shard list: %s] [int addr: %s] [ext addr: %s]",
$self->{result_values}->{status},
$self->{result_values}->{shard_list},
$self->{result_values}->{int_addr},
$self->{result_values}->{ext_addr});
return $msg;
}
sub custom_status_calc {
my ($self, %options) = @_;
$self->{result_values}->{status} = $options{new_datas}->{$self->{instance} . '_status'};
$self->{result_values}->{shard_list} = $options{new_datas}->{$self->{instance} . '_shard_list'};
$self->{result_values}->{int_addr} = $options{new_datas}->{$self->{instance} . '_int_addr'};
$self->{result_values}->{ext_addr} = $options{new_datas}->{$self->{instance} . '_ext_addr'};
return 0;
}
sub prefix_output {
my ($self, %options) = @_;
return "Node '" . $options{instance_value}->{display} . "' ";
}
sub set_counters {
my ($self, %options) = @_;
$self->{maps_counters_type} = [
{ name => 'nodes', type => 1, cb_prefix_output => 'prefix_output', message_separator => ', ', message_multiple => 'All nodes counters are ok' },
];
$self->{maps_counters}->{nodes} = [
{ label => 'status', threshold => 0, set => {
key_values => [ { name => 'status' }, { name => 'shard_list' }, { name => 'int_addr' }, { name => 'ext_addr' } ],
closure_custom_calc => $self->can('custom_status_calc'),
closure_custom_output => $self->can('custom_status_output'),
closure_custom_perfdata => sub { return 0; },
closure_custom_threshold_check => $self->can('custom_status_threshold'),
}
},
{ label => 'shard-count', set => {
key_values => [ { name => 'shard_count' }, { name => 'display' } ],
output_template => 'Shard count: %d',
perfdatas => [
{ label => 'shard_count', value => 'shard_count_absolute', template => '%d',
min => 0, label_extra_instance => 1, instance_use => 'display_absolute' },
],
},
},
{ label => 'uptime', set => {
key_values => [ { name => 'uptime' }, { name => 'uptime_sec' }, { name => 'display' } ],
output_template => 'Uptime: %s',
perfdatas => [
{ label => 'uptime', value => 'uptime_sec_absolute', template => '%d',
min => 0, unit => 's', label_extra_instance => 1, instance_use => 'display_absolute' },
],
},
},
{ label => 'cpu-system', set => {
key_values => [ { name => 'cpu_system' }, { name => 'display' } ],
output_template => 'Cpu system: %.2f %%',
perfdatas => [
{ label => 'cpu_system', value => 'cpu_system_absolute', template => '%.2f',
min => 0, max => 100, unit => '%', label_extra_instance => 1, instance_use => 'display_absolute' },
],
}
},
{ label => 'cpu-user', set => {
key_values => [ { name => 'cpu_user' }, { name => 'display' } ],
output_template => 'Cpu user: %.2f %%',
perfdatas => [
{ label => 'cpu_user', value => 'cpu_user_absolute', template => '%.2f',
min => 0, max => 100, unit => '%', label_extra_instance => 1, instance_use => 'display_absolute' },
],
}
},
{ label => 'memory', set => {
key_values => [ { name => 'free_memory' }, { name => 'total_memory' } ],
closure_custom_calc => $self->can('custom_usage_calc'),
closure_custom_calc_extra_options => { display => 'Ram', label => 'memory', perf => 'memory',
free => 'free_memory', total => 'total_memory' },
closure_custom_output => $self->can('custom_usage_output'),
closure_custom_perfdata => $self->can('custom_usage_perfdata'),
closure_custom_threshold_check => $self->can('custom_usage_threshold'),
}
},
{ label => 'persistent-storage', set => {
key_values => [ { name => 'persistent_storage_free' }, { name => 'persistent_storage_size' } ],
closure_custom_calc => $self->can('custom_usage_calc'),
closure_custom_calc_extra_options => { display => 'Persistent storage', label => 'persistent-storage', perf => 'persistent_storage',
free => 'persistent_storage_free', total => 'persistent_storage_size' },
closure_custom_output => $self->can('custom_usage_output'),
closure_custom_perfdata => $self->can('custom_usage_perfdata'),
closure_custom_threshold_check => $self->can('custom_usage_threshold'),
}
},
{ label => 'ephemeral-storage', set => {
key_values => [ { name => 'ephemeral_storage_free' }, { name => 'ephemeral_storage_size' } ],
closure_custom_calc => $self->can('custom_usage_calc'),
closure_custom_calc_extra_options => { display => 'Ephemeral storage', label => 'ephemeral-storage', perf => 'ephemeral_storage',
free => 'ephemeral_storage_free', total => 'ephemeral_storage_size' },
closure_custom_output => $self->can('custom_usage_output'),
closure_custom_perfdata => $self->can('custom_usage_perfdata'),
closure_custom_threshold_check => $self->can('custom_usage_threshold'),
}
},
{ label => 'flash-storage', set => {
key_values => [ { name => 'bigstore_free' }, { name => 'bigstore_size' } ],
closure_custom_calc => $self->can('custom_usage_calc'),
closure_custom_calc_extra_options => { display => 'Flash storage', label => 'flash-storage', perf => 'flash_storage',
free => 'bigstore_free', total => 'bigstore_size' },
closure_custom_output => $self->can('custom_usage_output'),
closure_custom_perfdata => $self->can('custom_usage_perfdata'),
closure_custom_threshold_check => $self->can('custom_usage_threshold'),
}
},
{ label => 'flash-iops', set => {
key_values => [ { name => 'bigstore_iops' }, { name => 'display' } ],
output_template => 'Flash IOPS: %s ops/s',
perfdatas => [
{ label => 'flash_iops', value => 'bigstore_iops_absolute', template => '%s',
min => 0, unit => 'ops/s', label_extra_instance => 1, instance_use => 'display_absolute' },
],
}
},
{ label => 'flash-throughput', set => {
key_values => [ { name => 'bigstore_throughput' }, { name => 'display' } ],
output_template => 'Flash throughput: %s %s/s',
output_change_bytes => 1,
perfdatas => [
{ label => 'flash_throughput', value => 'bigstore_throughput_absolute', template => '%s',
min => 0, unit => 'B/s', label_extra_instance => 1, instance_use => 'display_absolute' },
],
}
},
{ label => 'connections', set => {
key_values => [ { name => 'conns' }, { name => 'display' } ],
output_template => 'Connections: %s',
perfdatas => [
{ label => 'connections', value => 'conns_absolute', template => '%s',
min => 0, label_extra_instance => 1, instance_use => 'display_absolute' },
],
}
},
{ label => 'requests', set => {
key_values => [ { name => 'total_req' } ],
output_template => 'Requests rate: %s ops/s',
perfdatas => [
{ label => 'requests', value => 'total_req_absolute', template => '%s',
min => 0, unit => 'ops/s' },
],
}
},
{ label => 'traffic-in', set => {
key_values => [ { name => 'ingress' }, { name => 'display' } ],
output_template => 'Traffic In: %s %s/s',
output_change_bytes => 2,
perfdatas => [
{ label => 'traffic_in', value => 'ingress_absolute', template => '%d',
min => 0, unit => 'b/s', label_extra_instance => 1, instance_use => 'display_absolute' },
],
},
},
{ label => 'traffic-out', set => {
key_values => [ { name => 'egress' }, { name => 'display' } ],
output_template => 'Traffic Out: %s %s/s',
output_change_bytes => 2,
perfdatas => [
{ label => 'traffic_out', value => 'egress_absolute', template => '%d',
min => 0, unit => 'b/s', label_extra_instance => 1, instance_use => 'display_absolute' },
],
},
},
];
}
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 =>
{
"filter-node:s" => { name => 'filter_node' },
"units:s" => { name => 'units', default => '%' },
"free" => { name => 'free' },
"warning-status:s" => { name => 'warning_status', default => '' },
"critical-status:s" => { name => 'critical_status', default => '%{status} =~ /down/i' },
});
return $self;
}
sub check_options {
my ($self, %options) = @_;
$self->SUPER::check_options(%options);
$instance_mode = $self;
$self->change_macros();
}
sub change_macros {
my ($self, %options) = @_;
foreach (('warning_status', 'critical_status')) {
if (defined($self->{option_results}->{$_})) {
$self->{option_results}->{$_} =~ s/%\{(.*?)\}/\$self->{result_values}->{$1}/g;
}
}
}
sub manage_selection {
my ($self, %options) = @_;
my $result = $options{custom}->get(path => '/v1/nodes/stats/last?interval='.$options{custom}->get_interval());
my $result2 = $options{custom}->get(path => '/v1/nodes');
foreach my $node (keys $result) {
if (defined($self->{option_results}->{filter_node}) && $self->{option_results}->{filter_node} ne '' &&
$node !~ /$self->{option_results}->{filter_node}/) {
$self->{output}->output_add(long_msg => "skipping node '" . $node . "': no matching filter.", debug => 1);
next;
}
my $shard_list = '-';
if (@{$result2->{$node}->{shard_list}}) {
$shard_list = join(", ", @{$result2->{$node}->{shard_list}});
}
my $ext_addr = '-';
if (@{$result2->{$node}->{external_addr}}) {
$ext_addr = join(", ", @{$result2->{$node}->{external_addr}});
}
$self->{nodes}->{$node} = {
display => $node,
status => defined($result2->{$node}->{status}) ? $result2->{$node}->{status} : '-',
shard_list => $shard_list,
shard_count => $result2->{$node}->{shard_count},
int_addr => $result2->{$node}->{addr},
ext_addr => $ext_addr,
uptime => centreon::plugins::misc::change_seconds(value => $result2->{$node}->{uptime}),
uptime_sec => $result2->{$node}->{uptime},
cpu_system => $result->{$node}->{cpu_system} * 100,
cpu_user => $result->{$node}->{cpu_user} * 100,
free_memory => $result->{$node}->{free_memory},
total_memory => $result2->{$node}->{total_memory},
persistent_storage_free => $result->{$node}->{persistent_storage_free},
persistent_storage_size => $result2->{$node}->{persistent_storage_size},
ephemeral_storage_free => $result->{$node}->{ephemeral_storage_free},
ephemeral_storage_size => $result2->{$node}->{ephemeral_storage_size},
bigstore_free => $result->{$node}->{bigstore_free},
bigstore_size => $result2->{$node}->{bigstore_size},
bigstore_iops => $result->{$node}->{bigstore_iops},
bigstore_throughput => $result->{$node}->{bigstore_throughput},
conns => $result->{$node}->{conns},
total_req => $result->{$node}->{total_req},
ingress => $result->{$node}->{ingress_bytes} * 8,
egress => $result->{$node}->{egress_bytes} * 8,
};
if (scalar(keys %{$self->{nodes}}) <= 0) {
$self->{output}->add_option_msg(short_msg => 'No nodes detected, check your filter ? ');
$self->{output}->option_exit();
}
}
}
1;
__END__
=head1 MODE
Check RedisLabs Enterprise Cluster nodes statistics.
=over 8
=item B<--filter-counters>
Only display some counters (regexp can be used).
Example: --filter-counters='^cpu'
=item B<--units>
Units of thresholds (Default: '%') ('%', 'B').
=item B<--free>
Thresholds are on free space left.
=item B<--warning-status>
Set warning threshold for status.
Can used special variables like: %{status}, %{shard_list},
%{int_addr}, %{ext_addr}.
'status' can be: 'active', 'going_offline', 'offline',
'provisioning', 'decommissioning', 'down'.
=item B<--critical-status>
Set critical threshold for status (Default: '%{status} =~ /down/i').
Can used special variables like: %{status}, %{shard_list},
%{int_addr}, %{ext_addr}.
'status' can be: 'active', 'going_offline', 'offline',
'provisioning', 'decommissioning', 'down'.
=item B<--warning-*>
Threshold warning.
Can be: 'cpu-system', 'cpu-user',
'requests', 'memory', 'flash-storage',
'persistent-storage', 'ephemeral-storage',
'flash-iops', 'flash-throughput', 'connections',
'traffic-in', 'traffic-out', 'shard-count', 'uptime'.
=item B<--critical-*>
Threshold critical.
Can be: 'cpu-system', 'cpu-user',
'requests', 'memory', 'flash-storage',
'persistent-storage', 'ephemeral-storage',
'flash-iops', 'flash-throughput', 'connections',
'traffic-in', 'traffic-out', 'shard-count', 'uptime'.
=back
=cut

View File

@ -0,0 +1,472 @@
#
# Copyright 2017 Centreon (http://www.centreon.com/)
#
# Centreon is a full-fledged industry-strength solution that meets
# the needs in IT infrastructure and application monitoring for
# service performance.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
package apps::redis::restapi::mode::shardsstats;
use base qw(centreon::plugins::templates::counter);
use strict;
use warnings;
use Digest::MD5 qw(md5_hex);
my $instance_mode;
sub custom_status_threshold {
my ($self, %options) = @_;
my $status = 'ok';
my $message;
eval {
local $SIG{__WARN__} = sub { $message = $_[0]; };
local $SIG{__DIE__} = sub { $message = $_[0]; };
if (defined($instance_mode->{option_results}->{critical_status}) && $instance_mode->{option_results}->{critical_status} ne '' &&
eval "$instance_mode->{option_results}->{critical_status}") {
$status = 'critical';
} elsif (defined($instance_mode->{option_results}->{warning_status}) && $instance_mode->{option_results}->{warning_status} ne '' &&
eval "$instance_mode->{option_results}->{warning_status}") {
$status = 'warning';
}
};
if (defined($message)) {
$self->{output}->output_add(long_msg => 'filter status issue: ' . $message);
}
return $status;
}
sub custom_status_output {
my ($self, %options) = @_;
my $msg = sprintf("Status is '%s' (%s) [role: %s] [loading status: %s] [backup status: %s]",
$self->{result_values}->{status},
$self->{result_values}->{detailed_status},
$self->{result_values}->{role},
$self->{result_values}->{loading},
$self->{result_values}->{backup});
if ($self->{result_values}->{role} eq 'slave') {
$msg .= sprintf(" [sync status: %s]",
$self->{result_values}->{sync});
}
return $msg;
}
sub custom_status_calc {
my ($self, %options) = @_;
$self->{result_values}->{role} = $options{new_datas}->{$self->{instance} . '_role'};
$self->{result_values}->{status} = $options{new_datas}->{$self->{instance} . '_status'};
$self->{result_values}->{detailed_status} = $options{new_datas}->{$self->{instance} . '_detailed_status'};
$self->{result_values}->{loading} = $options{new_datas}->{$self->{instance} . '_loading'};
$self->{result_values}->{sync} = $options{new_datas}->{$self->{instance} . '_sync'};
$self->{result_values}->{backup} = $options{new_datas}->{$self->{instance} . '_backup'};
return 0;
}
sub custom_operations_output {
my ($self, %options) = @_;
my $msg = sprintf("%s operations rates (hits/misses): %s/%s ops/s",
$self->{result_values}->{operation},
$self->{result_values}->{hits},
$self->{result_values}->{misses});
return $msg;
}
sub custom_operations_calc {
my ($self, %options) = @_;
$self->{result_values}->{display} = $options{new_datas}->{$self->{instance} . '_' . $options{extra_options}->{display}};
$self->{result_values}->{operation} = $options{extra_options}->{operation};
$self->{result_values}->{hits} = $options{new_datas}->{$self->{instance} . '_' . $options{extra_options}->{hits}};
$self->{result_values}->{misses} = $options{new_datas}->{$self->{instance} . '_' . $options{extra_options}->{misses}};
return 0;
}
sub custom_cpu_output {
my ($self, %options) = @_;
my $msg = sprintf("%s CPU usage (user/system): %s/%s %%",
$self->{result_values}->{cpu},
$self->{result_values}->{user},
$self->{result_values}->{system});
return $msg;
}
sub custom_cpu_calc {
my ($self, %options) = @_;
$self->{result_values}->{display} = $options{new_datas}->{$self->{instance} . '_' . $options{extra_options}->{display}};
$self->{result_values}->{cpu} = $options{extra_options}->{cpu};
$self->{result_values}->{user} = $options{new_datas}->{$self->{instance} . '_' . $options{extra_options}->{user}};
$self->{result_values}->{system} = $options{new_datas}->{$self->{instance} . '_' . $options{extra_options}->{system}};
return 0;
}
sub prefix_output {
my ($self, %options) = @_;
return "Shard '" . $options{instance_value}->{display} . "' ";
}
sub set_counters {
my ($self, %options) = @_;
$self->{maps_counters_type} = [
{ name => 'shards', type => 1, cb_prefix_output => 'prefix_output', message_multiple => 'All shards counters are ok' },
];
$self->{maps_counters}->{shards} = [
{ label => 'status', threshold => 0, set => {
key_values => [ { name => 'status' }, { name => 'detailed_status' }, { name => 'role' },
{ name => 'loading' }, { name => 'sync' }, { name => 'backup' } ],
closure_custom_calc => $self->can('custom_status_calc'),
closure_custom_output => $self->can('custom_status_output'),
closure_custom_perfdata => sub { return 0; },
closure_custom_threshold_check => $self->can('custom_status_threshold'),
}
},
{ label => 'total-cpu', set => {
key_values => [ { name => 'shard_cpu_user' }, { name => 'shard_cpu_system' }, { name => 'display' } ],
closure_custom_calc => $self->can('custom_cpu_calc'),
closure_custom_calc_extra_options => { cpu => 'Total', user => 'shard_cpu_user',
system => 'shard_cpu_system', display => 'display' },
closure_custom_output => $self->can('custom_cpu_output'),
perfdatas => [
{ label => 'total_cpu_user', value => 'user', template => '%s',
min => 0, max => 100, unit => '%', label_extra_instance => 1, instance_use => 'display' },
{ label => 'total_cpu_system', value => 'system', template => '%s',
min => 0, max => 100, unit => '%', label_extra_instance => 1, instance_use => 'display' },
],
}
},
{ label => 'fork-cpu', set => {
key_values => [ { name => 'fork_cpu_user' }, { name => 'fork_cpu_system' }, { name => 'display' } ],
closure_custom_calc => $self->can('custom_cpu_calc'),
closure_custom_calc_extra_options => { cpu => 'Fork', user => 'fork_cpu_user',
system => 'fork_cpu_system', display => 'display' },
closure_custom_output => $self->can('custom_cpu_output'),
perfdatas => [
{ label => 'fork_cpu_user', value => 'user', template => '%s',
min => 0, max => 100, unit => '%', label_extra_instance => 1, instance_use => 'display' },
{ label => 'fork_cpu_system', value => 'system', template => '%s',
min => 0, max => 100, unit => '%', label_extra_instance => 1, instance_use => 'display' },
],
}
},
{ label => 'main-thread-cpu', set => {
key_values => [ { name => 'main_thread_cpu_user' }, { name => 'main_thread_cpu_system' }, { name => 'display' } ],
closure_custom_calc => $self->can('custom_cpu_calc'),
closure_custom_calc_extra_options => { cpu => 'Main thread', user => 'main_thread_cpu_user',
system => 'main_thread_cpu_system', display => 'display' },
closure_custom_output => $self->can('custom_cpu_output'),
perfdatas => [
{ label => 'main_thread_cpu_user', value => 'user', template => '%s',
min => 0, max => 100, unit => '%', label_extra_instance => 1, instance_use => 'display' },
{ label => 'main_thread_cpu_system', value => 'system', template => '%s',
min => 0, max => 100, unit => '%', label_extra_instance => 1, instance_use => 'display' },
],
}
},
{ label => 'memory', set => {
key_values => [ { name => 'used_memory' }, { name => 'display' } ],
output_template => 'Memory used: %s %s',
output_change_bytes => 1,
perfdatas => [
{ label => 'memory', value => 'used_memory_absolute', template => '%s',
min => 0, unit => 'B', label_extra_instance => 1, instance_use => 'display_absolute' },
],
}
},
{ label => 'mem-frag-ratio', set => {
key_values => [ { name => 'mem_frag_ratio' }, { name => 'display' } ],
output_template => 'Memory fragmentation ratio: %s',
perfdatas => [
{ label => 'mem_frag_ratio', value => 'mem_frag_ratio_absolute', template => '%s',
min => 0, label_extra_instance => 1, instance_use => 'display_absolute' },
],
}
},
{ label => 'connected-clients', set => {
key_values => [ { name => 'connected_clients' }, { name => 'display' } ],
output_template => 'Connected clients: %s',
perfdatas => [
{ label => 'connected_clients', value => 'connected_clients_absolute', template => '%s',
min => 0, label_extra_instance => 1, instance_use => 'display_absolute' },
],
}
},
{ label => 'blocked-clients', set => {
key_values => [ { name => 'blocked_clients' }, { name => 'display' } ],
output_template => 'Blocked clients: %s',
perfdatas => [
{ label => 'blocked_clients', value => 'blocked_clients_absolute', template => '%s',
min => 0, label_extra_instance => 1, instance_use => 'display_absolute' },
],
}
},
{ label => 'requests', set => {
key_values => [ { name => 'total_req'}, { name => 'display' }],
output_template => 'Requests rate: %s ops/s',
perfdatas => [
{ label => 'requests', value => 'total_req_absolute', template => '%s',
min => 0, unit => 'ops/s', label_extra_instance => 1, instance_use => 'display_absolute' },
],
}
},
{ label => 'keys', set => {
key_values => [ { name => 'no_of_keys' }, { name => 'display' } ],
output_template => 'Total keys: %s',
perfdatas => [
{ label => 'keys', value => 'no_of_keys_absolute', template => '%s',
min => 0, label_extra_instance => 1, instance_use => 'display_absolute' },
],
}
},
{ label => 'volatile-keys', set => {
key_values => [ { name => 'no_of_expires' }, { name => 'display' } ],
output_template => 'Volatile keys: %s',
perfdatas => [
{ label => 'volatile_keys', value => 'no_of_expires_absolute', template => '%s',
min => 0, label_extra_instance => 1, instance_use => 'display_absolute' },
],
}
},
{ label => 'evicted-objects', set => {
key_values => [ { name => 'evicted_objects' }, { name => 'display' } ],
output_template => 'Evicted objects rate: %s evictions/sec',
perfdatas => [
{ label => 'evicted_objects', value => 'evicted_objects_absolute', template => '%s',
min => 0, unit => 'evictions/sec', label_extra_instance => 1, instance_use => 'display_absolute' },
],
}
},
{ label => 'expired-objects', set => {
key_values => [ { name => 'expired_objects' }, { name => 'display' } ],
output_template => 'Expired objects rate: %s expirations/sec',
perfdatas => [
{ label => 'expired_objects', value => 'expired_objects_absolute', template => '%s',
min => 0, unit => 'expirations/sec', label_extra_instance => 1, instance_use => 'display_absolute' },
],
}
},
{ label => 'read-rates', set => {
key_values => [ { name => 'read_hits' }, { name => 'read_misses' }, { name => 'display' } ],
closure_custom_calc => $self->can('custom_operations_calc'),
closure_custom_calc_extra_options => { operation => 'Read', hits => 'read_hits',
misses => 'read_misses', display => 'display' },
closure_custom_output => $self->can('custom_operations_output'),
perfdatas => [
{ label => 'read_hits', value => 'hits', template => '%s',
min => 0, unit => 'ops/s', label_extra_instance => 1, instance_use => 'display' },
{ label => 'read_misses', value => 'misses', template => '%s',
min => 0, unit => 'ops/s', label_extra_instance => 1, instance_use => 'display' },
],
}
},
{ label => 'write-rates', set => {
key_values => [ { name => 'write_hits' }, { name => 'write_misses' }, { name => 'display' } ],
closure_custom_calc => $self->can('custom_operations_calc'),
closure_custom_calc_extra_options => { operation => 'Write', hits => 'write_hits',
misses => 'write_misses', display => 'display' },
closure_custom_output => $self->can('custom_operations_output'),
perfdatas => [
{ label => 'write_hits', value => 'hits', template => '%s',
min => 0, unit => 'ops/s', label_extra_instance => 1, instance_use => 'display' },
{ label => 'write_misses', value => 'misses', template => '%s',
min => 0, unit => 'ops/s', label_extra_instance => 1, instance_use => 'display' },
],
}
},
{ label => 'rdb-changes-since-last-save', set => {
key_values => [ { name => 'rdb_changes_since_last_save' }, { name => 'display' } ],
output_template => 'Rdb changes since last save: %s',
perfdatas => [
{ label => 'rdb_changes_since_last_save', value => 'rdb_changes_since_last_save_absolute', template => '%s',
min => 0, label_extra_instance => 1, instance_use => 'display_absolute' },
],
}
},
{ label => 'last-save-time', set => {
key_values => [ { name => 'last_save_time' }, { name => 'last_save_time_sec' }, { name => 'display' } ],
output_template => 'Last same time: %s',
perfdatas => [
{ label => 'last_save_time', value => 'last_save_time_sec_absolute', template => '%s',
min => 0, unit => 's', label_extra_instance => 1, instance_use => 'display_absolute' },
],
}
},
];
}
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 =>
{
"filter-shard:s" => { name => 'filter_shard' },
"warning-status:s" => { name => 'warning_status', default => '' },
"critical-status:s" => { name => 'critical_status', default => '%{status} =~ /inactive/i | %{backup} =~ /failed/i |
%{sync} =~ /link_down/i' },
});
return $self;
}
sub check_options {
my ($self, %options) = @_;
$self->SUPER::check_options(%options);
$instance_mode = $self;
$self->change_macros();
}
sub change_macros {
my ($self, %options) = @_;
foreach (('warning_status', 'critical_status')) {
if (defined($self->{option_results}->{$_})) {
$self->{option_results}->{$_} =~ s/%\{(.*?)\}/\$self->{result_values}->{$1}/g;
}
}
}
sub manage_selection {
my ($self, %options) = @_;
my $result = $options{custom}->get(path => '/v1/shards/stats/last?interval='.$options{custom}->get_interval());
my $result2 = $options{custom}->get(path => '/v1/shards');
foreach my $shard (keys $result) {
if (defined($self->{option_results}->{filter_shard}) && $self->{option_results}->{filter_shard} ne '' &&
$shard !~ /$self->{option_results}->{filter_shard}/) {
$self->{output}->output_add(long_msg => "skipping shard '" . $shard . "': no matching filter.", debug => 1);
next;
}
$self->{shards}->{$shard} = {
display => $shard,
status => defined($result2->{$shard}->{status}) ? $result2->{$shard}->{status} : '-',
detailed_status => defined($result2->{$shard}->{detailed_status}) ? $result2->{$shard}->{detailed_status} : '-',
role => defined($result2->{$shard}->{role}) ? $result2->{$shard}->{role} : '-',
loading => defined($result2->{$shard}->{loading}->{status}) ? $result2->{$shard}->{loading}->{status} : '-',
sync => defined($result2->{$shard}->{sync}->{status}) ? $result2->{$shard}->{sync}->{status} : '-',
backup => defined($result2->{$shard}->{backup}->{status}) ? $result2->{$shard}->{backup}->{status} : '-',
used_memory => $result->{$shard}->{used_memory},
mem_frag_ratio => $result->{$shard}->{mem_frag_ratio},
shard_cpu_user => $result->{$shard}->{shard_cpu_user} * 100,
shard_cpu_system => $result->{$shard}->{shard_cpu_system} * 100,
main_thread_cpu_user => $result->{$shard}->{main_thread_cpu_user} * 100,
main_thread_cpu_system => $result->{$shard}->{main_thread_cpu_system} * 100,
fork_cpu_user => $result->{$shard}->{fork_cpu_user} * 100,
fork_cpu_system => $result->{$shard}->{fork_cpu_system} * 100,
connected_clients => $result->{$shard}->{connected_clients},
blocked_clients => $result->{$shard}->{blocked_clients},
total_req => defined($result->{$shard}->{total_req}) ? $result->{$shard}->{total_req} : $result->{$shard}->{instantaneous_ops_per_sec},
no_of_keys => $result->{$shard}->{no_of_keys},
no_of_expires => $result->{$shard}->{no_of_expires},
evicted_objects => $result->{$shard}->{evicted_objects},
expired_objects => $result->{$shard}->{expired_objects},
read_hits => $result->{$shard}->{read_hits},
read_misses => $result->{$shard}->{read_misses},
write_hits => $result->{$shard}->{write_hits},
write_misses => $result->{$shard}->{write_misses},
rdb_changes_since_last_save => $result->{$shard}->{rdb_changes_since_last_save},
last_save_time => centreon::plugins::misc::change_seconds(value => time() - $result->{$shard}->{last_save_time}),
last_save_time_sec => time() - $result->{$shard}->{last_save_time},
};
if (scalar(keys %{$self->{shards}}) <= 0) {
$self->{output}->add_option_msg(short_msg => 'No shards detected, check your filter ? ');
$self->{output}->option_exit();
}
}
}
1;
__END__
=head1 MODE
Check RedisLabs Enterprise Cluster shards statistics.
=over 8
=item B<--filter-counters>
Only display some counters (regexp can be used).
Example: --filter-counters='clients'
=item B<--warning-status>
Set warning threshold for status.
Can used special variables like: %{status}, %{detailed_status},
%{role}, %{loading}, %{sync}, %{backup}.
'status' can be: 'active', 'inactive', 'trimming'.
'detailed_status' can be: 'ok', 'importing', 'timeout',
'loading', 'busy', 'down', 'trimming', 'unknown'.
'role' can be: 'slave', 'master'.
'loading' can be: 'in_progress', 'idle'.
'sync' can be: 'in_progress', 'idle', 'link_down'.
'backup' can be: 'exporting', 'succeeded', 'failed'.
=item B<--critical-status>
Set critical threshold for status (Default: '%{status} =~ /inactive/i |
%{backup} =~ /failed/i | %{sync} =~ /link_down/i').
Can used special variables like: %{status}, %{detailed_status},
%{role}, %{loading}, %{sync}, %{backup}.
'status' can be: 'active', 'inactive', 'trimming'.
'detailed_status' can be: 'ok', 'importing', 'timeout',
'loading', 'busy', 'down', 'trimming', 'unknown'.
'role' can be: 'slave', 'master'.
'loading' can be: 'in_progress', 'idle'.
'sync' can be: 'in_progress', 'idle', 'link_down'.
'backup' can be: 'exporting', 'succeeded', 'failed'.
=item B<--warning-*>
Threshold warning.
Can be: 'total-cpu', 'fork-cpu', 'main-thread-cpu',
'memory', 'mem-frag-ratio',
'connected-clients', 'blocked-clients',
'request', 'keys',
'evicted-objects', 'expired-objects',
'read-rates', 'write-rates',
'rdb-changes-since-last-save', 'last-save-time',
=item B<--critical-*>
Threshold critical.
Can be: 'total-cpu', 'fork-cpu', 'main-thread-cpu',
'memory', 'mem-frag-ratio',
'connected-clients', 'blocked-clients',
'request', 'keys',
'evicted-objects', 'expired-objects',
'read-rates', 'write-rates',
'rdb-changes-since-last-save', 'last-save-time',
=back
=cut

View File

@ -0,0 +1,54 @@
#
# Copyright 2017 Centreon (http://www.centreon.com/)
#
# Centreon is a full-fledged industry-strength solution that meets
# the needs in IT infrastructure and application monitoring for
# service performance.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
package apps::redis::restapi::plugin;
use strict;
use warnings;
use base qw(centreon::plugins::script_custom);
sub new {
my ($class, %options) = @_;
my $self = $class->SUPER::new(package => __PACKAGE__, %options);
bless $self, $class;
$self->{version} = '0.1';
%{$self->{modes}} = (
'databases-stats' => 'apps::redis::restapi::mode::databasesstats',
'cluster-stats' => 'apps::redis::restapi::mode::clusterstats',
'list-databases' => 'apps::redis::restapi::mode::listdatabases',
'list-nodes' => 'apps::redis::restapi::mode::listnodes',
'list-shards' => 'apps::redis::restapi::mode::listshards',
'nodes-stats' => 'apps::redis::restapi::mode::nodesstats',
'shards-stats' => 'apps::redis::restapi::mode::shardsstats',
);
$self->{custom_modes}{api} = 'apps::redis::restapi::custom::api';
return $self;
}
1;
__END__
=head1 PLUGIN DESCRIPTION
Check RedisLabs Enterprise Cluster through HTTP/REST API.
=cut

View File

@ -197,7 +197,8 @@ sub manage_selection {
$self->{tomcatconnector} = {};
foreach my $key (keys %$result) {
$key =~ /name=(.*?),type=(.*)/;
my ($connector, $type) = ($1, $2);
my ($connector, $type) = ($1, $2); # double quote nivo du name si existe
$connector =~ s/^"(.*)"$/$1/g;
if (defined($self->{option_results}->{filter_name}) && $self->{option_results}->{filter_name} ne '' &&
$connector !~ /$self->{option_results}->{filter_name}/) {
@ -212,7 +213,7 @@ sub manage_selection {
$self->{tomcatconnector}->{$connector} = { %{$self->{tomcatconnector}->{$connector}}, %{$result->{$key}} };
}
$self->{cache_name} = "tomcat_" . $self->{mode} . '_' . md5_hex($options{custom}->{url}) . '_' .
$self->{cache_name} = "tomcat_" . $self->{mode} . '_' . md5_hex($options{custom}->get_connection_info()) . '_' .
(defined($self->{option_results}->{filter_counters}) ? md5_hex($self->{option_results}->{filter_counters}) : md5_hex('all')) . '_' .
(defined($self->{option_results}->{filter_name}) ? md5_hex($self->{option_results}->{filter_name}) : md5_hex('all'));
}

View File

@ -0,0 +1,234 @@
#
# Copyright 2017 Centreon (http://www.centreon.com/)
#
# Centreon is a full-fledged industry-strength solution that meets
# the needs in IT infrastructure and application monitoring for
# service performance.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
package apps::tomcat::jmx::mode::datasourceusage;
use base qw(centreon::plugins::templates::counter);
use strict;
use warnings;
use Digest::MD5 qw(md5_hex);
my $instance_mode;
sub set_counters {
my ($self, %options) = @_;
$self->{maps_counters_type} = [
{ name => 'datasource', type => 1, cb_prefix_output => 'prefix_ds_output', message_multiple => 'All datasources are ok' },
];
$self->{maps_counters}->{datasource} = [
{ label => 'num-active', set => {
key_values => [ { name => 'numActive' }, { name => 'maxActive' }, { name => 'display' } ],
closure_custom_calc => $self->can('custom_usage_calc'),
closure_custom_calc_extra_options => { label_ref => 'Active', message => 'Current Num Active' },
closure_custom_output => $self->can('custom_usage_output'),
closure_custom_threshold_check => $self->can('custom_usage_threshold'),
closure_custom_perfdata => $self->can('custom_usage_perfdata'),
}
},
{ label => 'num-idle', set => {
key_values => [ { name => 'numIdle' }, { name => 'maxIdle' }, { name => 'display' } ],
closure_custom_calc => $self->can('custom_usage_calc'),
closure_custom_calc_extra_options => { label_ref => 'Idle', message => 'Current Num Idle' },
closure_custom_output => $self->can('custom_usage_output'),
closure_custom_threshold_check => $self->can('custom_usage_threshold'),
closure_custom_perfdata => $self->can('custom_usage_perfdata'),
}
},
];
}
sub custom_usage_perfdata {
my ($self, %options) = @_;
my $use_th = 1;
$use_th = 0 if ($instance_mode->{option_results}->{units} eq '%' && $self->{result_values}->{max} <= 0);
my $extra_label = '';
$extra_label = '_' . $self->{result_values}->{display} if (!defined($options{extra_instance}) || $options{extra_instance} != 0);
my $value_perf = $self->{result_values}->{used};
my %total_options = ();
if ($instance_mode->{option_results}->{units} eq '%' && $self->{result_values}->{max} > 0) {
$total_options{total} = $self->{result_values}->{max};
$total_options{cast_int} = 1;
}
my $label = $self->{label};
$label =~ s/-/_/g;
$self->{output}->perfdata_add(label => $label . $extra_label,
value => $value_perf,
warning => $use_th == 1 ? $self->{perfdata}->get_perfdata_for_output(label => 'warning-' . $self->{label}, %total_options) : undef,
critical => $use_th == 1 ? $self->{perfdata}->get_perfdata_for_output(label => 'critical-' . $self->{label}, %total_options) : undef,
min => 0, max => $self->{result_values}->{max} > 0 ? $self->{result_values}->{max} : undef);
}
sub custom_usage_threshold {
my ($self, %options) = @_;
# Cannot use percent without total
return 'ok' if ($self->{result_values}->{max} <= 0 && $instance_mode->{option_results}->{units} eq '%');
my ($exit, $threshold_value);
$threshold_value = $self->{result_values}->{used};
if ($instance_mode->{option_results}->{units} eq '%') {
$threshold_value = $self->{result_values}->{prct_used};
}
$exit = $self->{perfdata}->threshold_check(value => $threshold_value, threshold => [ { label => 'critical-' . $self->{label}, exit_litteral => 'critical' }, { label => 'warning-'. $self->{label}, exit_litteral => 'warning' } ]);
return $exit;
}
sub custom_usage_output {
my ($self, %options) = @_;
my $msg;
if ($self->{result_values}->{max} > 0) {
$msg = sprintf("%s Total: %s Used: %s (%.2f%%) Free: %s (%.2f%%)",
$self->{result_values}->{message}, $self->{result_values}->{max},
$self->{result_values}->{used}, $self->{result_values}->{prct_used},
$self->{result_values}->{max} - $self->{result_values}->{used}, 100 - $self->{result_values}->{prct_used});
} else {
$msg = sprintf("%s : %s", $self->{result_values}->{message}, $self->{result_values}->{used});
}
return $msg;
}
sub custom_usage_calc {
my ($self, %options) = @_;
$self->{result_values}->{display} = $options{new_datas}->{$self->{instance} . '_display'};
$self->{result_values}->{message} = $options{extra_options}->{message};
$self->{result_values}->{max} = $options{new_datas}->{$self->{instance} . '_max' . $options{extra_options}->{label_ref}};
$self->{result_values}->{used} = $options{new_datas}->{$self->{instance} . '_num' . $options{extra_options}->{label_ref}};
if ($self->{result_values}->{max} > 0) {
$self->{result_values}->{prct_used} = $self->{result_values}->{used} * 100 / $self->{result_values}->{max};
}
return 0;
}
sub prefix_ds_output {
my ($self, %options) = @_;
return "Datasource '" . $options{instance_value}->{display} . "' ";
}
sub new {
my ($class, %options) = @_;
my $self = $class->SUPER::new(package => __PACKAGE__, %options, statefile => 1);
bless $self, $class;
$self->{version} = '1.0';
$options{options}->add_options(arguments =>
{
"filter-name:s" => { name => 'filter_name' },
"units:s" => { name => 'units', default => '%' },
});
return $self;
}
sub check_options {
my ($self, %options) = @_;
$self->SUPER::check_options(%options);
$instance_mode = $self;
}
sub manage_selection {
my ($self, %options) = @_;
# maxActive or maxTotal
$self->{request} = [
{ mbean => "*:type=DataSource,class=*,context=*,host=*,name=*", attributes =>
[ { name => 'numActive' }, { name => 'numIdle' }, { name => 'maxIdle' }, { name => 'maxTotal' }, { name => 'maxActive' } ] },
{ mbean => "*:type=DataSource,class=*,path=*,host=*,name=*", attributes =>
[ { name => 'numActive' }, { name => 'numIdle' }, { name => 'maxIdle' }, { name => 'maxTotal' }, { name => 'maxActive' } ] },
];
my $result = $options{custom}->get_attributes(request => $self->{request}, nothing_quit => 1);
$self->{datasource} = {};
foreach my $key (keys %$result) {
$key =~ /(?:[:,])host=(.*?)(?:,|$)/;
my $ds_name = $1;
$key =~ /(?:[:,])(?:path|context)=(.*?)(?:,|$)/;
$ds_name .= '.' . $1;
$key =~ /(?:[:,])name=(.*?)(?:,|$)/; # double quote a virer
my $tmp_name = $1;
$tmp_name =~ s/^"(.*)"$/$1/;
$ds_name .= '.' . $tmp_name;
if (defined($self->{option_results}->{filter_name}) && $self->{option_results}->{filter_name} ne '' &&
$ds_name !~ /$self->{option_results}->{filter_name}/) {
$self->{output}->output_add(long_msg => "skipping '" . $ds_name . "': no matching filter.", debug => 1);
next;
}
$self->{datasource}->{$ds_name} = {
display => $ds_name,
numActive => $result->{$key}->{numActive},
maxActive => defined($result->{$key}->{maxTotal}) ? $result->{$key}->{maxTotal} : $result->{$key}->{maxActive},
numIdle => $result->{$key}->{numIdle},
maxIdle => $result->{$key}->{maxIdle},
};
}
$self->{cache_name} = "tomcat_" . $self->{mode} . '_' . md5_hex($options{custom}->get_connection_info()) . '_' .
(defined($self->{option_results}->{filter_counters}) ? md5_hex($self->{option_results}->{filter_counters}) : md5_hex('all')) . '_' .
(defined($self->{option_results}->{filter_name}) ? md5_hex($self->{option_results}->{filter_name}) : md5_hex('all'));
}
1;
__END__
=head1 MODE
Check data sources usage.
=over 8
=item B<--filter-counters>
Only display some counters (regexp can be used).
Example: --filter-counters='num-active'
=item B<--filter-name>
Filter datasource name (can be a regexp).
=item B<--warning-*>
Threshold warning.
Can be: 'num-active', 'num-idle'.
=item B<--critical-*>
Threshold critical.
Can be: 'num-active', 'num-idle'.
=item B<--units>
Units of thresholds (Default: '%') ('%', 'absolute').
=back
=cut

View File

@ -0,0 +1,138 @@
#
# Copyright 2017 Centreon (http://www.centreon.com/)
#
# Centreon is a full-fledged industry-strength solution that meets
# the needs in IT infrastructure and application monitoring for
# service performance.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
package apps::tomcat::jmx::mode::listdatasources;
use base qw(centreon::plugins::mode);
use strict;
use warnings;
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 =>
{
"filter-host:s" => { name => 'filter_host' },
"filter-path:s" => { name => 'filter_path' },
});
$self->{ds} = {};
return $self;
}
sub check_options {
my ($self, %options) = @_;
$self->SUPER::init(%options);
}
sub manage_selection {
my ($self, %options) = @_;
$self->{request} = [
{ mbean => "*:type=DataSource,class=*,context=*,host=*,name=*", attributes =>
[ { name => 'numActive' } ] },
];
my $result = $options{custom}->get_attributes(request => $self->{request});
foreach my $mbean (keys %{$result}) {
$mbean =~ /(?:[:,])host=(.*?)(?:,|$)/;
my $host = $1;
$mbean =~ /(?:[:,])(?:path|context)=(.*?)(?:,|$)/;
my $path = $1;
$mbean =~ /(?:[:,])name=(.*?)(?:,|$)/;
my $name = $1;
$name =~ s/^"(.*)"$/$1/;
if (defined($self->{option_results}->{filter_host}) && $self->{option_results}->{filter_host} ne '' &&
$host !~ /$self->{option_results}->{filter_host}/) {
$self->{output}->output_add(long_msg => "skipping '" . $host . "': no matching filter.", debug => 1);
next;
}
if (defined($self->{option_results}->{filter_path}) && $self->{option_results}->{filter_path} ne '' &&
$path !~ /$self->{option_results}->{filter_path}/) {
$self->{output}->output_add(long_msg => "skipping '" . $path . "': no matching filter.", debug => 1);
next;
}
$self->{ds}->{$host . '.' . $path} = {
host => $host, path => $path, name => $name,
};
}
}
sub run {
my ($self, %options) = @_;
$self->manage_selection(%options);
foreach my $instance (sort keys %{$self->{ds}}) {
$self->{output}->output_add(long_msg => '[host = ' . $self->{ds}->{$instance}->{host} . "]" .
" [path = '" . $self->{ds}->{$instance}->{path} . "']" .
" [name = '" . $self->{ds}->{$instance}->{name} . "']"
);
}
$self->{output}->output_add(severity => 'OK',
short_msg => 'List data sources:');
$self->{output}->display(nolabel => 1, force_ignore_perfdata => 1, force_long_output => 1);
$self->{output}->exit();
}
sub disco_format {
my ($self, %options) = @_;
$self->{output}->add_disco_format(elements => ['host', 'path', 'name']);
}
sub disco_show {
my ($self, %options) = @_;
$self->manage_selection(%options);
foreach my $instance (sort keys %{$self->{ds}}) {
$self->{output}->add_disco_entry(
%{$self->{ds}->{$instance}}
);
}
}
1;
__END__
=head1 MODE
List data sources.
=over 8
=item B<--filter-host>
Filter by virtual host name (can be a regexp).
=item B<--filter-path>
Filter by application name (can be a regexp).
=back
=cut

View File

@ -0,0 +1,134 @@
#
# Copyright 2017 Centreon (http://www.centreon.com/)
#
# Centreon is a full-fledged industry-strength solution that meets
# the needs in IT infrastructure and application monitoring for
# service performance.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
package apps::tomcat::jmx::mode::listwebapps;
use base qw(centreon::plugins::mode);
use strict;
use warnings;
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 =>
{
"filter-host:s" => { name => 'filter_host' },
"filter-path:s" => { name => 'filter_path' },
});
$self->{webapps} = {};
return $self;
}
sub check_options {
my ($self, %options) = @_;
$self->SUPER::init(%options);
}
sub manage_selection {
my ($self, %options) = @_;
$self->{request} = [
{ mbean => "*:context=*,host=*,type=Manager", attributes => [ { name => 'activeSessions' } ] },
{ mbean => "*:path=*,host=*,type=Manager", attributes => [ { name => 'activeSessions' } ] },
];
my $result = $options{custom}->get_attributes(request => $self->{request});
foreach my $mbean (keys %{$result}) {
$mbean =~ /(?:[:,])host=(.*?)(?:,|$)/;
my $host = $1;
$mbean =~ /(?:[:,])(?:path|context)=(.*?)(?:,|$)/;
my $path = $1;
if (defined($self->{option_results}->{filter_host}) && $self->{option_results}->{filter_host} ne '' &&
$host !~ /$self->{option_results}->{filter_host}/) {
$self->{output}->output_add(long_msg => "skipping '" . $host . "': no matching filter.", debug => 1);
next;
}
if (defined($self->{option_results}->{filter_path}) && $self->{option_results}->{filter_path} ne '' &&
$path !~ /$self->{option_results}->{filter_path}/) {
$self->{output}->output_add(long_msg => "skipping '" . $path . "': no matching filter.", debug => 1);
next;
}
$self->{webapps}->{$host . '.' . $path} = {
host => $host, path => $path,
};
}
}
sub run {
my ($self, %options) = @_;
$self->manage_selection(%options);
foreach my $instance (sort keys %{$self->{webapps}}) {
$self->{output}->output_add(long_msg => '[host = ' . $self->{webapps}->{$instance}->{host} . "]" .
" [path = '" . $self->{webapps}->{$instance}->{path} . "']"
);
}
$self->{output}->output_add(severity => 'OK',
short_msg => 'List webapps:');
$self->{output}->display(nolabel => 1, force_ignore_perfdata => 1, force_long_output => 1);
$self->{output}->exit();
}
sub disco_format {
my ($self, %options) = @_;
$self->{output}->add_disco_format(elements => ['host', 'path']);
}
sub disco_show {
my ($self, %options) = @_;
$self->manage_selection(%options);
foreach my $instance (sort keys %{$self->{webapps}}) {
$self->{output}->add_disco_entry(
%{$self->{webapps}->{$instance}}
);
}
}
1;
__END__
=head1 MODE
List webapps.
=over 8
=item B<--filter-host>
Filter by virtual host name (can be a regexp).
=item B<--filter-path>
Filter by application name (can be a regexp).
=back
=cut

View File

@ -0,0 +1,227 @@
#
# Copyright 2017 Centreon (http://www.centreon.com/)
#
# Centreon is a full-fledged industry-strength solution that meets
# the needs in IT infrastructure and application monitoring for
# service performance.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
package apps::tomcat::jmx::mode::webappssessions;
use base qw(centreon::plugins::templates::counter);
use strict;
use warnings;
use Digest::MD5 qw(md5_hex);
my $instance_mode;
sub set_counters {
my ($self, %options) = @_;
$self->{maps_counters_type} = [
{ name => 'webapps', type => 1, cb_prefix_output => 'prefix_webapps_output', message_multiple => 'All webapp sessions are ok' },
];
$self->{maps_counters}->{webapps} = [
{ label => 'sessions-active', set => {
key_values => [ { name => 'activeSessions' }, { name => 'maxActiveSessions' }, { name => 'display' } ],
closure_custom_calc => $self->can('custom_usage_calc'),
closure_custom_calc_extra_options => { label_ref => 'currentThreadCount', message => 'Current Threads' },
closure_custom_output => $self->can('custom_usage_output'),
closure_custom_threshold_check => $self->can('custom_usage_threshold'),
closure_custom_perfdata => $self->can('custom_usage_perfdata'),
}
},
{ label => 'sessions-count', set => {
key_values => [ { name => 'sessionCounter', diff => 1 }, { name => 'display' } ],
output_template => 'Sessions Count : %s',
perfdatas => [
{ label => 'sessions_count', value => 'sessionCounter_absolute', template => '%s',
min => 0, label_extra_instance => 1, instance_use => 'display_absolute' },
],
}
},
];
}
sub custom_usage_perfdata {
my ($self, %options) = @_;
my $use_th = 1;
$use_th = 0 if ($instance_mode->{option_results}->{units} eq '%' && $self->{result_values}->{max} <= 0);
my $extra_label = '';
$extra_label = '_' . $self->{result_values}->{display} if (!defined($options{extra_instance}) || $options{extra_instance} != 0);
my $value_perf = $self->{result_values}->{used};
my %total_options = ();
if ($instance_mode->{option_results}->{units} eq '%' && $self->{result_values}->{max} > 0) {
$total_options{total} = $self->{result_values}->{max};
$total_options{cast_int} = 1;
}
my $label = $self->{label};
$label =~ s/-/_/g;
$self->{output}->perfdata_add(label => $label . $extra_label,
value => $value_perf,
warning => $use_th == 1 ? $self->{perfdata}->get_perfdata_for_output(label => 'warning-' . $self->{label}, %total_options) : undef,
critical => $use_th == 1 ? $self->{perfdata}->get_perfdata_for_output(label => 'critical-' . $self->{label}, %total_options) : undef,
min => 0, max => $self->{result_values}->{max} > 0 ? $self->{result_values}->{max} : undef);
}
sub custom_usage_threshold {
my ($self, %options) = @_;
# Cannot use percent without total
return 'ok' if ($self->{result_values}->{max} <= 0 && $instance_mode->{option_results}->{units} eq '%');
my ($exit, $threshold_value);
$threshold_value = $self->{result_values}->{used};
if ($instance_mode->{option_results}->{units} eq '%') {
$threshold_value = $self->{result_values}->{prct_used};
}
$exit = $self->{perfdata}->threshold_check(value => $threshold_value, threshold => [ { label => 'critical-' . $self->{label}, exit_litteral => 'critical' }, { label => 'warning-'. $self->{label}, exit_litteral => 'warning' } ]);
return $exit;
}
sub custom_usage_output {
my ($self, %options) = @_;
my $msg;
if ($self->{result_values}->{max} > 0) {
$msg = sprintf("Current Active Sessions Total: %s Used: %s (%.2f%%) Free: %s (%.2f%%)",
$self->{result_values}->{max},
$self->{result_values}->{used}, $self->{result_values}->{prct_used},
$self->{result_values}->{max} - $self->{result_values}->{used}, 100 - $self->{result_values}->{prct_used});
} else {
$msg = sprintf("Current Active Sessions : %s", $self->{result_values}->{used});
}
return $msg;
}
sub custom_usage_calc {
my ($self, %options) = @_;
$self->{result_values}->{display} = $options{new_datas}->{$self->{instance} . '_display'};
$self->{result_values}->{max} = $options{new_datas}->{$self->{instance} . '_maxActiveSessions'};
$self->{result_values}->{used} = $options{new_datas}->{$self->{instance} . '_activeSessions'};
if ($self->{result_values}->{max} > 0) {
$self->{result_values}->{prct_used} = $self->{result_values}->{used} * 100 / $self->{result_values}->{max};
}
return 0;
}
sub prefix_webapps_output {
my ($self, %options) = @_;
return "Webapp '" . $options{instance_value}->{display} . "' ";
}
sub new {
my ($class, %options) = @_;
my $self = $class->SUPER::new(package => __PACKAGE__, %options, statefile => 1);
bless $self, $class;
$self->{version} = '1.0';
$options{options}->add_options(arguments =>
{
"filter-name:s" => { name => 'filter_name' },
"units:s" => { name => 'units', default => '%' },
});
return $self;
}
sub check_options {
my ($self, %options) = @_;
$self->SUPER::check_options(%options);
$instance_mode = $self;
}
sub manage_selection {
my ($self, %options) = @_;
# can be path or context
# Tomcat: Catalina:context=/xxxxx,host=localhost,type=Manager
# Jboss: jboss.web:host=localhost,path=/invoker,type=Manager
# maxActiveSessions = -1 (no limit)
$self->{request} = [
{ mbean => "*:context=*,host=*,type=Manager", attributes => [ { name => 'activeSessions' }, { name => 'sessionCounter' }, { name => 'maxActiveSessions' } ] },
{ mbean => "*:path=*,host=*,type=Manager", attributes => [ { name => 'activeSessions' }, { name => 'sessionCounter' }, { name => 'maxActiveSessions' } ] },
];
my $result = $options{custom}->get_attributes(request => $self->{request}, nothing_quit => 1);
$self->{webapps} = {};
foreach my $key (keys %$result) {
$key =~ /(?:[:,])host=(.*?)(?:,|$)/;
my $webapps = $1;
$key =~ /(?:[:,])(?:path|context)=(.*?)(?:,|$)/;
$webapps .= '.' . $1;
if (defined($self->{option_results}->{filter_name}) && $self->{option_results}->{filter_name} ne '' &&
$webapps !~ /$self->{option_results}->{filter_name}/) {
$self->{output}->output_add(long_msg => "skipping '" . $webapps . "': no matching filter.", debug => 1);
next;
}
$self->{webapps}->{$webapps} = {
display => $webapps,
%{$result->{$key}}
};
}
$self->{cache_name} = "tomcat_" . $self->{mode} . '_' . md5_hex($options{custom}->get_connection_info()) . '_' .
(defined($self->{option_results}->{filter_counters}) ? md5_hex($self->{option_results}->{filter_counters}) : md5_hex('all')) . '_' .
(defined($self->{option_results}->{filter_name}) ? md5_hex($self->{option_results}->{filter_name}) : md5_hex('all'));
}
1;
__END__
=head1 MODE
Check webapps session usage.
=over 8
=item B<--filter-counters>
Only display some counters (regexp can be used).
Example: --filter-counters='sessions-active'
=item B<--filter-name>
Filter webapps name (can be a regexp).
=item B<--warning-*>
Threshold warning.
Can be: 'sessions-count', 'sessions-active'.
=item B<--critical-*>
Threshold critical.
Can be: 'sessions-count', 'sessions-active'.
=item B<--units>
Units of thresholds (Default: '%') ('%', 'absolute').
=back
=cut

View File

@ -34,12 +34,16 @@ sub new {
'class-count' => 'centreon::common::jvm::mode::classcount',
'connector-usage' => 'apps::tomcat::jmx::mode::connectorusage',
'cpu-load' => 'centreon::common::jvm::mode::cpuload',
'datasource-usage' => 'apps::tomcat::jmx::mode::datasourceusage',
'fd-usage' => 'centreon::common::jvm::mode::fdusage',
'gc-usage' => 'centreon::common::jvm::mode::gcusage',
'list-datasources' => 'apps::tomcat::jmx::mode::listdatasources',
'list-webapps' => 'apps::tomcat::jmx::mode::listwebapps',
'load-average' => 'centreon::common::jvm::mode::loadaverage',
'memory' => 'centreon::common::jvm::mode::memory',
'memory-detailed' => 'centreon::common::jvm::mode::memorydetailed',
'threads' => 'centreon::common::jvm::mode::threads',
'webapps-sessions' => 'apps::tomcat::jmx::mode::webappssessions',
);
$self->{custom_modes}{jolokia} = 'centreon::common::protocols::jmx::custom::jolokia';

View File

@ -1,5 +1,5 @@
#
# Copyright 2016 Centreon (http://www.centreon.com/)
# Copyright 2017 Centreon (http://www.centreon.com/)
#
# Centreon is a full-fledged industry-strength solution that meets
# the needs in IT infrastructure and application monitoring for

View File

@ -1,5 +1,5 @@
#
# Copyright 2016 Centreon (http://www.centreon.com/)
# Copyright 2017 Centreon (http://www.centreon.com/)
#
# Centreon is a full-fledged industry-strength solution that meets
# the needs in IT infrastructure and application monitoring for

View File

@ -1,5 +1,5 @@
#
# Copyright 2016 Centreon (http://www.centreon.com/)
# Copyright 2017 Centreon (http://www.centreon.com/)
#
# Centreon is a full-fledged industry-strength solution that meets
# the needs in IT infrastructure and application monitoring for

View File

@ -1,5 +1,5 @@
#
# Copyright 2016 Centreon (http://www.centreon.com/)
# Copyright 2017 Centreon (http://www.centreon.com/)
#
# Centreon is a full-fledged industry-strength solution that meets
# the needs in IT infrastructure and application monitoring for

View File

@ -1,5 +1,5 @@
#
# Copyright 2016 Centreon (http://www.centreon.com/)
# Copyright 2017 Centreon (http://www.centreon.com/)
#
# Centreon is a full-fledged industry-strength solution that meets
# the needs in IT infrastructure and application monitoring for

View File

@ -1,5 +1,5 @@
#
# Copyright 2016 Centreon (http://www.centreon.com/)
# Copyright 2017 Centreon (http://www.centreon.com/)
#
# Centreon is a full-fledged industry-strength solution that meets
# the needs in IT infrastructure and application monitoring for

View File

@ -44,6 +44,10 @@ sub new {
"critical-in:s" => { name => 'critical_in', },
"warning-out:s" => { name => 'warning_out', },
"critical-out:s" => { name => 'critical_out', },
"warning-dropped-in:s" => { name => 'warning_dropped_in', },
"critical-dropped-in:s" => { name => 'critical_dropped_in', },
"warning-dropped-out:s" => { name => 'warning_dropped_out', },
"critical-dropped-out:s" => { name => 'critical_dropped_out', },
"link-down-status:s" => { name => 'link_down_status', default => 'critical' },
"no-proxyswitch" => { name => 'no_proxyswitch' },
});
@ -54,7 +58,8 @@ sub check_options {
my ($self, %options) = @_;
$self->SUPER::init(%options);
foreach my $label (('warning_in', 'critical_in', 'warning_out', 'critical_out')) {
foreach my $label (('warning_in', 'critical_in', 'warning_out', 'critical_out',
'warning_dropped_in', 'critical_dropped_in', 'warning_dropped_out', 'critical_dropped_out')) {
if (($self->{perfdata}->threshold_validate(label => $label, value => $self->{option_results}->{$label})) == 0) {
my ($label_opt) = $label;
$label_opt =~ tr/_/-/;
@ -141,6 +146,22 @@ Threshold warning traffic out (percent).
Threshold critical traffic out (percent).
=item B<--warning-dropped-in>
Threshold warning packets in dropped (percent).
=item B<--critical-dropped-in>
Threshold critical packets in dropped (percent).
=item B<--warning-dropped-out>
Threshold warning packets out dropped (percent).
=item B<--critical-dropped-out>
Threshold critical packets out dropped (percent).
=item B<--no-proxyswitch>
Use the following option if you are checking an ESX 3.x version (it's mandatory).

View File

@ -0,0 +1,278 @@
#
# Copyright 2017 Centreon (http://www.centreon.com/)
#
# Centreon is a full-fledged industry-strength solution that meets
# the needs in IT infrastructure and application monitoring for
# service performance.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
package apps::voip::asterisk::ami::custom::api;
use strict;
use warnings;
use IO::Socket::INET;
use IO::Select;
sub new {
my ($class, %options) = @_;
my $self = {};
bless $self, $class;
if (!defined($options{output})) {
print "Class Custom: Need to specify 'output' argument.\n";
exit 3;
}
if (!defined($options{options})) {
$options{output}->add_option_msg(short_msg => "Class Custom: Need to specify 'options' argument.");
$options{output}->option_exit();
}
if (!defined($options{noptions})) {
$options{options}->add_options(arguments =>
{
"ami-hostname:s@" => { name => 'ami_hostname' },
"ami-port:s@" => { name => 'ami_port' },
"ami-username:s@" => { name => 'ami_username' },
"ami-password:s@" => { name => 'ami_password' },
"timeout:s@" => { name => 'timeout' },
});
}
$options{options}->add_help(package => __PACKAGE__, sections => 'REST API OPTIONS', once => 1);
$self->{output} = $options{output};
$self->{mode} = $options{mode};
$self->{cnx_ami} = undef;
return $self;
}
sub set_options {
my ($self, %options) = @_;
$self->{option_results} = $options{option_results};
}
sub set_defaults {
my ($self, %options) = @_;
foreach (keys %{$options{default}}) {
if ($_ eq $self->{mode}) {
for (my $i = 0; $i < scalar(@{$options{default}->{$_}}); $i++) {
foreach my $opt (keys %{$options{default}->{$_}[$i]}) {
if (!defined($self->{option_results}->{$opt}[$i])) {
$self->{option_results}->{$opt}[$i] = $options{default}->{$_}[$i]->{$opt};
}
}
}
}
}
}
sub check_options {
my ($self, %options) = @_;
$self->{ami_hostname} = (defined($self->{option_results}->{ami_hostname})) ? shift(@{$self->{option_results}->{ami_hostname}}) : undef;
$self->{ami_username} = (defined($self->{option_results}->{ami_username})) ? shift(@{$self->{option_results}->{ami_username}}) : undef;
$self->{ami_password} = (defined($self->{option_results}->{ami_password})) ? shift(@{$self->{option_results}->{ami_password}}) : undef;
$self->{ami_port} = (defined($self->{option_results}->{ami_port})) ? shift(@{$self->{option_results}->{ami_port}}) : 5038;
$self->{timeout} = (defined($self->{option_results}->{timeout})) ? shift(@{$self->{option_results}->{timeout}}) : 10;
if (!defined($self->{ami_hostname})) {
$self->{output}->add_option_msg(short_msg => "Need to specify --ami-hostname option.");
$self->{output}->option_exit();
}
if (!defined($self->{ami_username})) {
$self->{output}->add_option_msg(short_msg => "Need to specify --ami-username option.");
$self->{output}->option_exit();
}
if (!defined($self->{ami_password})) {
$self->{output}->add_option_msg(short_msg => "Need to specify --ami-password option.");
$self->{output}->option_exit();
}
if (!defined($self->{ami_hostname}) ||
scalar(@{$self->{option_results}->{ami_hostname}}) == 0) {
return 0;
}
return 1;
}
sub get_connect_info {
my ($self, %options) = @_;
return $self->{ami_hostname} . '_' . $self->{ami_port};
}
sub read_ami_protocol_end {
my ($self, %options) = @_;
if (defined($options{response})) {
if ($options{response} eq 'Follows') {
return 1 if ($options{message} =~ /^--END COMMAND--/ms);
} else {
return 1 if ($options{message} =~ /^Message: (.*)(\r\n)/ms);
}
}
return 0;
}
sub read_ami_protocol {
my ($self, %options) = @_;
my $select = IO::Select->new($self->{cnx_ami});
# Two types of message:
# Response: Error
# Message: Authentication failed
#
# Response: Follows
# ...
# --END COMMAND--
my ($response, $read_msg);
my $message = '';
while (1) {
if (!$select->can_read(10)) {
$response = 'Timeout';
last;
}
my $status = $self->{cnx_ami}->recv($read_msg, 4096);
if (!defined($response)) {
next if ($read_msg !~ /^Response: (.*?)(?:\r\n|\n)(.*)/ms);
($response, $message) = ($1, $2);
} else {
$message .= $read_msg;
}
last if ($self->read_ami_protocol_end(response => $response, message => $message));
}
$message =~ s/\r//msg;
if ($response !~ /Success|Follows/) {
$message =~ s/\n+$//msg;
$message =~ s/\n/ -- /msg;
$self->{output}->add_option_msg(short_msg => "Communication issue [" . $message . "]");
$self->{output}->option_exit();
}
$self->{output}->output_add(long_msg => $message, debug => 1);
return $message;
}
sub write_ami_protocol {
my ($self, %options) = @_;
$self->{cnx_ami}->send($options{cmd});
}
sub login {
my ($self, %options) = @_;
$self->write_ami_protocol(cmd => "Action:login
Username:$self->{ami_username}
Secret:$self->{ami_password}
Events: off
");
# don't need to get it. If it comes, it's success :)
$self->read_ami_protocol();
}
sub connect {
my ($self, %options) = @_;
$self->{cnx_ami} = IO::Socket::INET->new(
PeerAddr => $self->{ami_hostname},
PeerPort => $self->{ami_port},
Proto => 'tcp',
Timeout => $self->{timeout},
);
if (!defined($self->{cnx_ami})) {
$self->{output}->add_option_msg(short_msg => "Can't bind : $@");
$self->{output}->option_exit();
}
$self->{cnx_ami}->autoflush(1);
$self->login();
}
sub command {
my ($self, %options) = @_;
if (!defined($self->{cnx_ami})) {
$self->connect();
}
$self->write_ami_protocol(cmd => "Action:command
Command:$options{cmd}
");
return $self->read_ami_protocol();
}
sub DESTROY {
my $self = shift;
if (defined($self->{cnx_ami})) {
$self->{cnx_ami}->close();
}
}
1;
__END__
=head1 NAME
Asterisk AMI
=head1 SYNOPSIS
Asterisk AMI custom mode
=head1 AMI API OPTIONS
=over 8
=item B<--ami-hostname>
AMI hostname (Required).
=item B<--ami-port>
AMI port (Default: 5038).
=item B<--ami-username>
AMI username.
=item B<--ami-password>
AMI password.
=item B<--timeout>
Set TCP timeout
=back
=head1 DESCRIPTION
B<custom>.
=cut

View File

@ -0,0 +1,132 @@
#
# Copyright 2017 Centreon (http://www.centreon.com/)
#
# Centreon is a full-fledged industry-strength solution that meets
# the needs in IT infrastructure and application monitoring for
# service performance.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
package apps::voip::asterisk::ami::mode::channelusage;
use base qw(centreon::plugins::templates::counter);
use strict;
use warnings;
use Digest::MD5 qw(md5_hex);
sub set_counters {
my ($self, %options) = @_;
$self->{maps_counters_type} = [
{ name => 'global', type => 0 },
];
$self->{maps_counters}->{global} = [
{ label => 'channels-active', set => {
key_values => [ { name => 'channels_active' } ],
output_template => 'Channels Active: %s',
perfdatas => [
{ label => 'channels_active', value => 'channels_active_absolute', template => '%s', min => 0 },
],
}
},
{ label => 'calls-active', set => {
key_values => [ { name => 'calls_active' } ],
output_template => 'Calls Active: %s',
perfdatas => [
{ label => 'calls_active', value => 'calls_active_absolute', template => '%s', min => 0 },
],
}
},
{ label => 'extcalls-active', set => {
key_values => [ { name => 'extcalls_active' } ],
output_template => 'External Calls Active: %s',
perfdatas => [
{ label => 'extcalls_active', value => 'extcalls_active_absolute', template => '%s', min => 0 },
],
}
},
{ label => 'calls-count', set => {
key_values => [ { name => 'calls_count', diff => 1 } ],
output_template => 'Calls Count: %s',
perfdatas => [
{ label => 'calls_count', value => 'calls_count_absolute', template => '%s', min => 0 },
],
}
},
];
}
sub new {
my ($class, %options) = @_;
my $self = $class->SUPER::new(package => __PACKAGE__, %options, statefile => 1);
bless $self, $class;
$self->{version} = '1.0';
$options{options}->add_options(arguments =>
{
});
return $self;
}
sub manage_selection {
my ($self, %options) = @_;
my $result = $options{custom}->command(cmd => 'core show channels');
$self->{global} = { channels_active => 0, calls_active => 0,
calls_count => undef, extcalls_active => 0 };
$self->{global}->{channels_active} = $1
if ($result =~ /^(\d+)\s+active\s+channels/ms);
$self->{global}->{calls_active} = $1
if ($result =~ /^(\d+)\s+active\s+calls/ms);
$self->{global}->{calls_count} = $1
if ($result =~ /^(\d+)\s+calls\s+processed/ms);
my $count = 0;
$count++ while ($result =~ /Outgoing\s+Line/msig);
$self->{global}->{extcalls_active} = $count;
$self->{cache_name} = "asterisk_" . '_' . $self->{mode} . '_' . $options{custom}->get_connect_info() . '_' .
(defined($self->{option_results}->{filter_counters}) ? md5_hex($self->{option_results}->{filter_counters}) : md5_hex('all')) . '_' .
(defined($self->{option_results}->{filter_name}) ? md5_hex($self->{option_results}->{filter_name}) : md5_hex('all'));
}
1;
__END__
=head1 MODE
Check channel usage: active calls, external calls.
=over 8
=item B<--warning-*>
Threshold warning.
Can be: 'channels-active', 'calls-active', 'extcalls-active',
'calls-count'.
=item B<--critical-*>
Threshold critical.
Can be: 'channels-active', 'calls-active', 'extcalls-active',
'calls-count'.
=back
=cut

View File

@ -0,0 +1,192 @@
#
# Copyright 2017 Centreon (http://www.centreon.com/)
#
# Centreon is a full-fledged industry-strength solution that meets
# the needs in IT infrastructure and application monitoring for
# service performance.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
package apps::voip::asterisk::ami::mode::dahdistatus;
use base qw(centreon::plugins::templates::counter);
use strict;
use warnings;
my $instance_mode;
sub custom_status_threshold {
my ($self, %options) = @_;
my $status = 'ok';
my $message;
eval {
local $SIG{__WARN__} = sub { $message = $_[0]; };
local $SIG{__DIE__} = sub { $message = $_[0]; };
my $label = $self->{label};
$label =~ s/-/_/g;
if (defined($instance_mode->{option_results}->{'critical_' . $label}) && $instance_mode->{option_results}->{'critical_' . $label} ne '' &&
eval "$instance_mode->{option_results}->{'critical_' . $label}") {
$status = 'critical';
} elsif (defined($instance_mode->{option_results}->{'warning_' . $label}) && $instance_mode->{option_results}->{'warning_' . $label} ne '' &&
eval "$instance_mode->{option_results}->{'warning_' . $label}") {
$status = 'warning';
}
};
if (defined($message)) {
$self->{output}->output_add(long_msg => 'filter status issue: ' . $message);
}
return $status;
}
sub custom_status_output {
my ($self, %options) = @_;
my $msg = sprintf('status : %s', $self->{result_values}->{status});
return $msg;
}
sub custom_status_calc {
my ($self, %options) = @_;
$self->{result_values}->{status} = $options{new_datas}->{$self->{instance} . '_status'};
$self->{result_values}->{description} = $options{new_datas}->{$self->{instance} . '_description'};
return 0;
}
sub set_counters {
my ($self, %options) = @_;
$self->{maps_counters_type} = [
{ name => 'dahdi', type => 1, cb_prefix_output => 'prefix_dahdi_output', message_multiple => 'All dahdi lines are ok' },
];
$self->{maps_counters}->{dahdi} = [
{ label => 'status', threshold => 0, set => {
key_values => [ { name => 'description' }, { name => 'status' } ],
closure_custom_calc => $self->can('custom_status_calc'),
closure_custom_output => $self->can('custom_status_output'),
closure_custom_perfdata => sub { return 0; },
closure_custom_threshold_check => $self->can('custom_status_threshold'),
}
},
];
}
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 =>
{
"filter-description:s" => { name => 'filter_description' },
"warning-status:s" => { name => 'warning_status', default => '%{status} =~ /UNCONFIGURED|YEL|BLU/i' },
"critical-status:s" => { name => 'critical_status', default => '%{status} =~ /RED/i' },
});
return $self;
}
sub check_options {
my ($self, %options) = @_;
$self->SUPER::check_options(%options);
$instance_mode = $self;
$self->change_macros();
}
sub prefix_dahdi_output {
my ($self, %options) = @_;
return "Line '" . $options{instance_value}->{description} . "' ";
}
sub change_macros {
my ($self, %options) = @_;
foreach (('warning_status', 'critical_status')) {
if (defined($self->{option_results}->{$_})) {
$self->{option_results}->{$_} =~ s/%\{(.*?)\}/\$self->{result_values}->{$1}/g;
}
}
}
sub manage_selection {
my ($self, %options) = @_;
# Status can be: OK, UNCONFIGURED, BLU, YEL, RED, REC (recover), NOP (notopen), UUU
#Description Alarms IRQ bpviol CRC4
#Wildcard TDM410P Board 1 OK 0 0 0
#Wildcard TDM800P Board 2 OK 0 0 0
#Description Alarms IRQ bpviol CRC Fra Codi Options LBO
#Wildcard TE131/TE133 Card 0 BLU/RED 0 0 0 CCS HDB3 0 db (CSU)/0-133 feet (DSX-1)
my $result = $options{custom}->command(cmd => 'dahdi show status');
$self->{dahdi} = {};
foreach my $line (split /\n/, $result) {
if ($line =~ /^(.*?)\s+((?:OK|UNCONFIGURED|BLU|YEL|RED|REC|NOP|UUU)[^\s]*)\s+/msg) {
my ($description, $status) = ($1, $2);
if (defined($self->{option_results}->{filter_description}) && $self->{option_results}->{filter_description} ne '' &&
$description !~ /$self->{option_results}->{filter_description}/) {
$self->{output}->output_add(long_msg => "skipping '" . $description . "': no matching filter.", debug => 1);
next;
}
$self->{dahdi}->{$description} = {
description => $description,
status => $status,
};
}
}
if (scalar(keys %{$self->{dahdi}}) <= 0) {
$self->{output}->add_option_msg(short_msg => "No dahdi lines found.");
$self->{output}->option_exit();
}
}
1;
__END__
=head1 MODE
Check status of dahdi lines.
=over 8
=item B<--filter-description>
Filter dahdi description (can be a regexp).
=item B<--warning-status>
Set warning threshold for status (Default: '%{status} =~ /UNCONFIGURED|YEL|BLU/i').
Can used special variables like: %{description}, %{status}
=item B<--critical-status>
Set critical threshold for status (Default: '%{status} =~ /RED/i').
Can used special variables like: %{description}, %{status}
=back
=cut

View File

@ -0,0 +1,252 @@
#
# Copyright 2017 Centreon (http://www.centreon.com/)
#
# Centreon is a full-fledged industry-strength solution that meets
# the needs in IT infrastructure and application monitoring for
# service performance.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
package apps::voip::asterisk::ami::mode::sippeersusage;
use base qw(centreon::plugins::templates::counter);
use strict;
use warnings;
my $instance_mode;
sub custom_status_threshold {
my ($self, %options) = @_;
my $status = 'ok';
my $message;
eval {
local $SIG{__WARN__} = sub { $message = $_[0]; };
local $SIG{__DIE__} = sub { $message = $_[0]; };
my $label = $self->{label};
$label =~ s/-/_/g;
if (defined($instance_mode->{option_results}->{'critical_' . $label}) && $instance_mode->{option_results}->{'critical_' . $label} ne '' &&
eval "$instance_mode->{option_results}->{'critical_' . $label}") {
$status = 'critical';
} elsif (defined($instance_mode->{option_results}->{'warning_' . $label}) && $instance_mode->{option_results}->{'warning_' . $label} ne '' &&
eval "$instance_mode->{option_results}->{'warning_' . $label}") {
$status = 'warning';
}
};
if (defined($message)) {
$self->{output}->output_add(long_msg => 'filter status issue: ' . $message);
}
return $status;
}
sub custom_status_output {
my ($self, %options) = @_;
my $msg = sprintf('status : %s', $self->{result_values}->{status});
return $msg;
}
sub custom_status_calc {
my ($self, %options) = @_;
$self->{result_values}->{status} = $options{new_datas}->{$self->{instance} . '_status'};
$self->{result_values}->{name} = $options{new_datas}->{$self->{instance} . '_name'};
return 0;
}
sub set_counters {
my ($self, %options) = @_;
$self->{maps_counters_type} = [
{ name => 'global', type => 0 },
{ name => 'sip', type => 1, cb_prefix_output => 'prefix_sip_output', message_multiple => 'All SIP peers are ok' },
];
$self->{maps_counters}->{global} = [
{ label => 'total-peers', set => {
key_values => [ { name => 'total_peers' } ],
output_template => 'Total Peers: %s',
perfdatas => [
{ label => 'total_peers', value => 'total_peers_absolute', template => '%s', min => 0 },
],
}
},
{ label => 'monitor-online-peers', set => {
key_values => [ { name => 'monitor_online_peers' } ],
output_template => 'Monitor Online Peers: %s',
perfdatas => [
{ label => 'monitor_online_peers', value => 'monitor_online_peers_absolute', template => '%s', min => 0 },
],
}
},
{ label => 'monitor-offline-peers', set => {
key_values => [ { name => 'monitor_offline_peers' } ],
output_template => 'Monitor Offline Peers: %s',
perfdatas => [
{ label => 'monitor_offline_peers', value => 'monitor_offline_peers_absolute', template => '%s', min => 0 },
],
}
},
{ label => 'unmonitor-online-peers', set => {
key_values => [ { name => 'unmonitor_online_peers' } ],
output_template => 'Unmonitor Online Peers: %s',
perfdatas => [
{ label => 'unmonitor_online_peers', value => 'unmonitor_online_peers_absolute', template => '%s', min => 0 },
],
}
},
{ label => 'unmonitor-offline-peers', set => {
key_values => [ { name => 'unmonitor_offline_peers' } ],
output_template => 'Unmonitor Offline Peers: %s',
perfdatas => [
{ label => 'unmonitor_offline_peers', value => 'unmonitor_offline_peers_absolute', template => '%s', min => 0 },
],
}
},
];
$self->{maps_counters}->{sip} = [
{ label => 'status', threshold => 0, set => {
key_values => [ { name => 'name' }, { name => 'status' } ],
closure_custom_calc => $self->can('custom_status_calc'),
closure_custom_output => $self->can('custom_status_output'),
closure_custom_perfdata => sub { return 0; },
closure_custom_threshold_check => $self->can('custom_status_threshold'),
}
},
];
}
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 =>
{
"filter-name:s" => { name => 'filter_name' },
"warning-status:s" => { name => 'warning_status', default => '%{status} =~ /LAGGED|UNKNOWN/i' },
"critical-status:s" => { name => 'critical_status', default => '%{status} =~ /UNREACHABLE/i' },
});
return $self;
}
sub check_options {
my ($self, %options) = @_;
$self->SUPER::check_options(%options);
$instance_mode = $self;
$self->change_macros();
}
sub prefix_sip_output {
my ($self, %options) = @_;
return "Peer '" . $options{instance_value}->{name} . "' ";
}
sub change_macros {
my ($self, %options) = @_;
foreach (('warning_status', 'critical_status')) {
if (defined($self->{option_results}->{$_})) {
$self->{option_results}->{$_} =~ s/%\{(.*?)\}/\$self->{result_values}->{$1}/g;
}
}
}
sub manage_selection {
my ($self, %options) = @_;
# Status can be: UNREACHABLE, LAGGED (%d ms), OK (%d ms), UNKNOWN, Unmonitored
#Name/username Host Dyn Forcerport Comedia ACL Port Status Description
#02l44k/02l44k 10.9.0.61 D No No 5060 Unmonitored
#0rafkw/0rafkw 10.9.0.28 D No No 5060 Unmonitored
#...
#55 sip peers [Monitored: 0 online, 0 offline Unmonitored: 43 online, 12 offline]
my $result = $options{custom}->command(cmd => 'sip show peers');
$self->{sip} = {};
foreach my $line (split /\n/, $result) {
if ($line =~ /^(.*?)\s+.*(UNREACHABLE|LAGGED|OK|UNKNOWN|Unmonitored)\s/msg) {
my ($name, $status) = ($1, $2);
if (defined($self->{option_results}->{filter_name}) && $self->{option_results}->{filter_name} ne '' &&
$name !~ /$self->{option_results}->{filter_name}/) {
$self->{output}->output_add(long_msg => "skipping '" . $name . "': no matching filter.", debug => 1);
next;
}
$self->{sip}->{$name} = {
name => $name,
status => $status,
};
}
}
$self->{global} = {
total_peers => $1,
monitor_online_peers => $2, monitor_offline_peers => $3,
unmonitor_online_peers => $4, unmonitor_offline_peers => $5,
} if ($result =~ /(\d+) sip peers \[Monitored: (\d+) online, (\d+) offline Unmonitored: (\d+) online, (\d+) offline]/msi);
if (scalar(keys %{$self->{sip}}) <= 0) {
$self->{output}->add_option_msg(short_msg => "No sip peers found.");
$self->{output}->option_exit();
}
}
1;
__END__
=head1 MODE
Check SIP peers usage.
=over 8
=item B<--filter-name>
Filter sip peer name (can be a regexp).
=item B<--warning-status>
Set warning threshold for status (Default: '%{status} =~ /LAGGED|UNKNOWN/i').
Can used special variables like: %{name}, %{status}
=item B<--critical-status>
Set critical threshold for status (Default: '%{status} =~ /UNREACHABLE/i').
Can used special variables like: %{name}, %{status}
=item B<--warning-*>
Threshold warning.
Can be: 'total-peers', 'monitor-online-peers', 'monitor-offline-peers',
'unmonitor-online-peers', 'unmonitor-offline-peers'.
=item B<--critical-*>
Threshold critical.
Can be: 'total-peers', 'monitor-online-peers', 'monitor-offline-peers',
'unmonitor-online-peers', 'unmonitor-offline-peers'.
=back
=cut

View File

@ -0,0 +1,51 @@
#
# Copyright 2017 Centreon (http://www.centreon.com/)
#
# Centreon is a full-fledged industry-strength solution that meets
# the needs in IT infrastructure and application monitoring for
# service performance.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
package apps::voip::asterisk::ami::plugin;
use strict;
use warnings;
use base qw(centreon::plugins::script_custom);
sub new {
my ($class, %options) = @_;
my $self = $class->SUPER::new(package => __PACKAGE__, %options);
bless $self, $class;
$self->{version} = '1.0';
%{$self->{modes}} = (
'channel-usage' => 'apps::voip::asterisk::ami::mode::channelusage',
'dahdi-status' => 'apps::voip::asterisk::ami::mode::dahdistatus',
'sip-peers-usage' => 'apps::voip::asterisk::ami::mode::sippeersusage',
);
$self->{custom_modes}{api} = 'apps::voip::asterisk::ami::custom::api';
return $self;
}
1;
__END__
=head1 PLUGIN DESCRIPTION
Check Asterisk through AMI interface.
=cut

View File

@ -1,103 +0,0 @@
#
# Copyright 2017 Centreon (http://www.centreon.com/)
#
# Centreon is a full-fledged industry-strength solution that meets
# the needs in IT infrastructure and application monitoring for
# service performance.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
package apps::voip::asterisk::remote::lib::ami;
use strict;
use warnings;
use Net::Telnet;
my $ami_handle;
my $line;
my @lines;
my @result;
sub quit {
$ami_handle->print("Action: logoff");
$ami_handle->print("");
$ami_handle->close();
}
sub connect {
my ($self, %options) = @_;
my $connection_exit = defined($options{connection_exit}) ? $options{connection_exit} : 'unknown';
$ami_handle = new Net::Telnet (Telnetmode => 0,
Timeout => $self->{option_results}->{timeout},
Errmode => 'return',
);
$ami_handle->open(Host => $self->{option_results}->{hostname},
Port => $self->{option_results}->{port},
);
if ($ami_handle->errmsg) {
$self->{output}->output_add(severity => $connection_exit,
short_msg => 'Unable to connect to AMI: ' . $ami_handle->errmsg);
$self->{output}->display();
$self->{output}->exit();
}
# Check connection message.
$line = $ami_handle->getline;
if ($line !~ /^Asterisk/) {
$self->{output}->output_add(severity => $connection_exit,
short_msg => 'Unable to connect to AMI: ' . $line);
$self->{output}->display();
$self->{output}->exit();
}
# Authentication.
$ami_handle->print("Action: login");
$ami_handle->print("Username: $self->{option_results}->{username}");
$ami_handle->print("Secret: $self->{option_results}->{password}");
$ami_handle->print("Events: off");
$ami_handle->print("");
# Check authentication message (second message).
$line = $ami_handle->getline;
$line = $ami_handle->getline;
if ($line !~ /^Message: Authentication accepted/) {
$self->{output}->output_add(severity => $connection_exit,
short_msg => 'Unable to connect to AMI: ' . $line);
$self->{output}->display();
$self->{output}->exit();
}
}
sub action {
my ($self) = @_;
$ami_handle->print("Action: command");
$ami_handle->print("Command: $self->{asterisk_command}");
$ami_handle->print("");
my @return;
while (my $line = $ami_handle->getline(Timeout => 1)) {
push(@return,$line);
next if ($line !~ /END COMMAND/o);
}
return @return;
}
1;

View File

@ -1,223 +0,0 @@
#
# Copyright 2017 Centreon (http://www.centreon.com/)
#
# Centreon is a full-fledged industry-strength solution that meets
# the needs in IT infrastructure and application monitoring for
# service performance.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
package apps::voip::asterisk::remote::mode::activecalls;
use base qw(centreon::plugins::mode);
use strict;
use warnings;
use centreon::plugins::misc;
use apps::voip::asterisk::remote::lib::ami;
sub new {
my ($class, %options) = @_;
my $self = $class->SUPER::new(package => __PACKAGE__, %options);
bless $self, $class;
$self->{version} = '0.2';
$options{options}->add_options(arguments =>
{
"hostname:s" => { name => 'hostname' },
"port:s" => { name => 'port', default => 5038 },
"username:s" => { name => 'username' },
"password:s" => { name => 'password' },
"remote:s" => { name => 'remote', default => 'ssh' },
"ssh-option:s@" => { name => 'ssh_option' },
"ssh-path:s" => { name => 'ssh_path' },
"ssh-command:s" => { name => 'ssh_command', default => 'ssh' },
"timeout:s" => { name => 'timeout', default => 30 },
"command:s" => { name => 'command', default => 'asterisk_sendcommand.pm' },
"command-path:s" => { name => 'command_path', default => '/home/centreon/bin' },
"protocol:s" => { name => 'protocol', },
"warning:s" => { name => 'warning', },
"critical:s" => { name => 'critical', },
});
$self->{result} = {};
return $self;
}
sub check_options {
my ($self, %options) = @_;
$self->SUPER::init(%options);
if (!defined($self->{option_results}->{hostname})) {
$self->{output}->add_option_msg(short_msg => "Please set the --hostname option");
$self->{output}->option_exit();
}
if ($self->{option_results}->{remote} eq 'ami')
{
if (!defined($self->{option_results}->{username})) {
$self->{output}->add_option_msg(short_msg => "Please set the --username option");
$self->{output}->option_exit();
}
if (!defined($self->{option_results}->{password})) {
$self->{output}->add_option_msg(short_msg => "Please set the --password option");
$self->{output}->option_exit();
}
}
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();
}
}
sub manage_selection {
my ($self, %options) = @_;
my @result;
$self->{asterisk_command} = 'core show channels';
if ($self->{option_results}->{remote} eq 'ami')
{
apps::voip::asterisk::remote::lib::ami::connect($self);
@result = apps::voip::asterisk::remote::lib::ami::action($self);
apps::voip::asterisk::remote::lib::ami::quit();
}
else
{
my $stdout = centreon::plugins::misc::execute(output => $self->{output},
options => $self->{option_results},
command => $self->{option_results}->{command},
command_path => $self->{option_results}->{command_path},
command_options => "'".$self->{asterisk_command}."'",
);
@result = split /\n/, $stdout;
}
# Compute data
foreach my $line (@result) {
if ($line =~ /^(\d*) active call/)
{
$self->{result}->{activecalls} = {value => $1, status => '1'};
}
elsif ($line =~ /^Unable to connect .*/)
{
$self->{result}->{activecalls} = {value => $line, status => '0'};
}
}
}
sub run {
my ($self, %options) = @_;
my $msg;
my $old_status = 'ok';
$self->manage_selection();
# Send formated data to Centreon
if ($self->{result}->{activecalls}->{status} eq '0')
{
$self->{output}->output_add(severity => $self->{result}->{activecalls}->{status},
short_msg => $self->{result}->{activecalls}->{value});
$self->{output}->display();
$self->{output}->exit();
}
my $exit_code = $self->{perfdata}->threshold_check(value => $self->{result}->{activecalls}->{value},
threshold => [ { label => 'critical', 'exit_litteral' => 'critical' }, { label => 'warning', exit_litteral => 'warning' } ]);
$self->{output}->perfdata_add(label => 'Active Calls',
value => $self->{result}->{activecalls}->{value},
warning => $self->{perfdata}->get_perfdata_for_output(label => 'warning'),
critical => $self->{perfdata}->get_perfdata_for_output(label => 'critical'),
min => 0);
$self->{output}->output_add(severity => $exit_code,
short_msg => sprintf("Current active calls: %s", $self->{result}->{activecalls}->{value})
);
$self->{output}->display();
$self->{output}->exit();
}
1;
__END__
=head1 MODE
Show number of current active calls
=over 8
=item B<--warning>
Threshold warning.
=item B<--critical>
Threshold critical.
=item B<--remote>
Execute command remotely; can be 'ami' or 'ssh' (default: ssh).
=item B<--hostname>
Hostname to query (need --remote option).
=item B<--port>
AMI remote port (default: 5038).
=item B<--username>
AMI username.
=item B<--password>
AMI password.
=item B<--ssh-option>
Specify multiple options like the user (example: --ssh-option='-l=centreon-engine' --ssh-option='-p=52').
=item B<--ssh-path>
Specify ssh command path (default: none)
=item B<--ssh-command>
Specify ssh command (default: 'ssh'). Useful to use 'plink'.
=item B<--timeout>
Timeout in seconds for the command (Default: 30).
=item B<--command>
Command to get information (Default: 'asterisk_sendcommand.pm').
Can be changed if you have output in a file.
=item B<--command-path>
Command path (Default: /home/centreon/bin).
=back
=cut

View File

@ -1,230 +0,0 @@
#
# Copyright 2017 Centreon (http://www.centreon.com/)
#
# Centreon is a full-fledged industry-strength solution that meets
# the needs in IT infrastructure and application monitoring for
# service performance.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
package apps::voip::asterisk::remote::mode::dahdistatus;
use base qw(centreon::plugins::mode);
use strict;
use warnings;
use centreon::plugins::misc;
use apps::voip::asterisk::remote::lib::ami;
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 =>
{
"hostname:s" => { name => 'hostname' },
"port:s" => { name => 'port', default => 5038 },
"username:s" => { name => 'username' },
"password:s" => { name => 'password' },
"remote:s" => { name => 'remote', default => 'ssh' },
"ssh-option:s@" => { name => 'ssh_option' },
"ssh-path:s" => { name => 'ssh_path' },
"ssh-command:s" => { name => 'ssh_command', default => 'ssh' },
"timeout:s" => { name => 'timeout', default => 30 },
"command:s" => { name => 'command', default => 'asterisk_sendcommand.pm' },
"command-path:s" => { name => 'command_path', default => '/home/centreon/bin' },
"filter-name:s" => { name => 'filter_name', },
});
$self->{result} = {};
return $self;
}
sub check_options {
my ($self, %options) = @_;
$self->SUPER::init(%options);
if (!defined($self->{option_results}->{hostname})) {
$self->{output}->add_option_msg(short_msg => "Please set the --hostname option");
$self->{output}->option_exit();
}
if ($self->{option_results}->{remote} eq 'ami')
{
if (!defined($self->{option_results}->{username})) {
$self->{output}->add_option_msg(short_msg => "Please set the --username option");
$self->{output}->option_exit();
}
if (!defined($self->{option_results}->{password})) {
$self->{output}->add_option_msg(short_msg => "Please set the --password option");
$self->{output}->option_exit();
}
}
}
sub manage_selection {
my ($self, %options) = @_;
my @result;
$self->{asterisk_command} = 'dahdi show status';
if ($self->{option_results}->{remote} eq 'ami')
{
apps::voip::asterisk::remote::lib::ami::connect($self);
@result = apps::voip::asterisk::remote::lib::ami::action($self);
apps::voip::asterisk::remote::lib::ami::quit();
}
else
{
my $stdout = centreon::plugins::misc::execute(output => $self->{output},
options => $self->{option_results},
command => $self->{option_results}->{command},
command_path => $self->{option_results}->{command_path},
command_options => "'".$self->{asterisk_command}."'",
);
@result = split /\n/, $stdout;
}
# Compute data
foreach my $line (@result) {
if ($line =~ /^Description /)
{
next;
}
if ($line =~ /^(.{41})(\w*).*/)
{
my $status;
my ($trunkname, $trunkstatus) = ($1, $2);
$trunkname =~ s/^\s+|\s+$//g;
if (defined($self->{option_results}->{filter_name}) && $self->{option_results}->{filter_name} ne '' &&
$trunkname !~ /$self->{option_results}->{filter_name}/)
{
$self->{output}->output_add(long_msg => "Skipping trunk '" . $trunkname . "': no matching filter name");
next;
}
if ($trunkstatus eq 'Red' | $trunkstatus eq 'Yel' | $trunkstatus eq 'Blu')
{
$status = 'CRITICAL';
}
elsif ($trunkstatus eq 'Unconfi')
{
$status = 'WARNING';
}
$self->{result}->{$trunkname} = {name => $trunkname, status => $status, realstatus => $trunkstatus};
}
elsif ($line =~ /^Unable to connect .*/)
{
$self->{result}->{$line} = {name => $line, status => 'CRITICAL'};
}
}
}
sub run {
my ($self, %options) = @_;
my $msg;
my $old_status = 'ok';
$self->manage_selection();
# Send formated data to Centreon
if (scalar keys %{$self->{result}} >= 1)
{
$self->{output}->output_add(severity => 'OK',
short_msg => 'Everything is OK');
}
else
{
$self->{output}->output_add(severity => 'Unknown',
short_msg => 'Nothing to be monitored');
}
foreach my $name (sort(keys %{$self->{result}})) {
if (!$self->{output}->is_status(value => $self->{result}->{$name}->{status}, compare => 'ok', litteral => 1))
{
$msg = sprintf("Trunk: %s", $self->{result}->{$name}->{name});
$self->{output}->output_add(severity => $self->{result}->{$name}->{status},
short_msg => $msg);
}
$self->{output}->output_add(long_msg => sprintf("%s : %s", $self->{result}->{$name}->{name}, $self->{result}->{$name}->{realstatus}));
}
$self->{output}->display();
$self->{output}->exit();
}
1;
__END__
=head1 MODE
Show status of dahdi lines.
=over 8
=item B<--remote>
Execute command remotely; can be 'ami' or 'ssh' (default: ssh).
=item B<--hostname>
Hostname to query (need --remote option).
=item B<--port>
AMI remote port (default: 5038).
=item B<--username>
AMI username.
=item B<--password>
AMI password.
=item B<--ssh-option>
Specify multiple options like the user (example: --ssh-option='-l=centreon-engine' --ssh-option='-p=52').
=item B<--ssh-path>
Specify ssh command path (default: none)
=item B<--ssh-command>
Specify ssh command (default: 'ssh'). Useful to use 'plink'.
=item B<--timeout>
Timeout in seconds for the command (Default: 30).
=item B<--command>
Command to get information (Default: 'asterisk_sendcommand.pm').
Can be changed if you have output in a file.
=item B<--command-path>
Command path (Default: /home/centreon/bin).
=item B<--filter-name>
Filter on trunkname (regexp can be used).
=back
=cut

View File

@ -1,213 +0,0 @@
#
# Copyright 2017 Centreon (http://www.centreon.com/)
#
# Centreon is a full-fledged industry-strength solution that meets
# the needs in IT infrastructure and application monitoring for
# service performance.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
package apps::voip::asterisk::remote::mode::externalcalls;
use base qw(centreon::plugins::mode);
use strict;
use warnings;
use centreon::plugins::misc;
use apps::voip::asterisk::remote::lib::ami;
sub new {
my ($class, %options) = @_;
my $self = $class->SUPER::new(package => __PACKAGE__, %options);
bless $self, $class;
$self->{version} = '0.1';
$options{options}->add_options(arguments =>
{
"hostname:s" => { name => 'hostname' },
"port:s" => { name => 'port', default => 5038 },
"username:s" => { name => 'username' },
"password:s" => { name => 'password' },
"remote:s" => { name => 'remote', default => 'ssh' },
"ssh-option:s@" => { name => 'ssh_option' },
"ssh-path:s" => { name => 'ssh_path' },
"ssh-command:s" => { name => 'ssh_command', default => 'ssh' },
"timeout:s" => { name => 'timeout', default => 30 },
"command:s" => { name => 'command', default => 'asterisk_sendcommand.pm' },
"command-path:s" => { name => 'command_path', default => '/home/centreon/bin' },
"protocol:s" => { name => 'protocol', },
"warning:s" => { name => 'warning', },
"critical:s" => { name => 'critical', },
});
$self->{result} = {};
return $self;
}
sub check_options {
my ($self, %options) = @_;
$self->SUPER::init(%options);
if (!defined($self->{option_results}->{hostname})) {
$self->{output}->add_option_msg(short_msg => "Please set the --hostname option");
$self->{output}->option_exit();
}
if ($self->{option_results}->{remote} eq 'ami')
{
if (!defined($self->{option_results}->{username})) {
$self->{output}->add_option_msg(short_msg => "Please set the --username option");
$self->{output}->option_exit();
}
if (!defined($self->{option_results}->{password})) {
$self->{output}->add_option_msg(short_msg => "Please set the --password option");
$self->{output}->option_exit();
}
}
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();
}
}
sub manage_selection {
my ($self, %options) = @_;
my @result;
$self->{asterisk_command} = 'core show channels';
if ($self->{option_results}->{remote} eq 'ami')
{
apps::voip::asterisk::remote::lib::ami::connect($self);
@result = apps::voip::asterisk::remote::lib::ami::action($self);
apps::voip::asterisk::remote::lib::ami::quit();
}
else
{
my $stdout = centreon::plugins::misc::execute(output => $self->{output},
options => $self->{option_results},
command => $self->{option_results}->{command},
command_path => $self->{option_results}->{command_path},
command_options => "'".$self->{asterisk_command}."'",
);
@result = split /\n/, $stdout;
}
# Compute data
$self->{option_results}->{extcallcounter} = '0';
foreach my $line (@result) {
if ($line =~ /Outgoing Line/m)
{
$self->{option_results}->{extcallcounter}++;
}
}
}
sub run {
my ($self, %options) = @_;
my $msg;
my $old_status = 'ok';
$self->manage_selection();
# Send formated data to Centreon
my $exit_code = $self->{perfdata}->threshold_check(value => $self->{option_results}->{extcallcounter},
threshold => [ { label => 'critical', 'exit_litteral' => 'critical' }, { label => 'warning', exit_litteral => 'warning' } ]);
$self->{output}->perfdata_add(label => 'External Calls',
value => $self->{option_results}->{extcallcounter},
warning => $self->{perfdata}->get_perfdata_for_output(label => 'warning'),
critical => $self->{perfdata}->get_perfdata_for_output(label => 'critical'),
min => 0);
$self->{output}->output_add(severity => $exit_code,
short_msg => sprintf("Current external calls: %s", $self->{option_results}->{extcallcounter})
);
$self->{output}->display();
$self->{output}->exit();
}
1;
__END__
=head1 MODE
Show number of current external calls
=over 8
=item B<--warning>
Threshold warning.
=item B<--critical>
Threshold critical.
=item B<--remote>
Execute command remotely; can be 'ami' or 'ssh' (default: ssh).
=item B<--hostname>
Hostname to query (need --remote option).
=item B<--port>
AMI remote port (default: 5038).
=item B<--username>
AMI username.
=item B<--password>
AMI password.
=item B<--ssh-option>
Specify multiple options like the user (example: --ssh-option='-l=centreon-engine' --ssh-option='-p=52').
=item B<--ssh-path>
Specify ssh command path (default: none)
=item B<--ssh-command>
Specify ssh command (default: 'ssh'). Useful to use 'plink'.
=item B<--timeout>
Timeout in seconds for the command (Default: 30).
=item B<--command>
Command to get information (Default: 'asterisk_sendcommand.pm').
Can be changed if you have output in a file.
=item B<--command-path>
Command path (Default: /home/centreon/bin).
=back
=cut

View File

@ -1,277 +0,0 @@
#
# Copyright 2017 Centreon (http://www.centreon.com/)
#
# Centreon is a full-fledged industry-strength solution that meets
# the needs in IT infrastructure and application monitoring for
# service performance.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
package apps::voip::asterisk::remote::mode::showpeers;
use base qw(centreon::plugins::mode);
use strict;
use warnings;
use centreon::plugins::misc;
use apps::voip::asterisk::remote::lib::ami;
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 =>
{
"hostname:s" => { name => 'hostname' },
"port:s" => { name => 'port', default => 5038 },
"username:s" => { name => 'username' },
"password:s" => { name => 'password' },
"remote:s" => { name => 'remote', default => 'ssh' },
"ssh-option:s@" => { name => 'ssh_option' },
"ssh-path:s" => { name => 'ssh_path' },
"ssh-command:s" => { name => 'ssh_command', default => 'ssh' },
"timeout:s" => { name => 'timeout', default => 30 },
"command:s" => { name => 'command', default => 'asterisk_sendcommand.pm' },
"command-path:s" => { name => 'command_path', default => '/home/centreon/bin' },
"protocol:s" => { name => 'protocol', },
"filter-name:s" => { name => 'filter_name', },
"warning:s" => { name => 'warning', },
"critical:s" => { name => 'critical', },
});
$self->{result} = {};
return $self;
}
sub check_options {
my ($self, %options) = @_;
$self->SUPER::init(%options);
if (!defined($self->{option_results}->{hostname})) {
$self->{output}->add_option_msg(short_msg => "Please set the --hostname option");
$self->{output}->option_exit();
}
if ($self->{option_results}->{remote} eq 'ami')
{
if (!defined($self->{option_results}->{username})) {
$self->{output}->add_option_msg(short_msg => "Please set the --username option");
$self->{output}->option_exit();
}
if (!defined($self->{option_results}->{password})) {
$self->{output}->add_option_msg(short_msg => "Please set the --password option");
$self->{output}->option_exit();
}
}
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();
}
}
sub manage_selection {
my ($self, %options) = @_;
my @result;
if ($self->{option_results}->{protocol} eq 'sip' || $self->{option_results}->{protocol} eq 'SIP')
{
$self->{asterisk_command} = 'sip show peers';
}
elsif ($self->{option_results}->{protocol} eq 'iax' || $self->{option_results}->{protocol} eq 'IAX')
{
$self->{asterisk_command} = 'iax2 show peers';
}
if ($self->{option_results}->{remote} eq 'ami')
{
apps::voip::asterisk::remote::lib::ami::connect($self);
@result = apps::voip::asterisk::remote::lib::ami::action($self);
apps::voip::asterisk::remote::lib::ami::quit();
}
else
{
my $stdout = centreon::plugins::misc::execute(output => $self->{output},
options => $self->{option_results},
command => $self->{option_results}->{command},
command_path => $self->{option_results}->{command_path},
command_options => "'".$self->{asterisk_command}."'",
);
@result = split /\n/, $stdout;
}
# Compute data
foreach my $line (@result) {
if ($line =~ /^([\w\-\/]*) *\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3} .* (OK) \((.*) (.*)\)/)
{
my ($trunkname, $trunkstatus, $trunkvalue, $trunkunit) = ($1, $2, $3, $4);
if (defined($self->{option_results}->{filter_name}) && $self->{option_results}->{filter_name} ne '' &&
$trunkname !~ /$self->{option_results}->{filter_name}/)
{
$self->{output}->output_add(long_msg => "Skipping trunk '" . $trunkname . "': no matching filter name");
next;
}
$self->{result}->{$trunkname} = {name => $trunkname, status => 'OK',
realstatus => $trunkstatus,
value => $trunkvalue,
unit => $trunkunit};
}
elsif ($line =~ /^([\w\-\/]*) *\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3} .* (Unreachable)/)
{
my ($trunkname, $trunkstatus) = ($1, $2);
$self->{result}->{$trunkname} = {name => $trunkname, status => 'CRITICAL', realstatus => $trunkstatus};
}
elsif ($line =~ /^Unable to connect .*/)
{
$self->{result}->{$line} = {name => $line, status => 'CRITICAL', realstatus => 'Unreachable'};
}
}
}
sub run {
my ($self, %options) = @_;
my $msg;
my $old_status = 'ok';
$self->manage_selection();
# Send formated data to Centreon
if (scalar keys %{$self->{result}} >= 1)
{
$self->{output}->output_add(severity => 'OK',
short_msg => 'Everything is OK');
}
else
{
$self->{output}->output_add(severity => 'Unknown',
short_msg => 'Nothing to be monitored');
}
foreach my $name (sort(keys %{$self->{result}})) {
if (defined($self->{result}->{$name}->{value}) && defined($self->{result}->{$name}->{unit}))
{
$self->{result}->{$name}->{status} = $self->{perfdata}->threshold_check(value => $self->{result}->{$name}->{value},
threshold => [{ label => 'critical', exit_litteral => 'critical' },
{ label => 'warning', exit_litteral => 'warning' }]);
$self->{output}->perfdata_add(label => $self->{result}->{$name}->{name},
value => $self->{result}->{$name}->{value}.$self->{result}->{$name}->{unit},
warning => $self->{perfdata}->get_perfdata_for_output(label => 'warning'),
critical => $self->{perfdata}->get_perfdata_for_output(label => 'critical'),
min => 0);
}
if (!$self->{output}->is_status(value => $self->{result}->{$name}->{status}, compare => 'ok', litteral => 1))
{
$msg = sprintf("Trunk: %s", $self->{result}->{$name}->{name});
$self->{output}->output_add(severity => $self->{result}->{$name}->{status},
short_msg => $msg);
if ($self->{result}->{$name}->{realstatus} eq 'Unreachable')
{
$self->{output}->output_add(long_msg => sprintf("%s : %s", $self->{result}->{$name}->{name}, $self->{result}->{$name}->{realstatus}));
}
else
{
$self->{output}->output_add(long_msg => sprintf("%s : %s", $self->{result}->{$name}->{name}, $self->{result}->{$name}->{value}));
}
}
}
$self->{output}->display();
$self->{output}->exit();
}
1;
__END__
=head1 MODE
Show peers for different protocols.
=over 8
=item B<--warning>
Threshold warning.
=item B<--critical>
Threshold critical.
=item B<--remote>
Execute command remotely; can be 'ami' or 'ssh' (default: ssh).
=item B<--hostname>
Hostname to query (need --remote option).
=item B<--port>
AMI remote port (default: 5038).
=item B<--username>
AMI username.
=item B<--password>
AMI password.
=item B<--ssh-option>
Specify multiple options like the user (example: --ssh-option='-l=centreon-engine' --ssh-option='-p=52').
=item B<--ssh-path>
Specify ssh command path (default: none)
=item B<--ssh-command>
Specify ssh command (default: 'ssh'). Useful to use 'plink'.
=item B<--timeout>
Timeout in seconds for the command (Default: 30).
=item B<--command>
Command to get information (Default: 'asterisk_sendcommand.pm').
Can be changed if you have output in a file.
=item B<--command-path>
Command path (Default: /home/centreon/bin).
=item B<--filter-name>
Filter on trunkname (regexp can be used).
=item B<--protocol>
show peer for the choosen protocol (sip or iax).
=back
=cut

View File

@ -1 +0,0 @@
<centreon asterisk user> <centreon asterisk secret>

View File

@ -1,114 +0,0 @@
#!/usr/bin/perl -w
#
# Copyright (C) 2005 Rodolphe Quiedeville <rodolphe@quiedeville.org>
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License
# as published by the Free Software Foundation; version 2 dated June,
# 1991.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
#
# If you improve this script please send your version to my email address
# with the copyright notice upgrade with your name.
#
#
# $Log$
# Revision 1.0 2015/01/16 11:15 David Sabatie <dsabatie@centreon.com>
# Release based on already existing munin script
#
# Parameters mandatory:
#
# username
# secret
#
#%# family=asterisk
#%# capabilities=autoconf
use strict;
use File::Basename;
my $ret = undef;
if (! eval "require Net::Telnet;")
{
$ret = "Net::Telnet not found";
}
my $DIRNAME=dirname($0);
my $conffile=$DIRNAME."/asterisk_centreon.conf";
my $command;
if ( (defined($ARGV[0])) && ($ARGV[0] ne '') )
{
$command = $ARGV[0];
}
else
{
print 'No command to send';
exit;
}
my $host = exists $ENV{'host'} ? $ENV{'host'} : "127.0.0.1";
my $port = exists $ENV{'port'} ? $ENV{'port'} : "5038";
#[asterisk_*]
#env.username xivo_centreon_user
#env.secret secretpass
my ($username, $secret);
open FILE, $conffile or die $!;
while (my $confline = <FILE>)
{
($username, $secret) = split(' ', $confline);
}
close(FILE);
my $pop = new Net::Telnet (Telnetmode => 0);
$pop->open(Host => $host,
Port => $port);
## Read connection message.
my $line = $pop->getline;
die $line unless $line =~ /^Asterisk/;
## Send user name.
$pop->print("Action: login");
$pop->print("Username: $username");
$pop->print("Secret: $secret");
$pop->print("Events: off");
$pop->print("");
#Response: Success
#Message: Authentication accepted
$line = $pop->getline;
$line = $pop->getline;
if ($line !~ /^Message: Authentication accepted/) {
print 'Unable to connect to AMI: ' . $line;
exit;
}
## Request status of messages.
$pop->print("Action: command");
$pop->print("Command: ".$command);
$pop->print("");
$line = $pop->getline;
$line = $pop->getline;
$line = $pop->getline;
while (($line = $pop->getline) and ($line !~ /END COMMAND/o))
{
print $line;
}
$pop->print("Action: logoff");
$pop->print("");
$pop->close();
# vim:syntax=perl

View File

@ -1,127 +0,0 @@
#
# Copyright 2017 Centreon (http://www.centreon.com/)
#
# Centreon is a full-fledged industry-strength solution that meets
# the needs in IT infrastructure and application monitoring for
# service performance.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
package apps::voip::asterisk::snmp::mode::activecalls;
use base qw(centreon::plugins::mode);
use strict;
use warnings;
use centreon::plugins::statefile;
my $oid_astBase = '.1.3.6.1.4.1.22736';
my $oid_astConfigCallsActive = $oid_astBase.'.1.2.5.0';
#my $oid_AsteriskConfigCallsProcessed = $oid_AsteriskBase.'.1.2.6.0';
sub new {
my ($class, %options) = @_;
my $self = $class->SUPER::new(package => __PACKAGE__, %options);
bless $self, $class;
$self->{version} = '1.1';
$options{options}->add_options(arguments =>
{
"warning:s" => { name => 'warning', },
"critical:s" => { name => 'critical', },
"force-oid:s" => { name => 'force_oid', },
});
$self->{statefile_value} = centreon::plugins::statefile->new(%options);
return $self;
}
sub check_options {
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->{statefile_value}->check_options(%options);
}
sub run {
my ($self, %options) = @_;
$self->{snmp} = $options{snmp};
my ($result, $value);
if (defined($self->{option_results}->{force_oid})) {
$result = $self->{snmp}->get_leef(oids => [ $self->{option_results}->{force_oid} ], nothing_quit => 1);
$value = $result->{$self->{option_results}->{force_oid}};
} else {
$result = $self->{snmp}->get_leef(oids => [ $oid_astConfigCallsActive ], nothing_quit => 1);
$value = $result->{$oid_astConfigCallsActive};
}
if (!defined($value)) {
$self->{output}->output_add(severity => 'Unknown',
short_msg => sprintf("No information available for active channel")
);
$self->{output}->display();
$self->{output}->exit();
}
my $exit_code = $self->{perfdata}->threshold_check(value => $value,
threshold => [ { label => 'critical', 'exit_litteral' => 'critical' }, { label => 'warning', exit_litteral => 'warning' } ]);
$self->{output}->perfdata_add(label => 'Calls',
value => $value,
warning => $self->{perfdata}->get_perfdata_for_output(label => 'warning'),
critical => $self->{perfdata}->get_perfdata_for_output(label => 'critical'),
min => 0);
$self->{output}->output_add(severity => $exit_code,
short_msg => sprintf("Current active calls: %s", $value)
);
$self->{output}->display();
$self->{output}->exit();
}
1;
__END__
=head1 MODE
Check number of active calls.
=over 8
=item B<--warning>
Threshold warning.
=item B<--critical>
Threshold critical.
=item B<--force-oid>
Can choose your oid (numeric format only).
=back
=cut

View File

@ -0,0 +1,121 @@
#
# Copyright 2017 Centreon (http://www.centreon.com/)
#
# Centreon is a full-fledged industry-strength solution that meets
# the needs in IT infrastructure and application monitoring for
# service performance.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
package apps::voip::asterisk::snmp::mode::channelusage;
use base qw(centreon::plugins::templates::counter);
use strict;
use warnings;
use Digest::MD5 qw(md5_hex);
sub set_counters {
my ($self, %options) = @_;
$self->{maps_counters_type} = [
{ name => 'global', type => 0 },
];
$self->{maps_counters}->{global} = [
{ label => 'channels-active', set => {
key_values => [ { name => 'channels_active' } ],
output_template => 'Channels Active: %s',
perfdatas => [
{ label => 'channels_active', value => 'channels_active_absolute', template => '%s', min => 0 },
],
}
},
{ label => 'calls-active', set => {
key_values => [ { name => 'calls_active' } ],
output_template => 'Calls Active: %s',
perfdatas => [
{ label => 'calls_active', value => 'calls_active_absolute', template => '%s', min => 0 },
],
}
},
{ label => 'calls-count', set => {
key_values => [ { name => 'calls_count', diff => 1 } ],
output_template => 'Calls Count: %s',
perfdatas => [
{ label => 'calls_count', value => 'calls_count_absolute', template => '%s', min => 0 },
],
}
},
];
}
sub new {
my ($class, %options) = @_;
my $self = $class->SUPER::new(package => __PACKAGE__, %options, statefile => 1);
bless $self, $class;
$self->{version} = '1.0';
$options{options}->add_options(arguments =>
{
});
return $self;
}
sub manage_selection {
my ($self, %options) = @_;
my $oid_astConfigCallsActive = '.1.3.6.1.4.1.22736.1.2.5.0';
my $oid_astConfigCallsProcessed = '.1.3.6.1.4.1.22736.1.2.6.0';
my $oid_astNumChannels = '.1.3.6.1.4.1.22736.1.5.1.0';
my $result = $options{snmp}->get_leef(oids => [$oid_astConfigCallsActive, $oid_astConfigCallsProcessed, $oid_astNumChannels], nothing_quit => 1);
$self->{cache_name} = "asterisk_" . $options{snmp}->get_hostname() . '_' . $options{snmp}->get_port() . '_' . $self->{mode} . '_' .
(defined($self->{option_results}->{filter_counters}) ? md5_hex($self->{option_results}->{filter_counters}) : md5_hex('all'));
$self->{global} = {
calls_active => $result->{$oid_astConfigCallsActive},
calls_count => $result->{$oid_astConfigCallsProcessed},
channels_active => $result->{$oid_astNumChannels},
};
}
1;
__END__
=head1 MODE
Check channel usage.
=over 8
=item B<--filter-counters>
Only display some counters (regexp can be used).
Example: --filter-counters='calls-active'
=item B<--warning-*>
Threshold warning.
Can be: 'channels-active', 'calls-active', 'calls-count'.
=item B<--critical-*>
Threshold critical.
Can be: 'channels-active', 'calls-active', 'calls-count'.
=back
=cut

View File

@ -1,224 +0,0 @@
#
# Copyright 2017 Centreon (http://www.centreon.com/)
#
# Centreon is a full-fledged industry-strength solution that meets
# the needs in IT infrastructure and application monitoring for
# service performance.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
package apps::voip::asterisk::snmp::mode::externalcalls;
use base qw(centreon::plugins::mode);
use strict;
use warnings;
use centreon::plugins::statefile;
my $oid_astBase = '.1.3.6.1.4.1.22736';
my $oid_astConfigCallsActive = $oid_astBase.'.1.2.5.0';
my $oid_astChanName = $oid_astBase.'.1.5.2.1.2'; # need an index at the end
my $oid_astChanIndex = $oid_astBase.'.1.5.2.1.1'; # need an index at the end
my $oid_astNumChannels = $oid_astBase.'.1.5.1.0';
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', },
"warnontrunk:s" => { name => 'warnontrunk', },
"critontrunk:s" => { name => 'critontrunk', },
"force-oid:s" => { name => 'force_oid', },
"trunkusernamelist:s" => { name => 'trunkusernamelist', },
"filter-name" => { name => 'filter-name' },
});
$self->{statefile_value} = centreon::plugins::statefile->new(%options);
return $self;
}
sub check_options {
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();
}
if (($self->{perfdata}->threshold_validate(label => 'warnontrunk', value => $self->{option_results}->{warnontrunk})) == 0) {
$self->{output}->add_option_msg(short_msg => "Wrong warning threshold '" . $self->{option_results}->{warnontrunk} . "'.");
$self->{output}->option_exit();
}
if (($self->{perfdata}->threshold_validate(label => 'critontrunk', value => $self->{option_results}->{critontrunk})) == 0) {
$self->{output}->add_option_msg(short_msg => "Wrong critical threshold '" . $self->{option_results}->{critontrunk} . "'.");
$self->{output}->option_exit();
}
if (!defined($self->{option_results}->{trunkusernamelist})) {
$self->{output}->add_option_msg(short_msg => "trunkusernamelist must be defined.");
$self->{output}->option_exit();
}
$self->{statefile_value}->check_options(%options);
}
sub run {
my ($self, %options) = @_;
$self->{snmp} = $options{snmp};
my ($result, $value);
my (@callsbytrunk, @error_msg, @msg);
# explode trunk list
my @trunkusernamelist = split(',',$self->{option_results}->{trunkusernamelist});
foreach my $trunk (@trunkusernamelist)
{
if (defined($self->{option_results}->{filter_name}) && $self->{option_results}->{filter_name} ne '' &&
$trunk !~ /$self->{option_results}->{filter_name}/) {
$self->{output}->output_add(long_msg => "Skipping trunk '" . $trunk . "': no matching filter name");
next;
}
push @callsbytrunk , { trunk => $trunk, num => 0};
}
# get chanName and sum calls for each
$result = $self->{snmp}->get_leef(oids => [ $oid_astNumChannels ], nothing_quit => 1);
my $astNumChannels = $result->{$oid_astNumChannels};
my $astConfigCallsActive = 0;
foreach my $i (1..$astNumChannels) {
$result = $self->{snmp}->get_leef(oids => [ $oid_astChanName.'.'.$i ], nothing_quit => 1);
$value = $result->{$oid_astChanName.'.'.$i};
$value =~ /^(.*)\/(.*)-.*/;
my ($protocol, $trunkname) = ($1, $2);
foreach my $val (@callsbytrunk)
{
if ( $val->{trunk} eq $trunkname )
{
$val->{num} = $val->{num}+1;
$astConfigCallsActive = $astConfigCallsActive+1;
}
}
}
# compute status based on total number of active calls
my $exit_code = $self->{perfdata}->threshold_check(value => $astConfigCallsActive,
threshold => [ { label => 'critical', exit_litteral => 'critical' }, { label => 'warning', exit_litteral => 'warning' } ]);
push @msg, {msg => sprintf("Current external calls: %s", $astConfigCallsActive)};
# Perfdata on all active calls
$self->{output}->perfdata_add(label => 'Total calls',
value => $astConfigCallsActive,
warning => $self->{perfdata}->get_perfdata_for_output(label => 'warning'),
critical => $self->{perfdata}->get_perfdata_for_output(label => 'critical'),
min => 0);
# Perfdata on number of calls for each trunk
my ($temp_exit, $exit_msg);
my (@trunk_msg, @out_msg);
my $trunk_exit_code = 'ok';
foreach $value (@callsbytrunk)
{
$temp_exit = $self->{perfdata}->threshold_check(value => $value->{num},
threshold => [ { label => 'critontrunk', exit_litteral => 'critical' }, { label => 'warnontrunk', exit_litteral => 'warning' } ]);
$self->{output}->perfdata_add(label => $value->{trunk},
value => $value->{num},
warning => $self->{perfdata}->get_perfdata_for_output(label => 'warnontrunk'),
critical => $self->{perfdata}->get_perfdata_for_output(label => 'critontrunk'),
min => 0);
$self->{output}->output_add(long_msg => sprintf("%s : %s", $value->{trunk}, $value->{num}));
$trunk_exit_code = $self->{output}->get_most_critical(status => [ $temp_exit, $trunk_exit_code ]);
# create msg for most critical data ....
if ($self->{output}->is_status(value => $temp_exit, compare => $trunk_exit_code, litteral => 1))
{
push @trunk_msg, {msg => sprintf("'%s': %s", $value->{trunk}, $value->{num})};
}
}
if (!$self->{output}->is_status(value => $exit_code, compare => 'ok', litteral => 1) && !$self->{output}->is_status(value => $trunk_exit_code, compare => 'ok', litteral => 1))
{
unshift @trunk_msg, @msg;
$exit_code = $self->{output}->get_most_critical(status => [ $exit_code, $trunk_exit_code ]);
}
if (!$self->{output}->is_status(value => $trunk_exit_code, compare => 'ok', litteral => 1))
{
@out_msg=@trunk_msg;
$exit_code = $trunk_exit_code ;
}
else
{
push @out_msg, @msg;
}
$exit_msg = '';
my $separator = '';
foreach my $out (@out_msg)
{
$exit_msg .= $separator.$out->{msg};
$separator = ', ';
}
$self->{output}->output_add(severity => $exit_code,
short_msg => $exit_msg
);
$self->{output}->display();
$self->{output}->exit();
}
1;
__END__
=head1 MODE
Check number of external calls (total and by trunk)
=over 8
=item B<--warning>
Threshold warning for total number of external calls.
=item B<--critical>
Threshold critical for total number of external calls.
=item B<--warnontrunk>
Threshold warning for trunks.
=item B<--critontrunk>
Threshold critical for trunks.
=item B<--force-oid>
Can choose your oid (numeric format only).
=item B<--trunkusernamelist>
List of outgoing trunks' username.
=item B<--filter-name>
Filter on trunk's username (regexp can be used).
=back
=cut

View File

@ -32,9 +32,8 @@ sub new {
$self->{version} = '0.1';
%{$self->{modes}} = (
'activecalls' => 'apps::voip::asterisk::snmp::mode::activecalls',
'externalcalls' => 'apps::voip::asterisk::snmp::mode::externalcalls',
);
'channel-usage' => 'apps::voip::asterisk::snmp::mode::channelusage',
);
return $self;
}

View File

@ -1,5 +1,5 @@
#
# Copyright 2016 Centreon (http://www.centreon.com/)
# Copyright 2017 Centreon (http://www.centreon.com/)
#
# Centreon is a full-fledged industry-strength solution that meets
# the needs in IT infrastructure and application monitoring for

View File

@ -0,0 +1,86 @@
#
# Copyright 2017 Centreon (http://www.centreon.com/)
#
# Centreon is a full-fledged industry-strength solution that meets
# the needs in IT infrastructure and application monitoring for
# service performance.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
package centreon::common::broadcom::fastpath::snmp::mode::components::fan;
use strict;
use warnings;
my %map_fan_status = (
1 => 'notpresent', 2 => 'operational', 3 => 'failed', 4 => 'powering',
5 => 'nopower', 6 => 'notpowering', 7 => 'incompatible'
);
my $mapping = {
boxServicesFanItemState => { oid => '.1.3.6.1.4.1.4413.1.1.43.1.6.1.3', map => \%map_fan_status },
boxServicesFanSpeed => { oid => '.1.3.6.1.4.1.4413.1.1.43.1.6.1.4' },
};
my $oid_boxServicesFansEntry = '.1.3.6.1.4.1.4413.1.1.43.1.6.1';
sub load {
my ($self) = @_;
push @{$self->{request}}, { oid => $oid_boxServicesFansEntry, begin => $mapping->{boxServicesFanItemState}->{oid}, end => $mapping->{boxServicesFanSpeed}->{oid} };
}
sub check {
my ($self) = @_;
$self->{output}->output_add(long_msg => "Checking fans");
$self->{components}->{fan} = {name => 'fans', total => 0, skip => 0};
return if ($self->check_filter(section => 'fan'));
my ($exit, $warn, $crit, $checked);
foreach my $oid ($self->{snmp}->oid_lex_sort(keys %{$self->{results}->{$oid_boxServicesFansEntry}})) {
next if ($oid !~ /^$mapping->{boxServicesFanItemState}->{oid}\.(.*)$/);
my $instance = $1;
my $result = $self->{snmp}->map_instance(mapping => $mapping, results => $self->{results}->{$oid_boxServicesFansEntry}, instance => $instance);
next if ($self->check_filter(section => 'fan', instance => $instance));
if ($result->{boxServicesFanItemState} =~ /notpresent/i) {
$self->absent_problem(section => 'fan', instance => $instance);
next;
}
$self->{components}->{fan}->{total}++;
$self->{output}->output_add(long_msg => sprintf("fan '%s' status is '%s' [instance = %s, speed = %s]",
$instance, $result->{boxServicesFanItemState}, $instance, defined($result->{boxServicesFanSpeed}) ? $result->{boxServicesFanSpeed} : 'unknown'));
$exit = $self->get_severity(label => 'default', section => 'fan', value => $result->{boxServicesFanItemState});
if (!$self->{output}->is_status(value => $exit, compare => 'ok', litteral => 1)) {
$self->{output}->output_add(severity => $exit,
short_msg => sprintf("Fan '%s' status is '%s'", $instance, $result->{boxServicesFanItemState}));
}
next if (!defined($result->{boxServicesFanSpeed}) || $result->{boxServicesFanSpeed} !~ /[0-9]+/);
($exit, $warn, $crit, $checked) = $self->get_severity_numeric(section => 'fan', instance => $instance, value => $result->{boxServicesFanSpeed});
if (!$self->{output}->is_status(value => $exit, compare => 'ok', litteral => 1)) {
$self->{output}->output_add(severity => $exit,
short_msg => sprintf("Fan '%s' is '%s' rpm", $instance, $result->{boxServicesFanSpeed}));
}
$self->{output}->perfdata_add(label => 'fan_' . $instance, unit => 'rpm',
value => $result->{boxServicesFanSpeed},
warning => $warn,
critical => $crit, min => 0
);
}
}
1;

View File

@ -0,0 +1,71 @@
#
# Copyright 2017 Centreon (http://www.centreon.com/)
#
# Centreon is a full-fledged industry-strength solution that meets
# the needs in IT infrastructure and application monitoring for
# service performance.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
package centreon::common::broadcom::fastpath::snmp::mode::components::psu;
use strict;
use warnings;
my %map_psu_status = (
1 => 'notpresent', 2 => 'operational', 3 => 'failed', 4 => 'powering',
5 => 'nopower', 6 => 'notpowering', 7 => 'incompatible'
);
my $mapping = {
boxServicesPowSupplyItemState => { oid => '.1.3.6.1.4.1.4413.1.1.43.1.7.1.3', map => \%map_psu_status },
};
sub load {
my ($self) = @_;
push @{$self->{request}}, { oid => $mapping->{boxServicesPowSupplyItemState}->{oid} };
}
sub check {
my ($self) = @_;
$self->{output}->output_add(long_msg => "Checking power supplies");
$self->{components}->{psu} = {name => 'psu', total => 0, skip => 0};
return if ($self->check_filter(section => 'psu'));
my ($exit, $warn, $crit, $checked);
foreach my $oid ($self->{snmp}->oid_lex_sort(keys %{$self->{results}->{$mapping->{boxServicesPowSupplyItemState}->{oid}}})) {
next if ($oid !~ /^$mapping->{boxServicesPowSupplyItemState}->{oid}\.(.*)$/);
my $instance = $1;
my $result = $self->{snmp}->map_instance(mapping => $mapping, results => $self->{results}->{$mapping->{boxServicesPowSupplyItemState}->{oid}}, instance => $instance);
next if ($self->check_filter(section => 'psu', instance => $instance));
if ($result->{boxServicesPowSupplyItemState} =~ /notpresent/i) {
$self->absent_problem(section => 'psu', instance => $instance);
next;
}
$self->{components}->{psu}->{total}++;
$self->{output}->output_add(long_msg => sprintf("power supply '%s' status is '%s' [instance = %s]",
$instance, $result->{boxServicesPowSupplyItemState}, $instance));
$exit = $self->get_severity(label => 'default', section => 'psu', value => $result->{boxServicesPowSupplyItemState});
if (!$self->{output}->is_status(value => $exit, compare => 'ok', litteral => 1)) {
$self->{output}->output_add(severity => $exit,
short_msg => sprintf("Power supply '%s' status is '%s'", $instance, $result->{boxServicesPowSupplyItemState}));
}
}
}
1;

View File

@ -0,0 +1,86 @@
#
# Copyright 2017 Centreon (http://www.centreon.com/)
#
# Centreon is a full-fledged industry-strength solution that meets
# the needs in IT infrastructure and application monitoring for
# service performance.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
package centreon::common::broadcom::fastpath::snmp::mode::components::temperature;
use strict;
use warnings;
my %map_temp_status = (
0 => 'low', 1 => 'normal', 2 => 'warning', 3 => 'critical',
4 => 'shutdown', 5 => 'notpresent', 6 => 'notoperational',
);
my $mapping = {
boxServicesTempSensorState => { oid => '.1.3.6.1.4.1.4413.1.1.43.1.8.1.4', map => \%map_temp_status },
boxServicesTempSensorTemperature => { oid => '.1.3.6.1.4.1.4413.1.1.43.1.8.1.5' },
};
my $oid_boxServicesTempSensorsEntry = '.1.3.6.1.4.1.4413.1.1.43.1.8.1';
sub load {
my ($self) = @_;
push @{$self->{request}}, { oid => $oid_boxServicesTempSensorsEntry, begin => $mapping->{boxServicesTempSensorState}->{oid}, end => $mapping->{boxServicesTempSensorTemperature}->{oid} };
}
sub check {
my ($self) = @_;
$self->{output}->output_add(long_msg => "Checking temperatures");
$self->{components}->{temperature} = {name => 'temperatures', total => 0, skip => 0};
return if ($self->check_filter(section => 'temperature'));
my ($exit, $warn, $crit, $checked);
foreach my $oid ($self->{snmp}->oid_lex_sort(keys %{$self->{results}->{$oid_boxServicesTempSensorsEntry}})) {
next if ($oid !~ /^$mapping->{boxServicesTempSensorState}->{oid}\.(.*)$/);
my $instance = $1;
my $result = $self->{snmp}->map_instance(mapping => $mapping, results => $self->{results}->{$oid_boxServicesTempSensorsEntry}, instance => $instance);
next if ($self->check_filter(section => 'temperature', instance => $instance));
if ($result->{boxServicesTempSensorState} =~ /notpresent/i) {
$self->absent_problem(section => 'temperature', instance => $instance);
next;
}
$self->{components}->{temperature}->{total}++;
$self->{output}->output_add(long_msg => sprintf("temperature '%s' status is '%s' [instance = %s, temperature = %s]",
$instance, $result->{boxServicesTempSensorState}, $instance, defined($result->{boxServicesTempSensorTemperature}) ? $result->{boxServicesTempSensorTemperature} : 'unknown'));
$exit = $self->get_severity(section => 'temperature', value => $result->{boxServicesTempSensorState});
if (!$self->{output}->is_status(value => $exit, compare => 'ok', litteral => 1)) {
$self->{output}->output_add(severity => $exit,
short_msg => sprintf("Temperature '%s' status is '%s'", $instance, $result->{boxServicesTempSensorState}));
}
next if (!defined($result->{boxServicesTempSensorTemperature}) || $result->{boxServicesTempSensorTemperature} !~ /[0-9]+/);
($exit, $warn, $crit, $checked) = $self->get_severity_numeric(section => 'temperature', instance => $instance, value => $result->{boxServicesTempSensorTemperature});
if (!$self->{output}->is_status(value => $exit, compare => 'ok', litteral => 1)) {
$self->{output}->output_add(severity => $exit,
short_msg => sprintf("Temperature '%s' is '%s' rpm", $instance, $result->{boxServicesTempSensorTemperature}));
}
$self->{output}->perfdata_add(label => 'temp_' . $instance, unit => 'C',
value => $result->{boxServicesTempSensorTemperature},
warning => $warn,
critical => $crit,
);
}
}
1;

View File

@ -0,0 +1,123 @@
#
# Copyright 2017 Centreon (http://www.centreon.com/)
#
# Centreon is a full-fledged industry-strength solution that meets
# the needs in IT infrastructure and application monitoring for
# service performance.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
package centreon::common::broadcom::fastpath::snmp::mode::cpu;
use base qw(centreon::plugins::templates::counter);
use strict;
use warnings;
sub set_counters {
my ($self, %options) = @_;
$self->{maps_counters_type} = [
{ name => 'global', type => 0, cb_prefix_output => 'prefix_cpu_output' }
];
$self->{maps_counters}->{global} = [
{ label => '5s', set => {
key_values => [ { name => 'usage_5s' } ],
output_template => '%.2f %% (5sec)', output_error_template => "%s (5sec)",
perfdatas => [
{ label => 'cpu_5s', value => 'usage_5s_absolute', template => '%.2f',
unit => '%', min => 0, max => 100 },
],
}
},
{ label => '1m', set => {
key_values => [ { name => 'usage_1m' } ],
output_template => '%.2f %% (1m)', output_error_template => "%s (1min)",
perfdatas => [
{ label => 'cpu_1m', value => 'usage_1m_absolute', template => '%.2f',
unit => '%', min => 0, max => 100 },
],
}
},
{ label => '5m', set => {
key_values => [ { name => 'usage_5m' } ],
output_template => '%.2f %% (5min)', output_error_template => "%s (5min)",
perfdatas => [
{ label => 'cpu_5m', value => 'usage_5m_absolute', template => '%.2f',
unit => '%', min => 0, max => 100 },
],
}
},
];
}
sub prefix_cpu_output {
my ($self, %options) = @_;
return "CPU ";
}
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 =>
{
});
return $self;
}
sub manage_selection {
my ($self, %options) = @_;
# STRING: " 5 Secs ( 43.2625%) 60 Secs ( 13.9157%) 300 Secs ( 8.9274%)"
my $oid_agentSwitchCpuProcessTotalUtilization = '.1.3.6.1.4.1.4413.1.1.1.1.4.9.0';
my $snmp_result = $options{snmp}->get_leef(oids => [$oid_agentSwitchCpuProcessTotalUtilization], nothing_quit => 1);
$snmp_result->{$oid_agentSwitchCpuProcessTotalUtilization} =~ /\s*5\s*Secs\s*\(\s*(.*?)%\s*\)\s*60\s*Secs\s*\(\s*(.*?)%\s*\)\s*300\s*Secs\s*\(\s*(.*?)%\s*\)/i;
$self->{global} = { usage_5s => $1, usage_1m => $2, usage_5m => $3 };
}
1;
__END__
=head1 MODE
Check CPU usage.
=over 8
=item B<--filter-counters>
Only display some counters (regexp can be used).
Example: --filter-counters='5m'
=item B<--warning-*>
Threshold warning.
Can be: '5s', '1m', '5m'.
=item B<--critical-*>
Threshold critical.
Can be: '5s', '1m', '5m'.
=back
=cut

Some files were not shown because too many files have changed in this diff Show More