summaryrefslogtreecommitdiffstats
path: root/frontends/php/include/services.inc.php
diff options
context:
space:
mode:
authorartem <artem@97f52cf1-0a1b-0410-bd0e-c28be96e8082>2008-03-31 11:17:54 +0000
committerartem <artem@97f52cf1-0a1b-0410-bd0e-c28be96e8082>2008-03-31 11:17:54 +0000
commitc606a0bad1b26b76bf7a061c329afbc49ff1cd97 (patch)
tree70ea31e3c754d9a91d531befd4ebd974c72abf63 /frontends/php/include/services.inc.php
parented68e5fe0c92a2a620df0116f28c6ef7ceea8df4 (diff)
downloadzabbix-c606a0bad1b26b76bf7a061c329afbc49ff1cd97.tar.gz
zabbix-c606a0bad1b26b76bf7a061c329afbc49ff1cd97.tar.xz
zabbix-c606a0bad1b26b76bf7a061c329afbc49ff1cd97.zip
- improvements to services calculation algorithms (Artem)
git-svn-id: svn://svn.zabbix.com/trunk@5564 97f52cf1-0a1b-0410-bd0e-c28be96e8082
Diffstat (limited to 'frontends/php/include/services.inc.php')
-rw-r--r--frontends/php/include/services.inc.php198
1 files changed, 91 insertions, 107 deletions
diff --git a/frontends/php/include/services.inc.php b/frontends/php/include/services.inc.php
index c00cf1f1..a43821c2 100644
--- a/frontends/php/include/services.inc.php
+++ b/frontends/php/include/services.inc.php
@@ -142,42 +142,33 @@
* Aly
*
* Comments:
- *
+ * Don't forget to sync code with C!!!!
*/
function get_service_status($serviceid,$algorithm,$triggerid=null,$status=0){
- if(!$status && is_numeric($triggerid)){
- $status = get_trigger_priority($triggerid);/* Do nothing */
+ if(is_numeric($triggerid)){
+ $trigger = get_trigger_by_triggerid($triggerid);
+ if((TRIGGER_STATUS_ENABLED == $trigger['status']) && (TRIGGER_VALUE_TRUE == $trigger['value'])){
+ $status = $trigger['priority'];
+ }
}
if((SERVICE_ALGORITHM_MAX == $algorithm) || (SERVICE_ALGORITHM_MIN == $algorithm)){
- if(SERVICE_ALGORITHM_MAX == $algorithm){
+ $sort_order = (SERVICE_ALGORITHM_MAX == $algorithm)?' DESC ':' ASC ';
- $result = DBselect('SELECT count(*) as count,max(status) as status'.
- ' FROM services s,services_links l '.
- ' WHERE l.serviceupid='.$serviceid.
- ' AND s.serviceid=l.servicedownid'
- );
- }
- /* MIN otherwise */
- else{
- $result = DBselect('SELECT count(*) as count,min(status) as status'.
- ' FROM services s,services_links l '.
- ' WHERE l.serviceupid='.$serviceid.
- ' AND s.serviceid=l.servicedownid'
- );
- }
+ $sql = 'SELECT s.status'.
+ ' FROM services s,services_links l '.
+ ' WHERE l.serviceupid='.$serviceid.
+ ' AND s.serviceid=l.servicedownid '.
+ ' ORDER BY s.status '.$sort_order;
+ $result = DBselect($sql);
- $rows = DBfetch($result);
-
- if($rows && !is_null($rows['count']) && !is_null($rows['status'])){
- if($rows['count'] > 0){
- $status=$rows['status'];
- }
+ $rows = DBfetch($result);
+ if($rows && !empty($rows['status'])){
+ $status=$rows['status'];
}
}
-
return $status;
}
@@ -196,6 +187,9 @@
$sql="DELETE FROM service_alarms WHERE serviceid=$serviceid";
if(!$result=DBexecute($sql)) return $result;
+ $sql="DELETE FROM services_times WHERE serviceid=$serviceid";
+ if(!$result=DBexecute($sql)) return $result;
+
update_services_status_all();
return $result;
@@ -240,38 +234,30 @@
# Return TRUE if triggerid is a reason why the service is not OK
# Warning: recursive function
- function does_service_depend_on_the_service($serviceid,$serviceid2)
- {
+ function does_service_depend_on_the_service($serviceid,$serviceid2){
$service=get_service_by_serviceid($serviceid);
- if($service["status"]==0)
- {
+ if($service["status"]==0){
return FALSE;
}
- if((bccomp($serviceid, $serviceid2)==0))
- {
- if($service["status"]>0)
- {
+ if((bccomp($serviceid, $serviceid2)==0)){
+ if($service["status"]>0){
return TRUE;
}
}
$result=DBselect("SELECT serviceupid FROM services_links WHERE servicedownid=$serviceid2 and soft=0");
- while($row=DBfetch($result))
- {
- if(does_service_depend_on_the_service($serviceid,$row["serviceupid"]) == TRUE)
- {
+ while($row=DBfetch($result)){
+ if(does_service_depend_on_the_service($serviceid,$row["serviceupid"]) == TRUE){
return TRUE;
}
}
return FALSE;
}
- function service_has_parent($serviceid)
- {
+ function service_has_parent($serviceid){
$row = DBfetch(DBselect("SELECT count(*) as cnt FROM services_links WHERE servicedownid=$serviceid"));
- if($row["cnt"]>0)
- {
+ if($row["cnt"]>0){
return TRUE;
}
return FALSE;
@@ -331,7 +317,7 @@
AND soft<>1)';
DBExecute($query);
}
-
+
function get_last_service_value($serviceid,$clock){
$sql="SELECT count(*) as cnt,max(clock) as maxx FROM service_alarms WHERE serviceid=$serviceid and clock<=$clock";
// echo " $sql<br>";
@@ -355,32 +341,44 @@
}
return $value;
}
-
- function expand_periodical_service_times(&$data,
+/*
+function VDI($time,$show=1){
+ $time = (is_array($time))?$time:getdate($time);
+return ($time['mon'].'/'.$time['mday'].'/'.$time['year'].' '.$time['hours'].':'.$time['minutes'].':'.$time['seconds']);
+}
+*/
+ function expand_periodical_service_times(&$data,
$period_start, $period_end,
$ts_from, $ts_to,
$type='ut' /* 'ut' OR 'dt' */
)
{
+//SDI("PERIOD: ".VDI($period_start).' - '.VDI($period_end));
+//SDI('serv time: '.VDI($ts_from,0).' - '.VDI($ts_to,0));
/* calculate period FROM '-1 week' to know period name for $period_start */
- for($curr = ($period_start - (7*24*3600)); $curr<=$period_end; $curr += 6*3600)
- {
+
+ for($curr = ($period_start - (7*24*3600)); $curr<=$period_end;$curr+=86400){
+
$curr_date = getdate($curr);
$from_date = getdate($ts_from);
- if($curr_date['wday'] == $from_date['wday'])
- {
+
+ if($curr_date['wday'] == $from_date['wday']){
$curr_from = mktime(
$from_date['hours'],$from_date['minutes'],$from_date['seconds'],
$curr_date['mon'],$curr_date['mday'],$curr_date['year']
);
+//SDI('FROM '.VDI($curr_from,0));
$curr_to = $curr_from + ($ts_to - $ts_from);
$curr_from = max($curr_from, $period_start);
$curr_from = min($curr_from, $period_end);
+//SDI('FROM2 '.VDI($curr_from,0));
+//SDI('TO '.VDI($curr_to,0));
$curr_to = max($curr_to, $period_start);
$curr_to = min($curr_to, $period_end);
-
+//SDI('TO2 '.VDI($curr_to,0).' : '.VDI($curr,0));
$curr = $curr_to;
+//SDI('CURR '.VDI($curr,0));
if(isset($data[$curr_from][$type.'_s']))
$data[$curr_from][$type.'_s'] ++;
@@ -391,16 +389,11 @@
$data[$curr_to][$type.'_e'] ++;
else
$data[$curr_to][$type.'_e'] = 1;
-
-
}
}
}
- function calculate_service_availability($serviceid,$period_start,$period_end)
- {
-
-
+ function calculate_service_availability($serviceid,$period_start,$period_end){
// $sql="SELECT count(*),min(clock),max(clock) FROM service_alarms WHERE serviceid=$serviceid and clock>=$period_start and clock<=$period_end";
/* FILL data */
@@ -416,12 +409,12 @@
$data[$period_start]['alarm'] = get_last_service_value($serviceid,$period_start);
- $service_alarms = DBselect('SELECT clock,value '.
+ $service_alarms = DBselect('SELECT servicealarmid,clock,value '.
' FROM service_alarms '.
' WHERE serviceid='.$serviceid.
' AND clock>='.$period_start.
' AND clock<='.$period_end.
- ' ORDER BY clock');
+ ' ORDER BY servicealarmid');
/* add alarms */
while($db_alarm_row = DBfetch($service_alarms)){
@@ -481,14 +474,18 @@
}
if(!isset($data[$period_end])) $data[$period_end] = array();
+ ksort($data); /* sort by time stamp */
/*
+ if($serviceid == 1 || $serviceid == 2){
+ print('<br>'.$serviceid.':<br>');
print('From: '.date('l d M Y H:i',$period_start).' To: '.date('l d M Y H:i',$period_end).SBR);
$ut = 0;
$dt = 0;
+
foreach($data as $ts => $val)
{
print($ts);
- print(" - [".date('l d M Y H:i',$ts)."]");
+ print(" - [".date('l d M Y H:i:s',$ts)."]");
if(isset($val['ut_s'])) {print(' ut_s-'.$val['ut_s']); $ut+=$val['ut_s'];}
if(isset($val['ut_e'])) {print(' ut_e-'.$val['ut_e']); $ut-=$val['ut_e'];}
if(isset($val['dt_s'])) {print(' dt_s-'.$val['dt_s']); $dt+=$val['dt_s'];}
@@ -497,11 +494,10 @@ $dt = 0;
print(' ut = '.$ut.' dt = '.$dt);
print(SBR);
}
-*/
+ }
+//*/
/* calculate times */
- ksort($data); /* sort by time stamp */
-
$dt_cnt = 0;
$ut_cnt = 0;
$sla_time = array(
@@ -553,42 +549,46 @@ $dt = 0;
$prev_time = $ts;
}
+
+/*
+if($serviceid == 1 || $serviceid == 2){
+ SDI($serviceid);
+ SDI($sla_time);
+}
+//*/
$sla_time['problem_time'] = &$sla_time['ut']['problem_time'];
$sla_time['ok_time'] = &$sla_time['ut']['ok_time'];
$sla_time['downtime_time'] = $sla_time['dt']['ok_time'] + $sla_time['dt']['problem_time'];
$full_time = $sla_time['problem_time'] + $sla_time['ok_time'];
- if($full_time > 0)
- {
+ if($full_time > 0){
$sla_time['problem'] = 100 * $sla_time['problem_time'] / $full_time;
$sla_time['ok'] = 100 * $sla_time['ok_time'] / $full_time;
}
- else
- {
+ else{
$sla_time['problem'] = 100;
$sla_time['ok'] = 100;
}
- return $sla_time;
+ return $sla_time;
}
function get_service_status_description($status){
$desc=new CSpan(S_OK_BIG,'green');
- if($status==5)
- {
+ if(TRIGGER_SEVERITY_DISASTER == $status){
$desc=new CTag('div','yes',S_DISASTER,'disaster');
}
- else if($status==4){
+ else if(TRIGGER_SEVERITY_HIGH == $status){
$desc=new CTag('div','yes',S_SERIOUS_PROBLEM,'high');
}
- else if($status==3){
+ else if(TRIGGER_SEVERITY_AVERAGE == $status){
$desc=new CTag('div','yes',S_AVERAGE_PROBLEM,'average');
}
- else if($status==2){
+ else if(TRIGGER_SEVERITY_WARNING == $status){
$desc=new CTag('div','yes',S_MINOR_PROBLEM,'warning');
}
- else if($status==1){
+ else if(TRIGGER_SEVERITY_INFORMATION == $status){
$desc=new CSpan(S_OK_BIG,'green');
}
return $desc;
@@ -612,30 +612,24 @@ $dt = 0;
return $res;
}
- function get_services_links_by_linkid($linkid)
- {
+ function get_services_links_by_linkid($linkid){
$result=DBselect("SELECT * FROM services_links WHERE linkid=$linkid");
$res = DBfetch($result);
- if(!$res)
- {
+ if(!$res){
error("No service linkage with linkid=[$linkid]");
return FALSE;
}
return $res;
}
- function algorithm2str($algorithm)
- {
- if($algorithm == SERVICE_ALGORITHM_NONE)
- {
+ function algorithm2str($algorithm){
+ if($algorithm == SERVICE_ALGORITHM_NONE){
return S_NONE;
}
- elseif($algorithm == SERVICE_ALGORITHM_MAX)
- {
+ elseif($algorithm == SERVICE_ALGORITHM_MAX){
return S_MAX_OF_CHILDS;
}
- elseif($algorithm == SERVICE_ALGORITHM_MIN)
- {
+ elseif($algorithm == SERVICE_ALGORITHM_MIN){
return S_MIN_OF_CHILDS;
}
return S_UNKNOWN;
@@ -646,7 +640,7 @@ $dt = 0;
$query = 'SELECT sl.servicedownid '.
' FROM services_links sl '.
- ' WHERE sl.serviceupid = '.$serviceid.(($soft == 1)?(''):(' AND sl.soft <> 1'));
+ ' WHERE sl.serviceupid = '.$serviceid.($soft?'':' AND sl.soft <> 1');
$res = DBSelect($query);
while($row = DBFetch($res)){
@@ -780,7 +774,7 @@ function update_services_rec($serviceid){
while($rows=DBfetch($result)){
$serviceupid = $rows['serviceupid'];
- update_services_rec($serviceupid);
+ update_services_rec($serviceupid); // ATANTION recursion!!!
}
}
@@ -838,7 +832,7 @@ function update_services_status_all(){
while($rows=DBfetch($result)){
$status = get_service_status($rows['serviceid'],$rows['algorithm'],$rows['triggerid']);
DBexecute('UPDATE services SET status = '.$status.' WHERE serviceid='.$rows['serviceid']);
-
+
add_service_alarm($rows['serviceid'],$status,time());
}
@@ -860,25 +854,16 @@ function update_services_status_all(){
function latest_service_alarm($serviceid, $status){
$ret = false;
- $result = DBselect('SELECT max(clock) as clock FROM service_alarms WHERE serviceid='.$serviceid);
+ $result = DBselect('SELECT servicealarmid, value '.
+ ' FROM service_alarms '.
+ ' WHERE serviceid='.$serviceid.
+ ' ORDER BY servicealarmid DESC',1);
$rows = DBfetch($result);
-
- if(!$rows || is_null($rows['clock'])){
- $ret = false;
- }
- else{
- $clock=$rows['clock'];
-
- $result = DBselect('SELECT value FROM service_alarms WHERE serviceid='.$serviceid.' AND clock='.$clock);
- $rows = DBfetch($result);
- if($rows && !is_null($rows['value'])){
- if($rows['value'] == $status){
- $ret = true;
- }
- }
+ if($rows && !is_null($rows['value']) && ($rows['value'] == $status)){
+ $ret = true;
}
- return $ret;
+return $ret;
}
/******************************************************************************
@@ -887,13 +872,12 @@ function latest_service_alarm($serviceid, $status){
* *
******************************************************************************/
function add_service_alarm($serviceid,$status,$clock){
-
- if(latest_service_alarm($serviceid,$status) == true){
+ if(latest_service_alarm($serviceid,$status)){
return true;
}
- DBexecute('INSERT INTO service_alarms (servicealarmid,serviceid,clock,value) VALUES ('.get_dbid('service_alarms','servicealarmid').','.$serviceid.','.$clock.','.$status.')');
+ $result = DBexecute('INSERT INTO service_alarms (servicealarmid,serviceid,clock,value) VALUES ('.get_dbid('service_alarms','servicealarmid').','.$serviceid.','.$clock.','.$status.')');
- return true;
+ return $result;
}
?>