Skip to content

Commit 580b60d

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

File tree

3 files changed

+37
-7
lines changed

3 files changed

+37
-7
lines changed

library/Icingadb/ProvidedHook/Reporting/HostSlaReport.php

+2-1
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

+2-1
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

+33-5
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,25 @@ 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('(%s) < %F',
83+
[$sla->getColumns()['sla']->getStatement(), $threshold]));
84+
//$sla->filter(Filter::lessThan('sla', $threshold));
85+
//$sla->getSelectBase()->where(['sla < ?' => $threshold]) requires to wrap Model again and
86+
// order by sla after
87+
}
88+
89+
foreach ($sla as $row) {
90+
yield $row;
91+
}
92+
};
93+
7294
if (isset($config['breakdown']) && $config['breakdown'] !== 'none') {
7395
switch ($config['breakdown']) {
7496
case 'day':
@@ -96,7 +118,7 @@ protected function fetchReportData(Timerange $timerange, array $config = null)
96118
$rd->setDimensions($dimensions);
97119

98120
foreach ($this->yieldTimerange($timerange, $interval, $boundary) as list($start, $end)) {
99-
foreach ($this->fetchSla(new Timerange($start, $end), $filter) as $row) {
121+
foreach ($yieldSla(new Timerange($start, $end), $filter) as $row) {
100122
$row = $this->createReportRow($row);
101123

102124
if ($row === null) {
@@ -111,7 +133,7 @@ protected function fetchReportData(Timerange $timerange, array $config = null)
111133
}
112134
}
113135
} else {
114-
foreach ($this->fetchSla($timerange, $filter) as $row) {
136+
foreach ($yieldSla($timerange, $filter) as $row) {
115137
$rows[] = $this->createReportRow($row);
116138
}
117139
}
@@ -129,7 +151,7 @@ protected function fetchReportData(Timerange $timerange, array $config = null)
129151
* @param string|null $boundary English text datetime description for calculating bounds to get
130152
* calendar days, weeks or months instead of relative times according to interval
131153
*
132-
* @return \Generator
154+
* @return Generator
133155
*/
134156
protected function yieldTimerange(Timerange $timerange, DateInterval $interval, $boundary = null)
135157
{
@@ -188,6 +210,12 @@ public function initConfigForm(Form $form)
188210
'min' => '1',
189211
'max' => '12'
190212
]);
213+
214+
$form->addElement('checkbox', 'only-violation', [
215+
'label' => t('Show only critical SLA'),
216+
'checkedValue' => '1',
217+
'uncheckedValue' => '0'
218+
]);
191219
}
192220

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

0 commit comments

Comments
 (0)