You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

136 lines
4.1 KiB

1 year ago
<?php declare(strict_types = 0);
/*
** Zabbix
** Copyright (C) 2001-2023 Zabbix SIA
**
** This program is free software; you can redistribute it and/or modify
** it under the terms of the GNU General Public License as published by
** the Free Software Foundation; either version 2 of the License, or
** (at your option) any later version.
**
** This program is distributed in the hope that it will be useful,
** but WITHOUT ANY WARRANTY; without even the implied warranty of
** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
** GNU General Public License for more details.
**
** You should have received a copy of the GNU General Public License
** along with this program; if not, write to the Free Software
** Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
**/
/**
* SLA report widget view.
*
* @var CView $this
* @var array $data
*/
$report = (new CTableInfo())->addClass(ZBX_STYLE_LIST_TABLE_STICKY_HEADER);
if ($data['has_permissions_error']) {
$report->setNoDataMessage(_('No permissions to referred object or it does not exist!'));
}
elseif ($data['sla']['status'] != ZBX_SLA_STATUS_ENABLED) {
$report->setNoDataMessage(_('SLA is disabled.'));
}
elseif (!$data['has_serviceid']) {
$header = [
_x('Service', 'compact table header'),
_x('SLO', 'compact table header')
];
foreach ($data['sli']['periods'] as $period) {
$header[] = CSlaHelper::getPeriodTag((int) $data['sla']['period'], $period['period_from'], $period['period_to'],
$data['sla']['timezone']
)->addClass($data['sla']['period'] != ZBX_SLA_PERIOD_ANNUALLY ? 'date-vertical' : null);
}
$report->setHeader($header);
$service_index = array_flip($data['sli']['serviceids']);
$num_rows_displayed = 0;
foreach (array_intersect_key($data['services'], $service_index) as $serviceid => $service) {
$row = [
(new CCol($data['has_access'][CRoleHelper::ACTIONS_MANAGE_SLA]
? new CLink(
$service['name'],
(new CUrl('zabbix.php'))
->setArgument('action', 'slareport.list')
->setArgument('filter_slaid', $data['sla']['slaid'])
->setArgument('filter_serviceid', $serviceid)
->setArgument('filter_set', 1)
->getUrl()
)
: $service['name']
))->addClass(ZBX_STYLE_WORDBREAK),
CSlaHelper::getSloTag((float) $data['sla']['slo'])
];
foreach (array_keys($data['sli']['periods']) as $period_index) {
$row[] = CSlaHelper::getSliTag(
$data['sli']['sli'][$period_index][$service_index[$serviceid]]['sli'],
(float) $data['sla']['slo']
);
}
$report->addRow($row);
if (++$num_rows_displayed == $data['rows_per_page']) {
break;
}
}
$report->setFooter(
(new CCol(_s('Displaying %1$s of %2$s found', $num_rows_displayed,
count($data['services']) > $data['search_limit']
? $data['search_limit'].'+'
: count($data['services'])
)))
->setColSpan($report->getNumCols())
->addClass(ZBX_STYLE_LIST_TABLE_FOOTER)
);
}
else {
$report->setHeader([
CSlaHelper::getReportNames(true)[$data['sla']['period']],
_x('SLO', 'compact table header'),
_x('SLI', 'compact table header'),
_x('Uptime', 'compact table header'),
_x('Downtime', 'compact table header'),
_x('Error budget', 'compact table header'),
_x('Excluded downtimes', 'compact table header')
]);
if ($data['sli']['serviceids']) {
$service_index = 0;
foreach (array_reverse($data['sli']['periods'], true) as $period_index => $period) {
$sli = $data['sli']['sli'][$period_index][$service_index];
$excluded_downtime_tags = [];
foreach ($sli['excluded_downtimes'] as $excluded_downtime) {
$excluded_downtime_tags[] = CSlaHelper::getExcludedDowntimeTag($excluded_downtime);
}
$report->addRow([
CSlaHelper::getPeriodTag((int) $data['sla']['period'], $period['period_from'], $period['period_to'],
$data['sla']['timezone']
),
CSlaHelper::getSloTag((float) $data['sla']['slo']),
CSlaHelper::getSliTag($sli['sli'], (float) $data['sla']['slo']),
CSlaHelper::getUptimeTag($sli['uptime']),
CSlaHelper::getDowntimeTag($sli['downtime']),
CSlaHelper::getErrorBudgetTag($sli['error_budget']),
$excluded_downtime_tags
]);
}
}
}
(new CWidgetView($data))
->addItem($report)
->show();