/[mon-modules]/parse_log.cgi
This is repository of my old source code which isn't updated any more. Go to git.rot13.org for current projects!
ViewVC logotype

Diff of /parse_log.cgi

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 1.2 by dpavlin, Sun Oct 5 19:00:15 2003 UTC revision 1.7 by dpavlin, Tue Oct 7 14:39:58 2003 UTC
# Line 12  use CGI qw/:standard *table/; Line 12  use CGI qw/:standard *table/;
12  use CGI::Carp qw(fatalsToBrowser);  use CGI::Carp qw(fatalsToBrowser);
13  use Data::Sorting qw(:arrays);  use Data::Sorting qw(:arrays);
14  use Time::ParseDate;  use Time::ParseDate;
15    use Time::Available;
16    use Cache::FileCache;
17    
18  use Data::Dumper;  use Data::Dumper;
19    
20  my $date_fmt = "%Y-%m-%d";  my $date_fmt = "%Y-%m-%d";
21  my $date_time_fmt = "%Y-%m-%d %H:%M:%S";  #my $date_time_fmt = "%Y-%m-%d %H:%M:%S";
22    my $date_time_fmt = "<small>%a</small> <nobr>%Y-%m-%d</nobr> %H:%M:%S";
23    
24  my $from_date = "now - 6 months";  my $from_date = "now - 6 months";
25  my $to_date = "now";  my $to_date = "now";
26    
27  # working days definition (1-7; mon=1)  # working days definition (1-7; mon=1)
28  my $wday_start = 1;  my $dayMask = Time::Available::DAY_WEEKDAY;
 my $wday_end = 5;  
