#!/usr/bin/python3 import collections import csv import os import sys import traceback report_errors = [] status = 'success' message = 'See the report' print(""" Clickhouse performance comparison

ClickHouse performance comparison

""".format()) table_template = """

{caption}

{header} {rows}
""" table_anchor = 0 row_anchor = 0 def nextTableAnchor(): global table_anchor table_anchor += 1 return str(table_anchor) def nextRowAnchor(): global row_anchor global table_anchor row_anchor += 1 return str(table_anchor) + "." + str(row_anchor) def tr(x): a = nextRowAnchor() #return '{x}'.format(a=a, x=str(x)) return '{x}'.format(a=a, x=str(x)) def td(value, cell_class = ''): return '{value}'.format( cell_class = cell_class, value = value) def th(x): return '' + str(x) + '' def tableRow(r): return tr(''.join([td(f) for f in r])) def tableHeader(r): return tr(''.join([th(f) for f in r])) def tableStart(title): return """

{title}

""".format( anchor = nextTableAnchor(), title = title) def tableEnd(): return '
' def tsvRowsRaw(n): result = [] try: with open(n, encoding='utf-8') as fd: return [row for row in csv.reader(fd, delimiter="\t", quotechar='"')] except: report_errors.append( traceback.format_exception_only( *sys.exc_info()[:2])[-1]) pass return [] def tsvTableRows(n): rawRows = tsvRowsRaw(n) result = '' for row in rawRows: result += tableRow(row) return result print(table_template.format( anchor = nextTableAnchor(), caption = 'Tested commits', header = tableHeader(['Old', 'New']), rows = tableRow([open('left-commit.txt').read(), open('right-commit.txt').read()]))) print(table_template.format( anchor = nextTableAnchor(), caption = 'Changes in performance', header = tableHeader(['Old, s', 'New, s', 'Relative difference (new - old)/old', 'Randomization distribution quantiles [5%, 50%, 95%]', 'Test', 'Query']), rows = tsvTableRows('changed-perf.tsv'))) print(table_template.format( anchor = nextTableAnchor(), caption = 'Slow on client', header = tableHeader(['Client time, s', 'Server time, s', 'Ratio', 'Query']), rows = tsvTableRows('slow-on-client.tsv'))) print(table_template.format( anchor = nextTableAnchor(), caption = 'Unstable queries', header = tableHeader(['Old, s', 'New, s', 'Relative difference (new - old)/old', 'Randomization distribution quantiles [5%, 50%, 95%]', 'Test', 'Query']), rows = tsvTableRows('unstable-queries.tsv'))) print(table_template.format( anchor = nextTableAnchor(), caption = 'Run errors', header = tableHeader(['A', 'B']), rows = tsvTableRows('run-errors.log'))) print(table_template.format( anchor = nextTableAnchor(), caption = 'Tests with most unstable queries', header = tableHeader(['Test', 'Unstable', 'Changed perf', 'Total not OK']), rows = tsvTableRows('bad-tests.tsv'))) def print_test_times(): rows = tsvRowsRaw('test-times.tsv') if not rows: return print(rows, file=sys.stderr) print(tableStart('Test times')) print(tableHeader([ 'Test', #0 'Wall clock time, s', #1 'Total client time, s', #2 'Total queries', #3 'Ignored short queries', #4 'Longest query
(sum for all runs), s', #5 'Avg wall clock time
(sum for all runs), s', #6 'Shortest query
(sum for all runs), s', #7 ])) for r in rows: print(tableRow(r)) print(tableEnd()) print_test_times() if len(report_errors): print(tableStart('Errors while building the report')) print(tableHeader(['Error'])) for x in report_errors: print(tableRow([x])) print(tableEnd()) print(""" """) if report_errors: status = 'error' message = 'Errors while building the report.' print(""" """.format(status=status, message=message))