(plugin) apps::monitoring::kadiska - adding new metrics and filters (#3946)
* adding processing duration metric and change secondes to milliseconds * modify output * adding new metrics for watcher * draft filter * enh forge post * adding filter for wfh * adding groupby gw site and country * push push * pairprogrammingwip * reworking all counterq * + country counter * enh for countries * enh condition when no counter populated * apply suggestion * isp draft * adding metrics for ISP * draft adding suggestion * handle wfa * modify site name and gw for wfa perfdata output * adapt select filter * modif wfa opt to be compliant w/ disco attributes * fix select when wfa is specifed * adding verbose opt for wfa * adding information in help for wfa Co-authored-by: Simon Bomm <sbomm@centreon.com>
This commit is contained in:
parent
a23791d3f5
commit
3d33ee61f1
|
@ -178,6 +178,37 @@ sub get_access_token {
|
|||
return $access_token;
|
||||
}
|
||||
|
||||
sub forge_select {
|
||||
my ($self, %options) = @_;
|
||||
|
||||
my %filters;
|
||||
$filters{gateway_name} = $options{gateway_name} if defined($options{gateway_name}) && $options{gateway_name} ne '';
|
||||
$filters{site_name} = $options{site_name} if defined($options{site_name}) && $options{site_name} ne '';
|
||||
$filters{watcher_name} = $options{watcher_name} if defined($options{watcher_name}) && $options{watcher_name} ne '';
|
||||
$filters{wfa} = $options{wfa} eq 'yes' ? 1 : undef ;
|
||||
|
||||
my @filter;
|
||||
|
||||
if (keys %filters > 1){
|
||||
foreach my $filter_name (keys %filters){
|
||||
if ($filter_name eq 'wfa'){
|
||||
unshift(@filter, ["=", "wfa", \1]) if defined($filters{$filter_name});
|
||||
next;
|
||||
}
|
||||
unshift(@filter, ["=", $filter_name,["\$", $filters{$filter_name}]]);
|
||||
}
|
||||
unshift(@filter, 'and');
|
||||
return \@filter;
|
||||
} elsif ( keys %filters == 1) {
|
||||
my ($filter_name) = %filters;
|
||||
my $filter_value = $filters{$filter_name};
|
||||
unshift(@filter, "=", $filter_name ,["\$", $filter_value ]);
|
||||
return \@filter;
|
||||
}
|
||||
|
||||
return undef;
|
||||
}
|
||||
|
||||
sub request_api {
|
||||
my ($self, %options) = @_;
|
||||
|
||||
|
|
|
@ -52,12 +52,15 @@ sub manage_selection {
|
|||
|
||||
my $raw_form_post = {
|
||||
"select" => [
|
||||
"watcher_name",
|
||||
"watcher_id"
|
||||
{ "watcher_id:group" => "watcher_name" },
|
||||
{ "site:group" => "site_name" },
|
||||
{ "gateway:group" => "gateway_name" }
|
||||
],
|
||||
"from" => "rum",
|
||||
"groupby" => [
|
||||
"watcher_id"
|
||||
"watcher_name",
|
||||
"site:group",
|
||||
"gateway:group"
|
||||
],
|
||||
"options" => {"sampling" => \1 }
|
||||
};
|
||||
|
@ -70,8 +73,10 @@ sub manage_selection {
|
|||
|
||||
foreach my $watcher (@{$results->{data}}) {
|
||||
my %application;
|
||||
$application{watcher_name} = $watcher->{watcher_name};
|
||||
$application{watcher_id} = $watcher->{watcher_id};
|
||||
$application{watcher_name} = $watcher->{'watcher_id:group'};
|
||||
$application{site_name} = defined($watcher->{'site:group'}) ? $watcher->{'site:group'} : '';
|
||||
$application{gateway_name} = defined($watcher->{'gateway:group'}) ? $watcher->{'gateway:group'} : '';
|
||||
$application{wfa} = !defined($watcher->{'gateway:group'}) && !defined($watcher->{'site:group'}) ? '--wfa --verbose' : '';
|
||||
push @disco_data, \%application;
|
||||
}
|
||||
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
#
|
||||
# Copyright 2022 Centreon (http://www.centreon.com/)
|
||||
#
|
||||
# Centreon is a full-fledged industry-strength solution that meets
|
||||
# Centreon is a full-fledged instry-strength solution that meets
|
||||
# the needs in IT infrastructure and application monitoring for
|
||||
# service performance.
|
||||
#
|
||||
|
@ -26,60 +26,396 @@ use strict;
|
|||
use warnings;
|
||||
use centreon::plugins::templates::catalog_functions qw(catalog_status_threshold_ng);
|
||||
|
||||
sub prefix_output {
|
||||
sub custom_usage_perfdata_ms {
|
||||
my ($self, %options) = @_;
|
||||
|
||||
return "Watcher '" . $options{instance} . "' ";
|
||||
|
||||
$self->{output}->perfdata_add(
|
||||
nlabel => $self->{nlabel},
|
||||
unit => 'ms',
|
||||
instances => [ $self->{result_values}->{watcher_name}, $self->{result_values}->{site_name}, $self->{result_values}->{gateway_name} ],
|
||||
value => sprintf('%s', $self->{result_values}->{ $self->{key_values}->[0]->{name} } ),
|
||||
warning => $self->{perfdata}->get_perfdata_for_output(label => 'warning-' . $self->{thlabel}),
|
||||
critical => $self->{perfdata}->get_perfdata_for_output(label => 'critical-' . $self->{thlabel}),
|
||||
min => 0
|
||||
);
|
||||
}
|
||||
|
||||
sub custom_usage_perfdata {
|
||||
my ($self, %options) = @_;
|
||||
|
||||
$self->{output}->perfdata_add(
|
||||
nlabel => $self->{nlabel},
|
||||
instances => [ $self->{result_values}->{watcher_name}, $self->{result_values}->{site_name}, $self->{result_values}->{gateway_name} ],
|
||||
value => sprintf('%s', $self->{result_values}->{ $self->{key_values}->[0]->{name} } ),
|
||||
warning => $self->{perfdata}->get_perfdata_for_output(label => 'warning-' . $self->{thlabel}),
|
||||
critical => $self->{perfdata}->get_perfdata_for_output(label => 'critical-' . $self->{thlabel}),
|
||||
min => 0
|
||||
);
|
||||
}
|
||||
|
||||
sub country_prefix_output {
|
||||
my ($self, %options) = @_;
|
||||
|
||||
return sprintf( "Country '%s' ", $options{instance});
|
||||
}
|
||||
|
||||
sub isp_prefix_output {
|
||||
my ($self, %options) = @_;
|
||||
|
||||
return sprintf( "ISP '%s' ", $options{instance});
|
||||
}
|
||||
|
||||
sub watcher_long_output {
|
||||
my ($self, %options) = @_;
|
||||
|
||||
return sprintf(
|
||||
"checking watcher '%s' [Site name: %s] [Gateway: %s]:",
|
||||
$options{instance_value}->{watcher_name},
|
||||
$options{instance_value}->{site_name},
|
||||
$options{instance_value}->{gateway_name}
|
||||
);
|
||||
}
|
||||
|
||||
sub prefix_watcher_output {
|
||||
my ($self, %options) = @_;
|
||||
|
||||
return sprintf(
|
||||
"Watcher '%s' [Site name: %s] [Gateway: %s] : ",
|
||||
$options{instance_value}->{watcher_name},
|
||||
$options{instance_value}->{site_name},
|
||||
$options{instance_value}->{gateway_name}
|
||||
);
|
||||
}
|
||||
|
||||
sub set_counters {
|
||||
my ($self, %options) = @_;
|
||||
|
||||
$self->{maps_counters_type} = [
|
||||
{ name => 'watchers', type => 1, cb_prefix_output => 'prefix_output', message_multiple => 'All Watchers are OK' }
|
||||
{ name => 'country', type => 1, cb_prefix_output => 'country_prefix_output', message_multiple => 'All countries are OK'},
|
||||
{ name => 'isp', type => 1, cb_prefix_output => 'isp_prefix_output', message_multiple => 'All ISP are OK'},
|
||||
{ name => 'watcher', type => 3, cb_prefix_output => 'prefix_watcher_output', message_multiple => 'All watchers are OK',
|
||||
cb_long_output => 'watcher_long_output', indent_long_output => ' ',
|
||||
group => [
|
||||
{ name => 'dtt_spent', type => 0, skipped_code => { -10 => 1 }},
|
||||
{ name => 'errors_prct', type => 0, skipped_code => { -10 => 1 }},
|
||||
{ name => 'full_network_time_spent', type => 0, skipped_code => { -10 => 1 }},
|
||||
{ name => 'loading_page', type => 0, skipped_code => { -10 => 1 }},
|
||||
{ name => 'pages', type => 0, skipped_code => { -10 => 1 }},
|
||||
{ name => 'processing', type => 0, skipped_code => { -10 => 1 }},
|
||||
{ name => 'redirect_time_avg', type => 0, skipped_code => { -10 => 1 }},
|
||||
{ name => 'requests', type => 0, skipped_code => { -10 => 1 }},
|
||||
{ name => 'sessions', type => 0, skipped_code => { -10 => 1 }},
|
||||
{ name => 'srt_spent', type => 0, skipped_code => { -10 => 1 }},
|
||||
{ name => 'users', type => 0, skipped_code => { -10 => 1 }},
|
||||
{ name => 'waiting_time', type => 0, skipped_code => { -10 => 1 }}
|
||||
]
|
||||
}
|
||||
];
|
||||
|
||||
$self->{maps_counters}->{watchers} = [
|
||||
{ label => 'errors-prct', nlabel => 'watcher.errors.percentage', set => {
|
||||
$self->{maps_counters}->{isp} = [
|
||||
{ label => 'dtt_spent', nlabel => 'isp.dtt.spent.time.milliseconds', set => {
|
||||
key_values => [ { name => 'dtt_spent' } ],
|
||||
output_template => 'DTT spent: %.2f ms',
|
||||
perfdatas => [
|
||||
{ template => '%s', unit => 'ms', min => 0, label_extra_instance => 1 },
|
||||
],
|
||||
}
|
||||
},
|
||||
{ label => 'errors-prct', nlabel => 'isp.errors.percentage', set => {
|
||||
key_values => [ { name => 'errors_prct' } ],
|
||||
output_template => 'errors: %.2f%%',
|
||||
output_template => 'Errors: %.2f%%',
|
||||
perfdatas => [
|
||||
{ template => '%.2f', unit => '%', min => 0, max => 100, label_extra_instance => 1 },
|
||||
],
|
||||
}
|
||||
},
|
||||
{ label => 'sessions', nlabel => 'watcher.sessions.count', set => {
|
||||
{ label => 'full-time-network-spent', nlabel => 'isp.network.spent.time.milliseconds', set => {
|
||||
key_values => [ { name => 'full_time_network_spent' } ],
|
||||
output_template => 'Full time network spent: %.2f ms',
|
||||
perfdatas => [
|
||||
{ template => '%s', unit => 'ms', min => 0, label_extra_instance => 1 },
|
||||
],
|
||||
}
|
||||
},
|
||||
{ label => 'sessions', nlabel => 'isp.sessions.count', set => {
|
||||
key_values => [ { name => 'sessions' } ],
|
||||
output_template => 'sessions: %s',
|
||||
output_template => 'Sessions: %s',
|
||||
perfdatas => [
|
||||
{ template => '%s', min => 0, label_extra_instance => 1 },
|
||||
],
|
||||
}
|
||||
},
|
||||
{ label => 'srt_spent', nlabel => 'isp.srt.spent.time.milliseconds', set => {
|
||||
key_values => [ { name => 'srt_spent' } ],
|
||||
output_template => 'SRT spent: %.2f ms',
|
||||
perfdatas => [
|
||||
{ template => '%s', unit => 'ms', min => 0, label_extra_instance => 1 },
|
||||
],
|
||||
}
|
||||
},
|
||||
{ label => 'requests', nlabel => 'isp.requests.count', set => {
|
||||
key_values => [ { name => 'requests' } ],
|
||||
output_template => 'Requests: %s',
|
||||
perfdatas => [
|
||||
{ template => '%s', min => 0, label_extra_instance => 1 },
|
||||
],
|
||||
}
|
||||
},
|
||||
{ label => 'redirect-time-avg', nlabel => 'isp.redirect.time.milliseconds', set => {
|
||||
key_values => [ { name => 'redirect_time_avg' } ],
|
||||
output_template => 'Redirect time avg: %.2f ms',
|
||||
perfdatas => [
|
||||
{ template => '%s', unit => 'ms', min => 0, label_extra_instance => 1 },
|
||||
],
|
||||
}
|
||||
},
|
||||
{ label => 'loading-page', nlabel => 'isp.loading.page.duration.milliseconds', set => {
|
||||
key_values => [ { name => 'loading_page' } ],
|
||||
output_template => 'Loading page duration: %.2f ms',
|
||||
perfdatas => [
|
||||
{ template => '%s', unit => 'ms', min => 0, label_extra_instance => 1 },
|
||||
],
|
||||
}
|
||||
},
|
||||
{ label => 'pages', nlabel => 'isp.pages.count', set => {
|
||||
key_values => [ { name => 'pages' } ],
|
||||
output_template => 'Loaded pages: %d',
|
||||
perfdatas => [
|
||||
{ template => '%d', min => 0, label_extra_instance => 1 },
|
||||
],
|
||||
}
|
||||
},
|
||||
{ label => 'processing', nlabel => 'isp.processing.duration.milliseconds', set => {
|
||||
key_values => [ { name => 'processing' } ],
|
||||
output_template => 'API Processing duration: %.2f ms',
|
||||
perfdatas => [
|
||||
{ template => '%s', unit => 'ms', min => 0, label_extra_instance => 1 },
|
||||
],
|
||||
}
|
||||
},
|
||||
{ label => 'users', nlabel => 'users.count', set => {
|
||||
key_values => [ { name => 'users' } ],
|
||||
output_template => 'Connected users: %s',
|
||||
perfdatas => [
|
||||
{ template => '%s', min => 0, label_extra_instance => 1 },
|
||||
],
|
||||
}
|
||||
},
|
||||
{ label => 'waiting-time-avg', nlabel => 'isp.waiting.time.milliseconds', set => {
|
||||
key_values => [ { name => 'waiting_time_avg' } ],
|
||||
output_template => 'Waiting time avg: %.2f ms',
|
||||
perfdatas => [
|
||||
{ template => '%s', unit => 'ms', min => 0, label_extra_instance => 1 },
|
||||
],
|
||||
}
|
||||
}
|
||||
];
|
||||
|
||||
$self->{maps_counters}->{country} = [
|
||||
{ label => 'dtt_spent', nlabel => 'watcher.dtt.spent.time.milliseconds', set => {
|
||||
key_values => [ { name => 'dtt_spent' } ],
|
||||
output_template => 'DTT spent: %.2f ms',
|
||||
perfdatas => [
|
||||
{ template => '%s', unit => 'ms', min => 0, label_extra_instance => 1 },
|
||||
],
|
||||
}
|
||||
},
|
||||
{ label => 'errors-prct', nlabel => 'watcher.errors.percentage', set => {
|
||||
key_values => [ { name => 'errors_prct' } ],
|
||||
output_template => 'Errors: %.2f%%',
|
||||
perfdatas => [
|
||||
{ template => '%.2f', unit => '%', min => 0, max => 100, label_extra_instance => 1 },
|
||||
],
|
||||
}
|
||||
},
|
||||
{ label => 'full-time-network-spent', nlabel => 'watcher.network.spent.time.milliseconds', set => {
|
||||
key_values => [ { name => 'full_time_network_spent' } ],
|
||||
output_template => 'Full time network spent: %.2f ms',
|
||||
perfdatas => [
|
||||
{ template => '%s', unit => 'ms', min => 0, label_extra_instance => 1 },
|
||||
],
|
||||
}
|
||||
},
|
||||
{ label => 'sessions', nlabel => 'watcher.sessions.count', set => {
|
||||
key_values => [ { name => 'sessions' } ],
|
||||
output_template => 'Sessions: %s',
|
||||
perfdatas => [
|
||||
{ template => '%s', min => 0, label_extra_instance => 1 },
|
||||
],
|
||||
}
|
||||
},
|
||||
{ label => 'srt_spent', nlabel => 'watcher.srt.spent.time.milliseconds', set => {
|
||||
key_values => [ { name => 'srt_spent' } ],
|
||||
output_template => 'SRT spent: %.2f ms',
|
||||
perfdatas => [
|
||||
{ template => '%s', unit => 'ms', min => 0, label_extra_instance => 1 },
|
||||
],
|
||||
}
|
||||
},
|
||||
{ label => 'requests', nlabel => 'watcher.requests.count', set => {
|
||||
key_values => [ { name => 'requests' } ],
|
||||
output_template => 'requests: %s',
|
||||
output_template => 'Requests: %s',
|
||||
perfdatas => [
|
||||
{ template => '%s', min => 0, label_extra_instance => 1 },
|
||||
],
|
||||
}
|
||||
},
|
||||
{ label => 'loading-page', nlabel => 'watcher.loading.page.duration.seconds', set => {
|
||||
key_values => [ { name => 'loading_page' } ],
|
||||
output_template => 'Loading page duration: %.2f s',
|
||||
{ label => 'redirect-time-avg', nlabel => 'watcher.redirect.time.milliseconds', set => {
|
||||
key_values => [ { name => 'redirect_time_avg' } ],
|
||||
output_template => 'Redirect time avg: %.2f ms',
|
||||
perfdatas => [
|
||||
{ template => '%.2f', unit => 's', min => 0, label_extra_instance => 1 },
|
||||
{ template => '%s', unit => 'ms', min => 0, label_extra_instance => 1 },
|
||||
],
|
||||
}
|
||||
},
|
||||
{ label => 'loading-page', nlabel => 'watchers.loading.page.duration.milliseconds', set => {
|
||||
key_values => [ { name => 'loading_page' } ],
|
||||
output_template => 'Loading page duration: %.2f ms',
|
||||
perfdatas => [
|
||||
{ template => '%s', unit => 'ms', min => 0, label_extra_instance => 1 },
|
||||
],
|
||||
}
|
||||
},
|
||||
{ label => 'pages', nlabel => 'watcher.pages.count', set => {
|
||||
{ label => 'pages', nlabel => 'watchers.pages.count', set => {
|
||||
key_values => [ { name => 'pages' } ],
|
||||
output_template => 'pages: %d',
|
||||
output_template => 'Loaded pages: %d',
|
||||
perfdatas => [
|
||||
{ template => '%d', min => 0, label_extra_instance => 1 },
|
||||
],
|
||||
}
|
||||
}
|
||||
},
|
||||
{ label => 'processing', nlabel => 'watchers.processing.duration.milliseconds', set => {
|
||||
key_values => [ { name => 'processing' } ],
|
||||
output_template => 'API Processing duration: %.2f ms',
|
||||
perfdatas => [
|
||||
{ template => '%s', unit => 'ms', min => 0, label_extra_instance => 1 },
|
||||
],
|
||||
}
|
||||
},
|
||||
{ label => 'users', nlabel => 'users.count', set => {
|
||||
key_values => [ { name => 'users' } ],
|
||||
output_template => 'Connected users: %s',
|
||||
perfdatas => [
|
||||
{ template => '%s', min => 0, label_extra_instance => 1 },
|
||||
],
|
||||
}
|
||||
},
|
||||
{ label => 'waiting-time-avg', nlabel => 'watchers.waiting.time.milliseconds', set => {
|
||||
key_values => [ { name => 'waiting_time_avg' } ],
|
||||
output_template => 'Waiting time avg: %.2f ms',
|
||||
perfdatas => [
|
||||
{ template => '%s', unit => 'ms', min => 0, label_extra_instance => 1 },
|
||||
],
|
||||
}
|
||||
}
|
||||
];
|
||||
|
||||
$self->{maps_counters}->{dtt_spent} = [
|
||||
{ label => 'dtt-spent', nlabel => 'watcher.dtt.spent.time.milliseconds', set => {
|
||||
key_values => [ { name => 'dtt_spent' }, { name => 'watcher_name' }, { name => 'site_name'}, { name => 'gateway_name'} ],
|
||||
output_template => 'DTT spent: %.2f ms',
|
||||
closure_custom_perfdata => $self->can('custom_usage_perfdata_ms')
|
||||
}
|
||||
}
|
||||
];
|
||||
|
||||
$self->{maps_counters}->{errors_prct} = [
|
||||
{ label => 'errors-prct', nlabel => 'watcher.errors.percentage', set => {
|
||||
key_values => [ { name => 'errors_prct' }, { name => 'watcher_name' }, { name => 'site_name'}, { name => 'gateway_name'} ],
|
||||
output_template => 'Errors: %.2f%%',
|
||||
closure_custom_perfdata => $self->can('custom_usage_perfdata')
|
||||
}
|
||||
}
|
||||
];
|
||||
|
||||
$self->{maps_counters}->{full_network_time_spent} = [
|
||||
{ label => 'full-network-time-spent', nlabel => 'watcher.network.spent.time.milliseconds', set => {
|
||||
key_values => [ { name => 'full_network_time_spent' }, { name => 'watcher_name' }, { name => 'site_name'}, { name => 'gateway_name'} ],
|
||||
output_template => 'Full network time spent: %.2f ms',
|
||||
closure_custom_perfdata => $self->can('custom_usage_perfdata_ms')
|
||||
}
|
||||
}
|
||||
];
|
||||
|
||||
$self->{maps_counters}->{loading_page} = [
|
||||
{ label => 'loading-page', nlabel => 'watcher.loading.page.duration.milliseconds', set => {
|
||||
key_values => [ { name => 'loading_page' }, { name => 'watcher_name' }, { name => 'site_name'}, { name => 'gateway_name'} ],
|
||||
output_template => 'Loading page duration: %.2f ms',
|
||||
closure_custom_perfdata => $self->can('custom_usage_perfdata_ms')
|
||||
}
|
||||
}
|
||||
];
|
||||
|
||||
$self->{maps_counters}->{pages} = [
|
||||
{ label => 'pages', nlabel => 'watcher.pages.count', set => {
|
||||
key_values => [ { name => 'pages' }, { name => 'watcher_name' }, { name => 'site_name'}, { name => 'gateway_name'} ],
|
||||
output_template => 'Loaded pages: %d',
|
||||
closure_custom_perfdata => $self->can('custom_usage_perfdata')
|
||||
}
|
||||
}
|
||||
];
|
||||
|
||||
$self->{maps_counters}->{processing} = [
|
||||
{ label => 'processing', nlabel => 'watcher.processing.duration.milliseconds', set => {
|
||||
key_values => [ { name => 'processing' }, { name => 'watcher_name' }, { name => 'site_name'}, { name => 'gateway_name'} ],
|
||||
output_template => 'API Processing duration: %.2f ms',
|
||||
closure_custom_perfdata => $self->can('custom_usage_perfdata_ms')
|
||||
}
|
||||
}
|
||||
];
|
||||
|
||||
$self->{maps_counters}->{redirect_time_avg} = [
|
||||
{ label => 'redirect-time-avg', nlabel => 'watcher.redirect.time.milliseconds', set => {
|
||||
key_values => [ { name => 'redirect_time_avg' }, { name => 'watcher_name' }, { name => 'site_name'}, { name => 'gateway_name'} ],
|
||||
output_template => 'Redirect time avg: %.2f ms',
|
||||
closure_custom_perfdata => $self->can('custom_usage_perfdata_ms')
|
||||
}
|
||||
}
|
||||
];
|
||||
|
||||
$self->{maps_counters}->{requests} = [
|
||||
{ label => 'requests', nlabel => 'watcher.requests.count', set => {
|
||||
key_values => [ { name => 'requests' }, { name => 'watcher_name' }, { name => 'site_name'}, { name => 'gateway_name'} ],
|
||||
output_template => 'Requests: %s',
|
||||
closure_custom_perfdata => $self->can('custom_usage_perfdata')
|
||||
}
|
||||
}
|
||||
];
|
||||
|
||||
$self->{maps_counters}->{sessions} = [
|
||||
{ label => 'sessions', nlabel => 'watcher.sessions.count', set => {
|
||||
key_values => [ { name => 'sessions' }, { name => 'watcher_name' }, { name => 'site_name'}, { name => 'gateway_name'} ],
|
||||
output_template => 'Sessions: %s',
|
||||
closure_custom_perfdata => $self->can('custom_usage_perfdata')
|
||||
}
|
||||
}
|
||||
];
|
||||
|
||||
$self->{maps_counters}->{srt_spent} = [
|
||||
{ label => 'srt-spent', nlabel => 'watcher.srt.spent.time.milliseconds', set => {
|
||||
key_values => [ { name => 'srt_spent' }, { name => 'watcher_name' }, { name => 'site_name'}, { name => 'gateway_name'} ],
|
||||
output_template => 'SRT spent: %.2f ms',
|
||||
closure_custom_perfdata => $self->can('custom_usage_perfdata_ms')
|
||||
}
|
||||
}
|
||||
];
|
||||
|
||||
$self->{maps_counters}->{users} = [
|
||||
{ label => 'users', nlabel => 'users.count', set => {
|
||||
key_values => [ { name => 'connected_users' }, { name => 'watcher_name' }, { name => 'site_name'}, { name => 'gateway_name'} ],
|
||||
output_template => 'Connected users: %s',
|
||||
closure_custom_perfdata => $self->can('custom_usage_perfdata')
|
||||
}
|
||||
},
|
||||
];
|
||||
|
||||
$self->{maps_counters}->{waiting_time} = [
|
||||
{ label => 'waiting-time', nlabel => 'watcher.waiting.time.milliseconds', set => {
|
||||
key_values => [ { name => 'waiting_time' }, { name => 'watcher_name' }, { name => 'site_name'}, { name => 'gateway_name'} ],
|
||||
output_template => 'Waiting time: %.2f ms',
|
||||
closure_custom_perfdata => $self->can('custom_usage_perfdata_ms')
|
||||
}
|
||||
}
|
||||
];
|
||||
}
|
||||
|
||||
|
@ -94,7 +430,12 @@ sub new {
|
|||
bless $self, $class;
|
||||
|
||||
$options{options}->add_options(arguments => {
|
||||
'filter-watcher-name:s' => { name => 'filter_watcher_name' },
|
||||
'country:s' => { name => 'country'},
|
||||
'isp:s' => { name => 'isp'},
|
||||
'select-watcher-name:s' => { name => 'watcher_name' },
|
||||
'select-site-name:s' => { name => 'site_name'},
|
||||
'select-gateway-name:s' => { name => 'gateway_name'},
|
||||
'wfa:s' => { name => 'wfa'}
|
||||
});
|
||||
|
||||
return $self;
|
||||
|
@ -106,13 +447,25 @@ sub manage_selection {
|
|||
my $raw_form_post = {
|
||||
"select" => [
|
||||
{
|
||||
"watcher_id:group" => "watcher_name"
|
||||
"user_id:distinct" => ["distinct","user_id"]
|
||||
},
|
||||
{
|
||||
"\%errors:avg|hits" =>
|
||||
[
|
||||
"*",100,["/",["sumFor","hits","error_count"],["countFor","hits"]]
|
||||
]
|
||||
"\%errors:avg|hits" => ["avgFor","hits","error_count"]
|
||||
},
|
||||
{
|
||||
"redirect_time_spent:avg|requests" => ["avgFor","requests","redirect_time_spent"]
|
||||
},
|
||||
{
|
||||
"waiting_time_spent:avg|requests" => ["avgFor","requests","waiting_time_spent"]
|
||||
},
|
||||
{
|
||||
"full_network_time_spent:avg|requests" => ["avgFor","requests","full_network_time_spent"]
|
||||
},
|
||||
{
|
||||
"srt_spent:avg|requests" => ["avgFor","requests","srt_spent"]
|
||||
},
|
||||
{
|
||||
"dtt_spent:avg|requests" => ["avgFor","requests","dtt_spent"]
|
||||
},
|
||||
{
|
||||
"session:sum|hits" => ["sumFor","hits","session_count"]
|
||||
|
@ -125,41 +478,186 @@ sub manage_selection {
|
|||
},
|
||||
{
|
||||
"lcp:p75|pages" => ["p75For","pages","lcp"]
|
||||
},
|
||||
{
|
||||
"processing_whole:avg|requests" => ["avgFor","requests",["+",["+",["+",["+","full_local_time_spent","full_network_time_spent"],"srt_spent"],"dtt_spent"],"dom_waiting_time_spent"]]
|
||||
}
|
||||
],
|
||||
"from" => "rum",
|
||||
"groupby" => [
|
||||
"watcher_name"
|
||||
],
|
||||
"offset" => 0,
|
||||
"options" => {"sampling" => \1 }
|
||||
};
|
||||
};
|
||||
|
||||
if (defined($self->{option_results}->{filter_watcher_name}) && $self->{option_results}->{filter_watcher_name} ne ''){
|
||||
$raw_form_post->{where} = ["=","watcher_name",["\$", $self->{option_results}->{filter_watcher_name}]],
|
||||
if (defined($self->{option_results}->{country})){
|
||||
unshift @{$raw_form_post->{select}}, { 'country:group' => "country" };
|
||||
unshift @{$raw_form_post->{groupby}}, 'country:group';
|
||||
} elsif (defined($self->{option_results}->{isp})) {
|
||||
unshift @{$raw_form_post->{select}}, { 'isp:group' => "isp" };
|
||||
unshift @{$raw_form_post->{groupby}}, 'isp:group';
|
||||
} else {
|
||||
push @{$raw_form_post->{select}}, { "watcher_id:group" => "watcher_name" }, { "site:group" => "site_name" }, { "gateway:group" => "gateway_name" };
|
||||
push @{$raw_form_post->{groupby}}, "watcher_name", "site:group", "gateway:group" ;
|
||||
}
|
||||
|
||||
my $select;
|
||||
$select = $options{custom}->forge_select(
|
||||
site_name => $self->{option_results}->{site_name},
|
||||
gateway_name => $self->{option_results}->{gateway_name},
|
||||
watcher_name => $self->{option_results}->{watcher_name},
|
||||
wfa => defined($self->{option_results}->{wfa}) ? 'yes' : 'no'
|
||||
);
|
||||
|
||||
$raw_form_post->{where} = $select if (defined($select));
|
||||
|
||||
my $results = $options{custom}->request_api(
|
||||
method => 'POST',
|
||||
endpoint => 'query',
|
||||
query_form_post => $raw_form_post
|
||||
);
|
||||
|
||||
$self->{watchers} = {};
|
||||
$self->{watcher} = {};
|
||||
$self->{country} = {};
|
||||
$self->{isp} = {};
|
||||
foreach my $watcher (@{$results->{data}}) {
|
||||
|
||||
last if (!defined($watcher->{'watcher_id:group'}));
|
||||
my $instance = $watcher->{'watcher_id:group'};
|
||||
$instance .= defined($watcher->{'gateway:group'}) ? $watcher->{'gateway:group'} : "wfa";
|
||||
$instance .= defined($watcher->{'site:group'}) ? $watcher->{'site:group'} : "no-site";
|
||||
|
||||
$self->{watcher}->{$instance} = {
|
||||
site_name => defined($watcher->{'site:group'}) ? $watcher->{'site:group'} : "no-site",
|
||||
gateway_name => defined($watcher->{'gateway:group'}) ? $watcher->{'gateway:group'} : "wfa",
|
||||
watcher_name => $watcher->{'watcher_id:group'}
|
||||
};
|
||||
|
||||
$self->{watcher}->{$instance}->{waiting_time} = {
|
||||
watcher_name => $watcher->{'watcher_id:group'},
|
||||
waiting_time => ( $watcher->{'waiting_time_spent:avg|requests'} / 10**3 ),
|
||||
site_name => defined($watcher->{'site:group'}) ? $watcher->{'site:group'} : "no-site",
|
||||
gateway_name => defined($watcher->{'gateway:group'}) ? $watcher->{'gateway:group'} : "wfa",
|
||||
};
|
||||
|
||||
$self->{watchers}->{$instance} = {
|
||||
$self->{watcher}->{$instance}->{users} = {
|
||||
watcher_name => $watcher->{'watcher_id:group'},
|
||||
connected_users => $watcher->{'user_id:distinct'},
|
||||
site_name => defined($watcher->{'site:group'}) ? $watcher->{'site:group'} : "no-site",
|
||||
gateway_name => defined($watcher->{'gateway:group'}) ? $watcher->{'gateway:group'} : "wfa",
|
||||
};
|
||||
|
||||
$self->{watcher}->{$instance}->{errors_prct} = {
|
||||
watcher_name => $watcher->{'watcher_id:group'},
|
||||
errors_prct => $watcher->{'%errors:avg|hits'},
|
||||
loading_page => (defined($watcher->{'lcp:p75|pages'}) && $watcher->{'lcp:p75|pages'} != 0 ) ? ($watcher->{'lcp:p75|pages'} / 10**6) : 0,
|
||||
site_name => defined($watcher->{'site:group'}) ? $watcher->{'site:group'} : "no-site",
|
||||
gateway_name => defined($watcher->{'gateway:group'}) ? $watcher->{'gateway:group'} : "wfa",
|
||||
};
|
||||
|
||||
$self->{watcher}->{$instance}->{dtt_spent} = {
|
||||
watcher_name => $watcher->{'watcher_id:group'},
|
||||
dtt_spent => ( $watcher->{'dtt_spent:avg|requests'} / 10**3 ) ,
|
||||
site_name => defined($watcher->{'site:group'}) ? $watcher->{'site:group'} : "no-site",
|
||||
gateway_name => defined($watcher->{'gateway:group'}) ? $watcher->{'gateway:group'} : "wfa",
|
||||
};
|
||||
|
||||
$self->{watcher}->{$instance}->{full_network_time_spent} = {
|
||||
watcher_name => $watcher->{'watcher_id:group'},
|
||||
full_network_time_spent => ( $watcher->{'full_network_time_spent:avg|requests'} / 10**3 ),
|
||||
site_name => defined($watcher->{'site:group'}) ? $watcher->{'site:group'} : "no-site",
|
||||
gateway_name => defined($watcher->{'gateway:group'}) ? $watcher->{'gateway:group'} : "wfa",
|
||||
};
|
||||
|
||||
$self->{watcher}->{$instance}->{loading_page} = {
|
||||
watcher_name => $watcher->{'watcher_id:group'},
|
||||
loading_page => (defined($watcher->{'lcp:p75|pages'}) && $watcher->{'lcp:p75|pages'} != 0 ) ? ($watcher->{'lcp:p75|pages'} / 10**3) : 0,
|
||||
site_name => defined($watcher->{'site:group'}) ? $watcher->{'site:group'} : "no-site",
|
||||
gateway_name => defined($watcher->{'gateway:group'}) ? $watcher->{'gateway:group'} : "wfa",
|
||||
};
|
||||
|
||||
$self->{watcher}->{$instance}->{pages} = {
|
||||
watcher_name => $watcher->{'watcher_id:group'},
|
||||
pages => $watcher->{'item:count|pages'},
|
||||
site_name => defined($watcher->{'site:group'}) ? $watcher->{'site:group'} : "no-site",
|
||||
gateway_name => defined($watcher->{'gateway:group'}) ? $watcher->{'gateway:group'} : "wfa",
|
||||
};
|
||||
|
||||
$self->{watcher}->{$instance}->{processing} = {
|
||||
watcher_name => $watcher->{'watcher_id:group'},
|
||||
processing => ( $watcher->{'processing_whole:avg|requests'} / 10**3 ),
|
||||
site_name => defined($watcher->{'site:group'}) ? $watcher->{'site:group'} : "no-site",
|
||||
gateway_name => defined($watcher->{'gateway:group'}) ? $watcher->{'gateway:group'} : "wfa",
|
||||
};
|
||||
|
||||
$self->{watcher}->{$instance}->{redirect_time_avg} = {
|
||||
watcher_name => $watcher->{'watcher_id:group'},
|
||||
redirect_time_avg => ( $watcher->{'redirect_time_spent:avg|requests'} / 10**3),
|
||||
site_name => defined($watcher->{'site:group'}) ? $watcher->{'site:group'} : "no-site",
|
||||
gateway_name => defined($watcher->{'gateway:group'}) ? $watcher->{'gateway:group'} : "wfa",
|
||||
};
|
||||
|
||||
$self->{watcher}->{$instance}->{requests} = {
|
||||
watcher_name => $watcher->{'watcher_id:group'},
|
||||
requests => $watcher->{'item:count|requests'},
|
||||
sessions => $watcher->{'session:sum|hits'}
|
||||
site_name => defined($watcher->{'site:group'}) ? $watcher->{'site:group'} : "no-site",
|
||||
gateway_name => defined($watcher->{'gateway:group'}) ? $watcher->{'gateway:group'} : "wfa",
|
||||
};
|
||||
|
||||
$self->{watcher}->{$instance}->{sessions} = {
|
||||
watcher_name => $watcher->{'watcher_id:group'},
|
||||
sessions => $watcher->{'session:sum|hits'},
|
||||
site_name => defined($watcher->{'site:group'}) ? $watcher->{'site:group'} : "",
|
||||
gateway_name => defined($watcher->{'gateway:group'}) ? $watcher->{'gateway:group'} : "wfa",
|
||||
};
|
||||
|
||||
$self->{watcher}->{$instance}->{srt_spent} = {
|
||||
watcher_name => $watcher->{'watcher_id:group'},
|
||||
srt_spent => ( $watcher->{'srt_spent:avg|requests'} / 10**3 ),
|
||||
site_name => defined($watcher->{'site:group'}) ? $watcher->{'site:group'} : "no-site",
|
||||
gateway_name => defined($watcher->{'gateway:group'}) ? $watcher->{'gateway:group'} : "wfa",
|
||||
};
|
||||
};
|
||||
|
||||
if (scalar(keys %{$self->{watchers}}) <= 0) {
|
||||
foreach my $country (@{$results->{data}}) {
|
||||
last if (!defined($country->{'country:group'}));
|
||||
next if (defined($country->{'country:group'}) && $country->{'country:group'} !~ /$self->{option_results}->{country}/i);
|
||||
my $instance = $country->{'country:group'};
|
||||
|
||||
$self->{country}->{$instance} = {
|
||||
dtt_spent => ( $country->{'dtt_spent:avg|requests'} / 10**3 ),
|
||||
errors_prct => $country->{'%errors:avg|hits'},
|
||||
full_time_network_spent => ( $country->{'full_network_time_spent:avg|requests'} / 10**3 ),
|
||||
loading_page => (defined($country->{'lcp:p75|pages'}) && $country->{'lcp:p75|pages'} != 0 ) ? ($country->{'lcp:p75|pages'} / 10**3) : 0,
|
||||
pages => $country->{'item:count|pages'},
|
||||
processing => ( $country->{'processing_whole:avg|requests'} / 10**3 ),
|
||||
requests => $country->{'item:count|requests'},
|
||||
redirect_time_avg => ( $country->{'redirect_time_spent:avg|requests'} / 10**3),
|
||||
srt_spent => ( $country->{'srt_spent:avg|requests'} / 10**3 ),
|
||||
sessions => $country->{'session:sum|hits'},
|
||||
users => $country->{'user_id:distinct'},
|
||||
waiting_time_avg => ( $country->{'waiting_time_spent:avg|requests'} / 10**3 )
|
||||
};
|
||||
}
|
||||
|
||||
foreach my $isp (@{$results->{data}}) {
|
||||
last if (!defined($isp->{'isp:group'}));
|
||||
next if (defined($isp->{'isp:group'}) && $isp->{'isp:group'} !~ /$self->{option_results}->{isp}/i);
|
||||
my $instance = $isp->{'isp:group'};
|
||||
|
||||
$self->{isp}->{$instance} = {
|
||||
dtt_spent => ( $isp->{'dtt_spent:avg|requests'} / 10**3 ),
|
||||
errors_prct => $isp->{'%errors:avg|hits'},
|
||||
full_time_network_spent => ( $isp->{'full_network_time_spent:avg|requests'} / 10**3 ),
|
||||
loading_page => (defined($isp->{'lcp:p75|pages'}) && $isp->{'lcp:p75|pages'} != 0 ) ? ($isp->{'lcp:p75|pages'} / 10**3) : 0,
|
||||
pages => $isp->{'item:count|pages'},
|
||||
processing => ( $isp->{'processing_whole:avg|requests'} / 10**3 ),
|
||||
requests => $isp->{'item:count|requests'},
|
||||
redirect_time_avg => ( $isp->{'redirect_time_spent:avg|requests'} / 10**3),
|
||||
srt_spent => ( $isp->{'srt_spent:avg|requests'} / 10**3 ),
|
||||
sessions => $isp->{'session:sum|hits'},
|
||||
users => $isp->{'user_id:distinct'},
|
||||
waiting_time_avg => ( $isp->{'waiting_time_spent:avg|requests'} / 10**3 )
|
||||
};
|
||||
}
|
||||
|
||||
if (scalar(keys %{$self->{watcher}}) <= 0 && scalar(keys %{$self->{country}}) <= 0 && scalar(keys %{$self->{isp}}) <= 0) {
|
||||
$self->{output}->add_option_msg(short_msg => "No instances or results found.");
|
||||
$self->{output}->option_exit();
|
||||
}
|
||||
|
@ -172,13 +670,39 @@ __END__
|
|||
|
||||
=head1 MODE
|
||||
|
||||
Check Kadiska application watchers' statistics during the period specified.
|
||||
Check Kadiska application watchers statistics during the period specified.
|
||||
|
||||
=over 8
|
||||
|
||||
=item B<--filter-watcher-name>
|
||||
=item B<--select-site-name>
|
||||
|
||||
Filter on an application watcher to only display related statistics.
|
||||
Display statistics for watchers on a particular site.
|
||||
|
||||
Leave empty to get work-from-home watchers statistics: --select-site-name="" --select-watcher-name="GitHub"
|
||||
|
||||
=item B<--select-gateway-name>
|
||||
|
||||
Display statistics for watchers attached to a particular gateway.
|
||||
|
||||
=item B<--select-watcher-name>
|
||||
|
||||
Display statistics for a particular watcher.
|
||||
|
||||
=item B<--country>
|
||||
|
||||
Display statistics per country.
|
||||
|
||||
Leave empty to get statistics from all countries, or specify particular country.
|
||||
|
||||
=item B<--isp>
|
||||
|
||||
Display statistics per ISP.
|
||||
|
||||
Leave empty to get statistics from all ISP, or specify particular ISP.
|
||||
|
||||
=item B<--wfa>
|
||||
|
||||
Display statistics for watchers used by work-from-anywhere users.
|
||||
|
||||
=item B<--warning-errors-prct>
|
||||
|
||||
|
@ -214,11 +738,11 @@ Critical threshold for requested pages by the application.
|
|||
|
||||
=item B<--warning-loading-page>
|
||||
|
||||
Warning threshold loading page duration in seconds.
|
||||
Warning threshold loading page duration in milliseconds.
|
||||
|
||||
=item B<--critical-loading-page>
|
||||
|
||||
Critical threshold for loading page duration in seconds.
|
||||
Critical threshold for loading page duration in milliseconds.
|
||||
|
||||
=back
|
||||
|
||||
|
|
Loading…
Reference in New Issue