29  # working hours  # working hours
30  my $whours_start = "7:00";  my $from_time_interval = "7:00";
31  my $whours_end = "17:00";  my $to_time_interval = "17:00";
32    
33  my $debug=1;  my $debug=0;
34  $debug++ if (grep(/-v/,@ARGV));  $debug++ if (grep(/-v/,@ARGV));
35  $debug++ if (grep(/-d/,@ARGV));  $debug++ if (grep(/-d/,@ARGV));
36    
37    my %days = (
38            Time::Available::DAY_MONDAY=>'Mo',
39            Time::Available::DAY_TUESDAY=>'Tu',
40            Time::Available::DAY_WEDNESDAY=>'We',
41            Time::Available::DAY_THURSDAY=>'Th',
42            Time::Available::DAY_FRIDAY=>'Fr',
43            Time::Available::DAY_SATURDAY=>'Sa',
44            Time::Available::DAY_SUNDAY=>'Su'
45    );
46    
47  my $q = new CGI;  my $q = new CGI;
48    
49  my $print_orphans = $q->param('print_orphans') || 0;  my $print_orphans = $q->param('print_orphans') || 0;
50  my $rep_reset = $q->param('rep_reset') || 0;  my $rep_reset = $q->param('rep_reset') || 0;
51  my @sg_selected = $q->param('sg_filter');  my @sg_selected = $q->param('sg_filter');
52    
53  my @sort;  # init misc sort parametars
54    my @sort_rules;
55  my $order;  my $order;
56  my %sort_param;  my %sort_param;
57  my ($usort,$dsort);  my ($usort,$dsort);
58  if ($q->param('usort')) {  if ($q->param('usort')) {
59          $sort_param{'usort'} = $q->param('usort');          $sort_param{'usort'} = $q->param('usort');
60          $q->delete('usort');          $q->delete('usort');
61          @sort = ( -compare => 'numeric', $sort_param{'usort'} );          @sort_rules = ( -compare => 'numeric', scalar $sort_param{'usort'} );
62  }  }
63  if ($q->param('dsort')) {  if ($q->param('dsort')) {
64          $sort_param{'dsort'} = $q->param('dsort');          $sort_param{'dsort'} = $q->param('dsort');
65          $q->delete('dsort');          $q->delete('dsort');
66          @sort = ( -compare => 'numeric', -order=>'reverse', $sort_param{'dsort'} );          @sort_rules = ( -compare => 'numeric', -order=>'reverse', scalar $sort_param{'dsort'} );
67  }  }
68    
69    # make interval
70    my $working_days;
71    if ($q->param('use_time_limit')) {
72            $dayMask=0;
73            foreach my $dm ($q->param('day_interval')) {
74                    $dayMask |= $dm;
75            }
76            $working_days=new Time::Available(start=>$q->param('from_time_interval'),end=>$q->param('to_time_interval'),dayMask=>$dayMask);
77    }
78    
79    # init cache and setup expriration
80    my $cache = new Cache::FileCache({ default_expires_in => '10 min' });
81    
82  #  #
83  # This option (activated via command switch -r) will reset failure duration  # This option (activated via command switch -r) will reset failure duration
84  # if repeated failure on same group/service happend.  # if repeated failure on same group/service happend.
# Line 64  if ($q->param('dsort')) { Line 90  if ($q->param('dsort')) {
90  # pretty format date  # pretty format date
91  sub d {  sub d {
92          my $utime = shift || return "?";          my $utime = shift || return "?";
93          return strftime($date_time_fmt,localtime($utime));          if ($debug) {
94                    return strftime($date_time_fmt." [%s]",localtime($utime));
95            } else {
96                    return strftime($date_time_fmt,localtime($utime));
97            }
98  }  }
99  # pretty format duration  # pretty format duration
100  sub dur {  sub dur {
101          my $dur = shift || return "?";          my $dur = shift || return "0";
102          my $out = "";          my $out = "";
103    
104          my $s = $dur;          my $s = $dur;
# Line 93  sub dur { Line 123  sub dur {
123  #  #
124    
125  my %fail;  my %fail;
126  my %downtime;   # total downtime  my $sg_filter;  # filter for service/group
127  my %sg_filter;  # filter for service/group  
128  my %sg_count;   # count number of downtimes  my $log_file="/var/log/mon/sap.log";
129    
130  my $log_file="/home/dpavlin/mon-log/sap.log";  my $data;
131    
132  my @data;  # generate unique key for this data and options
133    my $cache_key="monlog".join("|",@sg_selected)."|".$print_orphans."|".$rep_reset;
134  open(LOG, $log_file) || die "$log_file: $!";  
135    # debug disables cache
136  while(<LOG>) {  if (! $debug) {
137          chomp;          $data = $cache->get( $cache_key );
138          if (/^(failure|up)\s+(\S+)\s+(\S+)\s+(\d+)\s+\(([^)]+)\)\s+(.+)$/) {          $sg_filter = $cache->get("sg_filter $cache_key");
139                  my ($status,$group,$service,$utime,$date,$desc) = ($1,$2,$3,$4,$5,$6);  }
140                  my $id = "$group/$service";  
141                  if ($status eq "up" && defined($fail{$id})) {  if (!$data || !$sg_filter) {
142                          if (grep(m;$group/$service;,@sg_selected)) {  
143                                  push @data, {          open(LOG, $log_file) || die "$log_file: $!";
144                                          'sg'=>"$group/$service",  
145                                          'from_time'=>$fail{$id},          while(<LOG>) {
146                                          'to_time'=>$utime,                  chomp;
147                                          'dur_time'=>($utime - $fail{$id}),                  if (/^(failure|up)\s+(\S+)\s+(\S+)\s+(\d+)\s+\(([^)]+)\)\s+(.+)$/) {
148                                          'from'=>d($fail{$id}),                          my ($status,$group,$service,$utime,$date,$desc) = ($1,$2,$3,$4,$5,$6);
149                                          'to'=>d($utime),                          my $id = "$group/$service";
150                                          'dur'=>dur($utime - $fail{$id}),                          if ($status eq "up" && defined($fail{$id})) {
151                                          'desc'=>$desc };                                  if (grep(m;$group/$service;,@sg_selected)) {
152                                  $downtime{"$group/$service"} += ($utime - $fail{$id}),                                          push @$data, {
153                                  $sg_count{"$group/$service"}++;                                                  'sg'=>"$group/$service",
154                          }                                                  'from'=>$fail{$id},
155                          $sg_filter{"$group/$service"}++;                                                  'to'=>$utime,
156                          delete $fail{$id};                                                  'dur'=>($utime-$fail{$id}),
157                  } elsif ($status eq "up") {                                                  'desc'=>$desc };
158                          if ($print_orphans && grep(m;$group/$service;,@sg_selected)) {                                  }
159                                  push @data, {                                  $sg_filter->{"$group/$service"}++;
160                                          'sg'=>"$group/$service",                                  delete $fail{$id};
161                                          'to_time'=>$utime,                          } elsif ($status eq "up") {
162                                          'from'=>'unknown',                                  if ($print_orphans && grep(m;$group/$service;,@sg_selected)) {
163                                          'to'=>d($utime),                                          push @$data, {
164                                          'dur'=>'unknown',                                                  'sg'=>"$group/$service",
165                                          'desc'=>$desc };                                                  'from'=>-1,
166                                  $sg_count{"$group/$service"}++;                                                  'to'=>$utime,
167                          }                                                  'dur'=>0,
168                          delete $fail{$id};                                                  'desc'=>$desc };
169                          $sg_filter{"$group/$service"}++;                                  }
170                  } elsif (defined($fail{$id})) {                                  delete $fail{$id};
171                          if ($rep_reset && grep(m;$group/$service;,@sg_selected)) {                                  $sg_filter->{"$group/$service"}++;
172                                  push @data, {                          } elsif (defined($fail{$id})) {
173                                          'sg'=>"$group/$service",                                  if ($rep_reset && grep(m;$group/$service;,@sg_selected)) {
174                                          'from_time'=>$fail{$id},                                          push @$data, {
175                                          'to_time'=>$utime,                                                  'sg'=>"$group/$service",
176                                          'dur_time'=>($utime - $fail{$id}),                                                  'from'=>$fail{$id},
177                                          'from'=>d($fail{$id}),                                                  'to'=>$utime,
178                                          'to'=>d($utime),                                                  'dur'=>($utime-$fail{$id}),
179                                          'dur'=>dur($utime - $fail{$id}),                                                  'desc'=>'[failure again]'};
180                                          'desc'=>'[failure again]'};                                          $fail{$id} = $utime;
181                                  $downtime{"$group/$service"} += ($utime - $fail{$id}),                                  }
182                                    $sg_filter->{"$group/$service"}++;
183                            } else {
184                                  $fail{$id} = $utime;                                  $fail{$id} = $utime;
                                 $sg_count{"$group/$service"}++;  
185                          }                          }
                         $sg_filter{"$group/$service"}++;  
                 } else {  
                         $fail{$id} = $utime;  
186                  }                  }
187          }          }
188            close(LOG);
189    
190            $cache->set($cache_key, $data);
191            $cache->set("sg_filter $cache_key", $sg_filter);
192    
193  }  }
 close(LOG);  
