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.
zabbix/ui/app/partials/monitoring.latest.view.html...

322 lines
10 KiB

1 year ago
<?php
/*
** 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.
**/
/**
* @var CPartial $this
* @var array $data
*/
$form = (new CForm('GET', 'history.php'))
->setName('items')
->addItem(new CVar('action', HISTORY_BATCH_GRAPH));
$table = (new CTableInfo())->addClass(ZBX_STYLE_OVERFLOW_ELLIPSIS);
// Latest data header.
$col_check_all = new CColHeader(
(new CCheckBox('all_items'))->onClick("checkAll('".$form->getName()."', 'all_items', 'itemids');")
);
$view_url = $data['view_curl']->getUrl();
$col_host = make_sorting_header(_('Host'), 'host', $data['sort_field'], $data['sort_order'], $view_url);
$col_name = make_sorting_header(_('Name'), 'name', $data['sort_field'], $data['sort_order'], $view_url);
$simple_interval_parser = new CSimpleIntervalParser();
$update_interval_parser = new CUpdateIntervalParser(['usermacros' => true]);
if ($data['filter']['show_tags'] == SHOW_TAGS_NONE) {
$tags_header = null;
}
else {
$tags_header = new CColHeader(_('Tags'));
switch ($data['filter']['show_tags']) {
case SHOW_TAGS_1:
$tags_header->addClass(ZBX_STYLE_COLUMN_TAGS_1);
break;
case SHOW_TAGS_2:
$tags_header->addClass(ZBX_STYLE_COLUMN_TAGS_2);
break;
case SHOW_TAGS_3:
$tags_header->addClass(ZBX_STYLE_COLUMN_TAGS_3);
break;
}
}
if ($data['filter']['show_details']) {
$table->setHeader([
$col_check_all->addStyle('width: 16px;'),
$col_host->addStyle('width: 13%'),
$col_name->addStyle('width: 21%'),
(new CColHeader(_('Interval')))->addStyle('width: 5%'),
(new CColHeader(_('History')))->addStyle('width: 5%'),
(new CColHeader(_('Trends')))->addStyle('width: 5%'),
(new CColHeader(_('Type')))->addStyle('width: 8%'),
(new CColHeader(_('Last check')))->addStyle('width: 14%'),
(new CColHeader(_('Last value')))->addStyle('width: 14%'),
(new CColHeader(_x('Change', 'noun')))->addStyle('width: 10%'),
$tags_header,
(new CColHeader())->addStyle('width: 6%'),
(new CColHeader(_('Info')))->addStyle('width: 35px')
]);
}
else {
$table->setHeader([
$col_check_all->addStyle('width: 16px'),
$col_host->addStyle('width: 17%'),
$col_name->addStyle('width: 40%'),
(new CColHeader(_('Last check')))->addStyle('width: 14%'),
(new CColHeader(_('Last value')))->addStyle('width: 14%'),
(new CColHeader(_x('Change', 'noun')))->addStyle('width: 10%'),
$tags_header,
(new CColHeader())->addStyle('width: 6%'),
(new CColHeader(_('Info')))->addStyle('width: 35px')
]);
}
// Latest data rows.
foreach ($data['items'] as $itemid => $item) {
$host = $data['hosts'][$item['hostid']];
$data_actions = [];
$is_graph = ($item['value_type'] == ITEM_VALUE_TYPE_FLOAT || $item['value_type'] == ITEM_VALUE_TYPE_UINT64);
if ($is_graph) {
$data_actions['graph'] = true;
}
if (in_array($item['type'], checkNowAllowedTypes())
&& $item['status'] == ITEM_STATUS_ACTIVE && $host['status'] == HOST_STATUS_MONITORED
&& array_key_exists($itemid, $data['items_rw'])) {
$data_actions['execute'] = true;
}
$checkbox = new CCheckBox('itemids['.$itemid.']', $itemid);
if ($data_actions) {
$checkbox->setAttribute('data-actions', implode(' ', array_keys($data_actions)));
}
$state_css = ($item['state'] == ITEM_STATE_NOTSUPPORTED) ? ZBX_STYLE_GREY : null;
$item_name = (new CDiv([
(new CLinkAction($item['name']))
->setMenuPopup(
CMenuPopupHelper::getItem([
'itemid' => $itemid,
'context' => 'host',
'backurl' => (new CUrl('zabbix.php'))
->setArgument('action', 'latest.view')
->setArgument('context','host')
->getUrl()
])
),
($item['description_expanded'] !== '') ? makeDescriptionIcon($item['description_expanded']) : null
]))->addClass(ZBX_STYLE_ACTION_CONTAINER);
// Row history data preparation.
$last_history = array_key_exists($itemid, $data['history'])
? ((count($data['history'][$itemid]) > 0) ? $data['history'][$itemid][0] : null)
: null;
if ($last_history) {
$prev_history = (count($data['history'][$itemid]) > 1) ? $data['history'][$itemid][1] : null;
$last_check = (new CSpan(zbx_date2age($last_history['clock'])))
->addClass(ZBX_STYLE_CURSOR_POINTER)
->setHint(zbx_date2str(DATE_TIME_FORMAT_SECONDS, $last_history['clock']), '', true, '', 0);
if ($item['value_type'] == ITEM_VALUE_TYPE_BINARY) {
$last_value = italic(_('binary value'))->addClass(ZBX_STYLE_GREY);
}
else {
$last_value = (new CSpan(formatHistoryValue($last_history['value'], $item, false)))
->addClass(ZBX_STYLE_CURSOR_POINTER)
->setHint(
(new CDiv(mb_substr($last_history['value'], 0, ZBX_HINTBOX_CONTENT_LIMIT)))
->addClass(ZBX_STYLE_HINTBOX_WRAP),
'', true, '', 0
);
}
$change = '';
if ($prev_history && in_array($item['value_type'], [ITEM_VALUE_TYPE_FLOAT, ITEM_VALUE_TYPE_UINT64])) {
$history_diff = $last_history['value'] - $prev_history['value'];
if ($history_diff != 0) {
if ($history_diff > 0) {
$change = '+';
}
// The change must be calculated as uptime for the 'unixtime'.
$change .= convertUnits([
'value' => $history_diff,
'units' => ($item['units'] === 'unixtime') ? 'uptime' : $item['units']
]);
}
}
}
else {
$last_check = '';
$last_value = '';
$change = '';
}
// Other row data preparation.
if ($data['config']['hk_history_global']) {
$keep_history = timeUnitToSeconds($data['config']['hk_history']);
$item_history = $data['config']['hk_history'];
}
elseif ($simple_interval_parser->parse($item['history']) == CParser::PARSE_SUCCESS) {
$keep_history = timeUnitToSeconds($item['history']);
$item_history = $item['history'];
}
else {
$keep_history = 0;
$item_history = (new CSpan($item['history']))->addClass(ZBX_STYLE_RED);
}
if ($item['value_type'] == ITEM_VALUE_TYPE_FLOAT || $item['value_type'] == ITEM_VALUE_TYPE_UINT64) {
if ($data['config']['hk_trends_global']) {
$keep_trends = timeUnitToSeconds($data['config']['hk_trends']);
$item_trends = $data['config']['hk_trends'];
}
elseif ($simple_interval_parser->parse($item['trends']) == CParser::PARSE_SUCCESS) {
$keep_trends = timeUnitToSeconds($item['trends']);
$item_trends = $item['trends'];
}
else {
$keep_trends = 0;
$item_trends = (new CSpan($item['trends']))->addClass(ZBX_STYLE_RED);
}
}
else {
$keep_trends = 0;
$item_trends = '';
}
if ($keep_history != 0 || $keep_trends != 0) {
$actions = new CLink($is_graph ? _('Graph') : _('History'), (new CUrl('history.php'))
->setArgument('action', $is_graph ? HISTORY_GRAPH : HISTORY_VALUES)
->setArgument('itemids[]', $item['itemid'])
);
}
else {
$actions = '';
}
$maintenance_icon = '';
if ($host['status'] == HOST_STATUS_MONITORED && $host['maintenance_status'] == HOST_MAINTENANCE_STATUS_ON) {
if (array_key_exists($host['maintenanceid'], $data['maintenances'])) {
$maintenance = $data['maintenances'][$host['maintenanceid']];
$maintenance_icon = makeMaintenanceIcon($host['maintenance_type'], $maintenance['name'],
$maintenance['description']
);
}
else {
$maintenance_icon = makeMaintenanceIcon($host['maintenance_type'],
_('Inaccessible maintenance'), ''
);
}
}
$host_name_container = (new CDiv([
(new CLinkAction($host['name']))
->addClass($host['status'] == HOST_STATUS_NOT_MONITORED ? ZBX_STYLE_RED : null)
->setMenuPopup(CMenuPopupHelper::getHost($item['hostid'])),
$maintenance_icon
]))->addClass(ZBX_STYLE_ACTION_CONTAINER);
$item_icons = [];
if ($item['status'] == ITEM_STATUS_ACTIVE && $item['error'] !== '') {
$item_icons[] = makeErrorIcon($item['error']);
}
if ($data['filter']['show_details']) {
$item_key = (new CSpan($item['key_expanded']))->addClass(ZBX_STYLE_GREEN);
if (in_array($item['type'], [ITEM_TYPE_SNMPTRAP, ITEM_TYPE_TRAPPER, ITEM_TYPE_DEPENDENT])
|| ($item['type'] == ITEM_TYPE_ZABBIX_ACTIVE && strncmp($item['key_expanded'], 'mqtt.get', 8) === 0)) {
$item_delay = '';
}
elseif ($update_interval_parser->parse($item['delay']) == CParser::PARSE_SUCCESS) {
$item_delay = $update_interval_parser->getDelay();
if ($item_delay[0] === '{') {
$item_delay = (new CSpan($item_delay))->addClass(ZBX_STYLE_RED);
}
}
else {
$item_delay = (new CSpan($item['delay']))->addClass(ZBX_STYLE_RED);
}
$table_row = new CRow([
$checkbox,
$host_name_container,
(new CCol([$item_name, $item_key]))->addClass($state_css),
(new CCol($item_delay))->addClass($state_css),
(new CCol($item_history))->addClass($state_css),
(new CCol($item_trends))->addClass($state_css),
(new CCol(item_type2str($item['type'])))->addClass($state_css),
(new CCol($last_check))->addClass($state_css),
(new CCol($last_value))->addClass($state_css),
(new CCol($change))->addClass($state_css),
($data['filter']['show_tags'] != SHOW_TAGS_NONE) ? $data['tags'][$itemid] : null,
$actions,
makeInformationList($item_icons)
]);
}
else {
$table_row = new CRow([
$checkbox,
$host_name_container,
(new CCol($item_name))->addClass($state_css),
(new CCol($last_check))->addClass($state_css),
(new CCol($last_value))->addClass($state_css),
(new CCol($change))->addClass($state_css),
($data['filter']['show_tags'] != SHOW_TAGS_NONE) ? $data['tags'][$itemid] : null,
$actions,
makeInformationList($item_icons)
]);
}
$table->addRow($table_row);
}
$button_list = [
GRAPH_TYPE_STACKED => ['name' => _('Display stacked graph'), 'attributes' => ['data-required' => 'graph']],
GRAPH_TYPE_NORMAL => ['name' => _('Display graph'), 'attributes' => ['data-required' => 'graph']],
'item.masscheck_now' => [
'content' => (new CSimpleButton(_('Execute now')))
->onClick('view.massCheckNow(this);')
->addClass(ZBX_STYLE_BTN_ALT)
->addClass('js-no-chkbxrange')
->setAttribute('data-required', 'execute')
]
];
$form->addItem([$table, $data['paging'], new CActionButtonList('graphtype', 'itemids', $button_list, 'latest')]);
echo $form;