Skip to content

Commit

Permalink
reports: migrate different sla reports into one generic
Browse files Browse the repository at this point in the history
reports have been merged into a generic report:
    - sla_host, sla_hostgroup, sla_service, sla_servicegroup -> sla_report
    - sla_host_outage, sla_service_outage -> sla_outage
Those reports can now use any filter and also combine hosts and services into one report.
  • Loading branch information
sni committed Mar 19, 2021
1 parent 96f2f76 commit 7605fd0
Show file tree
Hide file tree
Showing 16 changed files with 136 additions and 47 deletions.
2 changes: 2 additions & 0 deletions MANIFEST
Expand Up @@ -594,6 +594,7 @@ plugins/plugins-available/reports2/templates/reports/comp/page_cover.tt
plugins/plugins-available/reports2/templates/reports/comp/page_standard.tt
plugins/plugins-available/reports2/templates/reports/comp/pnp_multiple_graph_page.tt
plugins/plugins-available/reports2/templates/reports/comp/report.tt
plugins/plugins-available/reports2/templates/reports/comp/sla_details.tt
plugins/plugins-available/reports2/templates/reports/comp/sla_graph_by_time.tt
plugins/plugins-available/reports2/templates/reports/comp/sla_graph_fixed.tt
plugins/plugins-available/reports2/templates/reports/comp/sla_graph_page.tt
Expand All @@ -618,6 +619,7 @@ plugins/plugins-available/reports2/templates/reports/sla_host.tt
plugins/plugins-available/reports2/templates/reports/sla_host_outage.tt
plugins/plugins-available/reports2/templates/reports/sla_hostgroup.tt
plugins/plugins-available/reports2/templates/reports/sla_outage.tt
plugins/plugins-available/reports2/templates/reports/sla_report.tt
plugins/plugins-available/reports2/templates/reports/sla_service.tt
plugins/plugins-available/reports2/templates/reports/sla_service_outage.tt
plugins/plugins-available/reports2/templates/reports/sla_servicegroup.tt
Expand Down
2 changes: 1 addition & 1 deletion lib/Monitoring/Availability.pm
Expand Up @@ -345,7 +345,7 @@ sub calculate {

# if we have more than one host or service, we dont build up a log
$self->{'report_options'}->{'build_log'} = TRUE;
if(scalar @{$self->{'report_options'}->{'hosts'}} == 1) {
if(scalar @{$self->{'report_options'}->{'hosts'}} == 1 && scalar @{$self->{'report_options'}->{'services'}} == 0) {
$self->{'report_options'}->{'build_log'} = HOST_ONLY;
}
elsif(scalar @{$self->{'report_options'}->{'services'}} == 1) {
Expand Down
7 changes: 3 additions & 4 deletions lib/Thruk/Utils/Avail.pm
Expand Up @@ -201,11 +201,10 @@ sub calculate_availability {
# services
$c->stash->{'services'} = {};
if(exists $params->{s_filter}) {
my $all_services;
$servicefilter = $params->{s_filter};
$service = 1;
$all_services = $c->{'db'}->get_services(filter => [ Thruk::Utils::Auth::get_auth_filter($c, 'services'), $servicefilter ]);
die('no such service: '.($service||'')."\n".Dumper([ Thruk::Utils::Auth::get_auth_filter($c, 'services'), $servicefilter ])) unless scalar @{$all_services} > 0;
my $all_services = $c->{'db'}->get_services(filter => [ Thruk::Utils::Auth::get_auth_filter($c, 'services'), $servicefilter ]);
die('no service matches filter: '.Dumper([ Thruk::Utils::Auth::get_auth_filter($c, 'services'), $servicefilter ])) unless scalar @{$all_services} > 0;
my $services_data;
for my $service (@{$all_services}) {
$services_data->{$service->{'host_name'}}->{$service->{'description'}} = $service;
Expand Down Expand Up @@ -243,7 +242,7 @@ sub calculate_availability {
$hostfilter = $params->{h_filter};

my $host_data = $c->{'db'}->get_hosts(filter => [ Thruk::Utils::Auth::get_auth_filter($c, 'hosts'), $hostfilter ]);
die('no such host: '.($host||'')."\n".Dumper([ Thruk::Utils::Auth::get_auth_filter($c, 'hosts'), $hostfilter ])) unless scalar @{$host_data} > 0;
die('no such host: '.Dumper([ Thruk::Utils::Auth::get_auth_filter($c, 'hosts'), $hostfilter ])) unless scalar @{$host_data} > 0;
if($initialassumedhoststate == -1) {
for my $host (@{$host_data}) {
$initial_states->{'hosts'}->{$host->{'name'}} = $host->{'state'};
Expand Down
Expand Up @@ -58,14 +58,12 @@

[% FOREACH hst = avail_data.services.keys.sort %]
[% FOREACH svc = avail_data.services.$hst.keys.sort %]
[% c.req.parameters.host = hst %]
[% c.req.parameters.service = svc %]
[% available = get_availability_percents() %]
[% available = get_availability_percents(hst, svc) %]
[% p = available.total.percent;
IF p == -1; p = 100; END;
IF param.exists('mail_max_level') && param.mail_max_level != -1 && p < param.mail_max_level; param.mail_max_level_count = param.mail_max_level_count + 1; END;
%]
[% pagetitle = loc("Business Process: %s", hst) %]
[% pagetitle = loc("Business Process: %s", hst) %]

[% WRAPPER 'reports/comp/page_standard.tt' %]
[% PROCESS 'reports/comp/sla_graph_page.tt' %]
Expand Down
Expand Up @@ -173,16 +173,15 @@ sub outages {

my $c = $Thruk::Request::c or die("not initialized!");
my $u = $c->stash->{'unavailable_states'};
my $host = $hst // $c->req->parameters->{'host'};
my $service = $svc // $c->req->parameters->{'service'};
my $only_host_services = $c->req->parameters->{'only_host_services'};
confess("got no host") unless $hst;

my $outages = Thruk::Utils::Avail::outages($logs, $u, $start, $end, $host, $service, $only_host_services);
my $outages = Thruk::Utils::Avail::outages($logs, $u, $start, $end, $hst, $svc, $only_host_services);
if($c->req->parameters->{'attach_json'} && lc($c->req->parameters->{'attach_json'}) ne 'no') {
if($service eq '') {
$c->stash->{'last_outages'}->{'hosts'}->{$host} = $outages;
if($svc eq '') {
$c->stash->{'last_outages'}->{'hosts'}->{$hst} = $outages;
} else {
$c->stash->{'last_outages'}->{'services'}->{$host}->{$service} = $outages;
$c->stash->{'last_outages'}->{'services'}->{$hst}->{$svc} = $outages;
}
}
return($outages);
Expand Down Expand Up @@ -491,18 +490,16 @@ sub get_availability_percents {
my($hst, $svc) = @_;
my $c = $Thruk::Request::c or die("not initialized!");

my $host = $hst // $c->req->parameters->{'host'};
my $service = $svc // $c->req->parameters->{'service'};
my $avail_data = $c->stash->{'avail_data'};
my $unavailable_states = $c->stash->{'unavailable_states'};
confess("No host in parameters:\n".Dumper($c->req->parameters)) unless defined $host;
confess("no host") unless defined $hst;

my $availability = Thruk::Utils::Avail::get_availability_percents($avail_data, $unavailable_states, $host, $service);
my $availability = Thruk::Utils::Avail::get_availability_percents($avail_data, $unavailable_states, $hst, $svc);
if($c->req->parameters->{'attach_json'} && lc($c->req->parameters->{'attach_json'}) ne 'no') {
if($service eq '') {
$c->stash->{'last_availability'}->{'hosts'}->{$host} = $availability;
if($svc eq '') {
$c->stash->{'last_availability'}->{'hosts'}->{$hst} = $availability;
} else {
$c->stash->{'last_availability'}->{'services'}->{$host}->{$service} = $availability;
$c->stash->{'last_availability'}->{'services'}->{$hst}->{$svc} = $availability;
}
}
return($availability);
Expand Down
Expand Up @@ -7,10 +7,10 @@
[% nb_page = ( (param.max_pnp_sources - 1) div 3 ) + 1 %]
[% END %]
[% page = 1 %]
[% source = get_graph_source(c.req.parameters.host, c.req.parameters.service) + 1 %][%# start at default source + 1 because the first graph is added in sla_graph_page.tt already #%]
[% source = get_graph_source(hst, svc) + 1 %][%# start at default source + 1 because the first graph is added in sla_graph_page.tt already #%]
[% WHILE page <= nb_page %]
[% nb_graph = 0 %]
[% pnpdata = get_pnp_image(c.req.parameters.host, c.req.parameters.service, start, end, 400, 100, source) %]
[% pnpdata = get_pnp_image(hst, svc, start, end, 400, 100, source) %]
[% IF pnpdata %]
[% nb_graph = nb_graph + 1 %]
[% WRAPPER 'reports/comp/page_standard.tt' pagetitle="" %]
Expand All @@ -22,7 +22,7 @@
[% nb_graph = 3 %]
[% END %]
[% WHILE nb_graph < 3 %]
[% pnpdata = get_pnp_image(c.req.parameters.host, c.req.parameters.service, start, end, 400, 100, source) %]
[% pnpdata = get_pnp_image(hst, svc, start, end, 400, 100, source) %]
[% IF pnpdata %]
[% nb_graph = nb_graph + 1 %]
<div align="center">
Expand Down
@@ -0,0 +1,17 @@
[% available = get_availability_percents(hst, svc) %]
[% p = available.total.percent;
IF p == -1; p = 100; END;
IF param.exists('mail_max_level') && param.mail_max_level != -1 && p < param.mail_max_level; param.mail_max_level_count = param.mail_max_level_count + 1; END;
IF total_services > 1 && param.details_max_level != -1 && p >= param.details_max_level; NEXT; END
%]
[% IF svc == "" %]
[% pagetitle = loc("Host: %s", _hst(hst)) %]
[% ELSE %]
[% pagetitle = loc("Service: %s on %s", _svc(hst, svc), _hst(hst)) %]
[% END %]

[% WRAPPER 'reports/comp/page_standard.tt' %]
[% PROCESS 'reports/comp/sla_graph_page.tt' %]
[% END %]
[% PROCESS 'reports/comp/pnp_multiple_graph_page.tt' %]
[% PROCESS 'reports/comp/sla_outages.tt' %]
@@ -1,5 +1,5 @@
[% IF !param.exists("max_pnp_sources") %][% param.max_pnp_sources = 1 %][% END %]
[% available = get_availability_percents() %]
[% available = get_availability_percents(hst, svc) %]
[% IF available.keys.size < 15 %]
[% PROCESS 'reports/comp/sla_graph_fixed.tt' data = available %]
[% PROCESS 'reports/comp/sla_table.tt' %]
Expand All @@ -9,8 +9,8 @@
[% PROCESS 'reports/comp/sla_total_table.tt' data = available.total %]

[% IF param.max_pnp_sources >= 1 %]
[% source = get_graph_source(c.req.parameters.host, c.req.parameters.service) %]
[% pnpdata = get_pnp_image(c.req.parameters.host, c.req.parameters.service, start, end, 400, 100, source) %]
[% source = get_graph_source(hst, svc) %]
[% pnpdata = get_pnp_image(hst, svc, start, end, 400, 100, source) %]
[% IF pnpdata %]
<div align="center">
<img src="[% pnpdata %]" class="[% c.stash.last_graph_type %]image" alt="[% c.stash.last_graph_type %] graph">
Expand Down
@@ -1,5 +1,5 @@
[% IF param.max_outages_pages > 0 || param.max_worst_pages > 0 %]
[% out = outages(logs, start, end) %]
[% out = outages(logs, start, end, hst, svc) %]
[% IF out.size == 0 %]
[% IF show_empty_outages %]
[% WRAPPER 'reports/comp/page_standard.tt' pagetitle = loc("Outages") %]
Expand Down
Expand Up @@ -59,9 +59,7 @@
[% END %]

[% FOREACH hst = avail_data.hosts.keys.sort %]
[% c.req.parameters.host = hst %]
[% c.req.parameters.service = "" %]
[% available = get_availability_percents() %]
[% available = get_availability_percents(hst, "") %]
[% p = available.total.percent;
IF p == -1; p = 100; END;
IF param.exists('mail_max_level') && param.mail_max_level != -1 && p < param.mail_max_level; param.mail_max_level_count = param.mail_max_level_count + 1; END;
Expand Down
Expand Up @@ -56,9 +56,7 @@
[% END %]

[% FOREACH hst = avail_data.hosts.keys.sort %]
[% c.req.parameters.host = hst %]
[% c.req.parameters.service = "" %]
[% available = get_availability_percents() %]
[% available = get_availability_percents(hst, svc) %]
[% p = available.total.percent;
IF p == -1; p = 100; END;
IF param.exists('mail_max_level') && param.mail_max_level != -1 && p < param.mail_max_level; param.mail_max_level_count = param.mail_max_level_count + 1; END;
Expand Down
Expand Up @@ -59,9 +59,7 @@
[% END %]

[% FOREACH hst = avail_data.hosts.keys.sort %]
[% c.req.parameters.host = hst %]
[% c.req.parameters.service = "" %]
[% available = get_availability_percents() %]
[% available = get_availability_percents(hst, "") %]
[% p = available.total.percent;
IF p == -1; p = 100; END;
IF param.exists('mail_max_level') && param.mail_max_level != -1 && p < param.mail_max_level; param.mail_max_level_count = param.mail_max_level_count + 1; END;
Expand Down
88 changes: 88 additions & 0 deletions plugins/plugins-available/reports2/templates/reports/sla_report.tt
@@ -0,0 +1,88 @@
[%# EDIT #%]
[% IF block == 'edit' %]
[%
required_fields = [
{ 'language' => [ 'Language', 'language', 'en' ,'', 1 ] },
{ 'affected_sla_objects' => [ '', 'affected_sla_objects', '' ] },
{ 'filter_type' => [ 'Objects', 'radio', 'Both' ,'', 1, ['Services', 'Hosts', 'Both'] ] },
{ 'filter' => [ 'Filter', 'filter', { 'host' => 'all' } ] },

{ 'timeperiod' => [ 'Timeperiod', 'rptimeperiod', 'last12months' ] },
{ 'breakdown' => [ 'Breakdown by', 'breakdowns', 'months' ] },
{ 'rpttimeperiod' => [ 'Report Timeperiod', 'rpttimeperiod', '' ] },
{ 'sla' => [ 'SLA %', 'int', '98' ,'', 1 ] },
{ 'graph_min_sla' => [ 'Graph SLA %', 'int', '90' ,'', 1 ] },
{ 'decimals' => [ 'Decimal Points', 'int', '2' ,'', 1 ] },
{ 'servicenameformat' => [ 'Servicename Format', 'serviceformat', 'description' ] },
{ 'dateformat' => [ 'Dateformat', 'dateformat', '' ] },
{ 'datetimeformat' => [ 'Datetimeformat', 'datetimeformat', '' ] },
{ 'assumeinitialstates' => [ 'Assume Initial States', 'yes_no', 'yes' ] },
{ 'initialassumedservicestate' => [ 'Initial Assumed State', 'svc_initialassumedstate', '0' ] },
{ 'includesoftstates' => [ 'Include Soft States', 'yes_no', 'no' ] },
{ 'unavailable' => [ 'Unavailable States', 'svc_unavailable', ['critical', 'unknown'], '', 1 ] },
{ 'overview_max_level' => [ 'Overview SLA %', 'int_box', '-1' ,'hide object from overview table if sla is above or equal threshold', 0, 100 ] },
{ 'details_max_level' => [ 'Details SLA %', 'int_box', '100' ,'hide details if sla is above or equal threshold', 1, 100 ] },
{ 'mail_max_level' => [ 'Mail SLA %', 'int_box', '-1', 'cancel mail if no object breaks this sla', 0, 100] },
{ 'max_worst_pages' => [ 'Worst Outages', 'int_box', '1' ,'max. # pages', 1, 1 ] },
{ 'max_outages_pages' => [ 'Latest Outages', 'int_box', '-1' ,'max. # pages', 1, 1 ] },
{ 'max_pnp_sources' => [ 'Maximum Graph Sources', 'int_box', '1' ,'max. # graph images', 1, 1 ] },
{ 'attach_json' => [ 'Attach Json', 'yes_no', 'no', 'attach json raw data' ] },
];
%]
[% END %]

[%# MAIL LAYOUT #%]
[% PROCESS 'reports/comp/mail.tt' %]

[%# PREPARE REPORT #%]
[% PROCESS 'reports/comp/sla_prepare.tt' %]

[%# REPORT LAYOUT #%]
[% IF block == 'render' %]
[% PROCESS 'reports/comp/sla_render_settings.tt' %]
[%
title = loc('SLA Report')
subtitle = r.name
coverdetails = [ loc('Report Timeperiod:'), get_report_timeperiod(start, end, reportDateFormat) ];
%]

[% WRAPPER 'reports/comp/report.tt' %]
[% WRAPPER 'reports/comp/page_cover.tt' %][% END %]
[% PROCESS 'reports/comp/backend_error_page.tt' %]
[% IF param.filter_type == "Hosts" %]
[% type = "host" %]
[% ELSIF param.filter_type == "Services" %]
[% type = "service" %]
[% ELSE %]
[% type = "both" %]
[% END %]

[% IF (total_hosts + total_services) > 1 %]
[% WRAPPER 'reports/comp/page_standard.tt' pagetitle=loc("SLA Overview Graph") %]
[% PROCESS 'reports/comp/sla_total_graph.tt' %]
[% END %]
[% END %]

[% IF param.filter_type == "Hosts" %]
[% FOREACH hst = avail_data.hosts.keys.sort %]
[% PROCESS 'reports/comp/sla_details.tt' svc="" %]
[% END %]

[% ELSIF param.filter_type == "Services" %]
[% FOREACH hst = avail_data.services.keys.sort %]
[% FOREACH svc = avail_data.services.$hst.keys.sort %]
[% PROCESS 'reports/comp/sla_details.tt' %]
[% END %]
[% END %]

[% ELSIF param.filter_type == "Both" %]
[% FOREACH hst = avail_data.services.keys.sort %]
[% PROCESS 'reports/comp/sla_outage_details.tt' svc="" %]
[% FOREACH svc = avail_data.services.$hst.keys.sort %]
[% PROCESS 'reports/comp/sla_details.tt' %]
[% END %]
[% END %]
[% END %]

[% END %][%# report wrapper #%]
[% END %][%# render block #%]
Expand Up @@ -60,9 +60,7 @@

[% FOREACH hst = avail_data.services.keys.sort %]
[% FOREACH svc = avail_data.services.$hst.keys.sort %]
[% c.req.parameters.host = hst %]
[% c.req.parameters.service = svc %]
[% available = get_availability_percents() %]
[% available = get_availability_percents(hst, svc) %]
[% p = available.total.percent;
IF p == -1; p = 100; END;
IF param.exists('mail_max_level') && param.mail_max_level != -1 && p < param.mail_max_level; param.mail_max_level_count = param.mail_max_level_count + 1; END;
Expand Down
Expand Up @@ -57,9 +57,7 @@

[% FOREACH hst = avail_data.services.keys.sort %]
[% FOREACH svc = avail_data.services.$hst.keys.sort %]
[% c.req.parameters.host = hst %]
[% c.req.parameters.service = svc %]
[% available = get_availability_percents() %]
[% available = get_availability_percents(hst, svc) %]
[% p = available.total.percent;
IF p == -1; p = 100; END;
IF param.exists('mail_max_level') && param.mail_max_level != -1 && p < param.mail_max_level; param.mail_max_level_count = param.mail_max_level_count + 1; END;
Expand Down
Expand Up @@ -63,9 +63,7 @@

[% FOREACH hst = avail_data.services.keys.sort %]
[% FOREACH svc = avail_data.services.$hst.keys.sort %]
[% c.req.parameters.host = hst %]
[% c.req.parameters.service = svc %]
[% available = get_availability_percents() %]
[% available = get_availability_percents(hst, svc) %]
[% p = available.total.percent;
IF p == -1; p = 100; END;
IF param.exists('mail_max_level') && param.mail_max_level != -1 && p < param.mail_max_level; param.mail_max_level_count = param.mail_max_level_count + 1; END;
Expand Down

0 comments on commit 7605fd0

Please sign in to comment.