diff --git a/src/apps/ceph/restapi/mode/storage.pm b/src/apps/ceph/restapi/mode/storage.pm new file mode 100644 index 000000000..83a946def --- /dev/null +++ b/src/apps/ceph/restapi/mode/storage.pm @@ -0,0 +1,118 @@ +# +# Copyright 2023 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::ceph::restapi::mode::storage; + +use base qw(centreon::plugins::templates::counter); + +use strict; +use warnings; + +sub custom_space_usage_output { + my ($self, %options) = @_; + + my ($total_size_value, $total_size_unit) = $self->{perfdata}->change_bytes(value => $self->{result_values}->{total_space}); + my ($total_used_value, $total_used_unit) = $self->{perfdata}->change_bytes(value => $self->{result_values}->{used_space}); + my ($total_free_value, $total_free_unit) = $self->{perfdata}->change_bytes(value => $self->{result_values}->{free_space}); + return sprintf( + 'raw storage space usage total: %s used: %s (%.2f%%) free: %s (%.2f%%)', + $total_size_value . " " . $total_size_unit, + $total_used_value . " " . $total_used_unit, $self->{result_values}->{prct_used_space}, + $total_free_value . " " . $total_free_unit, $self->{result_values}->{prct_free_space} + ); +} + +sub set_counters { + my ($self, %options) = @_; + + $self->{maps_counters_type} = [ + { name => 'global', type => 0, cb_prefix_output => 'prefix_global_output' } + ]; + + $self->{maps_counters}->{global} = [ + { label => 'space-usage', nlabel => 'storage.raw.space.usage.bytes', set => { + key_values => [ { name => 'used_space' }, { name => 'free_space' }, { name => 'prct_used_space' }, { name => 'prct_free_space' }, { name => 'total_space' } ], + closure_custom_output => $self->can('custom_space_usage_output'), + perfdatas => [ + { template => '%d', min => 0, max => 'total_space', unit => 'B', cast_int => 1, label_extra_instance => 1 } + ] + } + }, + { label => 'space-usage-free', nlabel => 'storage.raw.space.free.bytes', display_ok => 0, set => { + key_values => [ { name => 'free_space' }, { name => 'used_space' }, { name => 'prct_used_space' }, { name => 'prct_free_space' }, { name => 'total_space' } ], + closure_custom_output => $self->can('custom_space_usage_output'), + perfdatas => [ + { template => '%d', min => 0, max => 'total_space', unit => 'B', cast_int => 1, label_extra_instance => 1 } + ] + } + }, + { label => 'space-usage-prct', nlabel => 'storage.raw.space.usage.percentage', display_ok => 0, set => { + key_values => [ { name => 'prct_used_space' }, { name => 'used_space' }, { name => 'free_space' }, { name => 'prct_free_space' }, { name => 'total_space' } ], + closure_custom_output => $self->can('custom_space_usage_output'), + perfdatas => [ + { template => '%.2f', min => 0, max => 100, unit => '%', label_extra_instance => 1 } + ] + } + } + ]; +} + +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 $health = $options{custom}->request_api(endpoint => '/api/health/minimal'); + + $self->{global} = { + total_space => $health->{df}->{stats}->{total_bytes}, + used_space => $health->{df}->{stats}->{total_used_raw_bytes}, + free_space => $health->{df}->{stats}->{total_bytes} - $health->{df}->{stats}->{total_used_raw_bytes}, + prct_used_space => $health->{df}->{stats}->{total_used_raw_bytes} * 100 / $health->{df}->{stats}->{total_bytes}, + prct_free_space => ($health->{df}->{stats}->{total_bytes} - $health->{df}->{stats}->{total_used_raw_bytes}) * 100 / $health->{df}->{stats}->{total_bytes} + }; +} + +1; + +__END__ + +=head1 MODE + +Check raw storage. + +=over 8 + +=item B<--warning-*> B<--critical-*> + +Thresholds. +Can be: 'space-usage', 'space-usage-free', 'space-usage-prct'. + +=back + +=cut diff --git a/src/apps/ceph/restapi/plugin.pm b/src/apps/ceph/restapi/plugin.pm index 9ded2b046..61545fa03 100644 --- a/src/apps/ceph/restapi/plugin.pm +++ b/src/apps/ceph/restapi/plugin.pm @@ -33,7 +33,8 @@ sub new { 'health' => 'apps::ceph::restapi::mode::health', 'list-pools' => 'apps::ceph::restapi::mode::listpools', 'osd' => 'apps::ceph::restapi::mode::osd', - 'pools' => 'apps::ceph::restapi::mode::pools' + 'pools' => 'apps::ceph::restapi::mode::pools', + 'storage' => 'apps::ceph::restapi::mode::storage' }; $self->{custom_modes}->{api} = 'apps::ceph::restapi::custom::api';