blob: f609805f0a1a67e92dcae8a73d70c9c87c267586 [file] [log] [blame]
gstepanov1fbb71d2015-04-14 19:56:23 +03001import os
koder aka kdanilov652cd802015-04-13 12:21:07 +03002import sys
Yulia Portnova6d72d7f2015-02-04 16:48:50 +02003from collections import OrderedDict
Yulia Portnova6d72d7f2015-02-04 16:48:50 +02004
Yulia Portnova407ca952015-04-10 10:38:15 +03005import formatters
koder aka kdanilov66839a92015-04-11 13:22:31 +03006from chart import charts
gstepanov1fbb71d2015-04-14 19:56:23 +03007from io_results_loader import filter_data, load_files
8from meta_info import total_lab_info, collect_lab_data
koder aka kdanilov2c473092015-03-29 17:12:13 +03009from utils import ssize_to_b
koder aka kdanilov652cd802015-04-13 12:21:07 +030010from statistic import med_dev, approximate_curve
11
Yulia Portnova6d72d7f2015-02-04 16:48:50 +020012
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
gstepanov1fbb71d2015-04-14 19:56:23 +0300137def render_html(charts_urls, dest, lab_description):
Yulia Portnova919f3be2015-02-06 12:49:22 +0200138 templ = open("report.html", 'r').read()
gstepanov1fbb71d2015-04-14 19:56:23 +0300139 body = "<a href='#lab_desc'>Lab description</a>" \
140 "<div><ol>{0}</ol></div>" \
141 '<a name="lab_desc"></a>' \
142 "<div><ul>{1}</ul></div>"
Yulia Portnova919f3be2015-02-06 12:49:22 +0200143 li = "<li><img src='%s'></li>"
144 ol = []
gstepanov1fbb71d2015-04-14 19:56:23 +0300145 ul = []
146
147 for key in lab_description:
148 value = lab_description[key]
149 ul.append("<li>{0} : {1}</li>".
150 format(key, value))
151
Yulia Portnova919f3be2015-02-06 12:49:22 +0200152 for chart in charts_urls:
153 ol.append(li % chart)
gstepanov1fbb71d2015-04-14 19:56:23 +0300154
155 html = templ % {'body': body.format('\n'.join(ol),
156 '\n'.join(ul))}
Yulia Portnova407ca952015-04-10 10:38:15 +0300157 open(dest, 'w').write(html)
Yulia Portnova919f3be2015-02-06 12:49:22 +0200158
159
koder aka kdanilov652cd802015-04-13 12:21:07 +0300160# def render_html_results(ctx):
161# charts = []
162# for res in ctx.results:
163# if res[0] == "io":
164# charts.append(build_io_chart(res))
Yulia Portnova407ca952015-04-10 10:38:15 +0300165
koder aka kdanilov652cd802015-04-13 12:21:07 +0300166# bars = build_vertical_bar(ctx.results)
167# lines = build_lines_chart(ctx.results)
Yulia Portnova407ca952015-04-10 10:38:15 +0300168
koder aka kdanilov652cd802015-04-13 12:21:07 +0300169 # render_html(bars + lines, dest)
Yulia Portnova407ca952015-04-10 10:38:15 +0300170
Yulia Portnova407ca952015-04-10 10:38:15 +0300171
Yulia Portnova8ca20572015-04-14 14:09:39 +0300172def io_chart(title, concurence, latv, iops_or_bw, iops_or_bw_dev,
173 legend):
174 bar_data, bar_dev = iops_or_bw, iops_or_bw_dev
175 legend = [legend]
176
177 bar_dev_bottom = []
178 bar_dev_top = []
179 for i in range(len(bar_data)):
180 bar_dev_top.append(bar_data[i] + bar_dev[i])
181 bar_dev_bottom.append(bar_data[i] - bar_dev[i])
182
183 latv = [lat / 1000 for lat in latv]
184 ch = charts.render_vertical_bar(title, legend, [bar_data], [bar_dev_top],
185 [bar_dev_bottom],
186 scale_x=concurence,
187 lines=[(latv, "msec", "rr", "lat")])
188 return str(ch)
189
190
gstepanov1fbb71d2015-04-14 19:56:23 +0300191def make_io_report(results, path, lab_url, creds):
192 data = collect_lab_data(lab_url, creds)
193 lab_info = total_lab_info(data)
194
koder aka kdanilov652cd802015-04-13 12:21:07 +0300195 for suite_type, test_suite_data in results:
196 if suite_type != 'io':
197 continue
Yulia Portnova407ca952015-04-10 10:38:15 +0300198
koder aka kdanilov652cd802015-04-13 12:21:07 +0300199 io_test_suite_res = test_suite_data['res']
koder aka kdanilov66839a92015-04-11 13:22:31 +0300200
koder aka kdanilov652cd802015-04-13 12:21:07 +0300201 charts_url = []
koder aka kdanilov66839a92015-04-11 13:22:31 +0300202
koder aka kdanilov652cd802015-04-13 12:21:07 +0300203 name_filters = [
204 #('hdd_test_rws4k', ('concurence', 'lat', 'iops')),
205 #('hdd_test_rrs4k', ('concurence', 'lat', 'iops')),
206 ('hdd_test_rrd4k', ('concurence', 'lat', 'iops')),
koder aka kdanilov4e9f3ed2015-04-14 11:26:12 +0300207 ('hdd_test_swd1m', ('concurence', 'lat', 'bw')),
koder aka kdanilov652cd802015-04-13 12:21:07 +0300208 ]
koder aka kdanilov66839a92015-04-11 13:22:31 +0300209
koder aka kdanilov652cd802015-04-13 12:21:07 +0300210 for name_filter, fields in name_filters:
211 th_filter = filter_data(name_filter, fields)
koder aka kdanilov66839a92015-04-11 13:22:31 +0300212
koder aka kdanilov652cd802015-04-13 12:21:07 +0300213 data_iter = sorted(th_filter(io_test_suite_res.values()))
Yulia Portnova407ca952015-04-10 10:38:15 +0300214
koder aka kdanilov652cd802015-04-13 12:21:07 +0300215 concurence, latv, iops_or_bw_v = zip(*data_iter)
216 iops_or_bw_v, iops_or_bw_dev_v = zip(*map(med_dev, iops_or_bw_v))
Yulia Portnova8ca20572015-04-14 14:09:39 +0300217 latv, _ = zip(*map(med_dev, latv))
Yulia Portnova407ca952015-04-10 10:38:15 +0300218
Yulia Portnova8ca20572015-04-14 14:09:39 +0300219 url = io_chart(name_filter, concurence, latv, iops_or_bw_v,
220 iops_or_bw_dev_v,
221 fields[2])
gstepanov1fbb71d2015-04-14 19:56:23 +0300222
Yulia Portnova8ca20572015-04-14 14:09:39 +0300223 charts_url.append(url)
224 # _, ax1 = plt.subplots()
225 #
226 # ax1.plot(concurence, iops_or_bw_v)
227 # ax1.errorbar(concurence, iops_or_bw_v, iops_or_bw_dev_v,
228 # linestyle='None',
229 # label="iops_or_bw_v",
230 # marker="*")
231 #
232 # # ynew = approximate_line(ax, ay, ax, True)
233 #
234 # ax2 = ax1.twinx()
235 #
236 # ax2.errorbar(concurence,
237 # [med_dev(lat)[0] / 1000 for lat in latv],
238 # [med_dev(lat)[1] / 1000 for lat in latv],
239 # linestyle='None',
240 # label="iops_or_bw_v",
241 # marker="*")
242 # ax2.plot(concurence, [med_dev(lat)[0] / 1000 for lat in latv])
243 # plt.show()
244 # exit(0)
koder aka kdanilov652cd802015-04-13 12:21:07 +0300245
246 # bw_only = []
247
248 # for conc, _, _, (bw, _) in data:
249 # bw_only.append(bw)
250 # bw_d_per_th.append((bw / conc, 0))
251
252 # lines = [(zip(*lat_d)[0], 'msec', 'rr', 'lat'), (bw_sum, None, None, 'bw_sum')]
253
254 # chart_url = charts.render_vertical_bar(
255 # chart_name, ["bw"], [bw_d_per_th], label_x="KBps",
256 # scale_x=ordered_data.keys(),
257 # lines=lines)
258
259 # charts_url.append(str(chart_url))
260
gstepanov1fbb71d2015-04-14 19:56:23 +0300261 render_html(charts_url, path, lab_info)
koder aka kdanilov652cd802015-04-13 12:21:07 +0300262
263
264def main(args):
gstepanov1fbb71d2015-04-14 19:56:23 +0300265 make_io_report(results=[('a','b')],
266 path=os.path.dirname(args[0]),
267 lab_url='http://172.16.52.112:8000',
268 creds={'username': 'admin', 'password': 'admin', "tenant_name": 'admin'})
Yulia Portnova407ca952015-04-10 10:38:15 +0300269 return 0
270
271
272if __name__ == '__main__':
koder aka kdanilov652cd802015-04-13 12:21:07 +0300273 exit(main(sys.argv))