From 65203fddcf1cf63191d99715dd3ed156658d0a8d Mon Sep 17 00:00:00 2001 From: Matthias Jentsch Date: Tue, 16 Sep 2014 15:58:24 +0200 Subject: [PATCH] Add additional state history filters for time interval and event type --- .../Web/Widget/Chart/HistoryColorGrid.php | 48 ++++++--- .../controllers/ListController.php | 100 ++++++++++++++++-- .../scripts/list/statehistorysummary.phtml | 75 ++++++++++--- 3 files changed, 186 insertions(+), 37 deletions(-) diff --git a/library/Icinga/Web/Widget/Chart/HistoryColorGrid.php b/library/Icinga/Web/Widget/Chart/HistoryColorGrid.php index 974e02060..5595cabce 100644 --- a/library/Icinga/Web/Widget/Chart/HistoryColorGrid.php +++ b/library/Icinga/Web/Widget/Chart/HistoryColorGrid.php @@ -28,29 +28,33 @@ class HistoryColorGrid extends AbstractWidget { private $maxValue = 1; private $start = null; - private $end = null; private $data = array(); private $color; - public function __construct($color = '#51e551') { + public function __construct($color = '#51e551', $start = null, $end = null) { $this->setColor($color); + if (isset($start)) { + $this->start = $this->tsToDateStr($start); + } + if (isset($end)) { + $this->end = $this->tsToDateStr($end); + } } /** * Set the displayed data-set * - * @param $data array The values to display. - * properties for each entry: + * @param $events array The history events to display as an array of arrays: * value: The value to display * caption: The caption on mouse-over * url: The url to open on click. */ - public function setData(array $data) + public function setData(array $events) { - $this->data = $data; + $this->data = $events; $start = time(); $end = time(); foreach ($this->data as $entry) { @@ -68,8 +72,12 @@ class HistoryColorGrid extends AbstractWidget { $start = $time; } } - $this->start = $this->tsToDateStr($start); - $this->end = $this->tsToDateStr($end); + if (!isset($this->start)) { + $this->start = $this->tsToDateStr($start); + } + if (!isset($this->end)) { + $this->end = $this->tsToDateStr($end); + } } /** @@ -130,13 +138,14 @@ class HistoryColorGrid extends AbstractWidget { { $weeks = $grid['weeks']; $months = $grid['months']; + $years = $grid['years']; $html = ''; $html .= ''; $old = -1; - foreach ($months as $month) { + foreach ($months as $week => $month) { if ($old !== $month) { $old = $month; - $txt = $this->monthName($month); + $txt = $this->monthName($month, $years[$week]); } else { $txt = ''; } @@ -157,6 +166,7 @@ class HistoryColorGrid extends AbstractWidget { */ private function renderVertical($grid) { + $years = $grid['years']; $weeks = $grid['weeks']; $months = $grid['months']; $html = '
'; @@ -176,7 +186,7 @@ class HistoryColorGrid extends AbstractWidget { } if ($old !== $months[$index]) { $old = $months[$index]; - $txt = $this->monthName($old); + $txt = $this->monthName($old, $years[$index]); } else { $txt = ''; } @@ -220,6 +230,7 @@ class HistoryColorGrid extends AbstractWidget { $weeks = array(array()); $week = 0; $months = array(); + $years = array(); $start = strtotime($this->start); $year = intval(date('Y', $start)); $month = intval(date('n', $start)); @@ -232,6 +243,7 @@ class HistoryColorGrid extends AbstractWidget { $date = $this->toDateStr($day, $month, $year); $weeks[0][$weekday] = $date; + $years[0] = $year; $months[0] = $month; while ($date !== $this->end) { $day++; @@ -242,6 +254,7 @@ class HistoryColorGrid extends AbstractWidget { // PRESENT => The last day of week determines the month if ($this->weekFlow === self::CAL_GROW_INTO_PRESENT) { $months[$week] = $month; + $years[$week] = $year; } $week++; } @@ -257,21 +270,25 @@ class HistoryColorGrid extends AbstractWidget { // PAST => The first day of each week determines the month if ($this->weekFlow === self::CAL_GROW_INTO_PAST) { $months[$week] = $month; + $years[$week] = $year; } } $date = $this->toDateStr($day, $month, $year); $weeks[$week][$weekday] = $date; }; + $years[$week] = $year; $months[$week] = $month; if ($this->weekFlow == self::CAL_GROW_INTO_PAST) { return array( 'weeks' => array_reverse($weeks), - 'months' => array_reverse($months) + 'months' => array_reverse($months), + 'years' => array_reverse($years) ); } return array( 'weeks' => $weeks, - 'months' => $months + 'months' => $months, + 'years' => $years ); } @@ -282,9 +299,10 @@ class HistoryColorGrid extends AbstractWidget { * * @return string The */ - private function monthName($month) + private function monthName($month, $year) { - $dt = DateTimeFactory::create('2000-' . $month . '-01'); + // TODO: find a way to render years without messing up the layout + $dt = DateTimeFactory::create($year . '-' . $month . '-01'); return $dt->format('M'); } diff --git a/modules/monitoring/application/controllers/ListController.php b/modules/monitoring/application/controllers/ListController.php index bd0bb047f..259dbef02 100644 --- a/modules/monitoring/application/controllers/ListController.php +++ b/modules/monitoring/application/controllers/ListController.php @@ -14,6 +14,7 @@ use Icinga\Web\Widget\FilterBox; use Icinga\Web\Widget\Chart\HistoryColorGrid; use Icinga\Data\Filter\Filter; use Icinga\Web\Widget; +use Icinga\Module\Monitoring\Web\Widget\SelectBox; class Monitoring_ListController extends Controller { @@ -359,15 +360,100 @@ class Monitoring_ListController extends Controller public function statehistorysummaryAction() { - $this->addTitleTab('statehistorysummary', 'Critical Events'); + $this->view->from = $this->params->shift('from', '3 months ago'); + $this->addTitleTab('statehistorysummary', 'State Summary'); + $selections = array( + 'critical' => array( + 'column' => 'cnt_critical', + 'filter' => Filter::matchAll( + Filter::expression('object_type', '=', 'service'), + Filter::expression('state', '=', '2') + ), + 'tooltip' => t('%d critical events on %s'), + 'color' => '#ff5566', 'opacity' => '0.9' + ), + 'warning' => array( + 'column' => 'cnt_warning', + 'filter' => Filter::matchAll( + Filter::expression('object_type', '=', 'service'), + Filter::expression('state', '=', '1') + ), + 'tooltip' => t('%d warning events on %s'), + 'color' => '#ffaa44', 'opacity' => '1.0' + ), + 'unknown' => array( + 'column' => 'cnt_unknown', + 'filter' => Filter::matchAll( + Filter::expression('object_type', '=', 'service'), + Filter::expression('state', '=', '3') + ), + 'tooltip' => t('%d unknown events on %s'), + 'color' => '#cc77ff', 'opacity' => '0.7' + ), + 'ok' => array( + 'column' => 'cnt_ok', + 'filter' => Filter::matchAll( + Filter::expression('object_type', '=', 'service'), + Filter::expression('state', '=', '0') + ), + 'tooltip' => t('%d ok events on %s'), + 'color' => '#49DF96', 'opacity' => '0.55' + ) + ); + + $eventBox = new SelectBox( + 'statehistoryfilter', + array( + 'critical' => t('Critical'), + 'warning' => t('Warning'), + 'unknown' => t('Unknown'), + 'ok' => t('Ok') + ), + t('Events'), + 'event' + ); + $eventBox->applyRequest($this->getRequest()); + + $orientationBox = new SelectBox( + 'orientation', + array( + '0' => t('Vertical'), + '1' => t('Horizontal') + ), + t('Orientation'), + 'horizontal' + ); + $orientationBox->applyRequest($this->getRequest()); + + $intervalBox = new SelectBox( + 'from', + array( + '3 months ago' => t('3 Months'), + '4 months ago' => t('4 Months'), + '8 months ago' => t('8 Months'), + '12 months ago' => t('1 Year'), + '24 months ago' => t('2 Years') + ), + t('Interval'), + 'from' + ); + $intervalBox->applyRequest($this->getRequest()); + + $eventtype = $this->params->shift('event', 'critical'); + $orientation = $this->params->shift('horizontal', 0) ? 'horizontal' : 'vertical'; + $selection = $selections[$eventtype]; + $query = $this->backend->select()->from( 'stateHistorySummary', - array('day', 'cnt_critical') - )->getQuery()->order('day'); - $query->limit(365); - $this->view->summary = $query->fetchAll(); - $this->view->grid = new HistoryColorGrid(); - $this->handleFormatRequest($query); + array('day', $selection['column']) + ); + $this->applyFilters($query); + $this->view->orientationBox = $orientationBox; + $this->view->eventBox = $eventBox; + $this->view->selection = $selection; + $this->view->orientation = $orientation; + $this->view->summary = $query->getQuery()->fetchAll(); + $this->view->intervalBox = $intervalBox; } public function contactgroupsAction() diff --git a/modules/monitoring/application/views/scripts/list/statehistorysummary.phtml b/modules/monitoring/application/views/scripts/list/statehistorysummary.phtml index 55c41ffcb..b5a0b3fdb 100644 --- a/modules/monitoring/application/views/scripts/list/statehistorysummary.phtml +++ b/modules/monitoring/application/views/scripts/list/statehistorysummary.phtml @@ -1,34 +1,47 @@ + + + +
+ tabs->render($this); ?> +
+
+ + + +
+
+ -?>
-tabs ?> -

History - Critical Events

-
setColor('#f05060'); +$from = strtotime($from); +$to = time(); $data = array(); if (count($summary) === 0) { - echo t('No history entry matching the filter'); + echo t('No events in the selected time period.'); } foreach ($summary as $entry) { $day = $entry->day; - $value = $entry->cnt_critical; - $caption = $value . ' ' . - t('critical events on ') . $this->dateFormat()->formatDate(strtotime($day)); + $value = $entry->{$selection['column']}; + $caption = sprintf( + $selection['tooltip'], + $value, + $this->dateFormat()->formatDate(strtotime($day)) + ); $filter = Filter::matchAll( Filter::expression('timestamp', '<', strtotime($day . ' 23:59:59')), Filter::expression('timestamp', '>', strtotime($day . ' 00:00:00')), - Filter::expression('object_type', '=', 'service'), - Filter::expression('state', '=', '2'), Filter::matchAny( Filter::expression('type', '=', 'hard_state'), Filter::expression('type', '=', 'hard_state') - ) + ), + $selection['filter'] ); $data[$day] = array( 'value' => $value, @@ -36,7 +49,39 @@ foreach ($summary as $entry) { 'url' => $this->href('monitoring/list/eventhistory?' . $filter->toQueryString()) ); } -$grid->setData($data); + +$f = new DateTime(); +$f->setTimestamp($from); +$t = new DateTime(); +$t->setTimestamp($to); +$diff = $t->diff($f); +$step = 124; + +for ($i = 0; $i < $diff->days; $i += $step) { + $end = clone $f; + if ($diff->days - $i > $step) { + // full range, move last day to next chunk + $end->add(new DateInterval('P' . ($step - 1) . 'D')); + } else { + // include last day + $end->add(new DateInterval('P' . ($diff->days - $i) . 'D')); + } + $grid = new HistoryColorGrid(null, $f->getTimestamp(), $end->getTimestamp()); + $grid->setColor($selection['color']); + $grid->opacity = $selection['opacity']; + $grid->orientation = $orientation; + $grid->setData($data); + $grids[] = $grid; + + $f->add(new DateInterval('P' . $step . 'D')); +} ?> - +
+ $grid) { ?> +
+ + orientation === 'horizontal' ? '
' : '' ?> +
+ +