Skip to content

Commit

Permalink
AlertSummary: Add healing chart
Browse files Browse the repository at this point in the history
refs #4076
  • Loading branch information
mxhash committed Oct 8, 2014
1 parent c48c7f4 commit 0825b2f
Show file tree
Hide file tree
Showing 4 changed files with 151 additions and 11 deletions.
136 changes: 128 additions & 8 deletions modules/monitoring/application/controllers/AlertsummaryController.php
Expand Up @@ -3,6 +3,7 @@
// {{{ICINGA_LICENSE_HEADER}}}

use Icinga\Chart\GridChart;
use Icinga\Chart\Unit\LinearUnit;
use Icinga\Chart\Unit\StaticAxis;
use Icinga\Module\Monitoring\Controller;
use Icinga\Module\Monitoring\Web\Widget\SelectBox;
Expand Down Expand Up @@ -49,6 +50,7 @@ public function indexAction()
$this->view->recentAlerts = $this->createRecentAlerts();
$this->view->interval = $this->getInterval();
$this->view->defectChart = $this->createDefectImage();
$this->view->healingChart = $this->createHealingChart();
$this->view->perf = $this->createNotificationPerfdata();
$this->view->trend = $this->createTrendInformation();

Expand Down Expand Up @@ -87,10 +89,12 @@ private function createNotificationData() {

$query->order('notification_start_time', 'asc');

$records = $query->paginate(10000);
$records = $query->getQuery()->fetchAll();
$data = array();
$period = $this->createPeriod($interval);



foreach ($period as $entry) {
$id = $this->getPeriodFormat($interval, $entry->getTimestamp());
$data[$id] = array($id, 0);
Expand Down Expand Up @@ -132,7 +136,7 @@ private function createTrendInformation()

$query->order('notification_start_time', 'asc');

$records = $query->paginate(10000);
$records = $query->getQuery()->fetchAll();
$slots = array();

$period = new DatePeriod($beginDate, new DateInterval('P1D'), 2, DatePeriod::EXCLUDE_START_DATE);
Expand Down Expand Up @@ -194,7 +198,7 @@ private function createNotificationPerfdata()

$query->order('notification_start_time', 'desc');

$records = $query->paginate(10000);
$records = $query->getQuery()->fetchAll();
$slots = array();

foreach ($records as $item) {
Expand Down Expand Up @@ -250,7 +254,7 @@ private function createProblemData()
);

$defects = array();
$records = $query->paginate(10000);
$records = $query->getQuery()->fetchAll();
$period = $this->createPeriod($interval);

foreach ($period as $entry) {
Expand All @@ -269,18 +273,134 @@ private function createProblemData()
return $defects;
}

public function createDefectImage()
public function createHealingChart()
{
$gridChart = new GridChart();
$interval = $this->getInterval();

$gridChart->alignTopLeft();
$gridChart->setAxisLabel('', t('Services'))
$gridChart->setAxisLabel('', t('Notifications'))
->setXAxis(new StaticAxis())
->setAxisMin(null, 0)
->setYAxis(new \Icinga\Chart\Unit\LinearUnit(10));
->setYAxis(new LinearUnit(10));

$interval = $this->getInterval();

$query = $this->backend->select()->from('notification', array(
'host',
'service',
'notification_object_id',
'notification_output',
'notification_contact',
'notification_start_time',
'notification_state',
'acknowledgement_entry_time'
));

$query->setFilter(
new Icinga\Data\Filter\FilterExpression(
'n.start_time',
'>=',
$this->getBeginDate($interval)->format('Y-m-d H:i:s')
)
);

$query->order('notification_start_time', 'asc');

$records = $query->getQuery()->fetchAll();

$interval = $this->getInterval();
$period = $this->createPeriod($interval);
$dAvg = array();
$dMax = array();
$notifications = array();
$rData = array();

foreach ($period as $entry) {
$id = $this->getPeriodFormat($interval, $entry->getTimestamp());
$dMax[$id] = array($id, 0);
$dAvg[$id] = array($id, 0, 0);
$notifications[$id] = array($id, 0);
}

foreach ($records as $item) {
$id = $this->getPeriodFormat($interval, $item->notification_start_time);

if ($item->notification_state == '0' && isset($rData[$item->notification_object_id])) {
$rData[$item->notification_object_id]['recover'] = $item->notification_start_time - $rData[$item->notification_object_id]['entry'];
} elseif ($item->notification_state !== '0') {
$recover = 0;
if ($item->acknowledgement_entry_time) {
$recover = $item->acknowledgement_entry_time - $item->notification_start_time;
}
$rData[$item->notification_object_id] = array(
'id' => $id,
'entry' => $item->notification_start_time,
'recover' => $recover
);
}
}

foreach ($rData as $item) {
$notifications[$item['id']][1]++;

if ($item['recover'] > $dMax[$item['id']][1]) {
$dMax[$item['id']][1] = (int) $item['recover'];
}

$dAvg[$item['id']][1] += (int) $item['recover'];
$dAvg[$item['id']][2]++;
}

foreach ($dAvg as &$item) {
if ($item[2] > 0) {
$item[1] = ($item[1]/$item[2])/60/60;
}
}

foreach ($dMax as &$item) {
$item[1] = $item[1]/60/60;
}


$gridChart->drawBars(
array(
'label' => $this->translate('Notifications'),
'color' => 'blue',
'data' => $notifications,
'showPoints' => true
)
);

$gridChart->drawLines(
array(
'label' => $this->translate('Avg (min)'),
'color' => 'orange',
'data' => $dAvg,
'showPoints' => true
)
);

$gridChart->drawLines(
array(
'label' => $this->translate('Max (min)'),
'color' => 'red',
'data' => $dMax,
'showPoints' => true
)
);

return $gridChart;
}

public function createDefectImage()
{
$gridChart = new GridChart();

$gridChart->alignTopLeft();
$gridChart->setAxisLabel('', t('Notifications'))
->setXAxis(new StaticAxis())
->setAxisMin(null, 0)
->setYAxis(new LinearUnit(10));

$gridChart->drawBars(
array(
Expand Down
Expand Up @@ -13,12 +13,18 @@ $helper = $this->getHelper('MonitoringState');
<div class="content alertsummary">
<h1><?= $this->translate('Alert summary'); ?></h1>

<h2><?= $this->translate('Notifications'); ?></h2>
<h2><?= $this->translate('Notifications and problems'); ?></h2>

<div class="svg-container-responsive">
<?= $defectChart->render(); ?>
</div>

<h2><?= $this->translate('Time to reaction (Ack, Recover)'); ?></h2>

<div class="svg-container-responsive">
<?= $healingChart->render(); ?>
</div>

<h2><?= $this->translate('Trend'); ?></h2>

<div>
Expand Down
@@ -1,4 +1,3 @@
<?php var_dump($this->compact); ?>
<?php if (!$this->compact): ?>
<div class="controls">
<?= $this->tabs ?>
Expand Down
Expand Up @@ -18,7 +18,8 @@ class NotificationQuery extends IdoQuery
'notification' => array(
'notification_output' => 'n.output',
'notification_start_time' => 'UNIX_TIMESTAMP(n.start_time)',
'notification_state' => 'n.state'
'notification_state' => 'n.state',
'notification_object_id' => 'n.object_id'
),
'objects' => array(
'host' => 'o.name1',
Expand All @@ -30,6 +31,11 @@ class NotificationQuery extends IdoQuery
),
'command' => array(
'notification_command' => 'cmd_o.name1'
),
'acknowledgement' => array(
'acknowledgement_entry_time' => 'UNIX_TIMESTAMP(a.entry_time)',
'acknowledgement_author_name' => 'a.author_name',
'acknowledgement_comment_data' => 'a.comment_data'
)
);

Expand Down Expand Up @@ -95,4 +101,13 @@ protected function joinCommand()
array()
);
}

protected function joinAcknowledgement()
{
$this->select->joinLeft(
array('a' => $this->prefix . 'acknowledgements'),
'n.object_id = a.object_id',
array()
);
}
}

0 comments on commit 0825b2f

Please sign in to comment.