3 # Author: Alan J. Pippin
4 # Description: This script parses logfiles generated by the following zfs scripts:
8 $startdate=shift(@ARGV);
9 $backup_pool="backups";
12 print "Usage: $0 <log file> <date>\n";
15 if(! -f "$logfile") { &usage; }
19 $giga = 1024 * 1024 * 1024;
21 %month2num = ( "Jan" => "01", "Feb" => "02", "Mar" => "03", "Apr" => "04", "May" => "05", "Jun" => "06",
22 "Jul" => "07", "Aug" => "08", "Sep" => "09", "Oct" => "10", "Nov" => "11", "Dec" => "12");
25 my ($hour,$minute,$sec) = @_;
26 $seconds = ($hour * 60 * 60) + ($minute * 60) + ($sec);
32 if($duration > 3600) { $duration=int($duration/3600); $duration.="h"; }
33 elsif($duration > 60) { $duration=int($duration/60); $duration.="m"; }
34 else { $duration.="s"; }
40 if(abs($data) > ($giga)) { $data = $data / $giga; $data = sprintf("%2.2fGb",$data); }
41 elsif(abs($data) > ($mega)) { $data = int($data / $mega); $data = "$data"."Mb"; }
42 elsif(abs($data) > ($kilo)) { $data = int($data / $kilo); $data = "$data"."Kb"; }
46 sub parse_replicate_logfile {
52 if(($in_replicate == 0) && ("$startdate" ne "") && ($line !~ /$startdate/)) { next; }
53 if($line =~ /(\S+)\s+(\S+)\s+(\d+)\s+(\d+):(\d+):(\d+)\s+(\S+)\s+(\S+)/) {
54 $dayname=$1; $month=$2; $daynum=$3; $hour=$4; $minute=$5; $sec=$6; $year=$8;
55 if(($in_replicate == 0) && ($line =~ /lock obtained/)) {
57 $date="$dayname $month $daynum $hour:$minute:$sec $year";
58 $totals{$date}{data} = 0;
59 $totals{$date}{transfertime} = 0;
60 $totals{$date}{duration} = time_to_seconds($hour,$minute,$sec);
62 elsif(($in_replicate == 1) && ($line=~ /lock released/)) {
64 $totals{$date}{duration} = time_to_seconds($hour,$minute,$sec) - $totals{$date}{duration};
67 if(($in_replicate == 1) && ($line =~ /received ([\d\.]+)(\w+)/)) {
68 $data = $1; $size = $2;
69 if($size =~ /Kb/i) { $data = $data * $kilo; }
70 if($size =~ /Mb/i) { $data = $data * $mega; }
71 if($size =~ /Gb/i) { $data = $data * $giga; }
73 $totals{$date}{data} += $data;
75 if(($in_replicate == 1) && ($line =~ /in (\d+) seconds/)) {
77 $totals{$date}{transfertime} += $transfertime;
81 foreach $date (keys %totals) {
82 $duration=adjust_duration($totals{$date}{duration});
83 $data=adjust_data($totals{$date}{data});
84 $transfertime=adjust_duration($totals{$date}{transfertime});
85 $rate = adjust_data(int($totals{$date}{data}/$totals{$date}{transfertime}));
86 print "$date: data=${data} transfertime=$transfertime rate=${rate}/sec duration=$duration\n";
90 sub parse_snapshot_totals_logfile {
97 if($line =~ /logfile turned over/) { next; }
98 if(($in_totals == 0) && ($line =~ /(\S+)\s+(\S+)\s+(\d+)\s+(\d+):(\d+):(\d+)\s+(\S+)\s+(\S+)/)) {
99 $dayname=$1; $month=$2; $daynum=$3; $hour=$4; $minute=$5; $sec=$6; $year=$8;
101 $month = $month2num{$month};
102 if($daynum < 10) { $daynum = "0".$daynum; }
103 $date="$month-$daynum-$year";
104 if(!defined $founddates{$date}) { $header .= $date . " "; }
105 $founddates{$date} = 1;
107 elsif(($in_totals == 1) && ($line =~ /^\s+$/)) {
110 elsif(($in_totals == 1) && ($line =~ /(\S+)\s+([\d\.]+)(\w+)\s+(\d+)/)) {
111 $filesystem = $1; $data = $2; $size = $3; $num_snaps = $4;
112 if($filesystem =~ /Snapshots/) { next; }
113 if($filesystem =~ /$backup_pool/) { next; }
114 if(length($filesystem) > $maxlen) { $maxlen = length($filesystem); }
115 if($size =~ /K/i) { $data = $data * $kilo; }
116 if($size =~ /M/i) { $data = $data * $mega; }
117 if($size =~ /G/i) { $data = $data * $giga; }
119 $totals{$filesystem}{$date}{data} = $data;
120 if($totals{$filesystem}{start_data} == 0) { $totals{$filesystem}{start_data} = $data; }
121 $totals{$filesystem}{delta} = $data - $totals{$filesystem}{start_data};
125 printf("%-${maxlen}s %s %s\n","ZFS Filesystem","$header","Net Change");
126 foreach $filesystem (sort keys %totals) {
127 $hashref = $totals{$filesystem};
129 foreach $date (sort keys %$hashref) {
130 if($date !~ /(\d+)-(\d+)-(\d+)/) { next; }
131 $date_data=adjust_data($totals{$filesystem}{$date}{data});
132 $data .= sprintf("%10s",$date_data). " ";
133 $date_totals{$date}{data} += $totals{$filesystem}{$date}{data};
135 $data_total=adjust_data($data_total);
136 $total_delta+=$totals{$filesystem}{delta};
137 $delta=adjust_data($totals{$filesystem}{delta});
138 printf("%-${maxlen}s %s %10s\n",$filesystem,$data,$delta);
141 $data_len=length($data);
142 $total_delta=adjust_data($total_delta);
143 foreach $date (sort keys %date_totals) {
144 $date_data=adjust_data($date_totals{$date}{data});
145 $data .= sprintf("%10s",$date_data). " ";
147 printf("%-${maxlen}s %-${data_len}s %10s\n","Totals:",$data,$total_delta);
153 #print "-> Parsing $logfile\n";
154 open(FILE,"$logfile") || die "-E- Unable to open $logfile\n";
156 if($logfile =~ /replicate/) { parse_replicate_logfile(); }
157 if($logfile =~ /snapshot-totals/) { parse_snapshot_totals_logfile(); }