diff --git a/pandora_console/godmode/reporting/reporting_builder.item_editor.php b/pandora_console/godmode/reporting/reporting_builder.item_editor.php
index db18ce556c..b4d0ab5a14 100755
--- a/pandora_console/godmode/reporting/reporting_builder.item_editor.php
+++ b/pandora_console/godmode/reporting/reporting_builder.item_editor.php
@@ -136,6 +136,7 @@ switch ($action) {
switch ($type) {
case 'SLA_monthly':
case 'SLA_weekly':
+ case 'SLA_hourly':
case 'SLA_services':
case 'SLA':
case 'top_n':
@@ -143,6 +144,11 @@ switch ($action) {
case 'general':
case 'network_interfaces_report':
case 'availability':
+<<<<<<< HEAD
+=======
+ case 'availability_graph':
+ case 'agent_module':
+>>>>>>> 2b0820d... add new reports sla_hourly , weekly and availability graph
$get_data_editor = true;
break;
@@ -233,23 +239,9 @@ switch ($action) {
$period = $item['period'];
$idCustomGraph = $item['id_gs'];
break;
+
case 'SLA':
- $description = $item['description'];
- $period = $item['period'];
- $only_display_wrong = $item['only_display_wrong'];
- $monday = $item['monday'];
- $tuesday = $item['tuesday'];
- $wednesday = $item['wednesday'];
- $thursday = $item['thursday'];
- $friday = $item['friday'];
- $saturday = $item['saturday'];
- $sunday = $item['sunday'];
- $time_from = $item['time_from'];
- $time_to = $item['time_to'];
- $show_graph = $item['show_graph'];
- // 'top_n' filed will be reused for SLA sort option
- $sla_sorted_by = $item['top_n'];
- break;
+ case 'SLA_weekly':
case 'SLA_monthly':
$description = $item['description'];
$only_display_wrong = $item['only_display_wrong'];
@@ -268,6 +260,9 @@ switch ($action) {
break;
case 'SLA_weekly':
+ case 'SLA_monthly':
+ case 'SLA_hourly':
+ case 'availability_graph';
$description = $item['description'];
$only_display_wrong = $item['only_display_wrong'];
$monday = $item['monday'];
@@ -2450,24 +2445,23 @@ function chooseType() {
$("#row_working_time").show();
$("#row_only_display_wrong").show();
$("#row_show_graph").show();
- //$("#row_show_in_two_columns").show();
$("#row_sort").show();
$('#row_hide_notinit_agents').show();
break;
+
+ case 'availability_graph':
+ $("#row_description").show();
+ $("#row_period").show();
+ $("#sla_list").show();
+ $("#row_working_time").show();
+ break;
case 'SLA_monthly':
- $("#row_description").show();
- $("#sla_list").show();
- $("#row_working_time").show();
- //$("#row_show_in_two_columns").show();
- $("#row_sort").show();
- break;
-
case 'SLA_weekly':
+ case 'SLA_hourly':
$("#row_description").show();
$("#sla_list").show();
$("#row_working_time").show();
- //$("#row_show_in_two_columns").show();
$("#row_sort").show();
break;
diff --git a/pandora_console/godmode/reporting/reporting_builder.list_items.php b/pandora_console/godmode/reporting/reporting_builder.list_items.php
index 197cf7ba2f..84dc835f8f 100755
--- a/pandora_console/godmode/reporting/reporting_builder.list_items.php
+++ b/pandora_console/godmode/reporting/reporting_builder.list_items.php
@@ -223,7 +223,7 @@ if ($moduleFilter != 0) {
// Filter report items created from metaconsole in normal console list and the opposite
if (defined('METACONSOLE') and $config['metaconsole'] == 1) {
$where .= ' AND ((server_name IS NOT NULL AND length(server_name) != 0) ' .
- 'OR ' . $type_escaped . ' IN (\'general\', \'SLA\', \'exception\', \'availability\', \'top_n\',\'SLA_monthly\',\'SLA_weekly\'))';
+ 'OR ' . $type_escaped . ' IN (\'general\', \'SLA\', \'exception\', \'availability\', \'availability_graph\', \'top_n\',\'SLA_monthly\',\'SLA_weekly\',\'SLA_hourly\'))';
}
else
$where .= ' AND ((server_name IS NULL OR length(server_name) = 0) ' .
diff --git a/pandora_console/godmode/reporting/reporting_builder.php b/pandora_console/godmode/reporting/reporting_builder.php
index 563b11577b..2b7c65e7cb 100755
--- a/pandora_console/godmode/reporting/reporting_builder.php
+++ b/pandora_console/godmode/reporting/reporting_builder.php
@@ -937,8 +937,10 @@ switch ($action) {
break;
case 'SLA_monthly':
case 'SLA_weekly':
+ case 'SLA_hourly':
case 'SLA_services':
case 'SLA':
+ case 'availability_graph':
$values['period'] = get_parameter('period');
$values['top_n'] = get_parameter('combo_sla_sort_options',0);
$values['top_n_value'] = get_parameter('quantity');
diff --git a/pandora_console/include/functions_reporting.php b/pandora_console/include/functions_reporting.php
index de7c4d80fd..b1380fe024 100644
--- a/pandora_console/include/functions_reporting.php
+++ b/pandora_console/include/functions_reporting.php
@@ -161,6 +161,11 @@ function reporting_make_reporting_data($report = null, $id_report,
$date,
$time);
break;
+ case 'availability_graph':
+ $report['contents'][] = reporting_availability_graph(
+ $report,
+ $content);
+ break;
case 'sql':
$report['contents'][] = reporting_sql(
$report,
@@ -449,6 +454,19 @@ function reporting_make_reporting_data($report = null, $id_report,
$report,
$content);
break;
+<<<<<<< HEAD
+=======
+ case 'SLA_weekly':
+ $report['contents'][] = reporting_enterprise_sla_weekly(
+ $report,
+ $content);
+ break;
+ case 'SLA_hourly':
+ $report['contents'][] = reporting_enterprise_sla_hourly(
+ $report,
+ $content);
+ break;
+>>>>>>> 2b0820d... add new reports sla_hourly , weekly and availability graph
case 'SLA_services':
$report['contents'][] = reporting_enterprise_sla_services_refactoriced(
$report,
@@ -4639,6 +4657,12 @@ function reporting_advanced_sla ($id_agent_module, $time_from = null, $time_to =
return $return;
}
+/**
+ * reporting_availability
+ *
+ * Generates a structure the report.
+ *
+ */
function reporting_availability($report, $content, $date=false, $time=false) {
global $config;
@@ -4874,6 +4898,394 @@ function reporting_availability($report, $content, $date=false, $time=false) {
return reporting_check_structure_content($return);
}
+/**
+ * reporting_availability_graph
+ *
+ * Generates a structure the report.
+ *
+ */
+function reporting_availability_graph($report, $content, $date=false, $time=false) {
+ global $config;
+ $return = array();
+ $return['type'] = 'availability_graph';
+
+ if (empty($content['name'])) {
+ $content['name'] = __('Availability');
+ }
+
+ $return['title'] = $content['name'];
+ $return["description"] = $content["description"];
+ $return["date"] = reporting_get_date_text($report, $content);
+
+ // Get chart
+ reporting_set_conf_charts($width, $height, $only_image, $type,
+ $content, $ttl);
+
+
+ $return["id_rc"] = $content['id_rc'];
+
+ $edge_interval = 10;
+
+ if (empty($content['subitems'])) {
+ $slas = db_get_all_rows_field_filter (
+ 'treport_content_sla_combined',
+ 'id_report_content', $content['id_rc']);
+ }
+ else {
+ $slas = $content['subitems'];
+ }
+
+ if (empty($slas)) {
+ $return['failed'] = __('There are no SLAs defined');
+ }
+ else {
+ require_once ($config['homedir'] . '/include/functions_planned_downtimes.php');
+ $metaconsole_on = is_metaconsole();
+
+ $urlImage = ui_get_full_url(false, true, false, false);
+
+ $sla_failed = false;
+ $total_SLA = 0;
+ $total_result_SLA = 'ok';
+ $sla_showed = array();
+ $sla_showed_values = array();
+
+ foreach ($slas as $sla) {
+ $server_name = $sla ['server_name'];
+ //Metaconsole connection
+ if ($metaconsole_on && $server_name != '') {
+ $connection = metaconsole_get_connection($server_name);
+ if (!metaconsole_load_external_db($connection)) {
+ //ui_print_error_message ("Error connecting to ".$server_name);
+ continue;
+ }
+ }
+
+ if (modules_is_disable_agent($sla['id_agent_module'])
+ || modules_is_not_init($sla['id_agent_module'])) {
+ if ($metaconsole_on) {
+ //Restore db connection
+ metaconsole_restore_db();
+ }
+
+ continue;
+ }
+
+ //controller min and max == 0 then dinamic min and max critical
+ $dinamic_text = 0;
+ if($sla['sla_min'] == 0 && $sla['sla_max'] == 0){
+ $sla['sla_min'] = null;
+ $sla['sla_max'] = null;
+ $dinamic_text = __('Dynamic');
+ }
+
+ //controller inverse interval
+ $inverse_interval = 0;
+ if( (isset($sla['sla_max'])) && (isset($sla['sla_min'])) ) {
+ if($sla['sla_max'] < $sla['sla_min']){
+ $content_sla_max = $sla['sla_max'];
+ $sla['sla_max'] = $sla['sla_min'];
+ $sla['sla_min'] = $content_sla_max;
+ $inverse_interval = 1;
+ $dinamic_text = __('Inverse');
+ }
+ }
+
+ //for graph slice for module-interval, if not slice=0;
+ $module_interval = modules_get_interval ($sla['id_agent_module']);
+ $slice = $content["period"] / $module_interval;
+
+ //call functions sla
+ $sla_array = array();
+ $sla_array = reporting_advanced_sla(
+ $sla['id_agent_module'],
+ $report["datetime"] - $content['period'],
+ $report["datetime"],
+ $sla['sla_min'], // min_value -> dynamic
+ $sla['sla_max'], // max_value -> dynamic
+ $inverse_interval, // inverse_interval -> dynamic
+ array ( "1" => $content["sunday"],
+ "2" => $content["monday"],
+ "3" => $content["tuesday"],
+ "4" => $content["wednesday"],
+ "5" => $content["thursday"],
+ "6" => $content["friday"],
+ "7" => $content["saturday"]
+ ),
+ $content['time_from'],
+ $content['time_to'],
+ $slice
+ );
+
+
+ if ($metaconsole_on) {
+ //Restore db connection
+ metaconsole_restore_db();
+ }
+
+ $server_name = $sla ['server_name'];
+ //Metaconsole connection
+ if ($metaconsole_on && $server_name != '') {
+ $connection = metaconsole_get_connection($server_name);
+ if (metaconsole_connect($connection) != NOERR) {
+ continue;
+ }
+ }
+
+ $planned_downtimes = reporting_get_planned_downtimes_intervals($sla['id_agent_module'], $report['datetime'] - $content['period'], $report['datetime']);
+
+ if ( (is_array($planned_downtimes)) && (count($planned_downtimes) > 0)){
+ // Sort retrieved planned downtimes
+ usort($planned_downtimes, function ($a, $b) {
+ $a = intval($a["date_from"]);
+ $b = intval($b["date_from"]);
+ if ($a==$b) {
+ return 0;
+ }
+ return ($a<$b)?-1:1;
+ });
+
+ // Compress (overlapped) planned downtimes
+ $npd = count($planned_downtimes);
+ for ($i=0; $i<$npd; $i++) {
+ if (isset($planned_downtimes[$i+1])) {
+ if ($planned_downtimes[$i]["date_to"] >= $planned_downtimes[$i+1]["date_from"]) {
+ // merge
+ $planned_downtimes[$i]["date_to"] = $planned_downtimes[$i+1]["date_to"];
+ array_splice ($planned_downtimes, $i+1, 1);
+ $npd--;
+ }
+ }
+ }
+ }
+ else {
+ $planned_downtimes = null;
+ }
+
+ $data = array();
+ $data['agent'] = modules_get_agentmodule_agent_name($sla['id_agent_module']);
+ $data['module'] = modules_get_agentmodule_name($sla['id_agent_module']);
+ $data['max'] = $sla['sla_max'];
+ $data['min'] = $sla['sla_min'];
+ $data['sla_limit'] = $sla['sla_limit'];
+ $data['dinamic_text'] = $dinamic_text;
+
+ if(isset($sla_array[0])){
+ $data['time_total'] = 0;
+ $data['time_ok'] = 0;
+ $data['time_error'] = 0;
+ $data['time_unknown'] = 0;
+ $data['time_not_init'] = 0;
+ $data['time_downtime'] = 0;
+ $data['checks_total'] = 0;
+ $data['checks_ok'] = 0;
+ $data['checks_error'] = 0;
+ $data['checks_unknown'] = 0;
+ $data['checks_not_init'] = 0;
+
+ $raw_graph = array();
+ $i = 0;
+ foreach ($sla_array as $value_sla) {
+ $data['time_total'] += $value_sla['time_total'];
+ $data['time_ok'] += $value_sla['time_ok'];
+ $data['time_error'] += $value_sla['time_error'];
+ $data['time_unknown'] += $value_sla['time_unknown'];
+ $data['time_downtime'] += $value_sla['time_downtime'];
+ $data['time_not_init'] += $value_sla['time_not_init'];
+ $data['checks_total'] += $value_sla['checks_total'];
+ $data['checks_ok'] += $value_sla['checks_ok'];
+ $data['checks_error'] += $value_sla['checks_error'];
+ $data['checks_unknown'] += $value_sla['checks_unknown'];
+ $data['checks_not_init'] += $value_sla['checks_not_init'];
+
+ // generate raw data for graph
+ if ($value_sla['time_total'] != 0) {
+ if ($value_sla['time_error'] > 0) { // ERR
+ $raw_graph[$i]['data'] = 3;
+ }
+ elseif ($value_sla['time_unknown'] > 0) { // UNKNOWN
+ $raw_graph[$i]['data'] = 4;
+ }
+ elseif ($value_sla['time_not_init'] == $value_sla['time_total']) { // NOT INIT
+ $raw_graph[$i]['data'] = 6;
+ }
+ else {
+ $raw_graph[$i]['data'] = 1;
+ }
+ }
+ else {
+ $raw_graph[$i]['data'] = 7;
+ }
+ $raw_graph[$i]['utimestamp'] = $value_sla['date_to'] - $value_sla['date_from'];
+
+ if (isset($planned_downtimes)) {
+ foreach($planned_downtimes as $pd){
+ if( ($value_sla['date_from'] >= $pd['date_from'])
+ && ($value_sla['date_to'] <= $pd['date_to']) ) {
+ $raw_graph[$i]['data'] = 5; // in scheduled downtime
+ break;
+ }
+ }
+ }
+ $i++;
+ }
+ $data['sla_value'] = ($data['time_ok']/($data['time_ok']+$data['time_error']))*100;
+ $data['sla_fixed'] = sla_truncate($data['sla_value'], $config['graph_precision'] );
+ }
+ else{
+ //Show only table not divider in slice for defect slice=1
+ $data['time_total'] = $sla_array['time_total'];
+ $data['time_ok'] = $sla_array['time_ok'];
+ $data['time_error'] = $sla_array['time_error'];
+ $data['time_unknown'] = $sla_array['time_unknown'];
+ $data['time_downtime'] = $sla_array['time_downtime'];
+ $data['time_not_init'] = $sla_array['time_not_init'];
+ $data['checks_total'] = $sla_array['checks_total'];
+ $data['checks_ok'] = $sla_array['checks_ok'];
+ $data['checks_error'] = $sla_array['checks_error'];
+ $data['checks_unknown'] = $sla_array['checks_unknown'];
+ $data['checks_not_init'] = $sla_array['checks_not_init'];
+ $data['sla_value'] = $sla_array['SLA'];
+ }
+
+ //checks whether or not it meets the SLA
+ if ($data['sla_value'] >= $sla['sla_limit']) {
+ $data['sla_status'] = 1;
+ $sla_failed = false;
+ }
+ else {
+ $sla_failed = true;
+ $data['sla_status'] = 0;
+ }
+
+ //Do not show right modules if 'only_display_wrong' is active
+ if($content['only_display_wrong'] && $sla_failed == false){
+ continue;
+ }
+
+ //find order
+ $data['order'] = $data['sla_value'];
+ $return['data'][] = $data;
+
+ // Slice graphs calculation
+ $dataslice = array();
+ $dataslice['agent'] = modules_get_agentmodule_agent_name ($sla['id_agent_module']);
+ $dataslice['module'] = modules_get_agentmodule_name ($sla['id_agent_module']);
+ $dataslice['order'] = $data['sla_value'];
+ $dataslice['checks_total'] = $data['checks_total'];
+ $dataslice['checks_ok'] = $data['checks_ok'];
+ $dataslice['sla_status'] = $data['sla_status'];
+ $dataslice['sla_value'] = $data['sla_value'];
+
+ $dataslice['chart'] = graph_sla_slicebar(
+ $sla['id_agent_module'],
+ $content['period'],
+ $sla['sla_min'],
+ $sla['sla_max'],
+ $report['datetime'],
+ $content,
+ $content['time_from'],
+ $content['time_to'],
+ 1920,
+ 50,
+ $urlImage,
+ 5,
+ $raw_graph,
+ false);
+
+ $return['charts'][] = $dataslice;
+
+ if ($metaconsole_on) {
+ //Restore db connection
+ metaconsole_restore_db();
+ }
+
+ }
+
+ // SLA items sorted descending ()
+ if ($content['top_n'] == 2) {
+ arsort($return['data']['']);
+ }
+ // SLA items sorted ascending
+ else if ($content['top_n'] == 1) {
+ asort($sla_showed_values);
+ }
+
+ //order data for ascending or descending
+ if($content['top_n'] != 0){
+ switch ($content['top_n']) {
+ case 1:
+ //order tables
+ $temp = array();
+ foreach ($return['data'] as $row) {
+ $i = 0;
+ foreach ($temp as $t_row) {
+ if ($row['sla_value'] < $t_row['order']) {
+ break;
+ }
+ $i++;
+ }
+ array_splice($temp, $i, 0, array($row));
+ }
+ $return['data'] = $temp;
+
+ //order graphs
+ $temp = array();
+ foreach ($return['charts'] as $row) {
+ $i = 0;
+ foreach ($temp as $t_row) {
+ if ($row['sla_value'] < $t_row['order']) {
+ break;
+ }
+ $i++;
+ }
+ array_splice($temp, $i, 0, array($row));
+ }
+ $return['charts'] = $temp;
+
+ break;
+ case 2:
+ //order tables
+ $temp = array();
+ foreach ($return['data'] as $row) {
+ $i = 0;
+ foreach ($temp as $t_row) {
+ if ($row['sla_value'] > $t_row['order']) {
+ break;
+ }
+ $i++;
+ }
+ array_splice($temp, $i, 0, array($row));
+ }
+ $return['data'] = $temp;
+
+ //order graph
+ $temp = array();
+ foreach ($return['charts'] as $row) {
+ $i = 0;
+ foreach ($temp as $t_row) {
+ if ($row['sla_value'] > $t_row['order']) {
+ break;
+ }
+ $i++;
+ }
+ array_splice($temp, $i, 0, array($row));
+ }
+ $return['charts'] = $temp;
+
+ break;
+ }
+ }
+ }
+ return reporting_check_structure_content($return);
+}
+
+/**
+ * reporting_general
+ *
+ * Generates a structure the report.
+ *
+ */
function reporting_general($report, $content) {
global $config;
diff --git a/pandora_console/include/functions_reporting_html.php b/pandora_console/include/functions_reporting_html.php
index da4f30cd52..6323ba9c63 100644
--- a/pandora_console/include/functions_reporting_html.php
+++ b/pandora_console/include/functions_reporting_html.php
@@ -137,6 +137,9 @@ function reporting_html_print_report($report, $mini = false) {
case 'availability':
reporting_html_availability($table, $item);
break;
+ case 'availability_graph':
+ reporting_html_availability_graph($table, $item);
+ break;
case 'general':
reporting_html_general($table, $item);
break;
@@ -276,6 +279,9 @@ function reporting_html_print_report($report, $mini = false) {
case 'SLA_weekly':
reporting_enterprise_html_SLA_weekly($table, $item, $mini);
break;
+ case 'SLA_hourly':
+ reporting_enterprise_html_SLA_hourly($table, $item, $mini);
+ break;
case 'SLA_services':
reporting_enterprise_html_SLA_services($table, $item, $mini);
break;
@@ -2151,6 +2157,37 @@ function reporting_html_availability(&$table, $item) {
}
}
+function reporting_html_availability_graph(&$table, $item, $pdf=0) {
+ $table1 = new stdClass();
+ $table1->width = '99%';
+ $table1->data = array ();
+ if (!$hide_notinit_agent) {
+ foreach ($item['charts'] as $chart) {
+ $table1->data[] = array(
+ $chart['agent'] . "
" . $chart['module'],
+ $chart['chart'],
+ "" . sla_truncate($chart['sla_value'], $config['graph_precision']) . '%',
+ "(" . $chart['checks_ok'] . "/" . $chart['checks_total'] . ")"
+ );
+ }
+ }
+ else{
+ foreach ($item['charts'] as $chart) {
+ $the_first_men_time = get_agent_first_time(io_safe_output($chart['agent']));
+ if ($item['date']['to'] > $the_first_men_time) {
+ $table1->data[] = array(
+ $chart['agent'] . "
" . $chart['module'],
+ $chart['chart']);
+ }
+ }
+ }
+ $table->colspan['charts']['cell'] = 2;
+ $table->data['charts']['cell'] = html_print_table($table1, true);
+ if($pdf){
+ return html_print_table($table, true);
+ }
+}
+
function get_agent_first_time ($agent_name) {
$id = agents_get_agent_id($agent_name, true);
diff --git a/pandora_console/include/functions_reports.php b/pandora_console/include/functions_reports.php
index a65c549a50..9bd7cc8e22 100755
--- a/pandora_console/include/functions_reports.php
+++ b/pandora_console/include/functions_reports.php
@@ -519,6 +519,9 @@ function reports_get_report_types ($template = false, $not_editor = false) {
$types['automatic_graph'] = array('optgroup' => __('Graphs'),
'name' => __('Automatic combined Graph'));
}
+
+ $types['availability_graph'] = array('optgroup' => __('Graphs'),
+ 'name' => __('Availability graph'));
@@ -540,6 +543,8 @@ function reports_get_report_types ($template = false, $not_editor = false) {
'name' => __('Monthly S.L.A.'));
$types['SLA_weekly'] = array('optgroup' => __('SLA'),
'name' => __('Weekly S.L.A.'));
+ $types['SLA_hourly'] = array('optgroup' => __('SLA'),
+ 'name' => __('Hourly S.L.A.'));
if (!$config['metaconsole'] && !$template) {
$types['SLA_services'] = array('optgroup' => __('SLA'),
diff --git a/pandora_console/include/styles/pandora.css b/pandora_console/include/styles/pandora.css
index 060749ccf2..d779dd3513 100644
--- a/pandora_console/include/styles/pandora.css
+++ b/pandora_console/include/styles/pandora.css
@@ -3582,3 +3582,10 @@ color:#82b92e;font-family:Nunito;font-size:10pt;position:relative;top:6px;
float:left;
margin-left: 20px;
}
+<<<<<<< HEAD
+=======
+#table_hourly,
+#table_hourly2{
+ border-spacing: 2px;
+}
+>>>>>>> 2b0820d... add new reports sla_hourly , weekly and availability graph