コード例 #1
0
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;
}
コード例 #2
0
 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');
コード例 #3
0
/**
 * 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));
}