Improved io charts
diff --git a/report.py b/report.py
index aaaaa53..e21665d 100644
--- a/report.py
+++ b/report.py
@@ -1,7 +1,11 @@
import argparse
from collections import OrderedDict
+import itertools
+import math
+import re
from chart import charts
+import formatters
from utils import ssize_to_b
@@ -24,58 +28,95 @@
return parser.parse_args(argv)
-def build_vertical_bar(results):
+def pgbench_chart_data(results):
+ """
+ Format pgbench results for chart
+ """
data = {}
charts_url = []
- for build, results in results.items():
- for key, value in results.results.items():
- keys = key.split(' ')
- if not data.get(keys[2]):
- data[keys[2]] = {}
- if not data[keys[2]].get(build):
- data[keys[2]][build] = {}
- data[keys[2]][build][
- ' '.join([keys[0], sync_async_view[keys[1]]])] = value
+ formatted_res = formatters.format_pgbench_stat(results)
+ for key, value in formatted_res.items():
+ num_cl, num_tr = key.split(' ')
+ data.setdefault(num_cl, {}).setdefault(build, {})
+ data[keys[z]][build][
+ ' '.join(keys)] = value
for name, value in data.items():
- for op_type, operations in OPERATIONS:
- title = "Block size: " + name
- legend = []
- dataset = []
+ title = name
+ legend = []
+ dataset = []
- scale_x = []
+ scale_x = []
- for build_id, build_results in value.items():
- vals = []
+ for build_id, build_results in value.items():
+ vals = []
+ OD = OrderedDict
+ ordered_build_results = OD(sorted(build_results.items(),
+ key=lambda t: t[0]))
+ scale_x = ordered_build_results.keys()
+ for key in scale_x:
+ res = build_results.get(key)
+ if res:
+ vals.append(res)
+ if vals:
+ dataset.append(vals)
+ legend.append(build_id)
- for key in operations:
- res = build_results.get(key)
- if res:
- vals.append(res)
- scale_x.append(key)
- if vals:
- dataset.append(vals)
- legend.append(build_id)
-
- if dataset:
- charts_url.append(str(charts.render_vertical_bar
- (title, legend, dataset, scale_x=scale_x)))
+ if dataset:
+ charts_url.append(str(charts.render_vertical_bar
+ (title, legend, dataset, scale_x=scale_x)))
return charts_url
-def build_lines_chart(results):
+def build_vertical_bar(results, z=0):
+ data = {}
+ charts_url = []
+ for build, res in results:
+ formatted_res = formatters.get_formatter(build)(res)
+ for key, value in formatted_res.items():
+ keys = key.split(' ')
+ data.setdefault(keys[z], {}).setdefault(build, {})
+ data[keys[z]][build][
+ ' '.join(keys)] = value
+
+ for name, value in data.items():
+ title = name
+ legend = []
+ dataset = []
+
+ scale_x = []
+
+ for build_id, build_results in value.items():
+ vals = []
+ OD = OrderedDict
+ ordered_build_results = OD(sorted(build_results.items(),
+ key=lambda t: t[0]))
+ scale_x = ordered_build_results.keys()
+ for key in scale_x:
+ res = build_results.get(key)
+ if res:
+ vals.append(res)
+ if vals:
+ dataset.append(vals)
+ legend.append(build_id)
+
+ if dataset:
+ charts_url.append(str(charts.render_vertical_bar
+ (title, legend, dataset, scale_x=scale_x)))
+ return charts_url
+
+
+def build_lines_chart(results, z=0):
data = {}
charts_url = []
- for build, results in results.items():
- for key, value in results.results.items():
+ for build, res in results:
+ formatted_res = formatters.get_formatter(build)(res)
+ for key, value in formatted_res.items():
keys = key.split(' ')
- if not data.get(' '.join([keys[0], keys[1]])):
- data[' '.join([keys[0], keys[1]])] = {}
- if not data[' '.join([keys[0], keys[1]])].get(build):
- data[' '.join([keys[0], keys[1]])][build] = {}
- data[' '.join([keys[0], keys[1]])][build][keys[2]] = value
+ data.setdefault(key[z], {})
+ data[key[z]].setdefault(build, {})[keys[1]] = value
for name, value in data.items():
title = name
@@ -99,7 +140,7 @@
return charts_url
-def render_html(charts_urls):
+def render_html(charts_urls, dest):
templ = open("report.html", 'r').read()
body = "<div><ol>%s</ol></div>"
li = "<li><img src='%s'></li>"
@@ -107,22 +148,82 @@
for chart in charts_urls:
ol.append(li % chart)
html = templ % {'body': body % '\n'.join(ol)}
- open('results.html', 'w').write(html)
+ open(dest, 'w').write(html)
+def build_io_chart(res):
+ pass
+
+
+def render_html_results(ctx, dest):
+ charts = []
+ import ipdb;ipdb.set_trace()
+ for res in ctx.results:
+ if res[0] == "io":
+ charts.append(build_io_chart(res))
+
+ bars = build_vertical_bar(ctx.results)
+ lines = build_lines_chart(ctx.results)
+
+ render_html(bars + lines, dest)
+
# def report(url, email=None, password=None):
# results = storage.recent_builds()
# bars = build_vertical_bar(results)
# lines = build_lines_chart(results)
#
# render_html(bars + lines)
+#
-#
-# def main(argv):
-# opts = parse_args(argv)
-# report(opts.url)
-# return 0
-#
-#
-# if __name__ == '__main__':
-# exit(main(sys.argv[1:]))
+
+def calc_dev(l):
+ sum_res = sum(l)
+ mean = sum_res/len(l)
+ sum_sq = sum([(r - mean) ** 2 for r in l])
+ if len(l) > 1:
+ return math.sqrt(sum_sq / (len(l) - 1))
+ else:
+ return 0
+
+
+def main():
+ from tests.disk_test_agent import parse_output
+ out = parse_output(
+ open("results/io_scenario_check_th_count.txt").read()).next()
+ results = out['res']
+
+ charts_url = []
+ charts_data = {}
+ for test_name, test_res in results.items():
+ blocksize = test_res['blocksize']
+ op_type = "sync" if test_res['sync'] else "direct"
+ chart_name = "Block size: %s %s" % (blocksize, op_type)
+ lat = sum(test_res['lat']) / len(test_res['lat']) / 1000
+ lat_dev = calc_dev(test_res['lat'])
+ iops = sum(test_res['iops']) / len(test_res['iops'])
+ iops_dev = calc_dev(test_res['iops'])
+ bw = sum(test_res['bw_mean']) / len(test_res['bw_mean'])
+ bw_dev = calc_dev(test_res['bw_mean'])
+ conc = test_res['concurence']
+ vals = ((lat, lat_dev), (iops, iops_dev), (bw, bw_dev))
+ charts_data.setdefault(chart_name, {})[conc] = vals
+
+ for chart_name, chart_data in charts_data.items():
+ legend = ["bw"]
+ ordered_data = OrderedDict(sorted(chart_data.items(),
+ key=lambda t: t[0]))
+
+ lat_d, iops_d, bw_d = zip(*ordered_data.values())
+ bw_sum = [vals[2][0] * conc for conc, vals in ordered_data.items()]
+
+ chart_url = str(charts.render_vertical_bar(
+ chart_name, legend, [bw_d], label_x="KBps",
+ scale_x=ordered_data.keys(),
+ lines=[(zip(*lat_d)[0], 'msec', 'rr', 'lat'), (bw_sum, None, None, 'bw_sum')]))
+ charts_url.append(chart_url)
+ render_html(charts_url, "results.html")
+ return 0
+
+
+if __name__ == '__main__':
+ exit(main())