5 # This tool lets you parse multiple fio log files and look at interaval
6 # statistics even when samples are non-uniform. For instance:
8 # fiologparser.py -s *bw*
10 # to see per-interval sums for all bandwidth logs or:
12 # fiologparser.py -a *clat*
14 # to see per-interval average completion latency.
19 parser = argparse.ArgumentParser()
20 parser.add_argument('-i', '--interval', required=False, type=int, default=1000, help='interval of time in seconds.')
21 parser.add_argument('-d', '--divisor', required=False, type=int, default=1, help='divide the results by this value.')
22 parser.add_argument('-f', '--full', dest='full', action='store_true', default=False, help='print full output.')
23 parser.add_argument('-a', '--average', dest='average', action='store_true', default=False, help='print the average for each interval.')
24 parser.add_argument('-s', '--sum', dest='sum', action='store_true', default=False, help='print the sum for each interval.')
25 parser.add_argument("FILE", help="collectl log output files to parse", nargs="+")
26 args = parser.parse_args()
30 def get_ftime(series):
33 if ftime == 0 or ts.last.end < ftime:
37 def print_full(ctx, series):
38 ftime = get_ftime(series)
42 while (start < ftime):
43 end = ftime if ftime < end else end
44 results = [ts.get_value(start, end) for ts in series]
45 print "%s, %s" % (end, ', '.join(["%0.3f" % i for i in results]))
49 def print_sums(ctx, series):
50 ftime = get_ftime(series)
54 while (start < ftime):
55 end = ftime if ftime < end else end
56 results = [ts.get_value(start, end) for ts in series]
57 print "%s, %0.3f" % (end, sum(results))
61 def print_averages(ctx, series):
62 ftime = get_ftime(series)
66 while (start < ftime):
67 end = ftime if ftime < end else end
68 results = [ts.get_value(start, end) for ts in series]
69 print "%s, %0.3f" % (end, float(sum(results))/len(results))
74 def print_default(ctx, series):
75 ftime = get_ftime(series)
81 while (start < ftime):
82 end = ftime if ftime < end else end
83 results = [ts.get_value(start, end) for ts in series]
84 averages.append(sum(results))
85 weights.append(end-start)
90 for i in xrange(0, len(averages)):
91 total += averages[i]*weights[i]
92 print '%0.3f' % (total/sum(weights))
95 def __init__(self, ctx, fn):
101 def read_data(self, fn):
105 (time, value, foo, bar) = line.rstrip('\r\n').rsplit(', ')
106 self.add_sample(p_time, int(time), int(value))
109 def add_sample(self, start, end, value):
110 sample = Sample(ctx, start, end, value)
111 if not self.last or self.last.end < end:
113 self.samples.append(sample)
115 def get_value(self, start, end):
117 for sample in self.samples:
118 value += sample.get_contribution(start, end)
122 def __init__(self, ctx, start, end, value):
128 def get_contribution(self, start, end):
129 # short circuit if not within the bound
130 if (end < self.start or start > self.end):
133 sbound = self.start if start < self.start else start
134 ebound = self.end if end > self.end else end
135 ratio = float(ebound-sbound) / (end-start)
136 return self.value*ratio/ctx.divisor
139 if __name__ == '__main__':
143 series.append(TimeSeries(ctx, fn))
145 print_sums(ctx, series)
147 print_averages(ctx, series)
149 print_full(ctx, series)
151 print_default(ctx, series)