71496094095a85ba507a9e2679e625fe66a9b16d
[zfs-nexenta/.git] / zfs-log-parser
1 #!/usr/bin/perl
2
3 # Author: Alan J. Pippin
4 # Description: This script parses logfiles generated by the following zfs scripts:
5 #              zfs-replicate
6
7 $logfile=shift(@ARGV);
8 $startdate=shift(@ARGV);
9
10 sub usage {
11     print "Usage: $0 <log file> <date>\n";
12     exit 0;
13 }
14 if(! -f "$logfile") { &usage; }
15
16 $kilo = 1024;
17 $mega = 1024 * 1024;
18 $giga = 1024 * 1024 * 1024;
19
20 sub time_to_seconds {
21     my ($hour,$minute,$sec) = @_;
22     $seconds = ($hour * 60 * 60) + ($minute * 60) + ($sec);
23     return($seconds);
24 }
25
26 sub adjust_duration {
27     my ($duration) = @_;
28     if($duration > 3600) { $duration=int($duration/3600); $duration.="h"; }
29     elsif($duration > 60) { $duration=int($duration/60); $duration.="m"; }
30     else { $duration.="s"; }
31     return $duration;
32 }
33
34 sub adjust_data {
35     my ($data) = @_;
36     if($data > ($giga)) { $data = int($data / $giga); $data = "$data"."Gb"; }
37     elsif($data > ($mega)) { $data = int($data / $mega); $data = "$data"."Mb"; }
38     elsif($data > ($kilo)) { $data = int($data / $kilo); $data = "$data"."Kb"; }
39     return $data;
40 }
41
42 sub parse_replicate_logfile {
43     $in_replicate=0;
44     $date="";
45     %totals=();
46     while(<FILE>) {
47         $line = $_;
48         if(($in_replicate == 0) && ("$startdate" ne "") && ($line !~ /$startdate/)) { next; }
49         if($line =~ /(\S+)\s+(\S+)\s+(\d+)\s+(\d+):(\d+):(\d+)\s+(\S+)\s+(\S+)/) {
50             $dayname=$1; $month=$2; $daynum=$3; $hour=$4; $minute=$5; $sec=$6; $year=$8;
51             if(($in_replicate == 0) && ($line =~ /lock obtained/)) {
52                 $in_replicate = 1;
53                 $date="$dayname $month $daynum $hour:$minute:$sec $year";
54                 $totals{$date}{data} = 0;
55                 $totals{$date}{transfertime} = 0;
56                 $totals{$date}{duration} = time_to_seconds($hour,$minute,$sec);
57             }
58             elsif(($in_replicate == 1) && ($line=~ /lock released/)) {
59                 $in_replicate = 0;
60                 $totals{$date}{duration} = time_to_seconds($hour,$minute,$sec) - $totals{$date}{duration};
61             }
62         }   
63         if(($in_replicate == 1) && ($line =~ /received ([\d\.]+)(\w+)/)) {
64             $data = $1; $size = $2;
65             if($size =~ /Kb/i) { $data = $data * $kilo; }
66             if($size =~ /Mb/i) { $data = $data * $mega; }
67             if($size =~ /Gb/i) { $data = $data * $giga; }
68             chomp($line);
69             $totals{$date}{data} += $data;
70         }
71         if(($in_replicate == 1) && ($line =~ /in (\d+) seconds/)) {
72             $transfertime = $1;
73             $totals{$date}{transfertime} += $transfertime;
74         }
75     }
76     
77     foreach $date (keys %totals) {
78         $duration=adjust_duration($totals{$date}{duration});
79         $data=adjust_data($totals{$date}{data});
80         $transfertime=adjust_duration($totals{$date}{transfertime});
81         $rate = adjust_data(int($totals{$date}{data}/$totals{$date}{transfertime}));
82         print "$date: data=${data} transfertime=$transfertime rate=${rate}/sec duration=$duration\n";
83     }
84 }
85
86 #########
87 # MAIN
88 #########
89 #print "-> Parsing $logfile\n";
90 open(FILE,"$logfile") || die "-E- Unable to open $logfile\n";
91
92 if($logfile =~ /replicate/) { parse_replicate_logfile(); }
93
94 close(FILE);