2012-11-08 Sergio Martin <sergio.martin@artica.es>

* include/functions_graph.php
	include/graphs/pChart/pData.class.php
	include/functions_reporting.php
	include/constants.php: Improve performance to the SLA 
	report items, added unknown periods and fix planned downtimes
	in SLAs. Adapt the default pchart graph engine colors to pandora



git-svn-id: https://svn.code.sf.net/p/pandora/code/trunk@7136 c3f86ba8-e40f-0410-aaad-9ba5e7f4b01f
This commit is contained in:
zarzuelo 2012-11-08 07:42:11 +00:00
parent 10f8229cee
commit e2f08b720b
5 changed files with 206 additions and 113 deletions

View File

@ -1,3 +1,12 @@
2012-11-08 Sergio Martin <sergio.martin@artica.es>
* include/functions_graph.php
include/graphs/pChart/pData.class.php
include/functions_reporting.php
include/constants.php: Improve performance to the SLA
report items, added unknown periods and fix planned downtimes
in SLAs. Adapt the default pchart graph engine colors to pandora
2012-11-07 Miguel de Dios <miguel.dedios@artica.es> 2012-11-07 Miguel de Dios <miguel.dedios@artica.es>
* index.php: cleaned source code style. * index.php: cleaned source code style.

View File

