diff options
| author | artem <artem@97f52cf1-0a1b-0410-bd0e-c28be96e8082> | 2008-03-31 11:17:54 +0000 |
|---|---|---|
| committer | artem <artem@97f52cf1-0a1b-0410-bd0e-c28be96e8082> | 2008-03-31 11:17:54 +0000 |
| commit | c606a0bad1b26b76bf7a061c329afbc49ff1cd97 (patch) | |
| tree | 70ea31e3c754d9a91d531befd4ebd974c72abf63 /frontends/php/include/services.inc.php | |
| parent | ed68e5fe0c92a2a620df0116f28c6ef7ceea8df4 (diff) | |
| download | zabbix-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.php | 198 |
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; } ?> |
