diff --git a/centreon-plugins/cloud/aws/fsx/mode/datausage.pm b/centreon-plugins/cloud/aws/fsx/mode/datausage.pm new file mode 100644 index 000000000..e014879ec --- /dev/null +++ b/centreon-plugins/cloud/aws/fsx/mode/datausage.pm @@ -0,0 +1,195 @@ +# +# 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 cloud::aws::fsx::mode::datausage; + +use base qw(cloud::aws::custom::mode); + +use strict; +use warnings; + +sub get_metrics_mapping { + my ($self, %options) = @_; + + my $metrics_mapping = { + extra_params => { + message_multiple => 'All FSx metrics are ok' + }, + metrics => { + DataReadBytes => { + output => 'Data Read Bytes', + label => 'data-read-bytes', + nlabel => { + absolute => 'fsx.data.read.bytes', + per_second => 'fsx.data.read.bytespersecond' + }, + unit => 'B' + }, + DataWriteBytes => { + output => 'Data Write Bytes', + label => 'data-write-ops', + nlabel => { + absolute => 'fsx.data.write.bytes', + per_second => 'fsx.data.write.bytespersecond' + }, + unit => 'B' + }, + DataReadOperations => { + output => 'Data Read Ops', + label => 'data-read-ops', + nlabel => { + absolute => 'fsx.data.io.read.count', + per_second => 'fsx.data.io.read.persecond' + }, + unit => 'B' + }, + DataWriteOperations => { + output => 'Data Write Ops', + label => 'data-write-ops', + nlabel => { + absolute => 'fsx.data.io.write.count', + per_second => 'fsx.data.io.write.persecond' + }, + unit => 'count' + }, + MetadataOperations => { + output => 'MetaData Operations Bytes', + label => 'metadata-ops-bytes', + nlabel => { + absolute => 'fsx.metadata.ops.bytes', + per_second => 'fsx.metadata.ops.bytespersecond' + }, + unit => 'B' + } + } + }; + + return $metrics_mapping; +} + +sub long_output { + my ($self, %options) = @_; + + return "FSx FileSystemId '" . $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 => { + 'name:s@' => { name => 'name' } + }); + + return $self; +} + +sub check_options { + my ($self, %options) = @_; + $self->SUPER::check_options(%options); + + 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; + } + } +} + +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/FSx', + dimensions => [ { Name => "FileSystemId", 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->{metrics}->{$instance}->{display} = $instance; + $self->{metrics}->{$instance}->{statistics}->{lc($statistic)}->{display} = $statistic; + $self->{metrics}->{$instance}->{statistics}->{lc($statistic)}->{timeframe} = $self->{aws_timeframe}; + $self->{metrics}->{$instance}->{statistics}->{lc($statistic)}->{$metric} = + defined($metric_results{$instance}->{$metric}->{lc($statistic)}) ? + $metric_results{$instance}->{$metric}->{lc($statistic)} : 0; + } + } + } + + if (scalar(keys %{$self->{metrics}}) <= 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 FSx FileSystem Data consumption metrics. + +Example: +perl centreon_plugins.pl --plugin=cloud::aws::fsx::plugin --custommode=awscli --mode=datausage --region='eu-west-1' +--name='fs-1234abcd' --filter-metric='DataReadIOBytes' --statistic='sum' --warning-data-read-bytes='5' --verbose + +See 'https://docs.aws.amazon.com/efs/latest/ug/efs-metrics.html' for more information. + +=over 8 + +=item B<--name> + +Set the instance name (Required) (Can be multiple). + +=item B<--filter-metric> + +Filter on a specific metric +Can be: DataReadBytes, DataWriteBytes, DataReadOperations, DataWriteOperations, MetaDataOperations + +=item B<--statistic> + +Set the metric calculation method (Only Sum is relevant). + +=item B<--warning-$metric$> + +Thresholds warning ($metric$ can be: 'data-write-ops', 'data-write-ops', 'data-read-ops', 'data-read-bytes', 'metadata-ops-bytes'). + +=item B<--critical-$metric$> + +Thresholds critical ($metric$ can be: 'data-write-ops', 'data-write-ops', 'data-read-ops', 'data-read-bytes', 'metadata-ops-bytes'). + +=back + +=cut diff --git a/centreon-plugins/cloud/aws/fsx/mode/discovery.pm b/centreon-plugins/cloud/aws/fsx/mode/discovery.pm new file mode 100644 index 000000000..05c12705d --- /dev/null +++ b/centreon-plugins/cloud/aws/fsx/mode/discovery.pm @@ -0,0 +1,112 @@ +# +# 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 cloud::aws::fsx::mode::discovery; + +use base qw(centreon::plugins::mode); + +use strict; +use warnings; +use JSON::XS; + +sub new { + my ($class, %options) = @_; + my $self = $class->SUPER::new(package => __PACKAGE__, %options); + bless $self, $class; + + $options{options}->add_options(arguments => { + 'prettify' => { name => 'prettify' } + }); + + return $self; +} + +sub check_options { + my ($self, %options) = @_; + $self->SUPER::init(%options); +} + +sub run { + my ($self, %options) = @_; + + my @disco_data; + my $disco_stats; + + $disco_stats->{start_time} = time(); + + my $fsx_instances = $options{custom}->discovery( + service => 'fsx', + command => 'describe-file-systems' + ); + + foreach my $fs_instance (@{$fsx_instances->{FileSystems}}) { + next if (!defined($fsx_instance->{FileSystemId})); + my %fsx; + $fsx{type} = "fsx"; + $fsx{id} = $fsx_instance->{FileSystemId}; + $fsx{dns_name} = $fsx_instance->{DNSName}; + $fsx{creation_time} = $fsx_instance->{CreationTime}; + $fsx{lifecycle} = $fsx_instance->{Lifecycle}; + $fsx{fsx_type} = $fsx_instance->{FileSystemType}; + foreach my $tag (@{$instance->{Tags}}) { + push @{$fsx{tags}}, { key => $tag->{Key}, value => $tag->{Value} }; + } + push @disco_data, \%fsx; + } + + $disco_stats->{end_time} = time(); + $disco_stats->{duration} = $disco_stats->{end_time} - $disco_stats->{start_time}; + $disco_stats->{discovered_items} = @disco_data; + $disco_stats->{results} = \@disco_data; + + my $encoded_data; + eval { + if (defined($self->{option_results}->{prettify})) { + $encoded_data = JSON::XS->new->utf8->pretty->encode($disco_stats); + } else { + $encoded_data = JSON::XS->new->utf8->encode($disco_stats); + } + }; + if ($@) { + $encoded_data = '{"code":"encode_error","message":"Cannot encode discovered data into JSON format"}'; + } + + $self->{output}->output_add(short_msg => $encoded_data); + $self->{output}->display(nolabel => 1, force_ignore_perfdata => 1); + $self->{output}->exit(); +} + +1; + +__END__ + +=head1 MODE + +FSX discovery. + +=over 8 + +=item B<--prettify> + +Prettify JSON output. + +=back + +=cut diff --git a/centreon-plugins/cloud/aws/fsx/mode/freespace.pm b/centreon-plugins/cloud/aws/fsx/mode/freespace.pm new file mode 100644 index 000000000..af608aff6 --- /dev/null +++ b/centreon-plugins/cloud/aws/fsx/mode/freespace.pm @@ -0,0 +1,151 @@ +# +# 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 cloud::aws::fsx::mode::freespace; + +use base qw(cloud::aws::custom::mode); + +use strict; +use warnings; + +sub get_metrics_mapping { + my ($self, %options) = @_; + + my $metrics_mapping = { + metrics => { + FreeStorageCapacity => { + output => 'Free Storage Bytes', + label => 'storage-free-bytes', + nlabel => { + absolute => 'fsx.storage.free.bytes', + }, + unit => 'B' + } + } + }; + + return $metrics_mapping; +} + +sub long_output { + my ($self, %options) = @_; + + return "FSx FileSystemId '" . $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 => { + 'name:s@' => { name => 'name' } + }); + + return $self; +} + +sub check_options { + my ($self, %options) = @_; + $self->SUPER::check_options(%options); + + 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; + } + } +} + +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/FSx', + dimensions => [ { Name => "FileSystemId", 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->{metrics}->{$instance}->{display} = $instance; + $self->{metrics}->{$instance}->{statistics}->{lc($statistic)}->{display} = $statistic; + $self->{metrics}->{$instance}->{statistics}->{lc($statistic)}->{timeframe} = $self->{aws_timeframe}; + $self->{metrics}->{$instance}->{statistics}->{lc($statistic)}->{$metric} = + defined($metric_results{$instance}->{$metric}->{lc($statistic)}) ? + $metric_results{$instance}->{$metric}->{lc($statistic)} : 0; + } + } + } + + if (scalar(keys %{$self->{metrics}}) <= 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 FSx FileSystem Free Storage available in Bytes. + +Example: +perl centreon_plugins.pl --plugin=cloud::aws::fsx::plugin --custommode=awscli --mode=freespace --region='eu-west-1' +--name='fs-1234abcd' --warning-data-read-bytes='5' --verbose + +See 'https://docs.aws.amazon.com/efs/latest/ug/efs-metrics.html' for more information. + +=over 8 + +=item B<--name> + +Set the instance name (Required) (Can be multiple). + +=item B<--statistic> + +Set the metric calculation method (Default: Average) +Can be 'minimum', 'average' + +=item B<--warning-storage-free-bytes> + +Thresholds warning on remaining available bytes. + +=item B<--critical-storage-free-bytes> + +Thresholds warning on remaining available bytes. + +=back + +=cut diff --git a/centreon-plugins/cloud/aws/fsx/plugin.pm b/centreon-plugins/cloud/aws/fsx/plugin.pm new file mode 100644 index 000000000..f243c7fda --- /dev/null +++ b/centreon-plugins/cloud/aws/fsx/plugin.pm @@ -0,0 +1,52 @@ +# +# 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 cloud::aws::fsx::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} } = ( + 'datausage' => 'cloud::aws::fsx::mode::datausage', + 'discovery' => 'cloud::aws::fsx::mode::discovery', + 'freespace' => 'cloud::aws::fsx::mode::freespace' + ); + + $self->{custom_modes}{paws} = 'cloud::aws::custom::paws'; + $self->{custom_modes}{awscli} = 'cloud::aws::custom::awscli'; + return $self; +} + +1; + +__END__ + +=head1 PLUGIN DESCRIPTION + +Check Amazon shared File Systems (Amazon FSx). + +=cut