Index: tools/telemetry/telemetry/results/buildbot_output_formatter.py |
diff --git a/tools/telemetry/telemetry/results/buildbot_output_formatter.py b/tools/telemetry/telemetry/results/buildbot_output_formatter.py |
new file mode 100644 |
index 0000000000000000000000000000000000000000..2e39ef9f6fcc0fc47a817850d92b104ef1842b99 |
--- /dev/null |
+++ b/tools/telemetry/telemetry/results/buildbot_output_formatter.py |
@@ -0,0 +1,109 @@ |
+# Copyright 2014 The Chromium Authors. All rights reserved. |
+# Use of this source code is governed by a BSD-style license that can be |
+# found in the LICENSE file. |
+ |
+from telemetry import perf_tests_helper |
+from telemetry.results import output_formatter |
+from telemetry import value as value_module |
+from telemetry.value import summary as summary_module |
+ |
+ |
+class BuildbotOutputFormatter(output_formatter.OutputFormatter): |
+ def __init__(self, output_stream, trace_tag=''): |
+ super(BuildbotOutputFormatter, self).__init__(output_stream) |
+ self._trace_tag = trace_tag |
+ |
+ def _PrintPerfResult(self, measurement, trace, v, units, |
+ result_type='default'): |
+ output = perf_tests_helper.PrintPerfResult( |
+ measurement, trace, v, units, result_type, print_to_stdout=False) |
+ self.output_stream.write(output + '\n') |
+ self.output_stream.flush() |
+ |
+ def Format(self, page_test_results): |
+ """Print summary data in a format expected by buildbot for perf dashboards. |
+ |
+ If any failed pages exist, only output individual page results, and do |
+ not output any average data. |
+ """ |
+ had_failures = len(page_test_results.failures) > 0 |
+ |
+ # Print out the list of unique pages. |
+ perf_tests_helper.PrintPages( |
+ [page.display_name for page in page_test_results.pages_that_succeeded]) |
+ summary = summary_module.Summary(page_test_results.all_page_specific_values) |
+ for value in summary.interleaved_computed_per_page_values_and_summaries: |
+ if value.page: |
+ self._PrintComputedPerPageValue(value) |
+ else: |
+ self._PrintComputedSummaryValue(value, had_failures) |
+ self._PrintOverallResults(page_test_results) |
+ |
+ def _PrintComputedPerPageValue(self, value): |
+ # We dont print per-page-values when there is a trace tag. |
+ if self._trace_tag: |
+ return |
+ |
+ # Actually print the result. |
+ buildbot_value = value.GetBuildbotValue() |
+ buildbot_data_type = value.GetBuildbotDataType( |
+ output_context=value_module.PER_PAGE_RESULT_OUTPUT_CONTEXT) |
+ if buildbot_value is None or buildbot_data_type is None: |
+ return |
+ |
+ buildbot_measurement_name, buildbot_trace_name = ( |
+ value.GetChartAndTraceNameForPerPageResult()) |
+ self._PrintPerfResult(buildbot_measurement_name, |
+ buildbot_trace_name, |
+ buildbot_value, value.units, buildbot_data_type) |
+ |
+ def _PrintComputedSummaryValue(self, value, had_failures): |
+ # If there were any page errors, we typically will print nothing. |
+ # |
+ # Note: this branch is structured less-densely to improve legibility. |
+ if had_failures: |
+ return |
+ |
+ buildbot_value = value.GetBuildbotValue() |
+ buildbot_data_type = value.GetBuildbotDataType( |
+ output_context=value_module.COMPUTED_PER_PAGE_SUMMARY_OUTPUT_CONTEXT) |
+ if buildbot_value is None or buildbot_data_type is None: |
+ return |
+ |
+ buildbot_measurement_name, buildbot_trace_name = ( |
+ value.GetChartAndTraceNameForComputedSummaryResult( |
+ self._trace_tag)) |
+ self._PrintPerfResult(buildbot_measurement_name, |
+ buildbot_trace_name, |
+ buildbot_value, value.units, buildbot_data_type) |
+ |
+ def _PrintOverallResults(self, page_test_results): |
+ # If there were no failed pages, output the overall results (results not |
+ # associated with a page). |
+ had_failures = len(page_test_results.failures) > 0 |
+ if not had_failures: |
+ for value in page_test_results.all_summary_values: |
+ buildbot_value = value.GetBuildbotValue() |
+ buildbot_data_type = value.GetBuildbotDataType( |
+ output_context=value_module.SUMMARY_RESULT_OUTPUT_CONTEXT) |
+ buildbot_measurement_name, buildbot_trace_name = ( |
+ value.GetChartAndTraceNameForComputedSummaryResult( |
+ self._trace_tag)) |
+ self._PrintPerfResult( |
+ buildbot_measurement_name, |
+ buildbot_trace_name, |
+ buildbot_value, |
+ value.units, |
+ buildbot_data_type) |
+ |
+ # Print the number of failed and errored pages. |
+ self._PrintPerfResult('telemetry_page_measurement_results', 'num_failed', |
+ [len(page_test_results.failures)], 'count', |
+ 'unimportant') |
+ |
+ # TODO(chrishenry): Remove this in a separate patch to reduce the risk |
+ # of rolling back due to buildbot breakage. |
+ # Also fix src/tools/bisect-perf-regression_test.py when this is |
+ # removed. |
+ self._PrintPerfResult('telemetry_page_measurement_results', 'num_errored', |
+ [0], 'count', 'unimportant') |