From d5e8cfc2699e1d40a879243e2f191ce143f9da32 Mon Sep 17 00:00:00 2001 From: Ilya Shakhat Date: Sun, 20 Mar 2016 19:38:28 +0300 Subject: [PATCH] Add info block into report toolkit --- performa/engine/report.py | 60 ++++++++++++++++++- performa/scenarios/mq/omsimulator-ha-cast.rst | 27 ++++++++- 2 files changed, 82 insertions(+), 5 deletions(-) diff --git a/performa/engine/report.py b/performa/engine/report.py index fd60f11..d758408 100644 --- a/performa/engine/report.py +++ b/performa/engine/report.py @@ -61,16 +61,24 @@ def generate_chart(chart_str, db, doc_folder, tag): * ''' % dict(title=title) - table += ''.join((' - %s\n' % axes[k]) for k in sorted(axes.keys())) + axes_keys = sorted(axes.keys()) + + table += ''.join((' - %s\n' % axes[k]) for k in axes_keys) y_keys = set(axes.keys()) ^ set('x') for chart_rec in chart_data: for k in y_keys: lines[k].append((chart_rec['x'], chart_rec[k])) + + values = [] + for v in axes_keys: + cv = chart_rec[v] or 0 + patt = ' - %%%s' % ('d' if isinstance(cv, int) else '.1f') + values.append(patt % cv) + table += (' *\n' + - '\n'.join(' - %.1f' % (chart_rec[v] or 0) - for v in sorted(axes.keys())) + + '\n'.join(values) + '\n') xy_chart = pygal.XY(style=style.RedBlueStyle, @@ -94,6 +102,47 @@ def generate_chart(chart_str, db, doc_folder, tag): return doc +def generate_info(definition_str, db, doc_folder, tag): + definition = yaml.safe_load(definition_str) + pipeline = definition.get('pipeline') + title = definition.get('title') + fields = definition.get('fields') + + collection_name = definition.get('collection') or 'records' + collection = db.get_collection(collection_name) + + LOG.debug('Title: %s', title) + + pipeline.insert(0, {'$match': {'status': 'OK'}}) + + if tag: + pipeline.insert(0, {'$match': {'tag': tag}}) + + data = [r for r in collection.aggregate(pipeline)] + if not data: + LOG.warning('No data returned for info block: %s', title) + return '**No data**' + + data = data[0] + + table = ''' +.. list-table:: + :header-rows: 1 + + * + - attribute + - value +''' + + for field_name, field_title in sorted(fields.items(), key=lambda a: a[0]): + value = data[field_name] + patt = (''' *\n - %%s\n - %%%s\n''' % + ('d' if isinstance(value, int) else '.1f')) + table += patt % (field_title, value) + + return table + + def _make_dir(name): try: os.makedirs(name) @@ -128,6 +177,11 @@ def generate_report(scenario, base_dir, mongo_url, db_name, doc_folder, db=db, doc_folder=doc_folder, tag=tag) + jinja_env.filters['info'] = functools.partial( + generate_info, + db=db, + doc_folder=doc_folder, + tag=tag) template = utils.read_file(report_template, base_dir=base_dir) compiled_template = jinja_env.from_string(template) diff --git a/performa/scenarios/mq/omsimulator-ha-cast.rst b/performa/scenarios/mq/omsimulator-ha-cast.rst index 70a44b8..5bb28da 100644 --- a/performa/scenarios/mq/omsimulator-ha-cast.rst +++ b/performa/scenarios/mq/omsimulator-ha-cast.rst @@ -5,8 +5,31 @@ This report is result of `message_queue_performance`_ execution with `Oslo.messaging Simulator`_ -Test Case 1: RPC CAST Throughput Test -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +RPC CAST failover throughput test +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +**Summary** + +{{''' + title: Execution summary + fields: + a1: Client sent, msg + b1: Server received, msg + b2: Loss, msg + c1: Avg. latency, ms + c2: Max latency, ms + collection: records + pipeline: + - $match: { task: omsimulator, mode: cast } + - $project: + a1: "$client.count" + b1: "$server.count" + b2: { $subtract: ["$client.count", "$server.count" ] } + c1: { $multiply: ["$server.latency", 1000] } + c2: { $multiply: ["$server.max_latency", 1000] } +''' | info +}} + **Messages sent by the client**