diff --git a/cloud/aws/rds/mode/network.pm b/cloud/aws/rds/mode/network.pm index a487c00e0..34ae0f4ae 100644 --- a/cloud/aws/rds/mode/network.pm +++ b/cloud/aws/rds/mode/network.pm @@ -65,13 +65,12 @@ sub new { my $self = $class->SUPER::new(package => __PACKAGE__, %options); bless $self, $class; - $options{options}->add_options(arguments => - { - "type:s" => { name => 'type' }, - "name:s@" => { name => 'name' }, - "filter-metric:s" => { name => 'filter_metric' }, - }); - + $options{options}->add_options(arguments => { + 'type:s' => { name => 'type' }, + 'name:s@' => { name => 'name' }, + 'filter-metric:s' => { name => 'filter_metric' } + }); + return $self; } @@ -168,9 +167,9 @@ perl centreon_plugins.pl --plugin=cloud::aws::rds::plugin --custommode=paws --mo Works for the following database engines : aurora, mysql, mariadb. -See 'https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/rds-metricscollected.html' for more informations. +See 'https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/MonitoringOverview.html' for more informations. -Default statistic: 'average' / All satistics are valid. +Default statistic: 'average' / All statistics are valid. =over 8 diff --git a/cloud/aws/rds/mode/storage.pm b/cloud/aws/rds/mode/storage.pm new file mode 100644 index 000000000..1016a0055 --- /dev/null +++ b/cloud/aws/rds/mode/storage.pm @@ -0,0 +1,202 @@ +# +# Copyright 2020 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 cloud::aws::rds::mode::storage; + +use base qw(centreon::plugins::templates::counter); + +use strict; +use warnings; + +my %map_type = ( + instance => "DBInstanceIdentifier", + cluster => "DBClusterIdentifier" +); + +sub prefix_metric_output { + my ($self, %options) = @_; + + return ucfirst($options{instance_value}->{type}) . " '" . $options{instance_value}->{display} . "' " . $options{instance_value}->{stat} . " "; +} + +sub set_counters { + my ($self, %options) = @_; + + $self->{maps_counters_type} = [ + { name => 'metric', type => 1, cb_prefix_output => 'prefix_metric_output', message_multiple => "All storage metrics are ok", skipped_code => { -10 => 1 } } + ]; + + foreach my $statistic ('minimum', 'maximum', 'average', 'sum') { + foreach my $metric ('FreeStorageSpace', 'FreeableMemory') { + my $entry = { + label => lc($metric) . '-' . lc($statistic), set => { + key_values => [ { name => $metric . '_' . $statistic }, { name => 'display' }, { name => 'type' }, { name => 'stat' } ], + output_template => $metric . ': %.2f %s', + output_change_bytes => 2, + perfdatas => [ + { label => lc($metric) . '_' . lc($statistic), value => $metric . '_' . $statistic , + template => '%s', unit => 'B', min => 0, label_extra_instance => 1, instance_use => 'display' } + ] + } + }; + push @{$self->{maps_counters}->{metric}}, $entry; + } + } +} + +sub new { + my ($class, %options) = @_; + my $self = $class->SUPER::new(package => __PACKAGE__, %options); + bless $self, $class; + + $options{options}->add_options(arguments => { + 'type:s' => { name => 'type' }, + 'name:s@' => { name => 'name' }, + 'filter-metric:s' => { name => 'filter_metric' } + }); + + return $self; +} + +sub check_options { + my ($self, %options) = @_; + $self->SUPER::check_options(%options); + + if (!defined($self->{option_results}->{type}) || $self->{option_results}->{type} eq '') { + $self->{output}->add_option_msg(short_msg => "Need to specify --type option."); + $self->{output}->option_exit(); + } + + if ($self->{option_results}->{type} ne 'cluster' && $self->{option_results}->{type} ne 'instance') { + $self->{output}->add_option_msg(short_msg => "Instance type '" . $self->{option_results}->{type} . "' is not handled for this mode"); + $self->{output}->option_exit(); + } + + if (!defined($self->{option_results}->{name}) || $self->{option_results}->{name} eq '') { + $self->{output}->add_option_msg(short_msg => "Need to specify --name option."); + $self->{output}->option_exit(); + } + + foreach my $instance (@{$self->{option_results}->{name}}) { + if ($instance ne '') { + push @{$self->{aws_instance}}, $instance; + } + } + + $self->{aws_timeframe} = defined($self->{option_results}->{timeframe}) ? $self->{option_results}->{timeframe} : 600; + $self->{aws_period} = defined($self->{option_results}->{period}) ? $self->{option_results}->{period} : 60; + + $self->{aws_statistics} = ['Average']; + if (defined($self->{option_results}->{statistic})) { + $self->{aws_statistics} = []; + foreach my $stat (@{$self->{option_results}->{statistic}}) { + if ($stat ne '') { + push @{$self->{aws_statistics}}, ucfirst(lc($stat)); + } + } + } + + foreach my $metric ('NetworkReceiveThroughput', 'NetworkTransmitThroughput') { + next if (defined($self->{option_results}->{filter_metric}) && $self->{option_results}->{filter_metric} ne '' + && $metric !~ /$self->{option_results}->{filter_metric}/); + + push @{$self->{aws_metrics}}, $metric; + } +} + +sub manage_selection { + my ($self, %options) = @_; + + my %metric_results; + foreach my $instance (@{$self->{aws_instance}}) { + $metric_results{$instance} = $options{custom}->cloudwatch_get_metrics( + namespace => 'AWS/RDS', + dimensions => [ { Name => $map_type{$self->{option_results}->{type}}, Value => $instance } ], + metrics => $self->{aws_metrics}, + statistics => $self->{aws_statistics}, + timeframe => $self->{aws_timeframe}, + period => $self->{aws_period} + ); + + foreach my $metric (@{$self->{aws_metrics}}) { + foreach my $statistic (@{$self->{aws_statistics}}) { + next if (!defined($metric_results{$instance}->{$metric}->{lc($statistic)}) && !defined($self->{option_results}->{zeroed})); + + $self->{metric}->{$instance . "_" . lc($statistic)}->{display} = $instance; + $self->{metric}->{$instance . "_" . lc($statistic)}->{stat} = lc($statistic); + $self->{metric}->{$instance . "_" . lc($statistic)}->{type} = $self->{option_results}->{type}; + $self->{metric}->{$instance . "_" . lc($statistic)}->{$metric . "_" . lc($statistic)} = defined($metric_results{$instance}->{$metric}->{lc($statistic)}) ? $metric_results{$instance}->{$metric}->{lc($statistic)} : 0; + } + } + } + + if (scalar(keys %{$self->{metric}}) <= 0) { + $self->{output}->add_option_msg(short_msg => 'No metrics. Check your options or use --zeroed option to set 0 on undefined values'); + $self->{output}->option_exit(); + } +} + +1; + +__END__ + +=head1 MODE + +Check RDS instances storage metrics. + +Example: +perl centreon_plugins.pl --plugin=cloud::aws::rds::plugin --custommode=paws --mode=storage --region='eu-west-1' +--type='cluster' --name='centreon-db-ppd-cluster' --filter-metric='FreeStorageSpace' --statistic='average' +--critical-freestoragespace-average='10G:' --verbose + +Works for the following database engines : aurora, mysql, mariadb. + +See 'https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/MonitoringOverview.html' for more informations. + +Default statistic: 'average' / All statistics are valid. + +=over 8 + +=item B<--type> + +Set the instance type (Required) (Can be: 'cluster', 'instance'). + +=item B<--name> + +Set the instance name (Required) (Can be multiple). + +=item B<--filter-metric> + +Filter metrics (Can be: 'freestoragespace', 'freeablememory') +(Can be a regexp). + +=item B<--warning-$metric$-$statistic$> + +Thresholds warning ($metric$ can be: 'freestoragespace', 'freeablememory', +$statistic$ can be: 'minimum', 'maximum', 'average', 'sum'). + +=item B<--critical-$metric$-$statistic$> + +Thresholds warning ($metric$ can be: 'freestoragespace', 'freeablememory', +$statistic$ can be: 'minimum', 'maximum', 'average', 'sum'). + +=back + +=cut diff --git a/cloud/aws/rds/plugin.pm b/cloud/aws/rds/plugin.pm index 8156c0bad..b3dd75f3f 100644 --- a/cloud/aws/rds/plugin.pm +++ b/cloud/aws/rds/plugin.pm @@ -26,26 +26,27 @@ use base qw(centreon::plugins::script_custom); sub new { my ( $class, %options ) = @_; - my $self = $class->SUPER::new( package => __PACKAGE__, %options ); + my $self = $class->SUPER::new(package => __PACKAGE__, %options); bless $self, $class; $self->{version} = '0.1'; - %{ $self->{modes} } = ( - 'connections' => 'cloud::aws::rds::mode::connections', - 'cpu' => 'cloud::aws::rds::mode::cpu', - 'discovery' => 'cloud::aws::rds::mode::discovery', - 'diskio' => 'cloud::aws::rds::mode::diskio', - 'instance-status' => 'cloud::aws::rds::mode::instancestatus', - 'list-clusters' => 'cloud::aws::rds::mode::listclusters', - 'list-instances' => 'cloud::aws::rds::mode::listinstances', - 'network' => 'cloud::aws::rds::mode::network', - 'queries' => 'cloud::aws::rds::mode::queries', - 'transactions' => 'cloud::aws::rds::mode::transactions', - 'volume' => 'cloud::aws::rds::mode::volume', - ); + $self->{modes} = { + 'connections' => 'cloud::aws::rds::mode::connections', + 'cpu' => 'cloud::aws::rds::mode::cpu', + 'discovery' => 'cloud::aws::rds::mode::discovery', + 'diskio' => 'cloud::aws::rds::mode::diskio', + 'instance-status' => 'cloud::aws::rds::mode::instancestatus', + 'list-clusters' => 'cloud::aws::rds::mode::listclusters', + 'list-instances' => 'cloud::aws::rds::mode::listinstances', + 'network' => 'cloud::aws::rds::mode::network', + 'queries' => 'cloud::aws::rds::mode::queries', + 'storage' => 'cloud::aws::rds::mode::storage', + 'transactions' => 'cloud::aws::rds::mode::transactions', + 'volume' => 'cloud::aws::rds::mode::volume', + }; - $self->{custom_modes}{paws} = 'cloud::aws::custom::paws'; - $self->{custom_modes}{awscli} = 'cloud::aws::custom::awscli'; + $self->{custom_modes}->{paws} = 'cloud::aws::custom::paws'; + $self->{custom_modes}->{awscli} = 'cloud::aws::custom::awscli'; return $self; }