function getLastEvents($options) { if (!isset($options['limit'])) { $options['limit'] = 15; } $triggerOptions = array('filter' => array(), 'skipDependent' => 1, 'selectHosts' => array('hostid', 'host'), 'output' => API_OUTPUT_EXTEND, 'sortfield' => 'lastchange', 'sortorder' => ZBX_SORT_DOWN, 'limit' => $options['triggerLimit']); $eventOptions = array('output' => API_OUTPUT_EXTEND, 'filter' => array('object' => EVENT_OBJECT_TRIGGER, 'value_changed' => TRIGGER_VALUE_CHANGED_YES), 'sortfield' => 'eventid', 'sortorder' => ZBX_SORT_DOWN); if (isset($options['eventLimit'])) { $eventOptions['limit'] = $options['eventLimit']; } if (isset($options['nodeids'])) { $triggerOptions['nodeids'] = $options['nodeids']; } if (isset($options['priority'])) { $triggerOptions['filter']['priority'] = $options['priority']; } if (isset($options['monitored'])) { $triggerOptions['monitored'] = $options['monitored']; } if (isset($options['lastChangeSince'])) { $triggerOptions['lastChangeSince'] = $options['lastChangeSince']; $eventOptions['time_from'] = $options['lastChangeSince']; } if (isset($options['value'])) { $triggerOptions['filter']['value'] = $options['value']; $eventOptions['value'] = $options['value']; } // triggers $triggers = API::Trigger()->get($triggerOptions); $triggers = zbx_toHash($triggers, 'triggerid'); // events $eventOptions['triggerids'] = zbx_objectValues($triggers, 'triggerid'); $events = API::Event()->get($eventOptions); $sortClock = array(); $sortEvent = array(); foreach ($events as $enum => $event) { if (!isset($triggers[$event['objectid']])) { continue; } $events[$enum]['trigger'] = $triggers[$event['objectid']]; $events[$enum]['host'] = reset($events[$enum]['trigger']['hosts']); $sortClock[$enum] = $event['clock']; $sortEvent[$enum] = $event['eventid']; //expanding description for the state where event was $merged_event = array_merge($event, $triggers[$event['objectid']]); $events[$enum]['trigger']['description'] = CEventHelper::expandDescription($merged_event); } array_multisort($sortClock, SORT_DESC, $sortEvent, SORT_DESC, $events); return $events; }
foreach ($events as $enum => $event) { $trigger = $triggers[$event['objectid']]; $host = reset($trigger['hosts']); $host = $hosts[$host['hostid']]; $items = array(); foreach ($trigger['items'] as $item) { $i = array(); $i['itemid'] = $item['itemid']; $i['value_type'] = $item['value_type']; // ZBX-3059: So it would be possible to show different caption for history for chars and numbers (KB) $i['action'] = str_in_array($item['value_type'], array(ITEM_VALUE_TYPE_FLOAT, ITEM_VALUE_TYPE_UINT64)) ? 'showgraph' : 'showvalues'; $i['name'] = itemName($item); $items[] = $i; } $ack = getEventAckState($event, true); $description = CEventHelper::expandDescription(zbx_array_merge($trigger, array('clock' => $event['clock'], 'ns' => $event['ns']))); $tr_desc = new CSpan($description, 'pointer'); $tr_desc->addAction('onclick', "create_mon_trigger_menu(event, " . " [{'triggerid': '" . $trigger['triggerid'] . "', 'lastchange': '" . $event['clock'] . "'}]," . zbx_jsvalue($items, true) . ");"); // duration if ($nextEvent = get_next_event($event, $events, $_REQUEST['showUnknown'])) { $event['duration'] = zbx_date2age($event['clock'], $nextEvent['clock']); } else { $event['duration'] = zbx_date2age($event['clock']); } $statusSpan = new CSpan(trigger_value2str($event['value'])); // add colors and blinking to span depending on configuration and trigger parameters addTriggerValueStyle($statusSpan, $event['value'], $event['clock'], $event['acknowledged']); // host JS menu link $hostSpan = null; if ($_REQUEST['hostid'] == 0) { $hostSpan = new CSpan($host['name'], 'link_menu menu-host');
/** * Create and return a DIV with latest problem triggers. * * @param array $filter * * @return CDiv */ function make_latest_issues(array $filter = array()) { if (!isset($filter['sortfield'])) { $filter['sortfield'] = 'lastchange'; } if (!isset($filter['sortorder'])) { $filter['sortorder'] = ZBX_SORT_DOWN; } // get triggers $options = array('groupids' => $filter['groupids'], 'hostids' => isset($filter['hostids']) ? $filter['hostids'] : null, 'monitored' => true, 'maintenance' => $filter['maintenance'], 'withLastEventUnacknowledged' => !empty($filter['extAck']) && $filter['extAck'] == EXTACK_OPTION_UNACK ? true : null, 'skipDependent' => true, 'filter' => array('priority' => $filter['severity'], 'value' => TRIGGER_VALUE_TRUE), 'selectHosts' => array('hostid', 'name'), 'output' => array('triggerid', 'value_flags', 'error', 'url', 'expression', 'description', 'priority', 'type'), 'sortfield' => $filter['sortfield'], 'sortorder' => $filter['sortorder'], 'limit' => isset($filter['limit']) ? $filter['limit'] : DEFAULT_LATEST_ISSUES_CNT); $triggers = API::Trigger()->get($options); // total trigger count $options['countOutput'] = true; // we unset withLastEventUnacknowledged and skipDependent because of performance issues unset($options['limit'], $options['withLastEventUnacknowledged'], $options['skipDependent']); $triggersTotalCount = API::Trigger()->get($options); // get events $events = API::Trigger()->get(array('triggerids' => zbx_objectValues($triggers, 'triggerid'), 'selectLastEvent' => API_OUTPUT_EXTEND, 'preservekeys' => true)); // get acknowledges $eventIds = array(); foreach ($events as $event) { if ($event['lastEvent']) { $eventIds[$event['lastEvent']['eventid']] = $event['lastEvent']['eventid']; } } if ($eventIds) { $eventAcknowledges = API::Event()->get(array('eventids' => $eventIds, 'select_acknowledges' => API_OUTPUT_EXTEND, 'preservekeys' => true)); } foreach ($triggers as $tnum => $trigger) { // if trigger is lost (broken expression) we skip it if (empty($trigger['hosts'])) { unset($triggers[$tnum]); continue; } $host = reset($trigger['hosts']); $trigger['hostid'] = $host['hostid']; $trigger['hostname'] = $host['name']; // set events if (isset($events[$trigger['triggerid']])) { $trigger['event'] = $events[$trigger['triggerid']]['lastEvent']; } if (!empty($trigger['event'])) { $trigger['event']['acknowledges'] = isset($eventAcknowledges[$trigger['event']['eventid']]) ? $eventAcknowledges[$trigger['event']['eventid']]['acknowledges'] : null; } $triggers[$tnum] = $trigger; } $hostIds = zbx_objectValues($triggers, 'hostid'); // get hosts $hosts = API::Host()->get(array('hostids' => $hostIds, 'output' => array('hostid', 'name', 'maintenance_status', 'maintenance_type', 'maintenanceid'), 'selectInventory' => array('hostid'), 'selectScreens' => API_OUTPUT_COUNT, 'preservekeys' => true)); // get scripts $scripts_by_hosts = API::Script()->getScriptsByHosts($hostIds); // actions $actions = getEventActionsStatHints($eventIds); // ack params $ackParams = isset($filter['screenid']) ? array('screenid' => $filter['screenid']) : array(); $config = select_config(); // indicator of sort field $sortDiv = new CDiv(SPACE, $filter['sortorder'] === ZBX_SORT_DOWN ? 'icon_sortdown default_cursor' : 'icon_sortup default_cursor'); $sortDiv->addStyle('float: left'); $hostHeaderDiv = new CDiv(array(_('Host'), SPACE)); $hostHeaderDiv->addStyle('float: left'); $issueHeaderDiv = new CDiv(array(_('Issue'), SPACE)); $issueHeaderDiv->addStyle('float: left'); $lastChangeHeaderDiv = new CDiv(array(_('Last change'), SPACE)); $lastChangeHeaderDiv->addStyle('float: left'); $table = new CTableInfo(); $table->setHeader(array(is_show_all_nodes() ? _('Node') : null, $filter['sortfield'] === 'hostname' ? array($hostHeaderDiv, $sortDiv) : _('Host'), $filter['sortfield'] === 'priority' ? array($issueHeaderDiv, $sortDiv) : _('Issue'), $filter['sortfield'] === 'lastchange' ? array($lastChangeHeaderDiv, $sortDiv) : _('Last change'), _('Age'), _('Info'), $config['event_ack_enable'] ? _('Ack') : null, _('Actions'))); // triggers foreach ($triggers as $trigger) { // check for dependencies $host = $hosts[$trigger['hostid']]; $hostSpan = new CDiv(null, 'maintenance-abs-cont'); $hostName = new CSpan($host['name'], 'link_menu menu-host'); $hostName->setAttribute('data-menu', hostMenuData($host, $scripts_by_hosts[$host['hostid']])); // add maintenance icon with hint if host is in maintenance if ($host['maintenance_status']) { $mntIco = new CDiv(null, 'icon-maintenance-abs'); // get maintenance $maintenances = API::Maintenance()->get(array('maintenanceids' => $host['maintenanceid'], 'output' => API_OUTPUT_EXTEND, 'limit' => 1)); if ($maintenance = reset($maintenances)) { $hint = $maintenance['name'] . ' [' . ($host['maintenance_type'] ? _('Maintenance without data collection') : _('Maintenance with data collection')) . ']'; if (isset($maintenance['description'])) { // double quotes mandatory $hint .= "\n" . $maintenance['description']; } $mntIco->setHint($hint); $mntIco->addClass('pointer'); } $hostName->addClass('left-to-icon-maintenance-abs'); $hostSpan->addItem($mntIco); } $hostSpan->addItem($hostName); // unknown triggers $unknown = SPACE; if ($trigger['value_flags'] == TRIGGER_VALUE_FLAG_UNKNOWN) { $unknown = new CDiv(SPACE, 'status_icon iconunknown'); $unknown->setHint($trigger['error'], '', 'on'); } if (!empty($trigger['event'])) { $ack = getEventAckState($trigger['event'], empty($filter['backUrl']) ? true : $filter['backUrl'], true, $ackParams); $clock = new CLink(zbx_date2str(_('d M Y H:i:s'), $trigger['event']['clock']), 'events.php?triggerid=' . $trigger['triggerid'] . '&source=0&show_unknown=1&nav_time=' . $trigger['event']['clock']); $description = CEventHelper::expandDescription(zbx_array_merge($trigger, array('clock' => $trigger['event']['clock'], 'ns' => $trigger['event']['ns']))); $description = $trigger['url'] ? new CLink($description, resolveTriggerUrl($trigger), null, null, true) : new CSpan($description, 'pointer'); $description = new CCol($description, getSeverityStyle($trigger['priority'])); $description->setHint(make_popup_eventlist($trigger['triggerid'], $trigger['event']['eventid']), '', '', false); $table->addRow(array(get_node_name_by_elid($trigger['triggerid']), $hostSpan, $description, $clock, zbx_date2age($trigger['event']['clock']), $unknown, $ack, isset($actions[$trigger['event']['eventid']]) ? $actions[$trigger['event']['eventid']] : SPACE)); } } // initialize blinking zbx_add_post_js('jqBlink.blink();'); $script = new CJSScript(get_js("jQuery('#hat_lastiss_footer').html('" . _s('Updated: %s', zbx_date2str(_('H:i:s'))) . "')")); $infoDiv = new CDiv(_n('%2$d of %1$d issue is shown', '%2$d of %1$d issues are shown', $triggersTotalCount, count($triggers))); $infoDiv->addStyle('text-align: right; padding-right: 3px;'); return new CDiv(array($table, $infoDiv, $script)); }