} foreach ($customer["graphs"] as $graph_key => $graph) { $graph_items = ""; if (isset($graph["graph_item_id"])) { foreach ($graph["graph_item_id"] as $graph_item) { debug(" Graph: " . $graph["id"] . " Item: " . $graph_item); } $graph_items = join(",", $graph["graph_item_id"]); } else { debug(" Graph: " . $graph["id"] . " Items: ALL"); } /* Process graph */ if ($process_billing) { $graph_values = process_graph($graph["id"], $graph_items, $customer_time["start"], $customer_time["end"]); } elseif ($process_threshold) { $graph_values = process_graph($graph["id"], $graph_items, $customer_time["threshold_start"], $customer_time["threshold_end"]); } else { $graph_values = array(); } if (sizeof($graph_values) > 0 && is_array($graph_values)) { if ($debug) { /* just to show progress */ foreach ($graph_values as $field => $field_data) { debug(" Item: " . $field . " Value: " . $field_data["value_text"]); } } /* add customer graph values to processing matrix */ $config_customers[$customer_key]["graphs"][$graph_key]["values"] = $graph_values; /* Graph title needs to be in graph */ $graph_title_key = array_keys($graph_values); $config_customers[$customer_key]["graphs"][$graph_key]["graph_title"] = $graph_values[$graph_title_key[0]]["graph_title"];
function process_graph_threshold($customer_key, $graph_id, $graph_item_ids, $start_time, $end_time, $current_time, $threshold_value = 0) { global $config_track; global $config_customers; global $config_globals; global $rrd_fetch_cache; $output = array(); $interval = 600; /* 10 minute resolution, reduce caching needs by 50% */ /* current time should not exceed the end time - we will process beyond the billing range */ if ($current_time > $end_time) { $current_time = $end_time; } /* get graph items id for processing */ $where = ""; if (!empty($graph_item_ids)) { $where .= " AND i.id IN(" . $graph_item_ids . ")"; } $where .= " AND g.local_graph_id = " . $graph_id; $graph_items = db_fetch_assoc("SELECT \n\t\t\ti.id AS item_id, \n\t\t\ti.local_graph_id, \n\t\t\ti.task_item_id, \n\t\t\ti.text_format, \n\t\t\tg.id AS graph_id, \n\t\t\tg.title_cache,\n\t\t\td.local_data_id,\n\t\t\td.data_source_name\n\t\tFROM \n\t\t\tgraph_templates_graph AS g,\n\t\t\tgraph_templates_item AS i LEFT JOIN data_template_rrd as d ON i.task_item_id = d.id \n\t\tWHERE \n\t\t\ti.local_graph_id = g.local_graph_id AND \n\t\t\ti.local_graph_id <> 0 AND \n\t\t\ti.graph_type_id = 1 AND \n\t\t\ttext_format LIKE '%|%:%:%|%'\n\t\t\t" . $where . "\n\t\tORDER BY\n\t\t\ti.local_graph_id;"); /* Process times based on interval for each graph item */ $customer_description = $config_customers[$customer_key]["description"]; /* Cycle through graph items */ foreach ($graph_items as $graph_item) { /* Record the graph item type we are dealing with */ $graph_type = ""; $match = array(); if (preg_match('/\\|sum\\:([0-9]+|auto)\\:(current|total)\\:([0-9]+)\\:([0-9]+|auto)\\|/', $graph_item["text_format"], $match) > 0) { $graph_type = "Sum"; $graph_description = "Bandwidth Summation"; } elseif (preg_match('/\\|([0-9]{1,2})\\:(\\S+)\\:([0-9]+)\\:(\\S+)\\:([0-9]+)\\|/', $graph_item["text_format"], $match) > 0) { $graph_type = "Nth"; $graph_description = get_pretty_nth_value($match[1]); } /* Time loop - Can be slow and uses lots of memory */ for ($i = $start_time + $interval; $i <= $current_time; $i = $i + $interval) { /* check for cached values */ if (!isset($config_track[$customer_description][$graph_id][$graph_item["item_id"]][$start_time][$i])) { /* fetch data sets from graph for specific graph item id */ $rrd_fetch_cache = array(); /* No need to cache, we are changing end time which make cache grow exponentially */ $graph_data = process_graph($graph_id, $graph_item["item_id"], $start_time, $i); /* update cache */ $config_track[$customer_description][$graph_id][$graph_item["item_id"]][$start_time][$i] = $graph_data[$graph_item["item_id"]]["value_bits"]; } /* Process threshold time stamp search in cache */ debug(" Processing cache (" . $graph_item["item_id"] . "): " . $i . " ", 0); if ($config_track[$customer_description][$graph_id][$graph_item["item_id"]][$start_time][$i] >= $threshold_value) { if ($graph_type == "Sum") { $output[$graph_item["item_id"]]["value"] = $config_track[$customer_description][$graph_id][$graph_item["item_id"]][$start_time][$i]; $output[$graph_item["item_id"]]["start"] = $start_time; $output[$graph_item["item_id"]]["end"] = $i; /* No need to continue, we found what we need, let's not waste cpu and memory */ break; } if ($graph_type == "Nth") { if (!isset($output[$graph_item["item_id"]]["threshold"])) { $output[$graph_item["item_id"]]["value"] = $config_track[$customer_description][$graph_id][$graph_item["item_id"]][$start_time][$i]; $output[$graph_item["item_id"]]["start"] = $start_time; $output[$graph_item["item_id"]]["end"] = $i; } } } else { /* as we progress through time, if we do not exceed the threshold, clear previous stored thresholds */ if ($graph_type == "Nth") { $output[$graph_item["item_id"]] = array(); } } } /* Pass the type of graph item we have */ if (isset($output[$graph_item["item_id"]]["value"])) { $output[$graph_item["item_id"]]["type"] = $graph_type; $output[$graph_item["item_id"]]["description"] = $graph_description; } debug(" Processing cache (" . $graph_item["item_id"] . "): done "); if (isset($config_track[$customer_description][$graph_id][$graph_item["item_id"]][$start_time][$i])) { debug(" Threshold Calculation (" . $graph_type . "): " . $config_track[$customer_description][$graph_id][$graph_item["item_id"]][$start_time][$i] . " >= " . $threshold_value); } } /* Return output array */ return $output; }