@ -110,12 +110,12 @@ switch ($config["dbtype"]) {
/* Color constants */ /* Color constants */
define('COL_CRITICAL','#cc0000'); define('COL_CRITICAL','#FF0000');
define('COL_WARNING','#ffcc00'); define('COL_WARNING','#FFFF00');
define('COL_NORMAL','#8ae234'); define('COL_NORMAL','#38B800');
define('COL_NOTINIT','#ef2929'); define('COL_NOTINIT','#3BA0FF');
define('COL_UNKNOWN','#aaaaaa'); define('COL_UNKNOWN','#AAAAAA');
define('COL_ALERTFIRED','#ff8800'); define('COL_ALERTFIRED','#FF8800');

View File

@ -607,7 +607,7 @@ function grafico_modulo_sparse_data ($agent_module_id, $period, $show_events,
$graph_stats = get_statwin_graph_statistics($chart); $graph_stats = get_statwin_graph_statistics($chart);
// Fix event and alert scale // Fix event and alert scale
$event_max = 10 + (float)$max_value * 1.05; $event_max = 2 + (float)$max_value * 1.05;
foreach ($chart as $timestamp => $chart_data) { foreach ($chart as $timestamp => $chart_data) {
if ($show_events && $chart_data['event'.$series_suffix] > 0) { if ($show_events && $chart_data['event'.$series_suffix] > 0) {
$chart[$timestamp]['event'.$series_suffix] = $event_max * 1.2; $chart[$timestamp]['event'.$series_suffix] = $event_max * 1.2;
@ -1435,11 +1435,15 @@ function progress_bubble($progress, $width, $height, $title = '', $mode = 1, $va
"&colorRGB=". $colorRGB . "' />"; "&colorRGB=". $colorRGB . "' />";
} }
function graph_sla_slicebar ($id, $period, $sla_min, $sla_max, $date, $daysWeek = null, $time_from = null, $time_to = null, $width, $height, $home_url, $ttl = 1) { function graph_sla_slicebar ($id, $period, $sla_min, $sla_max, $date, $daysWeek = null, $time_from = null, $time_to = null, $width, $height, $home_url, $ttl = 1, $data = false) {
global $config; global $config;
$data = reporting_get_agentmodule_sla_array ($id, $period, $sla_min, $sla_max, $date, $daysWeek, $time_from, $time_to); // If the data is not provided, we got it
$colors = array(1 => '#38B800', 2 => '#FFFF00', 3 => '#FF0000', 4 => '#C3C3C3'); if($data === false) {
$data = reporting_get_agentmodule_sla_array ($id, $period, $sla_min, $sla_max, $date, $daysWeek, $time_from, $time_to);
}
$colors = array(1 => COL_NORMAL, 2 => COL_WARNING, 3 => COL_CRITICAL, 4 => COL_UNKNOWN, 5 => COL_NOTINIT);
return slicesbar_graph($data, $period, $width, $height, $colors, $config['fontpath'], return slicesbar_graph($data, $period, $width, $height, $colors, $config['fontpath'],
$config['round_corner'], $home_url, $ttl); $config['round_corner'], $home_url, $ttl);

View File

@ -662,7 +662,82 @@ function reporting_get_agentmodule_sla_array ($id_agent_module, $period = 0, $mi
$sql .= ' ORDER BY utimestamp ASC'; $sql .= ' ORDER BY utimestamp ASC';
$interval_data = db_get_all_rows_sql ($sql, true); $interval_data = db_get_all_rows_sql ($sql, true);
//--------calculate planned downtime dates-------------------------- if ($interval_data === false) {
$interval_data = array ();
}
// Indexing data
$interval_data_indexed = array();
foreach($interval_data as $idata) {
$interval_data_indexed[$idata['utimestamp']]['data'] = $idata['datos'];
}
//-----------Calculate unknown status events------------------------
$events_unknown = db_get_all_rows_filter ('tevento',
array ('id_agentmodule' => $id_agent_module,
"utimestamp > $datelimit",
"utimestamp < $date",
"event_type" => 'going_unknown',
'order' => 'utimestamp ASC'),
array ('id_evento', 'evento', 'timestamp', 'utimestamp', 'event_type'));
if ($events_unknown === false) {
$events_unknown = array ();
}
// Add unknown periods to data
foreach($events_unknown as $eu) {
$interval_data_indexed[$eu['utimestamp']]['data'] = 0;
$interval_data_indexed[$eu['utimestamp']]['status'] = 4;
}
// Get the last event before inverval to know if graph start on unknown
$prev_event = db_get_row_filter ('tevento',
array ('id_agentmodule' => $id_agent_module,
"utimestamp <= $datelimit",
'order' => 'utimestamp DESC'));
if(isset($prev_event['event_type']) && $prev_event['event_type'] == 'going_unknown') {
$start_unknown = true;
}
else {
$start_unknown = false;
}
//------------------------------------------------------------------
//-----------------Set limits of the interval-----------------------
// If the starting of the graph is unknown we set it
if($start_unknown) {
$interval_data_indexed[$datelimit]['data'] = 0;
$interval_data_indexed[$datelimit]['status'] = 4;
}
else {
// Get previous data (This adds the first data if the begin of module data is after the begin time interval)
$previous_data = modules_get_previous_data ($id_agent_module, $datelimit);
if ($previous_data !== false) {
$interval_data_indexed[$datelimit]['data'] = $previous_data['data'];
}
else { // If there are not data befor interval set unknown
$interval_data_indexed[$datelimit]['data'] = 0;
$interval_data_indexed[$datelimit]['status'] = 4;
}
}
// Get next data (This adds data before the interval of the report)
$next_data = modules_get_next_data ($id_agent_module, $date);
if ($next_data !== false) {
$interval_data_indexed[$date]['data'] = $previous_data['data'];
}
else if (count ($interval_data_indexed) > 0) {
// Propagate the last known data to the end of the interval (if there is no module data at the end point)
ksort($interval_data_indexed);
$last_data = array_pop($interval_data_indexed);
$interval_data_indexed[$date] = $last_data;
}
//------------------------------------------------------------------
//--------Calculate planned downtime dates--------------------------
$id_agent = db_get_value('id_agente', 'tagente_modulo', 'id_agente_modulo', $id_agent_module); $id_agent = db_get_value('id_agente', 'tagente_modulo', 'id_agente_modulo', $id_agent_module);
$sql_downtime = "SELECT id_downtime FROM tplanned_downtime_agents WHERE id_agent=$id_agent"; $sql_downtime = "SELECT id_downtime FROM tplanned_downtime_agents WHERE id_agent=$id_agent";
$downtimes = db_get_all_rows_sql($sql_downtime); $downtimes = db_get_all_rows_sql($sql_downtime);
@ -671,46 +746,44 @@ function reporting_get_agentmodule_sla_array ($id_agent_module, $period = 0, $mi
} }
$i = 0; $i = 0;
$downtime_dates = array(); $downtime_dates = array();
foreach ($downtimes as $downtime) { foreach ($downtimes as $downtime) {
$id_downtime = $downtime['id_downtime']; $id_downtime = $downtime['id_downtime'];
$sql_date = "SELECT date_from, date_to FROM tplanned_downtime WHERE id=$id_downtime"; $sql_date = "SELECT date_from, date_to FROM tplanned_downtime WHERE id=$id_downtime";
$date_downtime = db_get_row_sql($sql_date); $date_downtime = db_get_row_sql($sql_date);
if ($date_downtime != false) { if ($date_downtime != false) {
$downtime_dates[$i]['date_from'] = $date_downtime['date_from']; // Delete data of the planned downtime and put the last data on the upper limit
$downtime_dates[$i]['date_to'] = $date_downtime['date_to']; $interval_data_indexed[$date_downtime['date_from']]['data'] = 0;
$interval_data_indexed[$date_downtime['date_from']]['status'] = 5;
$last_downtime_data = false;
foreach($interval_data_indexed as $idi_timestamp => $idi) {
if($idi_timestamp != $date_downtime['date_from'] && $idi_timestamp != $date_downtime['date_to'] &&
$idi_timestamp >= $date_downtime['date_from'] && $idi_timestamp <= $date_downtime['date_to']) {
$last_downtime_data = $idi['data'];
unset($interval_data_indexed[$idi_timestamp]);
}
}
// Set the last data of the interval as limit
if($last_downtime_data !== false) {
$interval_data_indexed[$date_downtime['date_to']]['data'] = $last_downtime_data;
}// If there arent data into the downtime, set unknown
else {
$interval_data_indexed[$date_downtime['date_to']]['data'] = 0;
$interval_data_indexed[$date_downtime['date_to']]['status'] = 4;
}
$i++; $i++;
} }
} }
//------------------------------------------------------------------ //------------------------------------------------------------------
if ($interval_data === false) { // Sort the array
$interval_data = array (); ksort($interval_data_indexed);
}
// Get previous data (This adds the first data if the begin of module data is after the begin time interval)
$previous_data = modules_get_previous_data ($id_agent_module, $datelimit);
if ($previous_data !== false) {
$previous_data['utimestamp'] = $datelimit;
array_unshift ($interval_data, $previous_data);
}
// Get next data (This adds data before the interval of the report)
$next_data = modules_get_next_data ($id_agent_module, $date);
if ($next_data !== false) {
$next_data['utimestamp'] = $date;
array_push ($interval_data, $next_data);
}
else if (count ($interval_data) > 0) {
// Propagate the last known data to the end of the interval (if there is no module data at the end point)
$next_data = array_pop ($interval_data);
array_push ($interval_data, $next_data);
$next_data['utimestamp'] = $date;
array_push ($interval_data, $next_data);
}
// We need more or equal two points // We need more or equal two points
if (count ($interval_data) < 2) { if (count ($interval_data_indexed) < 2) {
return false; return false;
} }
@ -724,7 +797,7 @@ function reporting_get_agentmodule_sla_array ($id_agent_module, $period = 0, $mi
$percent = 0; $percent = 0;
} }
else { else {
// Getting 10% of $diff --> $percent = ($diff/100)*10, so... // Getting 1I0% of $diff --> $percent = ($diff/100)*10, so...
$percent = $diff / 10; $percent = $diff / 10;
} }
@ -735,8 +808,8 @@ function reporting_get_agentmodule_sla_array ($id_agent_module, $period = 0, $mi
$previous_value = $first_data ['datos']; $previous_value = $first_data ['datos'];
$previous_status = 0; $previous_status = 0;
if ($previous_value < 0) {// 4 for the Unknown value if (isset($first_data['status'])) { // 4 for the Unknown value amd 5 for planned downtime
$previous_status = 4; $previous_status = $first_data['status'];
} }
elseif ((($previous_value > ($min_value - $percent)) && ($previous_value < ($min_value + $percent))) || elseif ((($previous_value > ($min_value - $percent)) && ($previous_value < ($min_value + $percent))) ||
(($previous_value > ($max_value - $percent)) && ($previous_value < ($max_value + $percent)))) {//2 when value is within the edges (($previous_value > ($max_value - $percent)) && ($previous_value < ($max_value + $percent)))) {//2 when value is within the edges
@ -749,20 +822,16 @@ function reporting_get_agentmodule_sla_array ($id_agent_module, $period = 0, $mi
$previous_status = 3; $previous_status = 3;
} }
foreach ($downtime_dates as $date_dt) {
if (($date_dt['date_from'] <= $first_data['utimestamp']) AND ($date_dt['date_to'] >= $first_data['utimestamp'])) {
$previous_status = 1;
}
}
$data_colors = array(); $data_colors = array();
$i = 0; $i = 0;
foreach ($interval_data as $data) { foreach ($interval_data_indexed as $utimestamp => $data) {
$change = false; $change = false;
$value = $data['datos']; $value = $data['data'];
if ($value < 0) {// 4 for the Unknown value //~ $value = $data['datos'];
$status = 4; //$utimestamp = $data['utimestamp'];
if (isset($data['status'])) { // 4 for the Unknown value amd 5 for planned downtime
$status = $data['status'];
} }
elseif ((($value > ($min_value - $percent)) && ($value < ($min_value + $percent))) || elseif ((($value > ($min_value - $percent)) && ($value < ($min_value + $percent))) ||
(($value > ($max_value - $percent)) && ($value < ($max_value + $percent)))) { //2 when value is within the edges (($value > ($max_value - $percent)) && ($value < ($max_value + $percent)))) { //2 when value is within the edges
@ -775,24 +844,18 @@ function reporting_get_agentmodule_sla_array ($id_agent_module, $period = 0, $mi
$status = 3; $status = 3;
} }
foreach ($downtime_dates as $date_dt) {
if (($date_dt['date_from'] <= $data['utimestamp']) AND ($date_dt['date_to'] >= $data['utimestamp'])) {
$status = 1;
}
}
if ($status != $previous_status) { if ($status != $previous_status) {
$change = true; $change = true;
$data_colors[$i]['data'] = $previous_status; $data_colors[$i]['data'] = $previous_status;
$data_colors[$i]['utimestamp'] = $data['utimestamp'] - $previous_utimestamp; $data_colors[$i]['utimestamp'] = $utimestamp - $previous_utimestamp;
$i++; $i++;
$previous_status = $status; $previous_status = $status;
$previous_utimestamp = $data['utimestamp']; $previous_utimestamp = $utimestamp;
} }
} }
if ($change == false) { if ($change == false) {
$data_colors[$i]['data'] = $previous_status; $data_colors[$i]['data'] = $previous_status;
$data_colors[$i]['utimestamp'] = $data['utimestamp'] - $previous_utimestamp; $data_colors[$i]['utimestamp'] = $date - $previous_utimestamp;
} }
return $data_colors; return $data_colors;
@ -2407,12 +2470,7 @@ function reporting_render_report_html_item ($content, $table, $report, $mini = f
$data_graph[__('Out of limits')] = 0; $data_graph[__('Out of limits')] = 0;
$data_graph[__('On the edge')] = 0; $data_graph[__('On the edge')] = 0;
$data_graph[__('Unknown')] = 0; $data_graph[__('Unknown')] = 0;
$data_graph[__('Plannified downtime')] = 0;
$data_horin_graph = array ();
$data_horin_graph[__('Inside limits')]['g'] = 0;
$data_horin_graph[__('Out of limits')]['g'] = 0;
$data_horin_graph[__('On the edge')]['g'] = 0;
$data_horin_graph[__('Unknown')]['g'] = 0;
$sla_failed = false; $sla_failed = false;
$total_SLA = 0; $total_SLA = 0;
@ -2431,28 +2489,67 @@ function reporting_render_report_html_item ($content, $table, $report, $mini = f
} }
} }
//Get the array of the sla values
$data_sla = reporting_get_agentmodule_sla_array ($sla['id_agent_module'], $content['period'],
$sla['sla_min'], $sla['sla_max'], $report['datetime'], $content, $content['time_from'],
$content['time_to']);
//Get the sla_value in % and store it on $sla_value //Get the sla_value in % and store it on $sla_value
$sla_value = reporting_get_agentmodule_sla ($sla['id_agent_module'], $content['period'], $data_total = 0;
$sla['sla_min'], $sla['sla_max'], $report["datetime"], $content, $content['time_from'], $data_pass = 0;
$content['time_to']); foreach($data_sla as $d) {
switch($d['data']) {
case 1:
$data_pass += $d['utimestamp'];
$data_total += $d['utimestamp'];
break;
case 2:
$data_pass += $d['utimestamp'];
$data_total += $d['utimestamp'];
break;
case 3:
$data_total += $d['utimestamp'];
break;
case 4:
case 5:
break;
}
}
$sla_value = ($data_pass / $data_total) * 100;
//Do not show right modules if 'only_display_wrong' is active //Do not show right modules if 'only_display_wrong' is active
if ($content['only_display_wrong'] == 1 && $sla_value >= $sla['sla_limit']) continue; if ($content['only_display_wrong'] == 1 && $sla_value >= $sla['sla_limit']) continue;
$sla_showed[] = $sla; // Calculate general pie graph data
$sla_showed_values[] = $sla_value; foreach($data_sla as $d) {
switch($d['data']) {
if (($config ['metaconsole'] == 1) && defined('METACONSOLE')) { case 1:
if ($content['type'] != 'netflow_area' && $data_graph[__('Inside limits')] += $d['utimestamp'];
$content['type'] != 'netflow_pie' && break;
$content['type'] != 'netflow_data' && case 2:
$content['type'] != 'netflow_statistics' && $data_graph[__('On the edge')] += $d['utimestamp'];
$content['type'] != 'netflow_summary') { break;
//Restore db connection case 3:
metaconsole_restore_db(); $data_graph[__('Out of limits')] += $d['utimestamp'];
break;
case 4:
$data_graph[__('Unknown')] += $d['utimestamp'];
break;
case 5:
$data_graph[__('Plannified downtime')] += $d['utimestamp'];
break;
} }
} }
$sla_showed[] = $sla;
$sla_showed_values[] = $sla_value;
$sla_data_arrays[] = $data_sla;
if (($config ['metaconsole'] == 1) && defined('METACONSOLE')) {
//Restore db connection
metaconsole_restore_db();
}
} }
// SLA items sorted descending () // SLA items sorted descending ()
@ -2492,24 +2589,6 @@ function reporting_render_report_html_item ($content, $table, $report, $mini = f
$total_result_SLA = 'fail'; $total_result_SLA = 'fail';
} }
//Fill the array data_graph for the pie graph
if ($sla_value === false) {
$data_graph[__('Unknown')]++;
$data_horin_graph[__('Unknown')]['g']++;
}
else if ($sla_value <= ($sla['sla_limit']+$edge_interval) && $sla_value >= ($sla['sla_limit']-$edge_interval)) {
$data_graph[__('On the edge')]++;
$data_horin_graph[__('On the edge')]['g']++;
}
else if ($sla_value > ($sla['sla_limit']+$edge_interval)) {
$data_graph[__('Inside limits')]++;
$data_horin_graph[__('Inside limits')]['g']++;
}
else if ($sla_value < ($sla['sla_limit']-$edge_interval)) {
$data_graph[__('Out of limits')]++;
$data_horin_graph[__('Out of limits')]['g']++;
}
$total_SLA += $sla_value; $total_SLA += $sla_value;
if ($show_table) { if ($show_table) {
@ -2567,7 +2646,7 @@ function reporting_render_report_html_item ($content, $table, $report, $mini = f
$dataslice[1] = graph_sla_slicebar ($sla['id_agent_module'], $content['period'], $dataslice[1] = graph_sla_slicebar ($sla['id_agent_module'], $content['period'],
$sla['sla_min'], $sla['sla_max'], $report['datetime'], $content, $content['time_from'], $sla['sla_min'], $sla['sla_max'], $report['datetime'], $content, $content['time_from'],
$content['time_to'], 650, 25, ui_get_full_url(false) . '/'); $content['time_to'], 650, 25, ui_get_full_url(false) . '/', 1, $sla_data_arrays[$k]);
array_push ($tableslice->data, $dataslice); array_push ($tableslice->data, $dataslice);
} }

View File

@ -42,14 +42,15 @@
{ {
var $Data; var $Data;
var $Palette = array("0"=>array("R"=>188,"G"=>224,"B"=>46,"Alpha"=>100), var $Palette = array("0"=>array("R"=>138,"G"=>226,"B"=>52,"Alpha"=>100),
"1"=>array("R"=>224,"G"=>100,"B"=>46,"Alpha"=>100), "1"=>array("R"=>204,"G"=>0,"B"=>0,"Alpha"=>100),
"2"=>array("R"=>224,"G"=>214,"B"=>46,"Alpha"=>100), "2"=>array("R"=>255,"G"=>204,"B"=>0,"Alpha"=>100),
"3"=>array("R"=>46,"G"=>151,"B"=>224,"Alpha"=>100), "3"=>array("R"=>195,"G"=>195,"B"=>195,"Alpha"=>100),
"4"=>array("R"=>176,"G"=>46,"B"=>224,"Alpha"=>100), "4"=>array("R"=>59,"G"=>160,"B"=>255,"Alpha"=>100),
"5"=>array("R"=>224,"G"=>46,"B"=>117,"Alpha"=>100), "5"=>array("R"=>176,"G"=>46,"B"=>224,"Alpha"=>100),
"6"=>array("R"=>92,"G"=>224,"B"=>46,"Alpha"=>100), "6"=>array("R"=>224,"G"=>46,"B"=>117,"Alpha"=>100),
"7"=>array("R"=>224,"G"=>176,"B"=>46,"Alpha"=>100)); "7"=>array("R"=>92,"G"=>224,"B"=>46,"Alpha"=>100),
"8"=>array("R"=>224,"G"=>176,"B"=>46,"Alpha"=>100));
/* Class creator */ /* Class creator */
function pData() function pData()