Chromium Code Reviews| 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) |