1cef7893435aa41160dd1255c43cb8498279738ccChris Craik# Copyright 2014 The Chromium Authors. All rights reserved. 2cef7893435aa41160dd1255c43cb8498279738ccChris Craik# Use of this source code is governed by a BSD-style license that can be 3cef7893435aa41160dd1255c43cb8498279738ccChris Craik# found in the LICENSE file. 4cef7893435aa41160dd1255c43cb8498279738ccChris Craik 5cef7893435aa41160dd1255c43cb8498279738ccChris Craikfrom telemetry import decorators 6cef7893435aa41160dd1255c43cb8498279738ccChris Craikfrom telemetry.internal.results import output_formatter 7cef7893435aa41160dd1255c43cb8498279738ccChris Craikfrom telemetry.util import perf_tests_helper 8cef7893435aa41160dd1255c43cb8498279738ccChris Craikfrom telemetry import value as value_module 9cef7893435aa41160dd1255c43cb8498279738ccChris Craikfrom telemetry.value import summary as summary_module 10cef7893435aa41160dd1255c43cb8498279738ccChris Craik 11cef7893435aa41160dd1255c43cb8498279738ccChris Craik 12cef7893435aa41160dd1255c43cb8498279738ccChris Craik@decorators.Deprecated(2016, 2, 29, 'Chart JSON is a supported alternative. ' 13cef7893435aa41160dd1255c43cb8498279738ccChris Craik 'See https://goo.gl/8daFav .') 14cef7893435aa41160dd1255c43cb8498279738ccChris Craikclass BuildbotOutputFormatter(output_formatter.OutputFormatter): 15cef7893435aa41160dd1255c43cb8498279738ccChris Craik def __init__(self, output_stream, trace_tag=''): 16cef7893435aa41160dd1255c43cb8498279738ccChris Craik super(BuildbotOutputFormatter, self).__init__(output_stream) 17cef7893435aa41160dd1255c43cb8498279738ccChris Craik self._trace_tag = trace_tag 18cef7893435aa41160dd1255c43cb8498279738ccChris Craik 19cef7893435aa41160dd1255c43cb8498279738ccChris Craik def _PrintPerfResult(self, measurement, trace, v, units, 20cef7893435aa41160dd1255c43cb8498279738ccChris Craik result_type='default'): 21cef7893435aa41160dd1255c43cb8498279738ccChris Craik output = perf_tests_helper.PrintPerfResult( 22cef7893435aa41160dd1255c43cb8498279738ccChris Craik measurement, trace, v, units, result_type, print_to_stdout=False) 23cef7893435aa41160dd1255c43cb8498279738ccChris Craik self.output_stream.write(output + '\n') 24cef7893435aa41160dd1255c43cb8498279738ccChris Craik self.output_stream.flush() 25cef7893435aa41160dd1255c43cb8498279738ccChris Craik 26cef7893435aa41160dd1255c43cb8498279738ccChris Craik def Format(self, page_test_results): 27cef7893435aa41160dd1255c43cb8498279738ccChris Craik """Print summary data in a format expected by buildbot for perf dashboards. 28cef7893435aa41160dd1255c43cb8498279738ccChris Craik 29cef7893435aa41160dd1255c43cb8498279738ccChris Craik If any failed pages exist, only output individual page results, and do 30cef7893435aa41160dd1255c43cb8498279738ccChris Craik not output any average data. 31cef7893435aa41160dd1255c43cb8498279738ccChris Craik """ 32cef7893435aa41160dd1255c43cb8498279738ccChris Craik had_failures = len(page_test_results.failures) > 0 33cef7893435aa41160dd1255c43cb8498279738ccChris Craik 34cef7893435aa41160dd1255c43cb8498279738ccChris Craik # Print out the list of unique pages. 35cef7893435aa41160dd1255c43cb8498279738ccChris Craik perf_tests_helper.PrintPages( 36cef7893435aa41160dd1255c43cb8498279738ccChris Craik [page.display_name for page in page_test_results.pages_that_succeeded]) 37cef7893435aa41160dd1255c43cb8498279738ccChris Craik summary = summary_module.Summary(page_test_results.all_page_specific_values) 38cef7893435aa41160dd1255c43cb8498279738ccChris Craik for value in summary.interleaved_computed_per_page_values_and_summaries: 39cef7893435aa41160dd1255c43cb8498279738ccChris Craik if value.page: 40cef7893435aa41160dd1255c43cb8498279738ccChris Craik self._PrintComputedPerPageValue(value) 41cef7893435aa41160dd1255c43cb8498279738ccChris Craik else: 42cef7893435aa41160dd1255c43cb8498279738ccChris Craik self._PrintComputedSummaryValue(value, had_failures) 43cef7893435aa41160dd1255c43cb8498279738ccChris Craik self._PrintOverallResults(page_test_results) 44cef7893435aa41160dd1255c43cb8498279738ccChris Craik 45cef7893435aa41160dd1255c43cb8498279738ccChris Craik def _PrintComputedPerPageValue(self, value): 46cef7893435aa41160dd1255c43cb8498279738ccChris Craik # We dont print per-page-values when there is a trace tag. 47cef7893435aa41160dd1255c43cb8498279738ccChris Craik if self._trace_tag: 48cef7893435aa41160dd1255c43cb8498279738ccChris Craik return 49cef7893435aa41160dd1255c43cb8498279738ccChris Craik 50cef7893435aa41160dd1255c43cb8498279738ccChris Craik # Actually print the result. 51cef7893435aa41160dd1255c43cb8498279738ccChris Craik buildbot_value = value.GetBuildbotValue() 52cef7893435aa41160dd1255c43cb8498279738ccChris Craik buildbot_data_type = value.GetBuildbotDataType( 53cef7893435aa41160dd1255c43cb8498279738ccChris Craik output_context=value_module.PER_PAGE_RESULT_OUTPUT_CONTEXT) 54cef7893435aa41160dd1255c43cb8498279738ccChris Craik if buildbot_value is None or buildbot_data_type is None: 55cef7893435aa41160dd1255c43cb8498279738ccChris Craik return 56cef7893435aa41160dd1255c43cb8498279738ccChris Craik 57cef7893435aa41160dd1255c43cb8498279738ccChris Craik buildbot_measurement_name, buildbot_trace_name = ( 58cef7893435aa41160dd1255c43cb8498279738ccChris Craik value.GetChartAndTraceNameForPerPageResult()) 59cef7893435aa41160dd1255c43cb8498279738ccChris Craik if value.tir_label: 60cef7893435aa41160dd1255c43cb8498279738ccChris Craik buildbot_measurement_name = '%s-%s' % (value.tir_label, 61cef7893435aa41160dd1255c43cb8498279738ccChris Craik buildbot_measurement_name) 62cef7893435aa41160dd1255c43cb8498279738ccChris Craik self._PrintPerfResult(buildbot_measurement_name, 63cef7893435aa41160dd1255c43cb8498279738ccChris Craik buildbot_trace_name, 64cef7893435aa41160dd1255c43cb8498279738ccChris Craik buildbot_value, value.units, buildbot_data_type) 65cef7893435aa41160dd1255c43cb8498279738ccChris Craik 66cef7893435aa41160dd1255c43cb8498279738ccChris Craik def _PrintComputedSummaryValue(self, value, had_failures): 67cef7893435aa41160dd1255c43cb8498279738ccChris Craik # If there were any page errors, we typically will print nothing. 68cef7893435aa41160dd1255c43cb8498279738ccChris Craik # 69cef7893435aa41160dd1255c43cb8498279738ccChris Craik # Note: this branch is structured less-densely to improve legibility. 70cef7893435aa41160dd1255c43cb8498279738ccChris Craik if had_failures: 71cef7893435aa41160dd1255c43cb8498279738ccChris Craik return 72cef7893435aa41160dd1255c43cb8498279738ccChris Craik 73cef7893435aa41160dd1255c43cb8498279738ccChris Craik buildbot_value = value.GetBuildbotValue() 74cef7893435aa41160dd1255c43cb8498279738ccChris Craik buildbot_data_type = value.GetBuildbotDataType( 75cef7893435aa41160dd1255c43cb8498279738ccChris Craik output_context=value_module.COMPUTED_PER_PAGE_SUMMARY_OUTPUT_CONTEXT) 76cef7893435aa41160dd1255c43cb8498279738ccChris Craik if buildbot_value is None or buildbot_data_type is None: 77cef7893435aa41160dd1255c43cb8498279738ccChris Craik return 78cef7893435aa41160dd1255c43cb8498279738ccChris Craik 79cef7893435aa41160dd1255c43cb8498279738ccChris Craik buildbot_measurement_name, buildbot_trace_name = ( 80cef7893435aa41160dd1255c43cb8498279738ccChris Craik value.GetChartAndTraceNameForComputedSummaryResult( 81cef7893435aa41160dd1255c43cb8498279738ccChris Craik self._trace_tag)) 82cef7893435aa41160dd1255c43cb8498279738ccChris Craik if value.tir_label: 83cef7893435aa41160dd1255c43cb8498279738ccChris Craik buildbot_measurement_name = '%s-%s' % (value.tir_label, 84cef7893435aa41160dd1255c43cb8498279738ccChris Craik buildbot_measurement_name) 85cef7893435aa41160dd1255c43cb8498279738ccChris Craik buildbot_trace_name = '%s-%s' % (value.tir_label, 86cef7893435aa41160dd1255c43cb8498279738ccChris Craik buildbot_trace_name) 87cef7893435aa41160dd1255c43cb8498279738ccChris Craik self._PrintPerfResult(buildbot_measurement_name, 88cef7893435aa41160dd1255c43cb8498279738ccChris Craik buildbot_trace_name, 89cef7893435aa41160dd1255c43cb8498279738ccChris Craik buildbot_value, value.units, buildbot_data_type) 90cef7893435aa41160dd1255c43cb8498279738ccChris Craik 91cef7893435aa41160dd1255c43cb8498279738ccChris Craik def _PrintOverallResults(self, page_test_results): 92cef7893435aa41160dd1255c43cb8498279738ccChris Craik # If there were no failed pages, output the overall results (results not 93cef7893435aa41160dd1255c43cb8498279738ccChris Craik # associated with a page). 94cef7893435aa41160dd1255c43cb8498279738ccChris Craik had_failures = len(page_test_results.failures) > 0 95cef7893435aa41160dd1255c43cb8498279738ccChris Craik if not had_failures: 96cef7893435aa41160dd1255c43cb8498279738ccChris Craik for value in page_test_results.all_summary_values: 97cef7893435aa41160dd1255c43cb8498279738ccChris Craik buildbot_value = value.GetBuildbotValue() 98cef7893435aa41160dd1255c43cb8498279738ccChris Craik buildbot_data_type = value.GetBuildbotDataType( 99cef7893435aa41160dd1255c43cb8498279738ccChris Craik output_context=value_module.SUMMARY_RESULT_OUTPUT_CONTEXT) 100cef7893435aa41160dd1255c43cb8498279738ccChris Craik buildbot_measurement_name, buildbot_trace_name = ( 101cef7893435aa41160dd1255c43cb8498279738ccChris Craik value.GetChartAndTraceNameForComputedSummaryResult( 102cef7893435aa41160dd1255c43cb8498279738ccChris Craik self._trace_tag)) 103cef7893435aa41160dd1255c43cb8498279738ccChris Craik self._PrintPerfResult( 104cef7893435aa41160dd1255c43cb8498279738ccChris Craik buildbot_measurement_name, 105cef7893435aa41160dd1255c43cb8498279738ccChris Craik buildbot_trace_name, 106cef7893435aa41160dd1255c43cb8498279738ccChris Craik buildbot_value, 107cef7893435aa41160dd1255c43cb8498279738ccChris Craik value.units, 108cef7893435aa41160dd1255c43cb8498279738ccChris Craik buildbot_data_type) 109cef7893435aa41160dd1255c43cb8498279738ccChris Craik 110cef7893435aa41160dd1255c43cb8498279738ccChris Craik # Print the number of failed and errored pages. 111cef7893435aa41160dd1255c43cb8498279738ccChris Craik self._PrintPerfResult('telemetry_page_measurement_results', 'num_failed', 112cef7893435aa41160dd1255c43cb8498279738ccChris Craik [len(page_test_results.failures)], 'count', 113cef7893435aa41160dd1255c43cb8498279738ccChris Craik 'unimportant') 114cef7893435aa41160dd1255c43cb8498279738ccChris Craik 115cef7893435aa41160dd1255c43cb8498279738ccChris Craik # TODO(chrishenry): Remove this in a separate patch to reduce the risk 116cef7893435aa41160dd1255c43cb8498279738ccChris Craik # of rolling back due to buildbot breakage. 117cef7893435aa41160dd1255c43cb8498279738ccChris Craik # Also fix src/tools/bisect-perf-regression_test.py when this is 118cef7893435aa41160dd1255c43cb8498279738ccChris Craik # removed. 119cef7893435aa41160dd1255c43cb8498279738ccChris Craik self._PrintPerfResult('telemetry_page_measurement_results', 'num_errored', 120cef7893435aa41160dd1255c43cb8498279738ccChris Craik [0], 'count', 'unimportant') 121