--- parse_log.cgi 2003/10/05 22:26:34 1.3 +++ parse_log.cgi 2003/10/06 09:38:25 1.4 @@ -13,6 +13,7 @@ use Data::Sorting qw(:arrays); use Time::ParseDate; use Time::Available; +use Cache::FileCache; use Data::Dumper; @@ -74,6 +75,9 @@ $working_days=new Time::Available(start=>$q->param('from_time_interval'),end=>$q->param('to_time_interval'),dayMask=>$dayMask); } +# init cache and setup expriration +my $cache = new Cache::FileCache({ default_expires_in => '10 min' }); + # # This option (activated via command switch -r) will reset failure duration # if repeated failure on same group/service happend. @@ -118,66 +122,81 @@ # my %fail; -my %downtime; # total downtime -my %sg_filter; # filter for service/group -my %sg_count; # count number of downtimes - -my $log_file="/home/dpavlin/mon-log/sap.log"; - -my @data; - -open(LOG, $log_file) || die "$log_file: $!"; - -while() { - chomp; - if (/^(failure|up)\s+(\S+)\s+(\S+)\s+(\d+)\s+\(([^)]+)\)\s+(.+)$/) { - my ($status,$group,$service,$utime,$date,$desc) = ($1,$2,$3,$4,$5,$6); - my $id = "$group/$service"; - if ($status eq "up" && defined($fail{$id})) { - if (grep(m;$group/$service;,@sg_selected)) { - push @data, { - 'sg'=>"$group/$service", - 'from'=>$fail{$id}, - 'to'=>$utime, - 'dur'=>($utime - $fail{$id}), - 'int'=>$working_days->interval($utime,$fail{$id}), - 'desc'=>$desc }; - $downtime{"$group/$service"} += ($utime - $fail{$id}), - $sg_count{"$group/$service"}++; - } - $sg_filter{"$group/$service"}++; - delete $fail{$id}; - } elsif ($status eq "up") { - if ($print_orphans && grep(m;$group/$service;,@sg_selected)) { - push @data, { - 'sg'=>"$group/$service", - 'from'=>-1, - 'to'=>$utime, - 'desc'=>$desc }; - $sg_count{"$group/$service"}++; - } - delete $fail{$id}; - $sg_filter{"$group/$service"}++; - } elsif (defined($fail{$id})) { - if ($rep_reset && grep(m;$group/$service;,@sg_selected)) { - push @data, { - 'sg'=>"$group/$service", - 'from'=>$fail{$id}, - 'to'=>$utime, - 'dur'=>($utime - $fail{$id}), - 'int'=>$working_days->interval($utime,$fail{$id}), - 'desc'=>'[failure again]'}; - $downtime{"$group/$service"} += ($utime - $fail{$id}), +my $downtime; # total downtime +my $sg_filter; # filter for service/group +my $sg_count; # count number of downtimes + +my $log_file="/var/log/mon/sap.log"; + +my $data; + +# generate unique key for this data and options +my $cache_key="monlog".join("",@sg_selected).$print_orphans.$rep_reset; + +if (! $debug) { +$data = $cache->get( $cache_key ); +$downtime = $cache->get("downtime $cache_key"); +$sg_filter = $cache->get("sg_filter $cache_key"); +$sg_count = $cache->get("sg_count $cache_key"); +} + +if (!$data || !$downtime || !$sg_filter || !$sg_count) { + + open(LOG, $log_file) || die "$log_file: $!"; + + while() { + chomp; + if (/^(failure|up)\s+(\S+)\s+(\S+)\s+(\d+)\s+\(([^)]+)\)\s+(.+)$/) { + my ($status,$group,$service,$utime,$date,$desc) = ($1,$2,$3,$4,$5,$6); + my $id = "$group/$service"; + if ($status eq "up" && defined($fail{$id})) { + if (grep(m;$group/$service;,@sg_selected)) { + push @$data, { + 'sg'=>"$group/$service", + 'from'=>$fail{$id}, + 'to'=>$utime, + 'desc'=>$desc }; + $downtime->{"$group/$service"} += ($utime - $fail{$id}), + $sg_count->{"$group/$service"}++; + } + $sg_filter->{"$group/$service"}++; + delete $fail{$id}; + } elsif ($status eq "up") { + if ($print_orphans && grep(m;$group/$service;,@sg_selected)) { + push @$data, { + 'sg'=>"$group/$service", + 'from'=>-1, + 'to'=>$utime, + 'desc'=>$desc }; + $sg_count->{"$group/$service"}++; + } + delete $fail{$id}; + $sg_filter->{"$group/$service"}++; + } elsif (defined($fail{$id})) { + if ($rep_reset && grep(m;$group/$service;,@sg_selected)) { + push @$data, { + 'sg'=>"$group/$service", + 'from'=>$fail{$id}, + 'to'=>$utime, + 'desc'=>'[failure again]'}; + $downtime->{"$group/$service"} += ($utime - $fail{$id}), + $fail{$id} = $utime; + $sg_count->{"$group/$service"}++; + } + $sg_filter->{"$group/$service"}++; + } else { $fail{$id} = $utime; - $sg_count{"$group/$service"}++; } - $sg_filter{"$group/$service"}++; - } else { - $fail{$id} = $utime; } } + close(LOG); + + $cache->set($cache_key, $data); + $cache->set("downtime $cache_key", $downtime); + $cache->set("sg_filter $cache_key", $sg_filter); + $cache->set("sg_count $cache_key", $sg_count); + } -close(LOG); # generate output # @@ -191,8 +210,8 @@ Tr(td( em("Show just service/group:"),br, checkbox_group(-name=>'sg_filter', - -values=>[keys %sg_filter], - -default=>[keys %sg_filter], + -values=>[keys %$sg_filter], + -default=>[keys %$sg_filter], -linebreak=>'true', ), ),td( @@ -257,28 +276,27 @@ # sort data # -my @sorted = sorted_array(@data, @sort); -#my @sorted = @data; +my @sorted = sorted_array(@$data, @sort); -print "-- sort: ",Dumper(@sort)," (data: ".@data." sorted: ".@sorted.") --\n",br,"-- dayMask: $dayMask --\n",br if ($debug); +print "-- sort: ",Dumper(@sort)," (data: ".@$data." sorted: ".@sorted.") --\n",br,"-- dayMask: $dayMask --\n",br,"-- cache_key: $cache_key --\n",br if ($debug); print start_table({-border=>1,-cellspacing=>0,-cellpadding=>2,-width=>'100%'}); print Tr( th("group/service"), - th({-bgcolor=>'#f0f0f0'}, + th({-bgcolor=>'#f0f0f0'},''. &sort_link($q,'from','u').' from '. - &sort_link($q,'from','d'), + &sort_link($q,'from','d').'', br,$from_html ), - th( + th( ''. &sort_link($q,'to','u').' to '. - &sort_link($q,'to','d'), + &sort_link($q,'to','d').'', br,$to_html ), - th({-bgcolor=>'#e0e0e0'}, + th({-bgcolor=>'#e0e0e0'},''. &sort_link($q,'dur','u').' duration '. - &sort_link($q,'dur','d') + &sort_link($q,'dur','d').'' ), th("description") ) if (scalar @sorted > 0); @@ -288,8 +306,8 @@ my ($from,$dur,$int) = ('unknown','unknown','unknown'); if ($row->{from} != -1 ) { $from = d($row->{from}); - $dur = dur($row->{dur}); - $int = dur($row->{int}); + $dur = dur($row->{to} - $row->{from}); + $int = dur($working_days->interval($row->{to},$row->{from})); } print Tr( td({-align=>'left',-valign=>'center'},$row->{sg}), @@ -304,10 +322,10 @@ # dump totals # -foreach my $sg (keys %downtime) { +foreach my $sg (keys %$downtime) { print Tr(td({-colspan=>3,-align=>'right'},"total for $sg:"), - td({-bgcolor=>'#e0e0e0',-align=>'right'},dur($downtime{$sg})), - td(small("in ".$sg_count{$sg}." failures"))),"\n"; + td({-bgcolor=>'#e0e0e0',-align=>'right'},dur($downtime->{$sg})), + td(small("in ".$sg_count->{$sg}." failures"))),"\n"; } print end_table,