/[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.4 by dpavlin, Mon Oct 6 09:38:25 2003 UTC revision 1.8 by dpavlin, Tue Oct 7 20:24:45 2003 UTC
# Line 8  Line 8 
8    
9  use strict;  use strict;
10  use POSIX qw(strftime);  use POSIX qw(strftime);
11  use CGI qw/:standard *table/;  use CGI;
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;  use Time::Available;
# Line 18  use Cache::FileCache; Line 18  use Cache::FileCache;
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";
# Line 29  my $dayMask = Time::Available::DAY_WEEKD Line 30  my $dayMask = Time::Available::DAY_WEEKD
30  my $from_time_interval = "7:00";  my $from_time_interval = "7:00";
31  my $to_time_interval = "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    
# Line 50  my $rep_reset = $q->param('rep_reset') | Line 51  my $rep_reset = $q->param('rep_reset') |
51  my @sg_selected = $q->param('sg_filter');  my @sg_selected = $q->param('sg_filter');
52    
53  # init misc sort parametars  # init misc sort parametars
54  my @sort;  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  # make interval
# Line 122  sub dur { Line 123  sub dur {
123  #  #
124    
125  my %fail;  my %fail;
 my $downtime;   # total downtime  
126  my $sg_filter;  # filter for service/group  my $sg_filter;  # filter for service/group
 my $sg_count;   # count number of downtimes  
127    
128  my $log_file="/var/log/mon/sap.log";  my $log_file="/var/log/mon/sap.log";
129    
130  my $data;  my $data;
131    
132  # generate unique key for this data and options  # generate unique key for this data and options
133  my $cache_key="monlog".join("",@sg_selected).$print_orphans.$rep_reset;  my $cache_key="monlog".join("|",@sg_selected)."|".$print_orphans."|".$rep_reset;
134    
135    # debug disables cache
136  if (! $debug) {  if (! $debug) {
137  $data = $cache->get( $cache_key );          $data = $cache->get( $cache_key );
138  $downtime = $cache->get("downtime $cache_key");          $sg_filter = $cache->get("sg_filter $cache_key");
 $sg_filter = $cache->get("sg_filter $cache_key");  
 $sg_count = $cache->get("sg_count $cache_key");  
139  }  }
140    
141  if (!$data || !$downtime || !$sg_filter || !$sg_count) {  if (!$data || !$sg_filter) {
142    
143          open(LOG, $log_file) || die "$log_file: $!";          open(LOG, $log_file) || die "$log_file: $!";
144    
# Line 155  if (!$data || !$downtime || !$sg_filter Line 153  if (!$data || !$downtime || !$sg_filter
153                                                  'sg'=>"$group/$service",                                                  'sg'=>"$group/$service",
154                                                  'from'=>$fail{$id},                                                  'from'=>$fail{$id},
155                                                  'to'=>$utime,                                                  'to'=>$utime,
156                                                    'dur'=>($utime-$fail{$id}),
157                                                  'desc'=>$desc };                                                  'desc'=>$desc };
                                         $downtime->{"$group/$service"} += ($utime - $fail{$id}),  
                                         $sg_count->{"$group/$service"}++;  
158                                  }                                  }
159                                  $sg_filter->{"$group/$service"}++;                                  $sg_filter->{"$group/$service"}++;
160                                  delete $fail{$id};                                  delete $fail{$id};
# Line 167  if (!$data || !$downtime || !$sg_filter Line 164  if (!$data || !$downtime || !$sg_filter
164                                                  'sg'=>"$group/$service",                                                  'sg'=>"$group/$service",
165                                                  'from'=>-1,                                                  'from'=>-1,
166                                                  'to'=>$utime,                                                  'to'=>$utime,
167                                                    'dur'=>0,
168                                                  'desc'=>$desc };                                                  'desc'=>$desc };
                                         $sg_count->{"$group/$service"}++;  
