From 4b1a1b472bd95a76168f8461b0e3c59e3acb5d54 Mon Sep 17 00:00:00 2001 From: qgarnier Date: Tue, 17 Nov 2020 10:58:55 +0100 Subject: [PATCH] enhance rubrik (#2350) --- apps/backup/rubrik/restapi/mode/compliance.pm | 122 ++++++++++++++++++ apps/backup/rubrik/restapi/mode/tasks.pm | 20 ++- apps/backup/rubrik/restapi/plugin.pm | 11 +- 3 files changed, 136 insertions(+), 17 deletions(-) create mode 100644 apps/backup/rubrik/restapi/mode/compliance.pm diff --git a/apps/backup/rubrik/restapi/mode/compliance.pm b/apps/backup/rubrik/restapi/mode/compliance.pm new file mode 100644 index 000000000..22fde76f0 --- /dev/null +++ b/apps/backup/rubrik/restapi/mode/compliance.pm @@ -0,0 +1,122 @@ +# +# 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 apps::backup::rubrik::restapi::mode::compliance; + +use base qw(centreon::plugins::templates::counter); + +use strict; +use warnings; + +sub prefix_global_output { + my ($self, %options) = @_; + + return 'Backup objects last 24 hours '; +} + +sub set_counters { + my ($self, %options) = @_; + + $self->{maps_counters_type} = [ + { name => 'global', type => 0, cb_prefix_output => 'prefix_global_output', skipped_code => { -10 => 1 } } + ]; + + $self->{maps_counters}->{global} = [ + { label => 'incompliance', nlabel => 'backup.objects.incompliance.24h.count', set => { + key_values => [ { name => 'incompliance' } ], + output_template => 'in compliance: %s', + perfdatas => [ + { template => '%s', min => 0 } + ] + } + }, + { label => 'noncompliance', nlabel => 'backup.objects.noncompliance.24h.count', set => { + key_values => [ { name => 'noncompliance' } ], + output_template => 'non compliance: %s', + perfdatas => [ + { template => '%s', min => 0 } + ] + } + } + ]; +} + +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 $reports = $options{custom}->request_api(endpoint => '/report'); + my $report_id; + foreach (@{$reports->{data}}) { + if ($_->{name} eq 'SLA Compliance Summary') { + $report_id = $_->{id}; + last; + } + } + if (!defined($report_id)) { + $self->{output}->add_option_msg(short_msg => "Cannot find report name 'SLA Compliance Summary'"); + $self->{output}->option_exit(); + } + + my $tasks = $options{custom}->request_api( + endpoint => '/report/' . $report_id . '/chart', + get_param => ['timezone_offset=0', 'chart_id=chart0'] + ); + + $self->{global} = {}; + foreach (@{$tasks->[0]->{dataColumns}}) { + $self->{global}->{ lc($_->{label}) } = $_->{dataPoints}->[0]->{value}; + } + +} + +1; + +__END__ + +=head1 MODE + +Check backup objects compliance. + +=over 8 + +=item B<--filter-counters> + +Only display some counters (regexp can be used). +Example: --filter-counters='noncompliance' + +=item B<--warning-*> B<--critical-*> + +Thresholds. +Can be: 'incompliance', 'noncompliance'. + +=back + +=cut diff --git a/apps/backup/rubrik/restapi/mode/tasks.pm b/apps/backup/rubrik/restapi/mode/tasks.pm index 671824ad9..d9f5a21fc 100644 --- a/apps/backup/rubrik/restapi/mode/tasks.pm +++ b/apps/backup/rubrik/restapi/mode/tasks.pm @@ -24,12 +24,11 @@ use base qw(centreon::plugins::templates::counter); use strict; use warnings; -use Digest::MD5 qw(md5_hex); sub prefix_global_output { my ($self, %options) = @_; - return 'Tasks '; + return 'Tasks last 24 hours '; } sub set_counters { @@ -40,24 +39,24 @@ sub set_counters { ]; $self->{maps_counters}->{global} = [ - { label => 'succeeded', nlabel => 'tasks.succeeded.count', set => { - key_values => [ { name => 'succeeded', diff => 1 } ], + { label => 'succeeded', nlabel => 'tasks.succeeded.24h.count', set => { + key_values => [ { name => 'succeeded' } ], output_template => 'succeeded: %s', perfdatas => [ { template => '%s', min => 0 } ] } }, - { label => 'failed', nlabel => 'tasks.failed.count', set => { - key_values => [ { name => 'failed', diff => 1 } ], + { label => 'failed', nlabel => 'tasks.failed.24h.count', set => { + key_values => [ { name => 'failed' } ], output_template => 'failed: %s', perfdatas => [ { template => '%s', min => 0 } ] } }, - { label => 'canceled', nlabel => 'tasks.canceled.count', set => { - key_values => [ { name => 'canceled', diff => 1 } ], + { label => 'canceled', nlabel => 'tasks.canceled.24h.count', set => { + key_values => [ { name => 'canceled' } ], output_template => 'canceled: %s', perfdatas => [ { template => '%s', min => 0 } @@ -69,7 +68,7 @@ sub set_counters { sub new { my ($class, %options) = @_; - my $self = $class->SUPER::new(package => __PACKAGE__, %options, force_new_perfdata => 1, statefile => 1); + my $self = $class->SUPER::new(package => __PACKAGE__, %options, force_new_perfdata => 1); bless $self, $class; $options{options}->add_options(arguments => { @@ -81,9 +80,6 @@ sub new { sub manage_selection { my ($self, %options) = @_; - $self->{cache_name} = 'rubrik_' . $self->{mode} . '_' . md5_hex($options{custom}->get_connection_info()) . '_' . - (defined($self->{option_results}->{filter_counters}) ? md5_hex($self->{option_results}->{filter_counters}) : md5_hex('all')); - my $reports = $options{custom}->request_api(endpoint => '/report'); my $report_id; foreach (@{$reports->{data}}) { diff --git a/apps/backup/rubrik/restapi/plugin.pm b/apps/backup/rubrik/restapi/plugin.pm index 3ac92e8f8..b0c6250b1 100644 --- a/apps/backup/rubrik/restapi/plugin.pm +++ b/apps/backup/rubrik/restapi/plugin.pm @@ -31,11 +31,12 @@ sub new { $self->{version} = '0.1'; $self->{modes} = { - 'cluster' => 'apps::backup::rubrik::restapi::mode::cluster', - 'disks' => 'apps::backup::rubrik::restapi::mode::disks', - 'nodes' => 'apps::backup::rubrik::restapi::mode::nodes', - 'storage' => 'apps::backup::rubrik::restapi::mode::storage', - 'tasks' => 'apps::backup::rubrik::restapi::mode::tasks' + 'cluster' => 'apps::backup::rubrik::restapi::mode::cluster', + 'compliance' => 'apps::backup::rubrik::restapi::mode::compliance', + 'disks' => 'apps::backup::rubrik::restapi::mode::disks', + 'nodes' => 'apps::backup::rubrik::restapi::mode::nodes', + 'storage' => 'apps::backup::rubrik::restapi::mode::storage', + 'tasks' => 'apps::backup::rubrik::restapi::mode::tasks' }; $self->{custom_modes}->{api} = 'apps::backup::rubrik::restapi::custom::api';