blob: 32f9d6ff87eda7ea320a8f39aed8e431ef00b0de [file] [log] [blame]
koder aka kdanilov652cd802015-04-13 12:21:07 +03001import sys
Yulia Portnova6d72d7f2015-02-04 16:48:50 +02002from collections import OrderedDict
Yulia Portnova6d72d7f2015-02-04 16:48:50 +02003
koder aka kdanilov66839a92015-04-11 13:22:31 +03004
Yulia Portnova407ca952015-04-10 10:38:15 +03005import formatters
koder aka kdanilov66839a92015-04-11 13:22:31 +03006from chart import charts
koder aka kdanilov2c473092015-03-29 17:12:13 +03007from utils import ssize_to_b
koder aka kdanilov652cd802015-04-13 12:21:07 +03008from statistic import med_dev, approximate_curve
9
Yulia Portnova8ca20572015-04-14 14:09:39 +030010from disk_perf_test_tool.io_results_loader import (load_files, filter_data)
Yulia Portnova6d72d7f2015-02-04 16:48:50 +020011
12
Yulia Portnova7b3b1d42015-02-13 14:08:35 +020013OPERATIONS = (('async', ('randwrite asynchronous', 'randread asynchronous',
14 'write asynchronous', 'read asynchronous')),
15 ('sync', ('randwrite synchronous', 'randread synchronous',
koder aka kdanilov652cd802015-04-13 12:21:07 +030016 'write synchronous', 'read synchronous')),
17 ('direct', ('randwrite direct', 'randread direct',
18 'write direct', 'read direct')))
Yulia Portnova7b3b1d42015-02-13 14:08:35 +020019
20sync_async_view = {'s': 'synchronous',
koder aka kdanilov652cd802015-04-13 12:21:07 +030021 'a': 'asynchronous',
22 'd': 'direct'}
Yulia Portnova042344d2015-02-10 17:38:33 +020023
24
koder aka kdanilov652cd802015-04-13 12:21:07 +030025# def pgbench_chart_data(results):
26# """
27# Format pgbench results for chart
28# """
29# data = {}
30# charts_url = []
Yulia Portnova6d72d7f2015-02-04 16:48:50 +020031
koder aka kdanilov652cd802015-04-13 12:21:07 +030032# formatted_res = formatters.format_pgbench_stat(results)
33# for key, value in formatted_res.items():
34# num_cl, num_tr = key.split(' ')
35# data.setdefault(num_cl, {}).setdefault(build, {})
36# data[keys[z]][build][
37# ' '.join(keys)] = value
Yulia Portnova6d72d7f2015-02-04 16:48:50 +020038
koder aka kdanilov652cd802015-04-13 12:21:07 +030039# for name, value in data.items():
40# title = name
41# legend = []
42# dataset = []
Yulia Portnova6d72d7f2015-02-04 16:48:50 +020043
koder aka kdanilov652cd802015-04-13 12:21:07 +030044# scale_x = []
Yulia Portnova6d72d7f2015-02-04 16:48:50 +020045
koder aka kdanilov652cd802015-04-13 12:21:07 +030046# for build_id, build_results in value.items():
47# vals = []
48# OD = OrderedDict
49# ordered_build_results = OD(sorted(build_results.items(),
50# key=lambda t: t[0]))
51# scale_x = ordered_build_results.keys()
52# for key in scale_x:
53# res = build_results.get(key)
54# if res:
55# vals.append(res)
56# if vals:
57# dataset.append(vals)
58# legend.append(build_id)
Yulia Portnovae4408022015-02-10 15:39:25 +020059
koder aka kdanilov652cd802015-04-13 12:21:07 +030060# if dataset:
61# charts_url.append(str(charts.render_vertical_bar
62# (title, legend, dataset, scale_x=scale_x)))
63# return charts_url
Yulia Portnova919f3be2015-02-06 12:49:22 +020064
65
Yulia Portnova407ca952015-04-10 10:38:15 +030066def build_vertical_bar(results, z=0):
67 data = {}
68 charts_url = []
69 for build, res in results:
70 formatted_res = formatters.get_formatter(build)(res)
71 for key, value in formatted_res.items():
72 keys = key.split(' ')
73 data.setdefault(keys[z], {}).setdefault(build, {})
74 data[keys[z]][build][
75 ' '.join(keys)] = value
76
77 for name, value in data.items():
78 title = name
79 legend = []
80 dataset = []
81
82 scale_x = []
83
84 for build_id, build_results in value.items():
85 vals = []
86 OD = OrderedDict
87 ordered_build_results = OD(sorted(build_results.items(),
88 key=lambda t: t[0]))
89 scale_x = ordered_build_results.keys()
90 for key in scale_x:
91 res = build_results.get(key)
92 if res:
93 vals.append(res)
94 if vals:
95 dataset.append(vals)
96 legend.append(build_id)
97
98 if dataset:
99 charts_url.append(str(charts.render_vertical_bar
100 (title, legend, dataset, scale_x=scale_x)))
101 return charts_url
102
103
104def build_lines_chart(results, z=0):
Yulia Portnova919f3be2015-02-06 12:49:22 +0200105 data = {}
106 charts_url = []
107
Yulia Portnova407ca952015-04-10 10:38:15 +0300108 for build, res in results:
109 formatted_res = formatters.get_formatter(build)(res)
110 for key, value in formatted_res.items():
Yulia Portnova919f3be2015-02-06 12:49:22 +0200111 keys = key.split(' ')
Yulia Portnova407ca952015-04-10 10:38:15 +0300112 data.setdefault(key[z], {})
113 data[key[z]].setdefault(build, {})[keys[1]] = value
Yulia Portnova919f3be2015-02-06 12:49:22 +0200114
115 for name, value in data.items():
116 title = name
117 legend = []
118 dataset = []
119 scale_x = []
120 for build_id, build_results in value.items():
121 legend.append(build_id)
koder aka kdanilove21d7472015-02-14 19:02:04 -0800122
123 OD = OrderedDict
124 ordered_build_results = OD(sorted(build_results.items(),
koder aka kdanilov2c473092015-03-29 17:12:13 +0300125 key=lambda t: ssize_to_b(t[0])))
koder aka kdanilove21d7472015-02-14 19:02:04 -0800126
Yulia Portnova919f3be2015-02-06 12:49:22 +0200127 if not scale_x:
128 scale_x = ordered_build_results.keys()
129 dataset.append(zip(*ordered_build_results.values())[0])
130
131 chart = charts.render_lines(title, legend, dataset, scale_x)
132 charts_url.append(str(chart))
133
134 return charts_url
135
136
Yulia Portnova407ca952015-04-10 10:38:15 +0300137def render_html(charts_urls, dest):
Yulia Portnova919f3be2015-02-06 12:49:22 +0200138 templ = open("report.html", 'r').read()
139 body = "<div><ol>%s</ol></div>"
140 li = "<li><img src='%s'></li>"
141 ol = []
142 for chart in charts_urls:
143 ol.append(li % chart)
144 html = templ % {'body': body % '\n'.join(ol)}
Yulia Portnova407ca952015-04-10 10:38:15 +0300145 open(dest, 'w').write(html)
Yulia Portnova919f3be2015-02-06 12:49:22 +0200146
147
koder aka kdanilov652cd802015-04-13 12:21:07 +0300148# def render_html_results(ctx):
149# charts = []
150# for res in ctx.results:
151# if res[0] == "io":
152# charts.append(build_io_chart(res))
Yulia Portnova407ca952015-04-10 10:38:15 +0300153
koder aka kdanilov652cd802015-04-13 12:21:07 +0300154# bars = build_vertical_bar(ctx.results)
155# lines = build_lines_chart(ctx.results)
Yulia Portnova407ca952015-04-10 10:38:15 +0300156
koder aka kdanilov652cd802015-04-13 12:21:07 +0300157 # render_html(bars + lines, dest)
Yulia Portnova407ca952015-04-10 10:38:15 +0300158
Yulia Portnova407ca952015-04-10 10:38:15 +0300159
Yulia Portnova8ca20572015-04-14 14:09:39 +0300160def io_chart(title, concurence, latv, iops_or_bw, iops_or_bw_dev,
161 legend):
162 bar_data, bar_dev = iops_or_bw, iops_or_bw_dev
163 legend = [legend]
164
165 bar_dev_bottom = []
166 bar_dev_top = []
167 for i in range(len(bar_data)):
168 bar_dev_top.append(bar_data[i] + bar_dev[i])
169 bar_dev_bottom.append(bar_data[i] - bar_dev[i])
170
171 latv = [lat / 1000 for lat in latv]
172 ch = charts.render_vertical_bar(title, legend, [bar_data], [bar_dev_top],
173 [bar_dev_bottom],
174 scale_x=concurence,
175 lines=[(latv, "msec", "rr", "lat")])
176 return str(ch)
177
178
179def make_io_report(results, path):
koder aka kdanilov652cd802015-04-13 12:21:07 +0300180 for suite_type, test_suite_data in results:
181 if suite_type != 'io':
182 continue
Yulia Portnova407ca952015-04-10 10:38:15 +0300183
koder aka kdanilov652cd802015-04-13 12:21:07 +0300184 io_test_suite_res = test_suite_data['res']
koder aka kdanilov66839a92015-04-11 13:22:31 +0300185
koder aka kdanilov652cd802015-04-13 12:21:07 +0300186 charts_url = []
koder aka kdanilov66839a92015-04-11 13:22:31 +0300187
koder aka kdanilov652cd802015-04-13 12:21:07 +0300188 name_filters = [
189 #('hdd_test_rws4k', ('concurence', 'lat', 'iops')),
190 #('hdd_test_rrs4k', ('concurence', 'lat', 'iops')),
191 ('hdd_test_rrd4k', ('concurence', 'lat', 'iops')),
koder aka kdanilov4e9f3ed2015-04-14 11:26:12 +0300192 ('hdd_test_swd1m', ('concurence', 'lat', 'bw')),
koder aka kdanilov652cd802015-04-13 12:21:07 +0300193 ]
koder aka kdanilov66839a92015-04-11 13:22:31 +0300194
koder aka kdanilov652cd802015-04-13 12:21:07 +0300195 for name_filter, fields in name_filters:
196 th_filter = filter_data(name_filter, fields)
koder aka kdanilov66839a92015-04-11 13:22:31 +0300197
koder aka kdanilov652cd802015-04-13 12:21:07 +0300198 data_iter = sorted(th_filter(io_test_suite_res.values()))
Yulia Portnova407ca952015-04-10 10:38:15 +0300199
koder aka kdanilov652cd802015-04-13 12:21:07 +0300200 concurence, latv, iops_or_bw_v = zip(*data_iter)
201 iops_or_bw_v, iops_or_bw_dev_v = zip(*map(med_dev, iops_or_bw_v))
Yulia Portnova8ca20572015-04-14 14:09:39 +0300202 latv, _ = zip(*map(med_dev, latv))
Yulia Portnova407ca952015-04-10 10:38:15 +0300203
Yulia Portnova8ca20572015-04-14 14:09:39 +0300204 url = io_chart(name_filter, concurence, latv, iops_or_bw_v,
205 iops_or_bw_dev_v,
206 fields[2])
207 charts_url.append(url)
208 # _, ax1 = plt.subplots()
209 #
210 # ax1.plot(concurence, iops_or_bw_v)
211 # ax1.errorbar(concurence, iops_or_bw_v, iops_or_bw_dev_v,
212 # linestyle='None',
213 # label="iops_or_bw_v",
214 # marker="*")
215 #
216 # # ynew = approximate_line(ax, ay, ax, True)
217 #
218 # ax2 = ax1.twinx()
219 #
220 # ax2.errorbar(concurence,
221 # [med_dev(lat)[0] / 1000 for lat in latv],
222 # [med_dev(lat)[1] / 1000 for lat in latv],
223 # linestyle='None',
224 # label="iops_or_bw_v",
225 # marker="*")
226 # ax2.plot(concurence, [med_dev(lat)[0] / 1000 for lat in latv])
227 # plt.show()
228 # exit(0)
koder aka kdanilov652cd802015-04-13 12:21:07 +0300229
230 # bw_only = []
231
232 # for conc, _, _, (bw, _) in data:
233 # bw_only.append(bw)
234 # bw_d_per_th.append((bw / conc, 0))
235
236 # lines = [(zip(*lat_d)[0], 'msec', 'rr', 'lat'), (bw_sum, None, None, 'bw_sum')]
237
238 # chart_url = charts.render_vertical_bar(
239 # chart_name, ["bw"], [bw_d_per_th], label_x="KBps",
240 # scale_x=ordered_data.keys(),
241 # lines=lines)
242
243 # charts_url.append(str(chart_url))
244
Yulia Portnova8ca20572015-04-14 14:09:39 +0300245 render_html(charts_url, path)
koder aka kdanilov652cd802015-04-13 12:21:07 +0300246
247
248def main(args):
Yulia Portnova8ca20572015-04-14 14:09:39 +0300249 make_io_report(load_files(args[1:]))
Yulia Portnova407ca952015-04-10 10:38:15 +0300250 return 0
251
252
253if __name__ == '__main__':
koder aka kdanilov652cd802015-04-13 12:21:07 +0300254 exit(main(sys.argv))