AlertSummary: Add healing chart

refs #4076
This commit is contained in:
Marius Hein 2014-10-08 15:01:24 +02:00
parent c48c7f41b7
commit 0825b2f071
4 changed files with 152 additions and 12 deletions

View File

@ -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;
@ -49,6 +50,7 @@ class Monitoring_AlertsummaryController extends Controller
$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();
@ -87,10 +89,12 @@ class Monitoring_AlertsummaryController extends Controller
$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);
@ -132,7 +136,7 @@ class Monitoring_AlertsummaryController extends Controller
$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);
@ -194,7 +198,7 @@ class Monitoring_AlertsummaryController extends Controller
$query->order('notification_start_time', 'desc');
$records = $query->paginate(10000);
$records = $query->getQuery()->fetchAll();
$slots = array();
foreach ($records as $item) {
@ -250,7 +254,7 @@ class Monitoring_AlertsummaryController extends Controller
);
$defects = array();
$records = $query->paginate(10000);
$records = $query->getQuery()->fetchAll();
$period = $this->createPeriod($interval);
foreach ($period as $entry) {
@ -269,18 +273,134 @@ class Monitoring_AlertsummaryController extends Controller
return $defects;
}
public function createHealingChart()
{
$gridChart = new GridChart();
$gridChart->alignTopLeft();
$gridChart->setAxisLabel('', t('Notifications'))
->setXAxis(new StaticAxis())
->setAxisMin(null, 0)
->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();
$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));
$gridChart->drawBars(
array(

View File

@ -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>

View File

@ -1,4 +1,3 @@
<?php var_dump($this->compact); ?>
<?php if (!$this->compact): ?>
<div class="controls">
<?= $this->tabs ?>

View File

@ -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',
@ -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'
)
);
@ -95,4 +101,13 @@ class NotificationQuery extends IdoQuery
array()
);
}
protected function joinAcknowledgement()
{
$this->select->joinLeft(
array('a' => $this->prefix . 'acknowledgements'),
'n.object_id = a.object_id',
array()
);
}
}