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