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.
273 lines
7.0 KiB
273 lines
7.0 KiB
<?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.
|
|
**/
|
|
|
|
|
|
final class CSlaHelper {
|
|
|
|
public const SLA_STATUS_ANY = -1;
|
|
public const SLA_STATUS_ENABLED = ZBX_SLA_STATUS_ENABLED;
|
|
public const SLA_STATUS_DISABLED = ZBX_SLA_STATUS_DISABLED;
|
|
|
|
public const SCHEDULE_MODE_24X7 = 0;
|
|
public const SCHEDULE_MODE_CUSTOM = 1;
|
|
|
|
/**
|
|
* @return array
|
|
*/
|
|
public static function getPeriodNames(): array {
|
|
static $period_names;
|
|
|
|
if ($period_names === null) {
|
|
$period_names = [
|
|
ZBX_SLA_PERIOD_DAILY => _('Daily'),
|
|
ZBX_SLA_PERIOD_WEEKLY => _('Weekly'),
|
|
ZBX_SLA_PERIOD_MONTHLY => _('Monthly'),
|
|
ZBX_SLA_PERIOD_QUARTERLY => _('Quarterly'),
|
|
ZBX_SLA_PERIOD_ANNUALLY => _('Annually')
|
|
];
|
|
}
|
|
|
|
return $period_names;
|
|
}
|
|
|
|
/**
|
|
* @param bool $compact
|
|
*
|
|
* @return array
|
|
*/
|
|
public static function getReportNames(bool $compact = false): array {
|
|
static $report_names;
|
|
|
|
if ($report_names === null) {
|
|
$report_names = [
|
|
'default' => [
|
|
ZBX_SLA_PERIOD_DAILY => _('Day'),
|
|
ZBX_SLA_PERIOD_WEEKLY => _('Week'),
|
|
ZBX_SLA_PERIOD_MONTHLY => _('Month'),
|
|
ZBX_SLA_PERIOD_QUARTERLY => _('Quarter'),
|
|
ZBX_SLA_PERIOD_ANNUALLY => _('Year')
|
|
],
|
|
'compact' => [
|
|
ZBX_SLA_PERIOD_DAILY => _x('Day', 'compact table header'),
|
|
ZBX_SLA_PERIOD_WEEKLY => _x('Week', 'compact table header'),
|
|
ZBX_SLA_PERIOD_MONTHLY => _x('Month', 'compact table header'),
|
|
ZBX_SLA_PERIOD_QUARTERLY => _x('Quarter', 'compact table header'),
|
|
ZBX_SLA_PERIOD_ANNUALLY => _x('Year', 'compact table header')
|
|
]
|
|
];
|
|
}
|
|
|
|
return $report_names[$compact ? 'compact' : 'default'];
|
|
}
|
|
|
|
/**
|
|
* @param array $schedule
|
|
*
|
|
* @throws Exception
|
|
* @return array
|
|
*/
|
|
public static function getSchedulePeriods(array $schedule): array {
|
|
$schedule_periods = array_fill(0, 7, '');
|
|
|
|
for ($weekday = 0; $weekday < 7; $weekday++) {
|
|
foreach ($schedule as $schedule_row) {
|
|
$period_from = max(SEC_PER_DAY * $weekday, $schedule_row['period_from']);
|
|
$period_to = min(SEC_PER_DAY * ($weekday + 1), $schedule_row['period_to']);
|
|
|
|
if ($period_to <= $period_from) {
|
|
continue;
|
|
}
|
|
|
|
$period_from_str = (new DateTime('@'.($period_from - SEC_PER_DAY * $weekday)))->format('H:i');
|
|
$period_to_str = (new DateTime('@'.($period_to - SEC_PER_DAY * $weekday)))->format('H:i');
|
|
|
|
if ($period_to_str === '00:00') {
|
|
$period_to_str = '24:00';
|
|
}
|
|
|
|
if ($schedule_periods[$weekday] !== '') {
|
|
$schedule_periods[$weekday] .= ', ';
|
|
}
|
|
|
|
$schedule_periods[$weekday] .= $period_from_str.'-'.$period_to_str;
|
|
}
|
|
}
|
|
|
|
return $schedule_periods;
|
|
}
|
|
|
|
/**
|
|
* @param int $period
|
|
* @param int $period_from
|
|
* @param int $period_to
|
|
* @param string $timezone
|
|
*
|
|
* @return CTag
|
|
*/
|
|
public static function getPeriodTag(int $period, int $period_from, int $period_to, string $timezone): CTag {
|
|
$tag = new CSpan();
|
|
|
|
try {
|
|
$datetime_from = (new DateTime('@'.$period_from))
|
|
->setTimezone(new DateTimeZone($timezone !== ZBX_DEFAULT_TIMEZONE
|
|
? $timezone
|
|
: CTimezoneHelper::getSystemTimezone()
|
|
));
|
|
|
|
$datetime_to = (new DateTime('@'.($period_to - 1)))
|
|
->setTimezone(new DateTimeZone($timezone !== ZBX_DEFAULT_TIMEZONE
|
|
? $timezone
|
|
: CTimezoneHelper::getSystemTimezone()
|
|
));
|
|
}
|
|
catch (Exception $e) {
|
|
return $tag;
|
|
}
|
|
|
|
switch ($period) {
|
|
case ZBX_SLA_PERIOD_DAILY:
|
|
$tag->addItem($datetime_from->format(ZBX_SLA_PERIOD_DATE_FORMAT_DAILY));
|
|
break;
|
|
|
|
case ZBX_SLA_PERIOD_WEEKLY:
|
|
$tag->addItem([
|
|
$datetime_from->format(ZBX_SLA_PERIOD_DATE_FORMAT_WEEKLY_FROM),
|
|
[' ', NDASH(), ' '],
|
|
$datetime_to->format(ZBX_SLA_PERIOD_DATE_FORMAT_WEEKLY_TO)
|
|
]);
|
|
break;
|
|
|
|
case ZBX_SLA_PERIOD_MONTHLY:
|
|
$tag->addItem($datetime_from->format(ZBX_SLA_PERIOD_DATE_FORMAT_MONTHLY));
|
|
break;
|
|
|
|
case ZBX_SLA_PERIOD_QUARTERLY:
|
|
$tag->addItem([
|
|
$datetime_from->format(ZBX_SLA_PERIOD_DATE_FORMAT_QUARTERLY_FROM),
|
|
[' ', NDASH(), ' '],
|
|
$datetime_to->format(ZBX_SLA_PERIOD_DATE_FORMAT_QUARTERLY_TO)
|
|
]);
|
|
break;
|
|
|
|
case ZBX_SLA_PERIOD_ANNUALLY:
|
|
$tag->addItem($datetime_from->format(ZBX_SLA_PERIOD_DATE_FORMAT_ANNUALLY));
|
|
break;
|
|
}
|
|
|
|
return $tag;
|
|
}
|
|
|
|
/**
|
|
* @param float $slo
|
|
*
|
|
* @return CTag
|
|
*/
|
|
public static function getSloTag(float $slo): CTag {
|
|
return new CSpan([round($slo, 4), '%']);
|
|
}
|
|
|
|
/**
|
|
* @param float $sli
|
|
* @param float $slo
|
|
*
|
|
* @return CTag
|
|
*/
|
|
public static function getSliTag(float $sli, float $slo): CTag {
|
|
if ($sli == -1) {
|
|
return (new CSpan(_('N/A')))->addClass(ZBX_STYLE_GREY);
|
|
}
|
|
|
|
return (new CSpan(floor($sli * 10000) / 10000))->addClass($sli >= $slo ? ZBX_STYLE_GREEN : ZBX_STYLE_RED);
|
|
}
|
|
|
|
/**
|
|
* @param int $uptime
|
|
*
|
|
* @return CTag
|
|
*/
|
|
public static function getUptimeTag(int $uptime): CTag {
|
|
return (new CSpan(convertUnitsS($uptime, true)))->addClass($uptime == 0 ? ZBX_STYLE_GREY : null);
|
|
}
|
|
|
|
/**
|
|
* @param int $downtime
|
|
*
|
|
* @return CTag
|
|
*/
|
|
public static function getDowntimeTag(int $downtime): CTag {
|
|
return (new CSpan(convertUnitsS($downtime, true)))->addClass($downtime == 0 ? ZBX_STYLE_GREY : null);
|
|
}
|
|
|
|
/**
|
|
* @param int $error_budget
|
|
*
|
|
* @return CTag
|
|
*/
|
|
public static function getErrorBudgetTag(int $error_budget): CTag {
|
|
return (new CSpan(convertUnitsS($error_budget, true)))
|
|
->addClass($error_budget >= 0 ? ZBX_STYLE_GREY : ZBX_STYLE_RED);
|
|
}
|
|
|
|
/**
|
|
* @param array $excluded_downtime
|
|
*
|
|
* @throws Exception
|
|
*
|
|
* @return CTag
|
|
*/
|
|
public static function getExcludedDowntimeTag(array $excluded_downtime): CTag {
|
|
return new CDiv([
|
|
zbx_date2str(DATE_TIME_FORMAT, $excluded_downtime['period_from']),
|
|
' ',
|
|
$excluded_downtime['name'],
|
|
': ',
|
|
convertUnitsS($excluded_downtime['period_to'] - $excluded_downtime['period_from'])
|
|
]);
|
|
}
|
|
|
|
/**
|
|
* @param array $schedule
|
|
*
|
|
* @throws Exception
|
|
*
|
|
* @return array
|
|
*/
|
|
public static function getScheduleCaption(array $schedule): array {
|
|
if (!$schedule) {
|
|
return [new CSpan(_('24x7'))];
|
|
}
|
|
|
|
$hint = (new CTableInfo())->setHeader(
|
|
(new CColHeader(_('Custom schedule')))->setColSpan(2)
|
|
);
|
|
|
|
foreach (self::getSchedulePeriods($schedule) as $weekday => $periods) {
|
|
$hint->addRow([getDayOfWeekCaption($weekday), $periods === '' ? '-' : $periods]);
|
|
}
|
|
|
|
return [
|
|
new CSpan(_('Custom')),
|
|
(new CButtonIcon(ZBX_ICON_ALERT_WITH_CONTENT))
|
|
->setAttribute('data-content', '?')
|
|
->setHint($hint)
|
|
];
|
|
}
|
|
}
|