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.
203 lines
6.5 KiB
203 lines
6.5 KiB
<?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.
|
|
**/
|
|
|
|
|
|
require_once dirname(__FILE__).'/include/config.inc.php';
|
|
require_once dirname(__FILE__).'/include/triggers.inc.php';
|
|
|
|
$page['title'] = _('100 busiest triggers');
|
|
$page['file'] = 'toptriggers.php';
|
|
$page['scripts'] = ['class.calendar.js', 'gtlc.js'];
|
|
|
|
require_once dirname(__FILE__).'/include/page_header.php';
|
|
|
|
// VAR TYPE OPTIONAL FLAGS VALIDATION EXCEPTION
|
|
$fields = [
|
|
'groupids' => [T_ZBX_INT, O_OPT, P_SYS|P_ONLY_ARRAY, DB_ID, null],
|
|
'hostids' => [T_ZBX_INT, O_OPT, P_SYS|P_ONLY_ARRAY, DB_ID, null],
|
|
'severities' => [T_ZBX_INT, O_OPT, P_SYS|P_ONLY_ARRAY, null, null],
|
|
'filter_rst' => [T_ZBX_STR, O_OPT, P_SYS, null, null],
|
|
'filter_set' => [T_ZBX_STR, O_OPT, P_SYS, null, null],
|
|
'from' => [T_ZBX_RANGE_TIME, O_OPT, P_SYS, null, null],
|
|
'to' => [T_ZBX_RANGE_TIME, O_OPT, P_SYS, null, null]
|
|
];
|
|
check_fields($fields);
|
|
|
|
if (hasRequest('from') || hasRequest('to')) {
|
|
validateTimeSelectorPeriod(
|
|
hasRequest('from') ? getRequest('from') : null,
|
|
hasRequest('to') ? getRequest('to') : null
|
|
);
|
|
}
|
|
|
|
$timeselector_from = getRequest('from', CProfile::get('web.toptriggers.filter.from',
|
|
'now-'.CSettingsHelper::get(CSettingsHelper::PERIOD_DEFAULT)));
|
|
$timeselector_to = getRequest('to', CProfile::get('web.toptriggers.filter.to', 'now'));
|
|
|
|
/*
|
|
* Filter
|
|
*/
|
|
if (hasRequest('filter_set')) {
|
|
CProfile::updateArray('web.toptriggers.filter.severities', getRequest('severities', []), PROFILE_TYPE_STR);
|
|
CProfile::updateArray('web.toptriggers.filter.groupids', getRequest('groupids', []), PROFILE_TYPE_STR);
|
|
CProfile::updateArray('web.toptriggers.filter.hostids', getRequest('hostids', []), PROFILE_TYPE_STR);
|
|
CProfile::update('web.toptriggers.filter.from', $timeselector_from, PROFILE_TYPE_STR);
|
|
CProfile::update('web.toptriggers.filter.to', $timeselector_to, PROFILE_TYPE_STR);
|
|
}
|
|
elseif (hasRequest('filter_rst')) {
|
|
DBstart();
|
|
CProfile::deleteIdx('web.toptriggers.filter.severities');
|
|
CProfile::deleteIdx('web.toptriggers.filter.groupids');
|
|
CProfile::deleteIdx('web.toptriggers.filter.hostids');
|
|
DBend();
|
|
}
|
|
|
|
$data['filter'] = [
|
|
'severities' => CProfile::getArray('web.toptriggers.filter.severities', []),
|
|
'timeline' => getTimeSelectorPeriod([
|
|
'profileIdx' => 'web.toptriggers.filter',
|
|
'profileIdx2' => 0,
|
|
'from' => $timeselector_from,
|
|
'to' => $timeselector_to
|
|
]),
|
|
'active_tab' => CProfile::get('web.toptriggers.filter.active', 1)
|
|
];
|
|
|
|
// multiselect host groups
|
|
$data['multiSelectHostGroupData'] = [];
|
|
$groupids = CProfile::getArray('web.toptriggers.filter.groupids', []);
|
|
|
|
if ($groupids) {
|
|
$groupids = getSubGroups($groupids, $data['multiSelectHostGroupData']);
|
|
}
|
|
|
|
// multiselect hosts
|
|
$data['multiSelectHostData'] = [];
|
|
$hostids = CProfile::getArray('web.toptriggers.filter.hostids', []);
|
|
|
|
if ($hostids) {
|
|
$filterHosts = API::Host()->get([
|
|
'output' => ['hostid', 'name'],
|
|
'hostids' => $hostids
|
|
]);
|
|
|
|
foreach ($filterHosts as $filterHost) {
|
|
$data['multiSelectHostData'][] = [
|
|
'id' => $filterHost['hostid'],
|
|
'name' => $filterHost['name']
|
|
];
|
|
}
|
|
}
|
|
|
|
// data generation
|
|
$triggersEventCount = [];
|
|
|
|
// get 100 triggerids with max event count
|
|
$sql = 'SELECT e.objectid,count(distinct e.eventid) AS cnt_event'.
|
|
' FROM triggers t,events e'.
|
|
' WHERE t.triggerid=e.objectid'.
|
|
' AND e.source='.EVENT_SOURCE_TRIGGERS.
|
|
' AND e.object='.EVENT_OBJECT_TRIGGER.
|
|
' AND e.clock>='.zbx_dbstr($data['filter']['timeline']['from_ts']).
|
|
' AND e.clock<='.zbx_dbstr($data['filter']['timeline']['to_ts']);
|
|
|
|
if ($data['filter']['severities']) {
|
|
$sql .= ' AND '.dbConditionInt('t.priority', $data['filter']['severities']);
|
|
}
|
|
|
|
if ($hostids) {
|
|
$inHosts = ' AND '.dbConditionInt('i.hostid', $hostids);
|
|
}
|
|
|
|
if ($groupids) {
|
|
$inGroups = ' AND '.dbConditionInt('hgg.groupid', $groupids);
|
|
}
|
|
|
|
if (CWebUser::getType() == USER_TYPE_SUPER_ADMIN && ($groupids || $hostids)) {
|
|
$sql .= ' AND EXISTS ('.
|
|
'SELECT NULL'.
|
|
' FROM functions f,items i,hosts_groups hgg'.
|
|
' WHERE t.triggerid=f.triggerid'.
|
|
' AND f.itemid=i.itemid'.
|
|
' AND i.hostid=hgg.hostid'.
|
|
($hostids ? $inHosts : '').
|
|
($groupids ? $inGroups : '').
|
|
')';
|
|
}
|
|
elseif (CWebUser::getType() != USER_TYPE_SUPER_ADMIN) {
|
|
// add permission filter
|
|
$userId = CWebUser::$data['userid'];
|
|
$userGroups = getUserGroupsByUserId($userId);
|
|
$sql .= ' AND EXISTS ('.
|
|
'SELECT NULL'.
|
|
' FROM functions f,items i,hosts_groups hgg'.
|
|
' JOIN rights r'.
|
|
' ON r.id=hgg.groupid'.
|
|
' AND '.dbConditionInt('r.groupid', $userGroups).
|
|
' WHERE t.triggerid=f.triggerid'.
|
|
' AND f.itemid=i.itemid'.
|
|
' AND i.hostid=hgg.hostid'.
|
|
($hostids ? $inHosts : '').
|
|
($groupids ? $inGroups : '').
|
|
' GROUP BY f.triggerid'.
|
|
' HAVING MIN(r.permission)>'.PERM_DENY.
|
|
')';
|
|
}
|
|
$sql .= ' AND '.dbConditionInt('t.flags', [ZBX_FLAG_DISCOVERY_NORMAL, ZBX_FLAG_DISCOVERY_CREATED]).
|
|
' GROUP BY e.objectid'.
|
|
' ORDER BY cnt_event DESC';
|
|
$result = DBselect($sql, 100);
|
|
while ($row = DBfetch($result)) {
|
|
$triggersEventCount[$row['objectid']] = $row['cnt_event'];
|
|
}
|
|
|
|
$data['triggers'] = API::Trigger()->get([
|
|
'output' => ['triggerid', 'description', 'expression', 'priority', 'lastchange'],
|
|
'selectHosts' => ['hostid', 'status', 'name'],
|
|
'triggerids' => array_keys($triggersEventCount),
|
|
'expandDescription' => true,
|
|
'preservekeys' => true
|
|
]);
|
|
|
|
$trigger_hostids = [];
|
|
|
|
foreach ($data['triggers'] as $triggerId => $trigger) {
|
|
$hostId = $trigger['hosts'][0]['hostid'];
|
|
$trigger_hostids[$hostId] = $hostId;
|
|
|
|
$data['triggers'][$triggerId]['cnt_event'] = $triggersEventCount[$triggerId];
|
|
}
|
|
|
|
CArrayHelper::sort($data['triggers'], [
|
|
['field' => 'cnt_event', 'order' => ZBX_SORT_DOWN],
|
|
'host', 'description', 'priority'
|
|
]);
|
|
|
|
$data['hosts'] = API::Host()->get([
|
|
'output' => ['hostid', 'status'],
|
|
'hostids' => $trigger_hostids,
|
|
'preservekeys' => true
|
|
]);
|
|
|
|
// render view
|
|
echo (new CView('reports.toptriggers', $data))->getOutput();
|
|
|
|
require_once dirname(__FILE__).'/include/page_footer.php';
|