1# Copyright 2016 The Chromium Authors. All rights reserved. 2# Use of this source code is governed by a BSD-style license that can be 3# found in the LICENSE file. 4 5import datetime 6import json 7import logging 8import os 9import tempfile 10 11from py_utils import cloud_storage 12 13from telemetry.internal.results import chart_json_output_formatter 14from telemetry.internal.results import output_formatter 15 16from tracing import results_renderer 17from tracing.value import convert_chart_json 18 19 20class HtmlOutputFormatter(output_formatter.OutputFormatter): 21 def __init__(self, output_stream, metadata, reset_results, 22 upload_bucket=None): 23 super(HtmlOutputFormatter, self).__init__(output_stream) 24 self._metadata = metadata 25 self._upload_bucket = upload_bucket 26 self._reset_results = reset_results 27 28 def _ConvertChartJson(self, page_test_results): 29 chart_json = chart_json_output_formatter.ResultsAsChartDict( 30 self._metadata, page_test_results.all_page_specific_values, 31 page_test_results.all_summary_values) 32 info = page_test_results.telemetry_info 33 chart_json['label'] = info.label 34 chart_json['benchmarkStartMs'] = info.benchmark_start_ms 35 36 file_descriptor, chart_json_path = tempfile.mkstemp() 37 os.close(file_descriptor) 38 json.dump(chart_json, file(chart_json_path, 'w')) 39 40 vinn_result = convert_chart_json.ConvertChartJson(chart_json_path) 41 42 os.remove(chart_json_path) 43 44 if vinn_result.returncode != 0: 45 logging.error('Error converting chart json to Histograms:\n' + 46 vinn_result.stdout) 47 return [] 48 return json.loads(vinn_result.stdout) 49 50 def Format(self, page_test_results): 51 histograms = page_test_results.value_set 52 if not histograms: 53 histograms = self._ConvertChartJson(page_test_results) 54 55 results_renderer.RenderHTMLView(histograms, 56 self._output_stream, self._reset_results) 57 file_path = os.path.abspath(self._output_stream.name) 58 if self._upload_bucket: 59 remote_path = ('html-results/results-%s' % 60 datetime.datetime.now().strftime('%Y-%m-%d_%H-%M-%S')) 61 try: 62 url = cloud_storage.Insert(self._upload_bucket, remote_path, file_path) 63 print 'View HTML results online at %s' % url 64 except cloud_storage.PermissionError as e: 65 logging.error('Cannot upload profiling files to cloud storage due to ' 66 ' permission error: %s' % e.message) 67