169                                  }                                  }
170                                  delete $fail{$id};                                  delete $fail{$id};
171                                  $sg_filter->{"$group/$service"}++;                                  $sg_filter->{"$group/$service"}++;
# Line 178  if (!$data || !$downtime || !$sg_filter Line 175  if (!$data || !$downtime || !$sg_filter
175                                                  'sg'=>"$group/$service",                                                  'sg'=>"$group/$service",
176                                                  'from'=>$fail{$id},                                                  'from'=>$fail{$id},
177                                                  'to'=>$utime,                                                  'to'=>$utime,
178                                                    'dur'=>($utime-$fail{$id}),
179                                                  'desc'=>'[failure again]'};                                                  'desc'=>'[failure again]'};
                                         $downtime->{"$group/$service"} += ($utime - $fail{$id}),  
180                                          $fail{$id} = $utime;                                          $fail{$id} = $utime;
                                         $sg_count->{"$group/$service"}++;  
181                                  }                                  }
182                                  $sg_filter->{"$group/$service"}++;                                  $sg_filter->{"$group/$service"}++;
183                          } else {                          } else {
# Line 192  if (!$data || !$downtime || !$sg_filter Line 188  if (!$data || !$downtime || !$sg_filter
188          close(LOG);          close(LOG);
189    
190          $cache->set($cache_key, $data);          $cache->set($cache_key, $data);
         $cache->set("downtime $cache_key", $downtime);  
191          $cache->set("sg_filter $cache_key", $sg_filter);          $cache->set("sg_filter $cache_key", $sg_filter);
         $cache->set("sg_count $cache_key", $sg_count);  
192    
193  }  }
194    
195  # generate output  # generate output
196  #  #
197  print header,start_html("mon availiability report");  print $q->header,$q->start_html("mon availiability report");
198    
199  # make some filters  # make some filters
200  #  #
201    
202  print start_form,  print $q->start_form,'
203          start_table({-border=>0,-cellspacing=>0,-cellpadding=>0}),          <table border=0 cellspacing=0 cellpadding=0>
204          Tr(td(          <tr><td>
205          em("Show just service/group:"),br,          <em>Show just service/group:</em><br>
206          checkbox_group(-name=>'sg_filter',          ',$q->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><td>
212          em("Other options:"),br,          <em>Other options:</em><br>',
213          $q->checkbox(-name=>'rep_reset',-checked=>0,          $q->checkbox(-name=>'rep_reset',-checked=>0,
214          -label=>"show repeated failures on same service as individual failures"),          -label=>"show repeated failures on same service as individual failures"),'<br>',
         br,  
215          $q->checkbox(-name=>'print_orphans',-checked=>0,          $q->checkbox(-name=>'print_orphans',-checked=>0,
216          -label=>"show records which are not complete in this interval"),          -label=>"show records which are not complete in this interval"),'<br>',
         br,  
217          $q->checkbox(-name=>'use_date_limit',-checked=>1,          $q->checkbox(-name=>'use_date_limit',-checked=>1,
218          -label=>"use date limit from:"),          -label=>"use date limit from:"),
219          $q->textfield(-name=>'from_date',-size=>20,-default=>$from_date),          $q->textfield(-name=>'from_date',-size=>20,-default=>$from_date),' to: ',
220          " to: ",          $q->textfield(-name=>'to_date',-size=>20,-default=>$to_date),'
221          $q->textfield(-name=>'to_date',-size=>20,-default=>$to_date),          <small>Using <a href="http://search.cpan.org/search?mode=module&query=Time::ParseDate">Time::ParseDate</a></small>
222          small('Using <a href="http://search.cpan.org/search?mode=module&query=Time::ParseDate">Time::ParseDate</a>'),          <br>
223          br,          ',$q->checkbox(-name=>'use_time_limit',-checked=>1, -value=>'on',
         $q->checkbox(-name=>'use_time_limit',-checked=>1,  
224          -label=>"use time limit for each day:"),          -label=>"use time limit for each day:"),
225          $q->textfield(-name=>'from_time_interval',-size=>8,-default=>$from_time_interval),          $q->textfield(-name=>'from_time_interval',-size=>8,-default=>$from_time_interval),' to: ',
         " to: ",  
226          $q->textfield(-name=>'to_time_interval',-size=>8,-default=>$to_time_interval),          $q->textfield(-name=>'to_time_interval',-size=>8,-default=>$to_time_interval),
227          br,"Days: ",          '<br>Days: ',
228          $q->checkbox_group(-name=>'day_interval',          $q->checkbox_group(-name=>'day_interval',
229                  -values=>[ sort { $a <=> $b } keys %days ],                  -values=>[ sort { $a <=> $b } keys %days ],
230                  -labels=>\%days,                  -labels=>\%days,
# Line 245  print start_form, Line 235  print start_form,
235                          Time::Available::DAY_THURSDAY,                          Time::Available::DAY_THURSDAY,
236                          Time::Available::DAY_FRIDAY,                          Time::Available::DAY_FRIDAY,
237                  ]                  ]
238                  ),          ),
239          $q->submit(-name=>'show',-value=>'Show report'),          $q->submit(-name=>'show',-value=>'Show report'),'
240          )),end_table;          </td></tr>
241            </table>
242            ',$q->end_form;
243    
244    # bail out of no data
245    if ($data && scalar @$data < 1) {
246            print $q->end_html;
247            exit;
248    }
249    
250  # dump report  # dump report
251  #  #
252    
253    my %dir_html_entity = (
254    #       'u' => '&uArr;',
255    #       'd' => '&dArr;'
256            'u' => '&#9650;',
257            'd' => '&#9660;',
258    );
259    
260  sub sort_link {  sub sort_link {
261          my $q = shift || return;          my $q = shift || return;
262          my $col = shift || return;          my $col = shift || return;
263          my $dir = lc(shift) || return;          my $dir = lc(shift) || return;
264          if ($sort_param{$dir.'sort'} && $sort_param{$dir.'sort'} eq $col) {          if ($sort_param{$dir.'sort'} && $sort_param{$dir.'sort'} eq $col) {
265                  return '&'.$dir.'Arr;';                  return $dir_html_entity{$dir};
266          } else {          } else {
267                  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>';
268          }          }
269  }  }
270    
# Line 276  if ($q->param('use_date_limit')) { Line 281  if ($q->param('use_date_limit')) {
281    
282  # sort data  # sort data
283  #  #
284  my @sorted = sorted_array(@$data, @sort);  my @sorted = sorted_array( @$data, @sort_rules );
285    
286  print "-- sort: ",Dumper(@sort)," (data: ".@$data." sorted: ".@sorted.") --\n",br,"-- dayMask: $dayMask --\n",br,"-- cache_key: $cache_key --\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);
287    
288  print start_table({-border=>1,-cellspacing=>0,-cellpadding=>2,-width=>'100%'});  print '<table border=1 cellspacing=0 cellpadding=2 width="100%">
289            <tr>
290  print Tr(          <th>group/service</th><th bgcolor="#f0f0f0"><nobr>',
291                  th("group/service"),          &sort_link($q,'from','u'),' from ',&sort_link($q,'from','d'),'</nobr>';
292                  th({-bgcolor=>'#f0f0f0'},'<nobr>'.  print '<br>',$from_html if ($from_html);
293                          &sort_link($q,'from','u').' from '.  print '</th><th><nobr>',
294                          &sort_link($q,'from','d').'</nobr>',          &sort_link($q,'to','u'),' to ',&sort_link($q,'to','d'),'</nobr>';
295                          br,$from_html  print '<br>',$to_html if ($to_html);
296                  ),  print '</th><th bgcolor="#e0e0e0"><nobr>',
297                  th(     '<nobr>'.          &sort_link($q,'dur','u'),' duration ',&sort_link($q,'dur','d'),'</nobr>
298                          &sort_link($q,'to','u').' to '.          </th><th>description</th>
299                          &sort_link($q,'to','d').'</nobr>',          </tr>';
300                          br,$to_html  
301                  ),  my $downtime;           # total downtime
302                  th({-bgcolor=>'#e0e0e0'},'<nobr>'.  my $downinterval;       # total downtime in time interval
303                          &sort_link($q,'dur','u').' duration '.  my $sg_count;           # count number of downtimes
                         &sort_link($q,'dur','d').'</nobr>'  
                 ),  
                 th("description")  
         ) if (scalar @sorted > 0);  
