2010-04-29 Ramon Novoa <rnovoa@artica.es>
* include/functions_reporting.php: Added TTO, TTR, MTBF and MTTR reports. * include/functions_db.php: Fixed get_previous_data and wrote get_next_data. git-svn-id: https://svn.code.sf.net/p/pandora/code/trunk@2639 c3f86ba8-e40f-0410-aaad-9ba5e7f4b01f
This commit is contained in:
parent
d02eeffd36
commit
d243ac9403
|
@ -1,3 +1,16 @@
|
||||||
|
2010-04-29 Ramon Novoa <rnovoa@artica.es>
|
||||||
|
|
||||||
|
* include/functions_reporting.php: Added TTO, TTR, MTBF and MTTR
|
||||||
|
reports.
|
||||||
|
|
||||||
|
* include/functions_db.php: Fixed get_previous_data and wrote
|
||||||
|
get_next_data.
|
||||||
|
|
||||||
|
2010-04-29 Ramon Novoa <rnovoa@artica.es>
|
||||||
|
|
||||||
|
* include/functions_reporting.php
|
||||||
|
include/functions_db.php
|
||||||
|
|
||||||
2010-04-29 Sergio Martin <sergio.martin@artica.es>
|
2010-04-29 Sergio Martin <sergio.martin@artica.es>
|
||||||
|
|
||||||
* godmode/setup/gis_step_2.php: Fixed the creation
|
* godmode/setup/gis_step_2.php: Fixed the creation
|
||||||
|
|
|
@ -2515,13 +2515,37 @@ function get_previous_data ($id_agent_module, $utimestamp = 0) {
|
||||||
if (empty ($utimestamp))
|
if (empty ($utimestamp))
|
||||||
$utimestamp = time ();
|
$utimestamp = time ();
|
||||||
|
|
||||||
|
// 172800 = 60×60×24*2 Search up to 2 days before utimestamp
|
||||||
$interval = get_module_interval ($id_agent_module);
|
$interval = get_module_interval ($id_agent_module);
|
||||||
$sql = sprintf ('SELECT * FROM tagente_datos
|
$sql = sprintf ('SELECT * FROM tagente_datos
|
||||||
WHERE id_agente_modulo = %d
|
WHERE id_agente_modulo = %d
|
||||||
AND utimestamp <= %d
|
AND utimestamp <= %d
|
||||||
AND utimestamp > %d
|
AND utimestamp >= %d
|
||||||
ORDER BY utimestamp DESC',
|
ORDER BY utimestamp DESC',
|
||||||
$id_agent_module, $utimestamp, $utimestamp - $interval);
|
$id_agent_module, $utimestamp, $utimestamp - 172800);
|
||||||
|
|
||||||
|
return get_db_row_sql ($sql, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the next data to the timestamp provided.
|
||||||
|
*
|
||||||
|
* @param int Agent module id
|
||||||
|
* @param int The timestamp to look backwards from and get the data.
|
||||||
|
*
|
||||||
|
* @return mixed The row of tagente_datos of the last period. False if there were no data.
|
||||||
|
*/
|
||||||
|
function get_next_data ($id_agent_module, $utimestamp = 0) {
|
||||||
|
if (empty ($utimestamp))
|
||||||
|
$utimestamp = time ();
|
||||||
|
|
||||||
|
$interval = get_module_interval ($id_agent_module);
|
||||||
|
$sql = sprintf ('SELECT * FROM tagente_datos
|
||||||
|
WHERE id_agente_modulo = %d
|
||||||
|
AND utimestamp <= %d
|
||||||
|
AND utimestamp >= %d
|
||||||
|
ORDER BY utimestamp ASC',
|
||||||
|
$id_agent_module, $utimestamp + $interval, $utimestamp);
|
||||||
|
|
||||||
return get_db_row_sql ($sql, true);
|
return get_db_row_sql ($sql, true);
|
||||||
}
|
}
|
||||||
|
|
|
@ -60,7 +60,7 @@ function get_agentmodule_data_average ($id_agent_module, $period, $date = 0) {
|
||||||
$module_interval = get_module_interval ($id_agent_module);
|
$module_interval = get_module_interval ($id_agent_module);
|
||||||
$previous_data = get_previous_data ($id_agent_module, $datelimit);
|
$previous_data = get_previous_data ($id_agent_module, $datelimit);
|
||||||
if ($previous_data !== false) {
|
if ($previous_data !== false) {
|
||||||
$values = array_merge (array ($previous_data), $values);
|
array_unshift ($interval_data, $values);
|
||||||
}
|
}
|
||||||
|
|
||||||
foreach ($values as $data) {
|
foreach ($values as $data) {
|
||||||
|
@ -253,25 +253,56 @@ function get_agentmodule_sla ($id_agentmodule, $period = 0, $min_value = 1, $max
|
||||||
$interval_data = get_db_all_rows_sql ($sql, true);
|
$interval_data = get_db_all_rows_sql ($sql, true);
|
||||||
if ($interval_data === false) $interval_data = array ();
|
if ($interval_data === false) $interval_data = array ();
|
||||||
|
|
||||||
// Calculate for how long the module has not met the SLA
|
// Get previous data
|
||||||
$mark = 0;
|
$previous_data = get_previous_data ($id_agentmodule, $datelimit);
|
||||||
|
if ($previous_data !== false) {
|
||||||
|
$previous_data['utimestamp'] = $datelimit;
|
||||||
|
array_unshift ($interval_data, $previous_data);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Get next data
|
||||||
|
$next_data = get_next_data ($id_agentmodule, $date);
|
||||||
|
if ($next_data !== false) {
|
||||||
|
$next_data['utimestamp'] = $date;
|
||||||
|
array_push ($interval_data, $next_data);
|
||||||
|
} else {
|
||||||
|
// Propagate the last known data to the end of the interval
|
||||||
|
$next_data = array_pop ($interval_data);
|
||||||
|
array_push ($interval_data, $next_data);
|
||||||
|
$next_data['utimestamp'] = $date;
|
||||||
|
array_push ($interval_data, $next_data);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (count ($interval_data) < 2) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Set initial conditions
|
||||||
$bad_period = 0;
|
$bad_period = 0;
|
||||||
|
$first_data = array_shift ($interval_data);
|
||||||
|
$previous_utimestamp = $first_data['utimestamp'];
|
||||||
|
if ((($max_value > $min_value AND ($first_data['datos'] > $max_value OR $first_data['datos'] < $min_value))) OR
|
||||||
|
($max_value <= $min_value AND $first_data['datos'] < $min_value)) {
|
||||||
|
$previous_status = 1;
|
||||||
|
} else {
|
||||||
|
$previous_status = 0;
|
||||||
|
}
|
||||||
|
|
||||||
foreach ($interval_data as $data) {
|
foreach ($interval_data as $data) {
|
||||||
// bad data
|
// Previous status was critical
|
||||||
|
if ($previous_status == 1) {
|
||||||
|
$bad_period += $data['utimestamp'] - $previous_utimestamp;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Re-calculate previous status for the next data
|
||||||
if ((($max_value > $min_value AND ($data['datos'] > $max_value OR $data['datos'] < $min_value))) OR
|
if ((($max_value > $min_value AND ($data['datos'] > $max_value OR $data['datos'] < $min_value))) OR
|
||||||
($max_value <= $min_value AND $data['datos'] < $min_value)) {
|
($max_value <= $min_value AND $data['datos'] < $min_value)) {
|
||||||
// good data turns bad
|
$previous_status = 1;
|
||||||
if ($mark == 0) {
|
|
||||||
$mark = $data['utimestamp'];
|
|
||||||
}
|
|
||||||
// good data
|
|
||||||
} else {
|
} else {
|
||||||
// bad data turns good
|
$previous_status = 0;
|
||||||
if ($mark != 0) {
|
|
||||||
$bad_period += $data['utimestamp'] - $mark;
|
|
||||||
$mark = 0;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
$previous_utimestamp = $data['utimestamp'];
|
||||||
}
|
}
|
||||||
|
|
||||||
// Return the percentage of SLA compliance
|
// Return the percentage of SLA compliance
|
||||||
|
@ -1989,7 +2020,503 @@ function render_report_html_item ($content, $table, $report) {
|
||||||
array_push($table->data, array($cellContent));
|
array_push($table->data, array($cellContent));
|
||||||
$table->colspan[1][0] = 2;
|
$table->colspan[1][0] = 2;
|
||||||
break;
|
break;
|
||||||
|
case 'TTRT':
|
||||||
|
$data = array ();
|
||||||
|
$data[0] = "<h4>" . __('TTRT') . "</h4>";
|
||||||
|
$data[1] = "<h4>$agent_name - $module_name</h4>";
|
||||||
|
array_push ($table->data, $data);
|
||||||
|
|
||||||
|
// Put description at the end of the module (if exists)
|
||||||
|
if ($content["description"] != ""){
|
||||||
|
$table->colspan[1][0] = 3;
|
||||||
|
$data_desc = array();
|
||||||
|
$data_desc[0] = $content["description"];
|
||||||
|
array_push ($table->data, $data_desc);
|
||||||
|
}
|
||||||
|
|
||||||
|
$data = array ();
|
||||||
|
$table->colspan[2][0] = 3;
|
||||||
|
$ttr = get_agentmodule_ttr ($content['id_agent_module'], $content['period'], $report["datetime"]);
|
||||||
|
if ($ttr != 0) $ttr = human_time_description_raw ($ttr);
|
||||||
|
$data[0] = $ttr;
|
||||||
|
array_push ($table->data, $data);
|
||||||
|
break;
|
||||||
|
case 'TTO':
|
||||||
|
$data = array ();
|
||||||
|
$data[0] = "<h4>" . __('TTO') . "</h4>";
|
||||||
|
$data[1] = "<h4>$agent_name - $module_name</h4>";
|
||||||
|
array_push ($table->data, $data);
|
||||||
|
|
||||||
|
// Put description at the end of the module (if exists)
|
||||||
|
if ($content["description"] != ""){
|
||||||
|
$table->colspan[1][0] = 3;
|
||||||
|
$data_desc = array();
|
||||||
|
$data_desc[0] = $content["description"];
|
||||||
|
array_push ($table->data, $data_desc);
|
||||||
|
}
|
||||||
|
|
||||||
|
$data = array ();
|
||||||
|
$table->colspan[2][0] = 3;
|
||||||
|
$tto = get_agentmodule_tto ($content['id_agent_module'], $content['period'], $report["datetime"]);
|
||||||
|
if ($tto != 0) $tto = human_time_description_raw ($tto);
|
||||||
|
$data[0] = $tto;
|
||||||
|
array_push ($table->data, $data);
|
||||||
|
break;
|
||||||
|
case 'MTBF':
|
||||||
|
$data = array ();
|
||||||
|
$data[0] = "<h4>" . __('MTBF') . "</h4>";
|
||||||
|
$data[1] = "<h4>$agent_name - $module_name</h4>";
|
||||||
|
array_push ($table->data, $data);
|
||||||
|
|
||||||
|
// Put description at the end of the module (if exists)
|
||||||
|
if ($content["description"] != ""){
|
||||||
|
$table->colspan[1][0] = 3;
|
||||||
|
$data_desc = array();
|
||||||
|
$data_desc[0] = $content["description"];
|
||||||
|
array_push ($table->data, $data_desc);
|
||||||
|
}
|
||||||
|
|
||||||
|
$data = array ();
|
||||||
|
$table->colspan[2][0] = 3;
|
||||||
|
$mtbf = get_agentmodule_mtbf ($content['id_agent_module'], $content['period'], $report["datetime"]);
|
||||||
|
if ($mtbf != 0) $mtbf = human_time_description_raw ($mtbf);
|
||||||
|
$data[0] = $mtbf;
|
||||||
|
array_push ($table->data, $data);
|
||||||
|
break;
|
||||||
|
case 'MTTR':
|
||||||
|
$data = array ();
|
||||||
|
$data[0] = "<h4>" . __('MTTR') . "</h4>";
|
||||||
|
$data[1] = "<h4>$agent_name - $module_name</h4>";
|
||||||
|
array_push ($table->data, $data);
|
||||||
|
|
||||||
|
// Put description at the end of the module (if exists)
|
||||||
|
if ($content["description"] != ""){
|
||||||
|
$table->colspan[1][0] = 3;
|
||||||
|
$data_desc = array();
|
||||||
|
$data_desc[0] = $content["description"];
|
||||||
|
array_push ($table->data, $data_desc);
|
||||||
|
}
|
||||||
|
|
||||||
|
$data = array ();
|
||||||
|
$table->colspan[2][0] = 3;
|
||||||
|
$mttr = get_agentmodule_mttr ($content['id_agent_module'], $content['period'], $report["datetime"]);
|
||||||
|
if ($mttr != 0) $mttr = human_time_description_raw ($mttr);
|
||||||
|
$data[0] = $mttr;
|
||||||
|
array_push ($table->data, $data);
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the MTBF value of an agent module in a period of time. See
|
||||||
|
* http://en.wikipedia.org/wiki/Mean_time_between_failures
|
||||||
|
*
|
||||||
|
* @param int Agent module id
|
||||||
|
* @param int Period of time to check (in seconds)
|
||||||
|
* @param int Top date to check the values. Default current time.
|
||||||
|
*
|
||||||
|
* @return float The MTBF value in the interval.
|
||||||
|
*/
|
||||||
|
function get_agentmodule_mtbf ($id_agent_module, $period, $date = 0) {
|
||||||
|
|
||||||
|
// Initialize variables
|
||||||
|
if (empty ($date)) $date = get_system_time ();
|
||||||
|
if ((empty ($period)) OR ($period == 0)) $period = $config["sla_period"];
|
||||||
|
|
||||||
|
// Read module configuration
|
||||||
|
$datelimit = $date - $period;
|
||||||
|
$module = get_db_row_sql ('SELECT max_critical, min_critical, id_tipo_modulo
|
||||||
|
FROM tagente_modulo
|
||||||
|
WHERE id_agente_modulo = ' . (int) $id_agent_module);
|
||||||
|
if ($module === false) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
$critical_min = $module['min_critical'];
|
||||||
|
$critical_max = $module['max_critical'];
|
||||||
|
$module_type = $module['id_tipo_modulo'];
|
||||||
|
|
||||||
|
// Set critical_min and critical for proc modules
|
||||||
|
$module_type_str = get_module_type_name ($module_type);
|
||||||
|
if (strstr ($module_type_str, 'proc') !== false &&
|
||||||
|
($critical_min == 0 && $critical_max == 0)) {
|
||||||
|
$critical_min = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Get module data
|
||||||
|
$interval_data = get_db_all_rows_sql ('SELECT * FROM tagente_datos
|
||||||
|
WHERE id_agente_modulo = ' . (int) $id_agent_module .
|
||||||
|
' AND utimestamp > ' . (int) $datelimit .
|
||||||
|
' AND utimestamp < ' . (int) $date .
|
||||||
|
' ORDER BY utimestamp ASC', true);
|
||||||
|
if ($interval_data === false) $interval_data = array ();
|
||||||
|
|
||||||
|
// Get previous data
|
||||||
|
$previous_data = get_previous_data ($id_agent_module, $datelimit);
|
||||||
|
if ($previous_data !== false) {
|
||||||
|
$previous_data['utimestamp'] = $datelimit;
|
||||||
|
array_unshift ($interval_data, $previous_data);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Get next data
|
||||||
|
$next_data = get_next_data ($id_agent_module, $date);
|
||||||
|
if ($next_data !== false) {
|
||||||
|
$next_data['utimestamp'] = $date;
|
||||||
|
array_push ($interval_data, $next_data);
|
||||||
|
} else {
|
||||||
|
// Propagate the last known data to the end of the interval
|
||||||
|
$next_data = array_pop ($interval_data);
|
||||||
|
array_push ($interval_data, $next_data);
|
||||||
|
$next_data['utimestamp'] = $date;
|
||||||
|
array_push ($interval_data, $next_data);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (count ($interval_data) < 2) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Set initial conditions
|
||||||
|
$critical_period = 0;
|
||||||
|
$first_data = array_shift ($interval_data);
|
||||||
|
$previous_utimestamp = $first_data['utimestamp'];
|
||||||
|
if ((($critical_max > $critical_min AND ($first_data['datos'] > $critical_max OR $first_data['datos'] < $critical_min))) OR
|
||||||
|
($critical_max <= $critical_min AND $first_data['datos'] < $critical_min)) {
|
||||||
|
$previous_status = 1;
|
||||||
|
$critical_count = 1;
|
||||||
|
} else {
|
||||||
|
$previous_status = 0;
|
||||||
|
$critical_count = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
foreach ($interval_data as $data) {
|
||||||
|
// Previous status was critical
|
||||||
|
if ($previous_status == 1) {
|
||||||
|
$critical_period += $data['utimestamp'] - $previous_utimestamp;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Re-calculate previous status for the next data
|
||||||
|
if ((($critical_max > $critical_min AND ($data['datos'] > $critical_max OR $data['datos'] < $critical_min))) OR
|
||||||
|
($critical_max <= $critical_min AND $data['datos'] < $critical_min)) {
|
||||||
|
if ($previous_status == 0) {
|
||||||
|
$critical_count++;
|
||||||
|
}
|
||||||
|
$previous_status = 1;
|
||||||
|
} else {
|
||||||
|
$previous_status = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
$previous_utimestamp = $data['utimestamp'];
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($critical_count == 0) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
return ($period - $critical_period) / $critical_count;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the MTTR value of an agent module in a period of time. See
|
||||||
|
* http://en.wikipedia.org/wiki/Mean_time_to_recovery
|
||||||
|
*
|
||||||
|
* @param int Agent module id
|
||||||
|
* @param int Period of time to check (in seconds)
|
||||||
|
* @param int Top date to check the values. Default current time.
|
||||||
|
*
|
||||||
|
* @return float The MTTR value in the interval.
|
||||||
|
*/
|
||||||
|
function get_agentmodule_mttr ($id_agent_module, $period, $date = 0) {
|
||||||
|
|
||||||
|
// Initialize variables
|
||||||
|
if (empty ($date)) $date = get_system_time ();
|
||||||
|
if ((empty ($period)) OR ($period == 0)) $period = $config["sla_period"];
|
||||||
|
|
||||||
|
// Read module configuration
|
||||||
|
$datelimit = $date - $period;
|
||||||
|
$module = get_db_row_sql ('SELECT max_critical, min_critical, id_tipo_modulo
|
||||||
|
FROM tagente_modulo
|
||||||
|
WHERE id_agente_modulo = ' . (int) $id_agent_module);
|
||||||
|
if ($module === false) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
$critical_min = $module['min_critical'];
|
||||||
|
$critical_max = $module['max_critical'];
|
||||||
|
$module_type = $module['id_tipo_modulo'];
|
||||||
|
|
||||||
|
// Set critical_min and critical for proc modules
|
||||||
|
$module_type_str = get_module_type_name ($module_type);
|
||||||
|
if (strstr ($module_type_str, 'proc') !== false &&
|
||||||
|
($critical_min == 0 && $critical_max == 0)) {
|
||||||
|
$critical_min = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Get module data
|
||||||
|
$interval_data = get_db_all_rows_sql ('SELECT * FROM tagente_datos
|
||||||
|
WHERE id_agente_modulo = ' . (int) $id_agent_module .
|
||||||
|
' AND utimestamp > ' . (int) $datelimit .
|
||||||
|
' AND utimestamp < ' . (int) $date .
|
||||||
|
' ORDER BY utimestamp ASC', true);
|
||||||
|
if ($interval_data === false) $interval_data = array ();
|
||||||
|
|
||||||
|
// Get previous data
|
||||||
|
$previous_data = get_previous_data ($id_agent_module, $datelimit);
|
||||||
|
if ($previous_data !== false) {
|
||||||
|
$previous_data['utimestamp'] = $datelimit;
|
||||||
|
array_unshift ($interval_data, $previous_data);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Get next data
|
||||||
|
$next_data = get_next_data ($id_agent_module, $date);
|
||||||
|
if ($next_data !== false) {
|
||||||
|
$next_data['utimestamp'] = $date;
|
||||||
|
array_push ($interval_data, $next_data);
|
||||||
|
} else {
|
||||||
|
// Propagate the last known data to the end of the interval
|
||||||
|
$next_data = array_pop ($interval_data);
|
||||||
|
array_push ($interval_data, $next_data);
|
||||||
|
$next_data['utimestamp'] = $date;
|
||||||
|
array_push ($interval_data, $next_data);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (count ($interval_data) < 2) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Set initial conditions
|
||||||
|
$critical_period = 0;
|
||||||
|
$first_data = array_shift ($interval_data);
|
||||||
|
$previous_utimestamp = $first_data['utimestamp'];
|
||||||
|
if ((($critical_max > $critical_min AND ($first_data['datos'] > $critical_max OR $first_data['datos'] < $critical_min))) OR
|
||||||
|
($critical_max <= $critical_min AND $first_data['datos'] < $critical_min)) {
|
||||||
|
$previous_status = 1;
|
||||||
|
$critical_count = 1;
|
||||||
|
} else {
|
||||||
|
$previous_status = 0;
|
||||||
|
$critical_count = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
foreach ($interval_data as $data) {
|
||||||
|
// Previous status was critical
|
||||||
|
if ($previous_status == 1) {
|
||||||
|
$critical_period += $data['utimestamp'] - $previous_utimestamp;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Re-calculate previous status for the next data
|
||||||
|
if ((($critical_max > $critical_min AND ($data['datos'] > $critical_max OR $data['datos'] < $critical_min))) OR
|
||||||
|
($critical_max <= $critical_min AND $data['datos'] < $critical_min)) {
|
||||||
|
if ($previous_status == 0) {
|
||||||
|
$critical_count++;
|
||||||
|
}
|
||||||
|
$previous_status = 1;
|
||||||
|
} else {
|
||||||
|
$previous_status = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
$previous_utimestamp = $data['utimestamp'];
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($critical_count == 0) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
return $critical_period / $critical_count;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the TTO value of an agent module in a period of time.
|
||||||
|
*
|
||||||
|
* @param int Agent module id
|
||||||
|
* @param int Period of time to check (in seconds)
|
||||||
|
* @param int Top date to check the values. Default current time.
|
||||||
|
*
|
||||||
|
* @return float The TTO value in the interval.
|
||||||
|
*/
|
||||||
|
function get_agentmodule_tto ($id_agent_module, $period, $date = 0) {
|
||||||
|
|
||||||
|
// Initialize variables
|
||||||
|
if (empty ($date)) $date = get_system_time ();
|
||||||
|
if ((empty ($period)) OR ($period == 0)) $period = $config["sla_period"];
|
||||||
|
|
||||||
|
// Read module configuration
|
||||||
|
$datelimit = $date - $period;
|
||||||
|
$module = get_db_row_sql ('SELECT max_critical, min_critical, id_tipo_modulo
|
||||||
|
FROM tagente_modulo
|
||||||
|
WHERE id_agente_modulo = ' . (int) $id_agent_module);
|
||||||
|
if ($module === false) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
$critical_min = $module['min_critical'];
|
||||||
|
$critical_max = $module['max_critical'];
|
||||||
|
$module_type = $module['id_tipo_modulo'];
|
||||||
|
|
||||||
|
// Set critical_min and critical for proc modules
|
||||||
|
$module_type_str = get_module_type_name ($module_type);
|
||||||
|
if (strstr ($module_type_str, 'proc') !== false &&
|
||||||
|
($critical_min == 0 && $critical_max == 0)) {
|
||||||
|
$critical_min = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Get module data
|
||||||
|
$interval_data = get_db_all_rows_sql ('SELECT * FROM tagente_datos
|
||||||
|
WHERE id_agente_modulo = ' . (int) $id_agent_module .
|
||||||
|
' AND utimestamp > ' . (int) $datelimit .
|
||||||
|
' AND utimestamp < ' . (int) $date .
|
||||||
|
' ORDER BY utimestamp ASC', true);
|
||||||
|
if ($interval_data === false) $interval_data = array ();
|
||||||
|
|
||||||
|
// Get previous data
|
||||||
|
$previous_data = get_previous_data ($id_agent_module, $datelimit);
|
||||||
|
if ($previous_data !== false) {
|
||||||
|
$previous_data['utimestamp'] = $datelimit;
|
||||||
|
array_unshift ($interval_data, $previous_data);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Get next data
|
||||||
|
$next_data = get_next_data ($id_agent_module, $date);
|
||||||
|
if ($next_data !== false) {
|
||||||
|
$next_data['utimestamp'] = $date;
|
||||||
|
array_push ($interval_data, $next_data);
|
||||||
|
} else {
|
||||||
|
// Propagate the last known data to the end of the interval
|
||||||
|
$next_data = array_pop ($interval_data);
|
||||||
|
array_push ($interval_data, $next_data);
|
||||||
|
$next_data['utimestamp'] = $date;
|
||||||
|
array_push ($interval_data, $next_data);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (count ($interval_data) < 2) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Set initial conditions
|
||||||
|
$critical_period = 0;
|
||||||
|
$first_data = array_shift ($interval_data);
|
||||||
|
$previous_utimestamp = $first_data['utimestamp'];
|
||||||
|
if ((($critical_max > $critical_min AND ($first_data['datos'] > $critical_max OR $first_data['datos'] < $critical_min))) OR
|
||||||
|
($critical_max <= $critical_min AND $first_data['datos'] < $critical_min)) {
|
||||||
|
$previous_status = 1;
|
||||||
|
} else {
|
||||||
|
$previous_status = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
foreach ($interval_data as $data) {
|
||||||
|
// Previous status was critical
|
||||||
|
if ($previous_status == 1) {
|
||||||
|
$critical_period += $data['utimestamp'] - $previous_utimestamp;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Re-calculate previous status for the next data
|
||||||
|
if ((($critical_max > $critical_min AND ($data['datos'] > $critical_max OR $data['datos'] < $critical_min))) OR
|
||||||
|
($critical_max <= $critical_min AND $data['datos'] < $critical_min)) {
|
||||||
|
$previous_status = 1;
|
||||||
|
} else {
|
||||||
|
$previous_status = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
$previous_utimestamp = $data['utimestamp'];
|
||||||
|
}
|
||||||
|
|
||||||
|
return $period - $critical_period;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the TTR value of an agent module in a period of time.
|
||||||
|
*
|
||||||
|
* @param int Agent module id
|
||||||
|
* @param int Period of time to check (in seconds)
|
||||||
|
* @param int Top date to check the values. Default current time.
|
||||||
|
*
|
||||||
|
* @return float The TTR value in the interval.
|
||||||
|
*/
|
||||||
|
function get_agentmodule_ttr ($id_agent_module, $period, $date = 0) {
|
||||||
|
|
||||||
|
// Initialize variables
|
||||||
|
if (empty ($date)) $date = get_system_time ();
|
||||||
|
if ((empty ($period)) OR ($period == 0)) $period = $config["sla_period"];
|
||||||
|
|
||||||
|
// Read module configuration
|
||||||
|
$datelimit = $date - $period;
|
||||||
|
$module = get_db_row_sql ('SELECT max_critical, min_critical, id_tipo_modulo
|
||||||
|
FROM tagente_modulo
|
||||||
|
WHERE id_agente_modulo = ' . (int) $id_agent_module);
|
||||||
|
if ($module === false) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
$critical_min = $module['min_critical'];
|
||||||
|
$critical_max = $module['max_critical'];
|
||||||
|
$module_type = $module['id_tipo_modulo'];
|
||||||
|
|
||||||
|
// Set critical_min and critical for proc modules
|
||||||
|
$module_type_str = get_module_type_name ($module_type);
|
||||||
|
if (strstr ($module_type_str, 'proc') !== false &&
|
||||||
|
($critical_min == 0 && $critical_max == 0)) {
|
||||||
|
$critical_min = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Get module data
|
||||||
|
$interval_data = get_db_all_rows_sql ('SELECT * FROM tagente_datos
|
||||||
|
WHERE id_agente_modulo = ' . (int) $id_agent_module .
|
||||||
|
' AND utimestamp > ' . (int) $datelimit .
|
||||||
|
' AND utimestamp < ' . (int) $date .
|
||||||
|
' ORDER BY utimestamp ASC', true);
|
||||||
|
if ($interval_data === false) $interval_data = array ();
|
||||||
|
|
||||||
|
// Get previous data
|
||||||
|
$previous_data = get_previous_data ($id_agent_module, $datelimit);
|
||||||
|
if ($previous_data !== false) {
|
||||||
|
$previous_data['utimestamp'] = $datelimit;
|
||||||
|
array_unshift ($interval_data, $previous_data);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Get next data
|
||||||
|
$next_data = get_next_data ($id_agent_module, $date);
|
||||||
|
if ($next_data !== false) {
|
||||||
|
$next_data['utimestamp'] = $date;
|
||||||
|
array_push ($interval_data, $next_data);
|
||||||
|
} else {
|
||||||
|
// Propagate the last known data to the end of the interval
|
||||||
|
$next_data = array_pop ($interval_data);
|
||||||
|
array_push ($interval_data, $next_data);
|
||||||
|
$next_data['utimestamp'] = $date;
|
||||||
|
array_push ($interval_data, $next_data);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (count ($interval_data) < 2) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Set initial conditions
|
||||||
|
$critical_period = 0;
|
||||||
|
$first_data = array_shift ($interval_data);
|
||||||
|
$previous_utimestamp = $first_data['utimestamp'];
|
||||||
|
if ((($critical_max > $critical_min AND ($first_data['datos'] > $critical_max OR $first_data['datos'] < $critical_min))) OR
|
||||||
|
($critical_max <= $critical_min AND $first_data['datos'] < $critical_min)) {
|
||||||
|
$previous_status = 1;
|
||||||
|
} else {
|
||||||
|
$previous_status = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
foreach ($interval_data as $data) {
|
||||||
|
// Previous status was critical
|
||||||
|
if ($previous_status == 1) {
|
||||||
|
$critical_period += $data['utimestamp'] - $previous_utimestamp;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Re-calculate previous status for the next data
|
||||||
|
if ((($critical_max > $critical_min AND ($data['datos'] > $critical_max OR $data['datos'] < $critical_min))) OR
|
||||||
|
($critical_max <= $critical_min AND $data['datos'] < $critical_min)) {
|
||||||
|
$previous_status = 1;
|
||||||
|
} else {
|
||||||
|
$previous_status = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
$previous_utimestamp = $data['utimestamp'];
|
||||||
|
}
|
||||||
|
|
||||||
|
return $critical_period;
|
||||||
|
}
|
||||||
|
|
||||||
?>
|
?>
|
||||||
|
|
Loading…
Reference in New Issue