194    
195  # generate output  # generate output
196  #  #
# Line 172  print start_form, Line 204  print start_form,
204          Tr(td(          Tr(td(
205          em("Show just service/group:"),br,          em("Show just service/group:"),br,
206          checkbox_group(-name=>'sg_filter',          checkbox_group(-name=>'sg_filter',
207                  -values=>[keys %sg_filter],                  -values=>[keys %$sg_filter],
208                  -default=>[keys %sg_filter],                  -default=>[keys %$sg_filter],
209                  -linebreak=>'true',                  -linebreak=>'true',
210                  ),                  ),
211          ),td(          ),td(
# Line 191  print start_form, Line 223  print start_form,
223          $q->textfield(-name=>'to_date',-size=>20,-default=>$to_date),          $q->textfield(-name=>'to_date',-size=>20,-default=>$to_date),
224          small('Using <a href="http://search.cpan.org/search?mode=module&query=Time::ParseDate">Time::ParseDate</a>'),          small('Using <a href="http://search.cpan.org/search?mode=module&query=Time::ParseDate">Time::ParseDate</a>'),
225          br,          br,
226            $q->checkbox(-name=>'use_time_limit',-checked=>1, -value=>'on',
227            -label=>"use time limit for each day:"),
228            $q->textfield(-name=>'from_time_interval',-size=>8,-default=>$from_time_interval),
229            " to: ",
230            $q->textfield(-name=>'to_time_interval',-size=>8,-default=>$to_time_interval),
231            br,"Days: ",
232            $q->checkbox_group(-name=>'day_interval',
233                    -values=>[ sort { $a <=> $b } keys %days ],
234                    -labels=>\%days,
235                    -defaults=>[
236                            Time::Available::DAY_MONDAY,
237                            Time::Available::DAY_TUESDAY,
238                            Time::Available::DAY_WEDNESDAY,
239                            Time::Available::DAY_THURSDAY,
240                            Time::Available::DAY_FRIDAY,
241                    ]
242                    ),
243          $q->submit(-name=>'show',-value=>'Show report'),          $q->submit(-name=>'show',-value=>'Show report'),
244          )),end_table;          )),end_table,
245            end_form;
246    
247  # dump report  # dump report
248  #  #
249    
250    my %dir_html_entity = (
251    #       'u' => '&uArr;',
252    #       'd' => '&dArr;'
253            'u' => '&#9650;',
254            'd' => '&#9660;',
255    );
256    
257  sub sort_link {  sub sort_link {
258          my $q = shift || return;          my $q = shift || return;
259          my $col = shift || return;          my $col = shift || return;
260          my $dir = lc(shift) || return;          my $dir = lc(shift) || return;
261          if ($sort_param{$dir.'sort'} && $sort_param{$dir.'sort'} eq $col) {          if ($sort_param{$dir.'sort'} && $sort_param{$dir.'sort'} eq $col) {
262                  return '&'.$dir.'Arr;';                  return $dir_html_entity{$dir};
263          } else {          } else {
264                  return '<a href="'.$q->url(-query=>1).'&'.$dir.'sort='.$col.'">&'.$dir.'Arr;</a>';                  return '<a href="'.$q->url(-query=>1).'&'.$dir.'sort='.$col.'">'.$dir_html_entity{$dir}.'</a>';
265          }          }
266  }  }
267    
# Line 221  if ($q->param('use_date_limit')) { Line 278  if ($q->param('use_date_limit')) {
278    
279  # sort data  # sort data
280  #  #
281  my @sorted = sorted_array(@data, @sort);  my @sorted = sorted_array( @$data, @sort_rules );
 #my @sorted = @data;  