304    
305  foreach my $row (@sorted) {  foreach my $row (@sorted) {
306          next if ($q->param('use_date_limit') && ($row->{from} < $from_time || $row->{to} > $to_time));          next if ($q->param('use_date_limit') && ($row->{from} < $from_time || $row->{to} > $to_time));
307          my ($from,$dur,$int) = ('unknown','unknown','unknown');          my ($from,$dur,$int) = ('unknown','unknown','unknown');
308    
309          if ($row->{from} != -1 ) {          if ($row->{from} != -1 ) {
310                  $from = d($row->{from});                  $from = d($row->{from});
311                  $dur = dur($row->{to} - $row->{from});                  $dur = $row->{to} - $row->{from};
312                  $int = dur($working_days->interval($row->{to},$row->{from}));                  $downtime->{$row->{sg}} += $dur;
313                    if ($q->param('use_time_limit')) {
314                            $int = $working_days->interval($row->{from},$row->{to});
315                            $dur = dur($int)."<br><nobr><small>&sum; ".dur($dur)."</small></nobr>";
316                            $downinterval->{$row->{sg}} += $int;
317                    } else {
318                            $dur = dur($dur);
319                    }
320          }          }
321          print Tr(          $sg_count->{$row->{sg}}++;
322                  td({-align=>'left',-valign=>'center'},$row->{sg}),  
323                  td({-align=>'right',-bgcolor=>'#f0f0f0'},$from),          print '<tr>
324                  td({-align=>'right'},d($row->{to})),                  <td align="left" valign="center">',$row->{sg},'</td>
325                  td({-align=>'center',-bgcolor=>'#e0e0e0'},$dur),                  <td align="right" bgcolor="#f0f0f0">',$from,'</td>
326                  td({-align=>'center',-bgcolor=>'#e0e0e0'},$int),                  <td align="right">',d($row->{to}),'</td>
327                  td({-align=>'left'},$row->{desc}),                  <td align="center" bgcolor="#e0e0e0">',$dur,'</td>
328                  ),"\n";                  <td align="left">',$row->{desc},'</td>
329                    </tr>';
330  }  }
331    
332  # dump totals  # dump totals
333  #  #
334    
335    my $dur;
336  foreach my $sg (keys %$downtime) {  foreach my $sg (keys %$downtime) {
337  print Tr(td({-colspan=>3,-align=>'right'},"total for $sg:"),          if ($downinterval->{$sg}) {
338          td({-bgcolor=>'#e0e0e0',-align=>'right'},dur($downtime->{$sg})),                  $dur=dur($downinterval->{$sg})."<br><nobr><small>&sum; ".dur($downtime->{$sg})."</small></nobr>";
339          td(small("in ".$sg_count->{$sg}." failures"))),"\n";          } else {
340                    $dur=dur($downtime->{$sg});
341            }
342            print '<tr><td colspan=3 align="right">total for ',$sg,'</td>
343                    <td bgcolor="#e0e0e0" align="right">',$dur,'</td>
344                    <td><small>in ',$sg_count->{$sg},' failures</small></td>
345                    </tr>';
346  }  }
347    
348  print end_table,  print "</table>",
349          end_form;          $q->end_html;
350    
351    

Legend:
Removed from v.1.4  
changed lines
  Added in v.1.8

  ViewVC Help
Powered by ViewVC 1.1.26