Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(601)

Unified Diff: scripts/slave/results_dashboard.py

Issue 545803002: Update buildbots to parse new telemetry JSON format. (Closed) Base URL: https://chromium.googlesource.com/chromium/tools/build.git@master
Patch Set: Switched to having telemetry output json to files. Created 6 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: scripts/slave/results_dashboard.py
diff --git a/scripts/slave/results_dashboard.py b/scripts/slave/results_dashboard.py
index 7861202c176ca6e9322e616c56ae6bb5b767cb29..5da3736e3ec6bed9720d7409f359d792c9bdd91c 100755
--- a/scripts/slave/results_dashboard.py
+++ b/scripts/slave/results_dashboard.py
@@ -9,6 +9,7 @@ import calendar
import datetime
import httplib
import json
+import logging
ghost stip (do not use) 2014/09/09 02:20:06 left in from debugging?
import os
import urllib
import urllib2
@@ -25,6 +26,39 @@ CACHE_DIR = 'results_dashboard'
CACHE_FILENAME = 'results_to_retry'
+def SendChartJsonResults(chart_json, ref_json, revision_data, bot, mastername,
+ buildername, buildnumber, supplemental_dict, url,
+ build_dir):
qyearsley 2014/09/09 20:22:54 What about having a function which just constructs
sullivan 2014/09/11 00:25:56 Done.
+ # The master name used for the dashboard is the CamelCase name returned by
+ # GetActiveMaster(), and not the canonical master name with dots.
+ if not chart_json:
+ print 'Error: No json output from telemetry.'
+ print '@@@STEP_EXCEPTION@@@'
+ master = slave_utils.GetActiveMaster()
+ point_id, default_rev, versions = _RevisionNumberColumns(
+ revision_data, master, '')
+ supplemental_columns = {'default_rev': default_rev}
+ for key in supplemental_dict:
+ supplemental_columns[key.replace('a_', '', 1)] = supplemental_dict[key]
+ fields = {
+ 'master': master,
+ 'bot': bot,
+ 'masterid': mastername,
+ 'buildername': buildername,
+ 'buildnumber': buildnumber,
+ 'point_id': point_id,
+ 'supplemental': supplemental_columns,
+ 'versions': versions,
+ 'chart_data': chart_json,
+ 'is_ref': False,
+ }
+ SendResults(fields, url, build_dir)
+ if ref_json:
ghost stip (do not use) 2014/09/09 02:20:06 so the file will always exist, but the telemeteriz
sullivan 2014/09/11 00:25:55 In telemetry_utils.TelemetryResultsTracker._GetFil
+ fields['is_ref'] = True
+ fields['chart_data'] = ref_json
+ SendResults(fields, url, build_dir)
+
+
def SendResults(data, url, build_dir):
"""Sends results to the Chrome Performance Dashboard.
@@ -178,7 +212,8 @@ def MakeListOfPoints(charts, bot, test_name, mastername, buildername,
master = slave_utils.GetActiveMaster()
for chart_name, chart_data in sorted(charts.items()):
- revision, revision_columns = _RevisionNumberColumns(chart_data, master)
+ revision, default_rev, revision_columns = _RevisionNumberColumns(
+ chart_data, master)
ghost stip (do not use) 2014/09/09 02:24:16 this needs a prefix, right? 'r_' ?
eakuefner 2014/09/09 21:00:54 Actually, to clarify, the r_ and a_ prefixes are a
sullivan 2014/09/11 00:25:56 Yep.
for trace_name, trace_values in sorted(chart_data['traces'].items()):
is_important = trace_name in chart_data.get('important', [])
@@ -191,7 +226,7 @@ def MakeListOfPoints(charts, bot, test_name, mastername, buildername,
'masterid': mastername,
'buildername': buildername,
'buildnumber': buildnumber,
- 'supplemental_columns': {}
+ 'supplemental_columns': {'a_default_rev': default_rev}
}
# Add the supplemental_columns values that were passed in after the
@@ -226,22 +261,24 @@ def MakeListOfPoints(charts, bot, test_name, mastername, buildername,
return results
-def _RevisionNumberColumns(data, master):
+def _RevisionNumberColumns(data, master, prefix):
"""Get the revision number and revision-related columns from the given data.
Args:
data: A dict of information from one line of the log file.
master: The name of the buildbot master.
+ prefix: Prefix for keys. 'r_' for old-style json, '' for telemetry json.
Returns:
- A pair with the revision number (which must be an int), and a dict of
- version-related supplemental columns.
+ A 3-tuple with the revision number (which must be an int), the default rev
+ name, and a dict of version-related supplemental columns.
"""
def GetTimestamp():
"""Get the Unix timestamp for the current time."""
return int(calendar.timegm(datetime.datetime.utcnow().utctimetuple()))
revision_supplemental_columns = {}
+ default_rev = None
# The dashboard requires points' x-values to be integers, and points are
# ordered by this. If the revision can't be parsed as an int, assume that
@@ -257,8 +294,8 @@ def _RevisionNumberColumns(data, master):
# Add Chromium version if it was specified, and use timestamp as x-value.
if 'ver' in data and data['ver'] != 'undefined':
- revision_supplemental_columns['r_chrome_version'] = data['ver']
- revision_supplemental_columns['a_default_rev'] = 'r_chrome_version'
+ revision_supplemental_columns[prefix + 'chrome_version'] = data['ver']
+ default_rev = 'r_chrome_version'
revision = GetTimestamp()
# Blink builds can have the same chromium revision for two builds. So
@@ -266,35 +303,35 @@ def _RevisionNumberColumns(data, master):
# order they were built.
if master in ['ChromiumWebkit', 'Oilpan']:
if not git_hash:
- revision_supplemental_columns['r_chromium_svn'] = revision
+ revision_supplemental_columns[prefix + 'chromium_svn'] = revision
revision = GetTimestamp()
# Regardless of what the master is, if the given "rev" can't be parsed as
# an int, we're assuming that it's a git hash.
if git_hash:
- revision_supplemental_columns['r_chromium'] = git_hash
+ revision_supplemental_columns[prefix + 'chromium'] = git_hash
# For Oilpan, send the webkit_rev as r_oilpan since we are getting
# the oilpan branch revision instead of the Blink trunk revision
# and set r_oilpan to be the dashboard default revision.
if master == 'Oilpan':
- revision_supplemental_columns['r_oilpan'] = data['webkit_rev']
- revision_supplemental_columns['a_default_rev'] = 'r_oilpan'
+ revision_supplemental_columns[prefix + 'oilpan'] = data['webkit_rev']
+ default_rev = 'r_oilpan'
else:
# For other revision data, add it if it's present and not undefined:
for key in ['webkit_rev', 'webrtc_rev', 'v8_rev']:
if key in data and data[key] != 'undefined':
- revision_supplemental_columns['r_' + key] = data[key]
+ revision_supplemental_columns[prefix + key] = data[key]
# If possible, also send the git hash.
# If no other "default revision" type is specified already, use the git hash.
# This will change how it is displayed on the perf dashboard.
if 'git_revision' in data and data['git_revision'] != 'undefined':
- revision_supplemental_columns['r_chromium'] = data['git_revision']
- if 'a_default_rev' not in revision_supplemental_columns:
- revision_supplemental_columns['a_default_rev'] = 'r_chromium'
+ revision_supplemental_columns[prefix + 'chromium'] = data['git_revision']
+ if not default_rev:
+ default_rev = 'r_chromium'
- return revision, revision_supplemental_columns
+ return revision, default_rev, revision_supplemental_columns
def _TestPath(test_name, chart_name, trace_name):
@@ -367,12 +404,16 @@ def _LinkAnnotation(url, data):
Returns:
An annotation to print, or None.
"""
- if not data or type(data) is not list:
+ if not data:
return None
- point = data[0]
+ if type(data) is list:
+ master, bot, test, revision = (
+ data[0]['master'], data[0]['bot'], data[0]['test'], data[0]['revision'])
+ else:
+ master, bot, test, revision = (
+ data['master'], data['bot'], data['chart_data']['benchmark_name'],
+ data['point_id'])
results_link = url + RESULTS_LINK_PATH % (
- urllib.quote(point['master']),
- urllib.quote(point['bot']),
- urllib.quote(point['test'].split('/')[0]),
- point['revision'])
+ urllib.quote(master), urllib.quote(bot), urllib.quote(test.split('/')[0]),
+ revision)
return '@@@STEP_LINK@%s@%s@@@' % ('Results Dashboard', results_link)

Powered by Google App Engine
This is Rietveld 408576698