enh(stormshield/snmp): add memory-detailed mode (#3070)

This commit is contained in:
qgarnier 2021-09-01 15:44:54 +02:00 committed by GitHub
parent 33724ba2b2
commit dab38c2388
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 238 additions and 54 deletions

View File

@ -32,6 +32,7 @@ sub set_counters {
$self->{maps_counters_type} = [ $self->{maps_counters_type} = [
{ name => 'global', type => 0 }, { name => 'global', type => 0 },
]; ];
$self->{maps_counters}->{global} = [ $self->{maps_counters}->{global} = [
{ label => 'udp', set => { { label => 'udp', set => {
key_values => [ { name => 'udp', per_second => 1 } ], key_values => [ { name => 'udp', per_second => 1 } ],
@ -65,16 +66,20 @@ sub new {
sub manage_selection { sub manage_selection {
my ($self, %options) = @_; my ($self, %options) = @_;
$self->{cache_name} = "fw_stormshield_" . $options{snmp}->get_hostname() . '_' . $options{snmp}->get_port() . '_' . $self->{mode} . '_' . md5_hex('all');
$self->{cache_name} = 'fw_stormshield_' . $options{snmp}->get_hostname() . '_' . $options{snmp}->get_port() . '_' . $self->{mode} . '_' . md5_hex('all');
my $oid_ntqASQStatsStatefulUdpConn = '.1.3.6.1.4.1.11256.1.12.1.33.0'; my $oid_ntqASQStatsStatefulUdpConn = '.1.3.6.1.4.1.11256.1.12.1.33.0';
my $oid_ntqASQStatsStatefulTcpConn = '.1.3.6.1.4.1.11256.1.12.1.23.0'; my $oid_ntqASQStatsStatefulTcpConn = '.1.3.6.1.4.1.11256.1.12.1.23.0';
my $result = $options{snmp}->get_leef(oids => [ $oid_ntqASQStatsStatefulUdpConn, $oid_ntqASQStatsStatefulTcpConn ], my $result = $options{snmp}->get_leef(
nothing_quit => 1); oids => [ $oid_ntqASQStatsStatefulUdpConn, $oid_ntqASQStatsStatefulTcpConn ],
nothing_quit => 1
);
$self->{global} = { $self->{global} = {
udp => $result->{$oid_ntqASQStatsStatefulUdpConn}, udp => $result->{$oid_ntqASQStatsStatefulUdpConn},
tcp => $result->{$oid_ntqASQStatsStatefulTcpConn}, tcp => $result->{$oid_ntqASQStatsStatefulTcpConn}
}; };
} }

View File

@ -29,9 +29,11 @@ use centreon::plugins::templates::catalog_functions qw(catalog_status_threshold)
sub custom_node_perfdata { sub custom_node_perfdata {
my ($self, %options) = @_; my ($self, %options) = @_;
$self->{output}->perfdata_add(label => 'dead_nodes', $self->{output}->perfdata_add(
value => sprintf("%d", $self->{result_values}->{dead_nodes}), label => 'dead_nodes',
min => 0, max => $self->{result_values}->{total_nodes}); value => sprintf("%d", $self->{result_values}->{dead_nodes}),
min => 0, max => $self->{result_values}->{total_nodes}
);
} }
sub custom_node_threshold { sub custom_node_threshold {
@ -64,8 +66,7 @@ sub custom_node_calc {
sub custom_state_output { sub custom_state_output {
my ($self, %options) = @_; my ($self, %options) = @_;
my $msg = sprintf("state is '%s' [role: %s]", $self->{result_values}->{state}, $self->{result_values}->{role}); return sprintf("state is '%s' [role: %s]", $self->{result_values}->{state}, $self->{result_values}->{role});
return $msg;
} }
sub custom_state_calc { sub custom_state_calc {
@ -77,12 +78,18 @@ sub custom_state_calc {
return 0; return 0;
} }
sub prefix_node_output {
my ($self, %options) = @_;
return "Node '" . $options{instance_value}->{display} . "' ";
}
sub set_counters { sub set_counters {
my ($self, %options) = @_; my ($self, %options) = @_;
$self->{maps_counters_type} = [ $self->{maps_counters_type} = [
{ name => 'global', type => 0 }, { name => 'global', type => 0 },
{ name => 'nodes', type => 1, cb_prefix_output => 'prefix_node_output', message_multiple => 'All HA nodes are OK' }, { name => 'nodes', type => 1, cb_prefix_output => 'prefix_node_output', message_multiple => 'All HA nodes are OK' }
]; ];
$self->{maps_counters}->{global} = [ $self->{maps_counters}->{global} = [
@ -91,49 +98,44 @@ sub set_counters {
closure_custom_calc => $self->can('custom_node_calc'), closure_custom_calc => $self->can('custom_node_calc'),
closure_custom_output => $self->can('custom_node_output'), closure_custom_output => $self->can('custom_node_output'),
closure_custom_threshold_check => $self->can('custom_node_threshold'), closure_custom_threshold_check => $self->can('custom_node_threshold'),
closure_custom_perfdata => $self->can('custom_node_perfdata'), closure_custom_perfdata => $self->can('custom_node_perfdata')
} }
} }
]; ];
$self->{maps_counters}->{nodes} = [ $self->{maps_counters}->{nodes} = [
{ label => 'state', threshold => 0, set => { { label => 'state', threshold => 0, set => {
key_values => [ { name => 'ntqOnline' }, { name => 'ntqHALicence' }, { name => 'display' } ], key_values => [ { name => 'ntqOnline' }, { name => 'ntqHALicence' }, { name => 'display' } ],
closure_custom_calc => $self->can('custom_state_calc'), closure_custom_calc => $self->can('custom_state_calc'),
closure_custom_output => $self->can('custom_state_output'), closure_custom_output => $self->can('custom_state_output'),
closure_custom_perfdata => sub { return 0; }, closure_custom_perfdata => sub { return 0; },
closure_custom_threshold_check => \&catalog_status_threshold, closure_custom_threshold_check => \&catalog_status_threshold
} }
}, },
{ label => 'health', set => { { label => 'health', set => {
key_values => [ { name => 'ntqHAQuality' }, { name => 'display' } ], key_values => [ { name => 'ntqHAQuality' }, { name => 'display' } ],
output_template => 'health: %s%%', output_template => 'health: %s%%',
perfdatas => [ perfdatas => [
{ label => 'health', value => 'ntqHAQuality', template => '%d', min => 0, max => 100, { label => 'health', template => '%d', min => 0, max => 100,
unit => '%', label_extra_instance => 1, instance_use => 'display' }, unit => '%', label_extra_instance => 1, instance_use => 'display' }
], ]
} }
} }
]; ];
} }
sub prefix_node_output {
my ($self, %options) = @_;
return "Node '" . $options{instance_value}->{display} . "' ";
}
sub new { sub new {
my ($class, %options) = @_; my ($class, %options) = @_;
my $self = $class->SUPER::new(package => __PACKAGE__, %options); my $self = $class->SUPER::new(package => __PACKAGE__, %options);
bless $self, $class; bless $self, $class;
$options{options}->add_options(arguments => $options{options}->add_options(arguments => {
{ 'filter-node:s' => { name => 'filter_node' },
"filter-node:s" => { name => 'filter_node' }, 'percent' => { name => 'percent' },
"percent" => { name => 'percent' }, 'warning-state:s' => { name => 'warning_state', default => '' },
"warning-state:s" => { name => 'warning_state', default => '' }, 'critical-state:s' => { name => 'critical_state', default => '%{state} =~ /offline/i' }
"critical-state:s" => { name => 'critical_state', default => '%{state} =~ /offline/i' }, });
});
return $self; return $self;
} }
@ -163,12 +165,13 @@ sub manage_selection {
my ($self, %options) = @_; my ($self, %options) = @_;
my $snmp_result = $options{snmp}->get_leef(oids => [ $oid_ntqNbNode, $oid_ntqNbDeadNode ], nothing_quit => 1); my $snmp_result = $options{snmp}->get_leef(oids => [ $oid_ntqNbNode, $oid_ntqNbDeadNode ], nothing_quit => 1);
my $prct_dead = $snmp_result->{$oid_ntqNbDeadNode} * 100 / $snmp_result->{$oid_ntqNbNode};
$self->{global} = { dead_nodes => $snmp_result->{$oid_ntqNbDeadNode}, my $prct_dead = $snmp_result->{$oid_ntqNbDeadNode} * 100 / $snmp_result->{$oid_ntqNbNode};
total_nodes => $snmp_result->{$oid_ntqNbNode}, $self->{global} = {
prct_dead => $prct_dead }; dead_nodes => $snmp_result->{$oid_ntqNbDeadNode},
total_nodes => $snmp_result->{$oid_ntqNbNode},
prct_dead => $prct_dead
};
$snmp_result = $options{snmp}->get_table(oid => $oid_ntqFwSerial, nothing_quit => 1); $snmp_result = $options{snmp}->get_table(oid => $oid_ntqFwSerial, nothing_quit => 1);
$self->{nodes} = {}; $self->{nodes} = {};
@ -196,7 +199,7 @@ sub manage_selection {
foreach (keys %{$self->{nodes}}) { foreach (keys %{$self->{nodes}}) {
my $result = $options{snmp}->map_instance(mapping => $mapping, results => $snmp_result, instance => $_); my $result = $options{snmp}->map_instance(mapping => $mapping, results => $snmp_result, instance => $_);
foreach my $name (keys %$mapping) { foreach my $name (keys %$mapping) {
$self->{nodes}->{$_}->{$name} = $result->{$name}; $self->{nodes}->{$_}->{$name} = $result->{$name};
} }

View File

@ -0,0 +1,175 @@
#
# Copyright 2021 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::stormshield::snmp::mode::memorydetailed;
use base qw(centreon::plugins::templates::counter);
use strict;
use warnings;
sub prefix_memory_output {
my ($self, %options) = @_;
return 'Memory usage ';
}
sub set_counters {
my ($self, %options) = @_;
$self->{maps_counters_type} = [
{ name => 'global', type => 0, cb_prefix_output => 'prefix_memory_output', skipped_code => { -10 => 1 } }
];
$self->{maps_counters}->{global} = [
{ label => 'total', nlabel => 'memory.usage.percentage', set => {
key_values => [ { name => 'total' } ],
output_template => 'total: %.2f %%',
perfdatas => [
{ template => '%.2f', min => 0, max => 100, unit => '%' }
]
}
},
{ label => 'host', nlabel => 'memory.protected_host.percentage', set => {
key_values => [ { name => 'host' } ],
output_template => 'protected host: %.2f %%',
perfdatas => [
{ template => '%.2f', min => 0, max => 100, unit => '%' }
]
}
},
{ label => 'frag', nlabel => 'memory.fragmented.percentage', set => {
key_values => [ { name => 'frag' } ],
output_template => 'fragmented: %.2f %%',
perfdatas => [
{ template => '%.2f', min => 0, max => 100, unit => '%' }
]
}
},
{ label => 'conn', nlabel => 'memory.connections.percentage', set => {
key_values => [ { name => 'conn' } ],
output_template => 'connections: %.2f %%',
perfdatas => [
{ template => '%.2f', min => 0, max => 100, unit => '%' }
]
}
},
{ label => 'icmp', nlabel => 'memory.icmp.percentage', set => {
key_values => [ { name => 'icmp' } ],
output_template => 'icmp: %.2f %%',
perfdatas => [
{ template => '%.2f', min => 0, max => 100, unit => '%' }
]
}
},
{ label => 'dtrack', nlabel => 'memory.data_tracking.percentage', set => {
key_values => [ { name => 'dtrack' } ],
output_template => 'data tracking: %.2f %%',
perfdatas => [
{ template => '%.2f', min => 0, max => 100, unit => '%' }
]
}
},
{ label => 'dyn', nlabel => 'memory.dynamic.percentage', set => {
key_values => [ { name => 'dyn' } ],
output_template => 'dynamic: %.2f %%',
perfdatas => [
{ template => '%.2f', min => 0, max => 100, unit => '%' }
]
}
},
{ label => 'etherstate', nlabel => 'memory.ether_state.percentage', set => {
key_values => [ { name => 'ether_state' } ],
output_template => 'ether state: %.2f %%',
perfdatas => [
{ template => '%.2f', min => 0, max => 100, unit => '%' }
]
}
},
];
}
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 => {});
return $self;
}
sub manage_selection {
my ($self, %options) = @_;
my $oid_snsMem = '.1.3.6.1.4.1.11256.1.10.3.0';
my $snmp_result = $options{snmp}->get_leef(
oids => [ $oid_snsMem ],
nothing_quit => 1
);
# host,frag,icmp,conn,dtrack,dyn
# host,frag,icmp,conn,ether_state,dtrack,dyn
my @values = split(/,/, $snmp_result->{$oid_snsMem});
my $fields = scalar(@values);
if ($fields == 7) {
$self->{global} = {
total => $values[0] + $values[1] + $values[2] + $values[3] + $values[4] + $values[5] + $values[6],
host => $values[0],
frag => $values[1],
icmp => $values[2],
conn => $values[3],
ether_state => $values[4],
dtrack => $values[5],
dyn => $values[6]
};
} elsif ($fields == 6) {
$self->{global} = {
total => $values[0] + $values[1] + $values[2] + $values[3] + $values[4] + $values[5],
host => $values[0],
frag => $values[1],
icmp => $values[2],
conn => $values[3],
dtrack => $values[4],
dyn => $values[5]
};
}
}
1;
__END__
=head1 MODE
Check memory detailed.
=over 8
=item B<--warning-*> B<--critical-*>
Thresholds.
Can be: 'total', 'host', 'frag', 'conn', 'icmp',
'dtrack', 'dyn', 'etherstate'.
=back
=cut

View File

@ -52,7 +52,7 @@ sub set_counters {
closure_custom_calc => $self->can('custom_status_calc'), closure_custom_calc => $self->can('custom_status_calc'),
output_template => 'status: %s', output_error_template => 'Status : %s', output_template => 'status: %s', output_error_template => 'Status : %s',
closure_custom_perfdata => sub { return 0; }, closure_custom_perfdata => sub { return 0; },
closure_custom_threshold_check => $self->can('custom_threshold_output'), closure_custom_threshold_check => $self->can('custom_threshold_output')
} }
}, },
{ label => 'traffic', nlabel => 'vpn.traffic.bitspersecond', set => { { label => 'traffic', nlabel => 'vpn.traffic.bitspersecond', set => {
@ -61,16 +61,16 @@ sub set_counters {
output_change_bytes => 2, output_change_bytes => 2,
perfdatas => [ perfdatas => [
{ label => 'traffic', template => '%s', { label => 'traffic', template => '%s',
unit => 'b/s', min => 0, label_extra_instance => 1, cast_int => 1, instance_use => 'num' }, unit => 'b/s', min => 0, label_extra_instance => 1, cast_int => 1, instance_use => 'num' }
], ]
} }
}, }
]; ];
} }
sub prefix_vpn_output { sub prefix_vpn_output {
my ($self, %options) = @_; my ($self, %options) = @_;
return "VPN '$options{instance_value}->{num}/$options{instance_value}->{ntqVPNIPSrc}/$options{instance_value}->{ntqVPNIPDst}' "; return "VPN '$options{instance_value}->{num}/$options{instance_value}->{ntqVPNIPSrc}/$options{instance_value}->{ntqVPNIPDst}' ";
} }
@ -79,8 +79,8 @@ my $thresholds = {
['larval', 'WARNING'], ['larval', 'WARNING'],
['mature', 'OK'], ['mature', 'OK'],
['dying', 'CRITICAL'], ['dying', 'CRITICAL'],
['dead', 'CRITICAL'], ['dead', 'CRITICAL']
], ]
}; };
sub new { sub new {

View File

@ -31,19 +31,20 @@ sub new {
$self->{version} = '1.0'; $self->{version} = '1.0';
$self->{modes} = { $self->{modes} = {
'cpu' => 'snmp_standard::mode::cpu', 'cpu' => 'snmp_standard::mode::cpu',
'cpu-detailed' => 'snmp_standard::mode::cpudetailed', 'cpu-detailed' => 'snmp_standard::mode::cpudetailed',
'connections' => 'network::stormshield::snmp::mode::connections', 'connections' => 'network::stormshield::snmp::mode::connections',
'interfaces' => 'snmp_standard::mode::interfaces', 'interfaces' => 'snmp_standard::mode::interfaces',
'list-interfaces' => 'snmp_standard::mode::listinterfaces', 'list-interfaces' => 'snmp_standard::mode::listinterfaces',
'load' => 'snmp_standard::mode::loadaverage', 'load' => 'snmp_standard::mode::loadaverage',
'ha-nodes' => 'network::stormshield::snmp::mode::hanodes', 'ha-nodes' => 'network::stormshield::snmp::mode::hanodes',
'health' => 'network::stormshield::snmp::mode::health', 'health' => 'network::stormshield::snmp::mode::health',
'memory' => 'os::freebsd::snmp::mode::memory', 'memory' => 'os::freebsd::snmp::mode::memory',
'qos' => 'network::stormshield::snmp::mode::qos', 'memory-detailed' => 'network::stormshield::snmp::mode::memorydetailed',
'storage' => 'snmp_standard::mode::storage', 'qos' => 'network::stormshield::snmp::mode::qos',
'swap' => 'snmp_standard::mode::swap', 'storage' => 'snmp_standard::mode::storage',
'vpn-status' => 'network::stormshield::snmp::mode::vpnstatus' 'swap' => 'snmp_standard::mode::swap',
'vpn-status' => 'network::stormshield::snmp::mode::vpnstatus'
}; };
return $self; return $self;