Fix format produced by chart data recorder.
- dashboard wants a dictionary of dictionaries indexed by name of the
measurement
- the uploading logic already serializes the chart data together w/
metadata, recorder should return Python data structure
R=etiennej@chromium.org
Review URL: https://codereview.chromium.org/1422983002 .
Cr-Mirrored-From: https://github.com/domokit/mojo
Cr-Mirrored-Commit: dd48bf5ed9763b8b01a495046f73610c6b8e3d88
diff --git a/devtoolslib/perf_dashboard.py b/devtoolslib/perf_dashboard.py
index 68d87a3..defb54d 100644
--- a/devtoolslib/perf_dashboard.py
+++ b/devtoolslib/perf_dashboard.py
@@ -10,7 +10,6 @@
See http://www.chromium.org/developers/speed-infra/performance-dashboard/sending-data-to-the-performance-dashboard.
"""
-from collections import defaultdict
import httplib
import json
import pprint
@@ -28,18 +27,19 @@
"""
def __init__(self, benchmark_name):
- self.charts = defaultdict(list)
+ self.charts = {}
self.benchmark_name = benchmark_name
def record_scalar(self, chart_name, value_name, units, value):
"""Records a single measurement value of a scalar type."""
- self.charts[chart_name].append({
+ if chart_name not in self.charts:
+ self.charts[chart_name] = {}
+ self.charts[chart_name][value_name] = {
'type': 'scalar',
- 'name': value_name,
'units': units,
- 'value': value})
+ 'value': value}
- def get_json(self):
+ def get_chart_data(self):
"""Returns the JSON string representing the recorded chart data, wrapping
it with the required meta data."""
chart_data = {
@@ -47,7 +47,7 @@
'benchmark_name': self.benchmark_name,
'charts': self.charts
}
- return json.dumps(chart_data)
+ return chart_data
def add_argparse_server_arguments(parser):
diff --git a/devtoolslib/perf_dashboard_unittest.py b/devtoolslib/perf_dashboard_unittest.py
index b9c3b17..98714c9 100644
--- a/devtoolslib/perf_dashboard_unittest.py
+++ b/devtoolslib/perf_dashboard_unittest.py
@@ -5,7 +5,6 @@
"""Tests for the Chromium Performance Dashboard data format implementation."""
import imp
-import json
import os.path
import sys
import unittest
@@ -24,7 +23,7 @@
def test_empty(self):
"""Tests chart data with no charts."""
recorder = ChartDataRecorder('benchmark')
- result = json.loads(recorder.get_json())
+ result = recorder.get_chart_data()
self.assertEquals({
'format_version': '1.0',
'benchmark_name': 'benchmark',
@@ -36,7 +35,7 @@
recorder.record_scalar('chart', 'val1', 'ms', 1)
recorder.record_scalar('chart', 'val2', 'ms', 2)
- result = json.loads(recorder.get_json())
+ result = recorder.get_chart_data()
self.assertEquals('1.0', result['format_version'])
self.assertEquals('benchmark', result['benchmark_name'])
@@ -45,14 +44,12 @@
self.assertEquals(2, len(charts['chart']))
self.assertEquals({
'type': 'scalar',
- 'name': 'val1',
'units': 'ms',
- 'value': 1}, charts['chart'][0])
+ 'value': 1}, charts['chart']['val1'])
self.assertEquals({
'type': 'scalar',
- 'name': 'val2',
'units': 'ms',
- 'value': 2}, charts['chart'][1])
+ 'value': 2}, charts['chart']['val2'])
def test_two_charts(self):
"""Tests chart data with two samples over two charts."""
@@ -60,7 +57,7 @@
recorder.record_scalar('chart1', 'val1', 'ms', 1)
recorder.record_scalar('chart2', 'val2', 'ms', 2)
- result = json.loads(recorder.get_json())
+ result = recorder.get_chart_data()
self.assertEquals('1.0', result['format_version'])
self.assertEquals('benchmark', result['benchmark_name'])
@@ -69,12 +66,10 @@
self.assertEquals(1, len(charts['chart1']))
self.assertEquals({
'type': 'scalar',
- 'name': 'val1',
'units': 'ms',
- 'value': 1}, charts['chart1'][0])
+ 'value': 1}, charts['chart1']['val1'])
self.assertEquals(1, len(charts['chart2']))
self.assertEquals({
'type': 'scalar',
- 'name': 'val2',
'units': 'ms',
- 'value': 2}, charts['chart2'][0])
+ 'value': 2}, charts['chart2']['val2'])
diff --git a/mojo_benchmark b/mojo_benchmark
index 8413490..ff50689 100755
--- a/mojo_benchmark
+++ b/mojo_benchmark
@@ -6,11 +6,12 @@
"""Runner for Mojo application benchmarks."""
import argparse
+import json
import logging
-import sys
-import time
import os.path
import re
+import sys
+import time
from devtoolslib import shell_arguments
from devtoolslib import shell_config
@@ -244,7 +245,8 @@
exit_code = 1
if script_args.chart_data_output_file:
- script_args.chart_data_output_file.write(chart_data_recorder.get_json())
+ script_args.chart_data_output_file.write(
+ json.dumps(chart_data_recorder.get_chart_data()))
script_args.chart_data_output_file.write('\n')
return exit_code