Skip to content

Commit 14853cb

Browse files
committed
SlaReport: Add checkbox to optionally show critical SLA of hosts/services reports
1 parent 5948e9f commit 14853cb

File tree

3 files changed

+39
-7
lines changed

3 files changed

+39
-7
lines changed

library/Icingadb/ProvidedHook/Reporting/HostSlaReport.php

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
use Icinga\Module\Reporting\ReportData;
1010
use Icinga\Module\Reporting\ReportRow;
1111
use Icinga\Module\Reporting\Timerange;
12+
use ipl\Orm\Query;
1213
use ipl\Sql\Expression;
1314
use ipl\Stdlib\Filter\Rule;
1415

@@ -44,7 +45,7 @@ protected function createReportRow($row)
4445
->setValues([(float) $row->sla]);
4546
}
4647

47-
protected function fetchSla(Timerange $timerange, Rule $filter = null)
48+
protected function fetchSla(Timerange $timerange, Rule $filter = null): Query
4849
{
4950
$sla = Host::on($this->getDb())
5051
->columns([

library/Icingadb/ProvidedHook/Reporting/ServiceSlaReport.php

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
use Icinga\Module\Reporting\ReportData;
1010
use Icinga\Module\Reporting\ReportRow;
1111
use Icinga\Module\Reporting\Timerange;
12+
use ipl\Orm\Query;
1213
use ipl\Sql\Expression;
1314
use ipl\Stdlib\Filter\Rule;
1415

@@ -44,7 +45,7 @@ protected function createReportRow($row)
4445
->setValues([(float) $row->sla]);
4546
}
4647

47-
protected function fetchSla(Timerange $timerange, Rule $filter = null)
48+
protected function fetchSla(Timerange $timerange, Rule $filter = null): Query
4849
{
4950
$sla = Service::on($this->getDb())
5051
->columns([

library/Icingadb/ProvidedHook/Reporting/SlaReport.php

Lines changed: 35 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66

77
use DateInterval;
88
use DatePeriod;
9+
use Generator;
910
use Icinga\Module\Icingadb\Common\Auth;
1011
use Icinga\Module\Icingadb\Common\Database;
1112
use Icinga\Module\Icingadb\Widget\EmptyState;
@@ -15,6 +16,8 @@
1516
use Icinga\Module\Reporting\Timerange;
1617
use ipl\Html\Form;
1718
use ipl\Html\Html;
19+
use ipl\Orm\Query;
20+
use ipl\Sql\Expression;
1821
use ipl\Stdlib\Filter\Rule;
1922
use ipl\Web\Filter\QueryString;
2023

@@ -57,9 +60,9 @@ abstract protected function createReportRow($row);
5760
* @param Timerange $timerange
5861
* @param Rule|null $filter
5962
*
60-
* @return iterable
63+
* @return Query
6164
*/
62-
abstract protected function fetchSla(Timerange $timerange, Rule $filter = null);
65+
abstract protected function fetchSla(Timerange $timerange, Rule $filter = null): Query;
6366

6467
protected function fetchReportData(Timerange $timerange, array $config = null)
6568
{
@@ -69,6 +72,27 @@ protected function fetchReportData(Timerange $timerange, array $config = null)
6972
$filter = trim((string) $config['filter']) ?: '*';
7073
$filter = $filter !== '*' ? QueryString::parse($filter) : null;
7174

75+
$yieldSla = function (Timerange $timerange, Rule $filter = null) use ($config): Generator {
76+
$sla = $this->fetchSla($timerange, $filter);
77+
78+
if ($config['only-violation'] === '1') {
79+
$threshold = $config['threshold'] ?? static::DEFAULT_THRESHOLD;
80+
81+
$sla->assembleSelect();
82+
$sla->getSelectBase()->where(new Expression(
83+
'(%s) < %F',
84+
[$sla->getColumns()['sla']->getStatement(), $threshold]
85+
));
86+
//$sla->filter(Filter::lessThan('sla', $threshold));
87+
//$sla->getSelectBase()->where(['sla < ?' => $threshold]) requires to wrap Model again and
88+
// order by sla after
89+
}
90+
91+
foreach ($sla as $row) {
92+
yield $row;
93+
}
94+
};
95+
7296
if (isset($config['breakdown']) && $config['breakdown'] !== 'none') {
7397
switch ($config['breakdown']) {
7498
case 'day':
@@ -96,7 +120,7 @@ protected function fetchReportData(Timerange $timerange, array $config = null)
96120
$rd->setDimensions($dimensions);
97121

98122
foreach ($this->yieldTimerange($timerange, $interval, $boundary) as list($start, $end)) {
99-
foreach ($this->fetchSla(new Timerange($start, $end), $filter) as $row) {
123+
foreach ($yieldSla(new Timerange($start, $end), $filter) as $row) {
100124
$row = $this->createReportRow($row);
101125

102126
if ($row === null) {
@@ -111,7 +135,7 @@ protected function fetchReportData(Timerange $timerange, array $config = null)
111135
}
112136
}
113137
} else {
114-
foreach ($this->fetchSla($timerange, $filter) as $row) {
138+
foreach ($yieldSla($timerange, $filter) as $row) {
115139
$rows[] = $this->createReportRow($row);
116140
}
117141
}
@@ -129,7 +153,7 @@ protected function fetchReportData(Timerange $timerange, array $config = null)
129153
* @param string|null $boundary English text datetime description for calculating bounds to get
130154
* calendar days, weeks or months instead of relative times according to interval
131155
*
132-
* @return \Generator
156+
* @return Generator
133157
*/
134158
protected function yieldTimerange(Timerange $timerange, DateInterval $interval, $boundary = null)
135159
{
@@ -188,6 +212,12 @@ public function initConfigForm(Form $form)
188212
'min' => '1',
189213
'max' => '12'
190214
]);
215+
216+
$form->addElement('checkbox', 'only-violation', [
217+
'label' => t('Show only critical SLA'),
218+
'checkedValue' => '1',
219+
'uncheckedValue' => '0'
220+
]);
191221
}
192222

193223
public function getData(Timerange $timerange, array $config = null)

0 commit comments

Comments
 (0)