282    
283  print "-- sort: ",Dumper(@sort)," (data: ".@data." sorted: ".@sorted.") --\n",br if ($debug);  print "-- sort: ",Dumper(@sort_rules)," (data: ".@$data." sorted: ".@sorted.") --\n",br,"-- dayMask: $dayMask --\n",br,"-- cache_key: $cache_key --\n",br if ($debug);
284    
285  print start_table({-border=>1,-cellspacing=>0,-cellpadding=>2,-width=>'100%'});  print start_table({-border=>1,-cellspacing=>0,-cellpadding=>2,-width=>'100%'});
286    
287  print Tr(  print Tr(
288                  th("group/service"),                  th("group/service"),
289                  th({-bgcolor=>'#f0f0f0'},                  th({-bgcolor=>'#f0f0f0'},'<nobr>'.
290                          &sort_link($q,'from_time','u').' from '.                          &sort_link($q,'from','u').' from '.
291                          &sort_link($q,'from_time','d'),                          &sort_link($q,'from','d').'</nobr>',
292                          br,$from_html                          br,$from_html
293                  ),                  ),
294                  th(                  th(     '<nobr>'.
295                          &sort_link($q,'to_time','u').' to '.                          &sort_link($q,'to','u').' to '.
296                          &sort_link($q,'to_time','d'),                          &sort_link($q,'to','d').'</nobr>',
297                          br,$to_html                          br,$to_html
298                  ),                  ),
299                  th({-bgcolor=>'#e0e0e0'},                  th({-bgcolor=>'#e0e0e0'},'<nobr>'.
300                          &sort_link($q,'dur_time','u').' duration '.                          &sort_link($q,'dur','u').' duration '.
301                          &sort_link($q,'dur_time','d')                          &sort_link($q,'dur','d').'</nobr>'
302                  ),                  ),
303                  th("description")                  th("description")
304          ) if (scalar @sorted > 0);          ) if (scalar @sorted > 0);
305    
306    my $downtime;           # total downtime
307    my $downinterval;       # total downtime in time interval
308    my $sg_count;           # count number of downtimes
309    
310  foreach my $row (@sorted) {  foreach my $row (@sorted) {
311          next if ($q->param('use_date_limit') && ($row->{from_time} < $from_time || $row->{to_time} > $to_time));          next if ($q->param('use_date_limit') && ($row->{from} < $from_time || $row->{to} > $to_time));
312            my ($from,$dur,$int) = ('unknown','unknown','unknown');
313    
314            if ($row->{from} != -1 ) {
315                    $from = d($row->{from});
316                    $dur = $row->{to} - $row->{from};
317                    $downtime->{$row->{sg}} += $dur;
318                    if ($q->param('use_time_limit')) {
319                            $int = $working_days->interval($row->{from},$row->{to});
320                            $dur = dur($int)."<br><nobr><small>&sum; ".dur($dur)."</small></nobr>";
321                            $downinterval->{$row->{sg}} += $int;
322                    } else {
323                            $dur = dur($dur);
324                    }
325            }
326            $sg_count->{$row->{sg}}++;
327    
328          print Tr(          print Tr(
329                  td({-align=>'left',-valign=>'center'},$row->{sg}),                  td({-align=>'left',-valign=>'center'},$row->{sg}),
330                  td({-align=>'right',-bgcolor=>'#f0f0f0'},$row->{from}),                  td({-align=>'right',-bgcolor=>'#f0f0f0'},$from),
331                  td({-align=>'right'},$row->{to}),                  td({-align=>'right'},d($row->{to})),
332                  td({-align=>'center',-bgcolor=>'#e0e0e0'},$row->{dur}),                  td({-align=>'center',-bgcolor=>'#e0e0e0'},$dur),
333                  td({-align=>'left'},$row->{desc}),                  td({-align=>'left'},$row->{desc}),
334                  ),"\n";                  ),"\n";
335  }  }
# Line 261  foreach my $row (@sorted) { Line 337  foreach my $row (@sorted) {
337  # dump totals  # dump totals
338  #  #
339    
340  foreach my $sg (keys %downtime) {  foreach my $sg (keys %$downtime) {
341  print Tr(td({-colspan=>3,-align=>'right'},"total for $sg:"),          my $dur;
342          td({-bgcolor=>'#e0e0e0',-align=>'right'},dur($downtime{$sg})),          if ($downinterval->{$sg}) {
343          td(small("in ".$sg_count{$sg}." failures"))),"\n";                  $dur=dur($downinterval->{$sg})."<br><nobr><small>&sum; ".dur($downtime->{$sg})."</small></nobr>";
344            } else {
345                    $dur=dur($downtime->{$sg});
346            }
347            print Tr(td({-colspan=>3,-align=>'right'},"total for $sg:"),
348                    td({-bgcolor=>'#e0e0e0',-align=>'right'},$dur),
349                    td(small("in ".$sg_count->{$sg}." failures"))),"\n";
350  }  }
351    
352  print end_table,  print end_table;
         end_form;  
353    

Legend:
Removed from v.1.2  
changed lines
  Added in v.1.7

  ViewVC Help
Powered by ViewVC 1.1.26