network::alcatel::oxe::snmp - add new metrics to domain check & add new trunk usage mode (#3793)

* + add new metric to OXE

* + apply latest guidelines

* + apply latest guidelines bis

* + add OXE trunk monitoring

* + trunk mode indent

* + mention not used OIDs exhaustively

* + fix following review

* + fix following review

* + fix some copy/paste

* + make it modern

* + modern
This commit is contained in:
Simon Bomm 2022-07-29 16:52:33 +02:00 committed by GitHub
parent 0a51a150dc
commit 8b1d670ea0
3 changed files with 326 additions and 27 deletions

View File

@ -18,7 +18,7 @@
# limitations under the License.
#
package network::alcatel::oxe::snmp::mode::domainusage;
package network::alcatel::oxe::snmp::mode::domains;
use base qw(centreon::plugins::templates::counter);
@ -29,9 +29,8 @@ sub custom_usage_perfdata {
my ($self, %options) = @_;
$self->{output}->perfdata_add(
label => $self->{result_values}->{label_perf} . '_used',
nlabel => $self->{nlabel},
instances => $self->use_instances(extra_instance => $options{extra_instance}) ? $self->{result_values}->{display} : undef,
instances => $self->{result_values}->{display},
value => $self->{result_values}->{used},
warning => $self->{perfdata}->get_perfdata_for_output(label => 'warning-' . $self->{thlabel}, total => $self->{result_values}->{total}, cast_int => 1),
critical => $self->{perfdata}->get_perfdata_for_output(label => 'critical-' . $self->{thlabel}, total => $self->{result_values}->{total}, cast_int => 1),
@ -42,7 +41,13 @@ sub custom_usage_perfdata {
sub custom_usage_threshold {
my ($self, %options) = @_;
my $exit = $self->{perfdata}->threshold_check(value => $self->{result_values}->{prct_used}, threshold => [ { label => 'critical-' . $self->{thlabel}, exit_litteral => 'critical' }, { label => 'warning-' . $self->{thlabel}, exit_litteral => 'warning' } ]);
my $exit = $self->{perfdata}->threshold_check(
value => $self->{result_values}->{prct_used},
threshold => [
{ label => 'critical-' . $self->{thlabel}, exit_litteral => 'critical' },
{ label => 'warning-' . $self->{thlabel}, exit_litteral => 'warning' }
]
);
return $exit;
}
@ -70,7 +75,6 @@ sub custom_cac_usage_calc {
$self->{result_values}->{free} = $self->{result_values}->{total} - $self->{result_values}->{used};
$self->{result_values}->{prct_free} = $self->{result_values}->{free} * 100 / $self->{result_values}->{total};
$self->{result_values}->{prct_used} = $self->{result_values}->{used} * 100 / $self->{result_values}->{total};
$self->{result_values}->{label_perf} = $options{extra_options}->{label_perf};
$self->{result_values}->{label_output} = $options{extra_options}->{label_output};
return 0;
}
@ -88,7 +92,23 @@ sub custom_conference_usage_calc {
$self->{result_values}->{free} = $self->{result_values}->{total} - $self->{result_values}->{used};
$self->{result_values}->{prct_free} = $self->{result_values}->{free} * 100 / $self->{result_values}->{total};
$self->{result_values}->{prct_used} = $self->{result_values}->{used} * 100 / $self->{result_values}->{total};
$self->{result_values}->{label_perf} = $options{extra_options}->{label_perf};
$self->{result_values}->{label_output} = $options{extra_options}->{label_output};
return 0;
}
sub custom_dsp_usage_calc {
my ($self, %options) = @_;
if ($options{new_datas}->{$self->{instance} . '_dspRessAvailable'} <= 0) {
$self->{error_msg} = "skipped (no available)";
return -2;
}
$self->{result_values}->{display} = $options{new_datas}->{$self->{instance} . '_display'};
$self->{result_values}->{total} = $options{new_datas}->{$self->{instance} . '_dspRessAvailable'};
$self->{result_values}->{used} = $options{new_datas}->{$self->{instance} . '_dspRessBusy'};
$self->{result_values}->{free} = $self->{result_values}->{total} - $self->{result_values}->{used};
$self->{result_values}->{prct_free} = $self->{result_values}->{free} * 100 / $self->{result_values}->{total};
$self->{result_values}->{prct_used} = $self->{result_values}->{used} * 100 / $self->{result_values}->{total};
$self->{result_values}->{label_output} = $options{extra_options}->{label_output};
return 0;
}
@ -97,28 +117,69 @@ sub set_counters {
my ($self, %options) = @_;
$self->{maps_counters_type} = [
{ name => 'domain', type => 1, cb_prefix_output => 'prefix_domain_output', message_multiple => 'All domain are ok', skipped_code => { -2 => 1, -10 => 1 } }
{ name => 'domain', type => 1, cb_prefix_output => 'prefix_domain_output', message_multiple => 'All domains are ok', skipped_code => { -2 => 1, -10 => 1 } }
];
$self->{maps_counters}->{domain} = [
{ label => 'cac-usage', nlabel => 'domain.communications.external.current.count', set => {
key_values => [ { name => 'display' }, { name => 'cacUsed' }, { name => 'cacAllowed' } ],
key_values => [ { name => 'cacUsed' }, { name => 'cacAllowed' }, { name => 'display '} ],
closure_custom_calc => $self->can('custom_cac_usage_calc'),
closure_custom_calc_extra_options => { label_output => 'External Communication', label_perf => 'cac' },
closure_custom_calc_extra_options => { label_output => 'External Communication' },
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 => 'cac-overrun', nlabel => 'domain.communications.external.overrun.count', set => {
key_values => [ { name => 'cacOverrun' } ],
output_template => 'conference overrun: %s',
perfdatas => [
{ template => '%s', min => 0, label_extra_instance => 1 }
]
}
},
{ label => 'conference-usage', nlabel => 'domain.conference.circuits.current.count', set => {
key_values => [ { name => 'display' }, { name => 'confBusy' }, { name => 'confAvailable' } ],
key_values => [ { name => 'confBusy' }, { name => 'confAvailable' }, { name => 'display '} ],
closure_custom_calc => $self->can('custom_conference_usage_calc'),
closure_custom_calc_extra_options => { label_output => 'Conference circuits', label_perf => 'conference' },
closure_custom_calc_extra_options => { label_output => 'Conference circuits' },
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 => 'conf-outoforder', nlabel => 'domain.conference.circuits.outoforder.count', set => {
key_values => [ { name => 'confOutOfOrder' } ],
output_template => 'conference out of order: %s',
perfdatas => [
{ template => '%s', min => 0, label_extra_instance => 1 }
]
}
},
{ label => 'dsp-usage', nlabel => 'domain.compressors.current.count', set => {
key_values => [ { name => 'dspRessBusy' }, { name => 'dspRessAvailable' }, { name => 'display '} ],
closure_custom_calc => $self->can('custom_dsp_usage_calc'),
closure_custom_calc_extra_options => { label_output => 'DSP Compressors' },
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 => 'dsp-outofservice', nlabel => 'domain.compressors.outofservice.count', set => {
key_values => [ { name => 'dspRessOutOfService' } ],
output_template => 'compressor out of service: %s',
perfdatas => [
{ template => '%s', min => 0, label_extra_instance => 1 }
]
},
},
{ label => 'dsp-overrun', nlabel => 'domain.compressors.overrun.count', set => {
key_values => [ { name => 'dspRessOverrun' } ],
output_template => 'compressor overrun: %s',
perfdatas => [
{ template => '%s', min => 0, label_extra_instance => 1 }
]
},
}
];
}
@ -130,7 +191,7 @@ sub prefix_domain_output {
sub new {
my ($class, %options) = @_;
my $self = $class->SUPER::new(package => __PACKAGE__, %options);
my $self = $class->SUPER::new(package => __PACKAGE__, %options, force_new_perfdata => 1);
bless $self, $class;
$options{options}->add_options(arguments => {
@ -141,11 +202,16 @@ sub new {
}
my $mapping = {
confAvailable => { oid => '.1.3.6.1.4.1.637.64.4400.1.3.1.2' },
confBusy => { oid => '.1.3.6.1.4.1.637.64.4400.1.3.1.3' },
confOutOfOrder => { oid => '.1.3.6.1.4.1.637.64.4400.1.3.1.4' },
cacAllowed => { oid => '.1.3.6.1.4.1.637.64.4400.1.3.1.9' },
cacUsed => { oid => '.1.3.6.1.4.1.637.64.4400.1.3.1.10' },
confAvailable => { oid => '.1.3.6.1.4.1.637.64.4400.1.3.1.2' },
confBusy => { oid => '.1.3.6.1.4.1.637.64.4400.1.3.1.3' },
confOutOfOrder => { oid => '.1.3.6.1.4.1.637.64.4400.1.3.1.4' },
dspRessAvailable => { oid => '.1.3.6.1.4.1.637.64.4400.1.3.1.5' },
dspRessBusy => { oid => '.1.3.6.1.4.1.637.64.4400.1.3.1.6' },
dspRessOutOfService => { oid => '.1.3.6.1.4.1.637.64.4400.1.3.1.7' },
dspRessOverrun => { oid => '.1.3.6.1.4.1.637.64.4400.1.3.1.8' },
cacAllowed => { oid => '.1.3.6.1.4.1.637.64.4400.1.3.1.9' },
cacUsed => { oid => '.1.3.6.1.4.1.637.64.4400.1.3.1.10' },
cacOverrun => { oid => '.1.3.6.1.4.1.637.64.4400.1.3.1.10' }
};
sub manage_selection {
@ -197,13 +263,19 @@ Filter by domain (regexp can be used).
=item B<--warning-*>
Threshold warning.
Can be: 'cac-usage' (%), 'conference-usage' (%).
Can be: 'cac-usage' (%), 'conference-usage' (%),
'cac-overrun' (absolute), conf-outoforder (absolute),
'dsp-usage' (absolute), 'dsp-outofservice' (absolute),
'dsp-overrun' (absolute)
=item B<--critical-*>
Threshold critical.
Can be: 'cac-usage' (%), 'conference-usage' (%).
Can be: 'cac-usage' (%), 'conference-usage' (%),
'cac-overrun' (absolute), conf-outoforder (absolute),
'dsp-usage' (absolute), 'dsp-outofservice' (absolute),
'dsp-overrun' (absolute)
=back
=cut
=cut

View File

@ -0,0 +1,226 @@
#
# Copyright 2022 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 network::alcatel::oxe::snmp::mode::trunks;
use base qw(centreon::plugins::templates::counter);
use strict;
use warnings;
use centreon::plugins::templates::catalog_functions qw(catalog_status_threshold_ng);
sub custom_status_output {
my ($self, %options) = @_;
return ' status: ' . $self->{result_values}->{cluster_status};
}
sub custom_usage_perfdata {
my ($self, %options) = @_;
$self->{output}->perfdata_add(
nlabel => $self->{nlabel},
instances => $self->{result_values}->{display},
value => $self->{result_values}->{used},
warning => $self->{perfdata}->get_perfdata_for_output(label => 'warning-' . $self->{thlabel}, total => $self->{result_values}->{total}, cast_int => 1),
critical => $self->{perfdata}->get_perfdata_for_output(label => 'critical-' . $self->{thlabel}, total => $self->{result_values}->{total}, cast_int => 1),
min => 0, max => $self->{result_values}->{total}
);
}
sub custom_usage_threshold {
my ($self, %options) = @_;
my $exit = $self->{perfdata}->threshold_check(
value => $self->{result_values}->{prct_used},
threshold => [
{ label => 'critical-' . $self->{thlabel}, exit_litteral => 'critical' },
{ label => 'warning-' . $self->{thlabel}, exit_litteral => 'warning' }
]
);
return $exit;
}
sub custom_usage_output {
my ($self, %options) = @_;
my $msg = sprintf("Total: %s Used: %s (%.2f%%) Free: %s (%.2f%%)",
$self->{result_values}->{total},
$self->{result_values}->{used}, $self->{result_values}->{prct_used},
$self->{result_values}->{free}, $self->{result_values}->{prct_free});
return $msg;
}
sub custom_trunk_usage_calc {
my ($self, %options) = @_;
if ($options{new_datas}->{$self->{instance} . '_cacAllowed'} <= 0) {
$self->{error_msg} = "skipped (no allowed)";
return -2;
}
$self->{result_values}->{display} = $options{new_datas}->{$self->{instance} . '_display'};
$self->{result_values}->{free} = $options{new_datas}->{$self->{instance} . 'freechan'};
$self->{result_values}->{used} = $options{new_datas}->{$self->{instance} . '_busychan'};
$self->{result_values}->{total} = $self->{result_values}->{free} + $self->{result_values}->{used};
$self->{result_values}->{prct_free} = $self->{result_values}->{free} * 100 / $self->{result_values}->{total};
$self->{result_values}->{prct_used} = $self->{result_values}->{used} * 100 / $self->{result_values}->{total};
return 0;
}
sub set_counters {
my ($self, %options) = @_;
$self->{maps_counters_type} = [
{ name => 'trunk', type => 1, cb_prefix_output => 'prefix_trunk_output', message_multiple => 'All trunks are ok', skipped_code => { -2 => 1, -10 => 1 } }
];
$self->{maps_counters}->{trunk} = [
{ label => 'trunk-status', type => 2, critical_default => '%{trunkstatus} =~ /oos/i', set => {
key_values => [ { name => 'trunkstatus' } ],
closure_custom_output => $self->can('custom_status_output'),
closure_custom_perfdata => sub { return 0; },
closure_custom_threshold_check => \&catalog_status_threshold_ng
}
},
{ label => 'channel-usage', nlabel => 'trunk.channels.current.count', set => {
key_values => [ { name => 'busychan' }, { name => 'freechan' }, { name => 'display '} ],
closure_custom_calc => $self->can('custom_trunk_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'),
}
},
{ label => 'channel-outofservice', nlabel => 'trunk.channels.outofservice.count', set => {
key_values => [ { name => 'ooschan' } ],
output_template => 'channel out of service %s',
perfdatas => [
{ template => '%s', min => 0, label_extra_instance => 1 }
]
}
}
];
}
sub prefix_trunk_output {
my ($self, %options) = @_;
return "Trunk '" . $options{instance_value}->{display} . "' ";
}
sub new {
my ($class, %options) = @_;
my $self = $class->SUPER::new(package => __PACKAGE__, %options, force_new_perfdata => 1);
bless $self, $class;
$options{options}->add_options(arguments => {
"filter-trunk:s" => { name => 'filter_trunk' },
});
return $self;
}
my $map_trunk_status = {
0 => 'OOS',
1 => 'INS'
};
my $mapping = {
trunkname => { oid => '1.3.6.1.4.1.637.64.4400.1.9.1.2' },
crystalno => { oid => '1.3.6.1.4.1.637.64.4400.1.9.1.3' }, # not used
couplerno => { oid => '1.3.6.1.4.1.637.64.4400.1.9.1.4' }, # not used
trunktype => { oid => '1.3.6.1.4.1.637.64.4400.1.9.1.5' }, # not used
nodepbx => { oid => '1.3.6.1.4.1.637.64.4400.1.9.1.6' }, # not used
freechan => { oid => '1.3.6.1.4.1.637.64.4400.1.9.1.7' },
busychan => { oid => '1.3.6.1.4.1.637.64.4400.1.9.1.8' },
ooschan => { oid => '1.3.6.1.4.1.637.64.4400.1.9.1.9' },
trunkstatus => { oid => '1.3.6.1.4.1.637.64.4400.1.9.1.10', map => $map_trunk_status },
cumuloos => { oid => '1.3.6.1.4.1.637.64.4400.1.9.1.11' }, # not used
cumuloverrun => { oid => '1.3.6.1.4.1.637.64.4400.1.9.1.12' }, # not used
};
sub manage_selection {
my ($self, %options) = @_;
my $oid_trunkEntry = '1.3.6.1.4.1.637.64.4400.1.9.1';
my $snmp_result = $options{snmp}->get_table(
oid => $oid_trunkEntry,
nothing_quit => 1
);
$self->{trunk} = {};
foreach my $oid (keys %$snmp_result) {
next if ($oid !~ /^$mapping->{trunkname}->{oid}\.(\d+)/);
my $instance = $1;
my $result = $options{snmp}->map_instance(mapping => $mapping, results => $snmp_result, instance => $instance);
if (defined($self->{option_results}->{filter_trunk}) && $self->{option_results}->{filter_trunk} ne '' &&
$result->{trunkname} !~ /$self->{option_results}->{filter_trunk}/) {
$self->{output}->output_add(long_msg => "skipping '" . $result->{trunkname} . "': no matching filter.", debug => 1);
next;
}
$self->{trunk}->{$result->{trunkname}} = {
display => $result->{trunkname},
%{$result}
};
}
if (scalar(keys %{$self->{trunk}}) <= 0) {
$self->{output}->add_option_msg(short_msg => "No trunk found.");
$self->{output}->option_exit();
}
}
1;
__END__
=head1 MODE
Check Trunk usages.
=over 8
=item B<--filter-trunk>
Filter by trunk name (regexp can be used).
=item B<--warning-trunk-status>
Set warning threshold for status
Can used special variables like: %{trunkstatus}
=item B<--critical-trunk-status>
Set critical threshold for status (Default: '%{trunkstatus} =~ /oos/i').
Can used special variables like: %{trunkstatus}
=item B<--warning-*>
Threshold warning.
Can be: 'channel-usage' (%), 'channel-outofservice' (absolute)
=item B<--critical-*>
Threshold critical.
Can be: 'channel-usage' (%), 'channel-outofservice' (absolute)
=back
=cut

View File

@ -31,13 +31,14 @@ sub new {
$self->{version} = '1.0';
%{$self->{modes}} = (
'cpu' => 'snmp_standard::mode::cpu',
'domain-usage' => 'network::alcatel::oxe::snmp::mode::domainusage',
'memory' => 'snmp_standard::mode::memory',
'pbx-state' => 'network::alcatel::oxe::snmp::mode::pbxstate',
'pbx-role' => 'network::alcatel::oxe::snmp::mode::pbxrole',
'storage' => 'snmp_standard::mode::storage',
'swap' => 'snmp_standard::mode::swap',
'cpu' => 'snmp_standard::mode::cpu',
'domains' => 'network::alcatel::oxe::snmp::mode::domains',
'memory' => 'snmp_standard::mode::memory',
'pbx-state' => 'network::alcatel::oxe::snmp::mode::pbxstate',
'pbx-role' => 'network::alcatel::oxe::snmp::mode::pbxrole',
'storage' => 'snmp_standard::mode::storage',
'swap' => 'snmp_standard::mode::swap',
'trunks' => 'network::alcatel::oxe::snmp::mode::trunks'
);
return $self;