blob: cdfc5e996ec7fea44c6bf8136fc0fbc51ac741e8 [file] [log] [blame]
# -*- coding: utf-8 -*-
# Copyright 2015 The Chromium OS Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
"""Developer tool for exploring perf website interaction.
The performance dashboards can be found here (login w/your @google.com):
https://chromeperf.appspot.com/ (production)
https://chrome-perf.googleplex.com/ (staging)
By default though, this tool will post data to a local instance running on your
system. See this page for details on running that:
https://sites.google.com/a/google.com/chromeperf/
This guide should help familiarize yourself with the perf data format:
https://dev.chromium.org/developers/testing/sending-data-to-the-performance-dashboard
This tool currently uses the version 0 data format.
Some notes:
- --revision or --cros-version/--chrome-version should be independent
- do not mix rev/cros-ver/chrome-ver in the same data series/graph
Examples:
# Create a data point at (20110701024650,361077106). The test name is
# "sdk.size" and is in the "base" series in the "combined" graph.
$ ./perf_dashboard_tool -u bytes -t sdk.size -g combined -d base \\
--revision 20110701024650 361077106
# Create a data point at (6689.0.0,2000400100). The test name is
# "disk.size" and is in the "data" series.
$ ./perf_dashboard_tool -u bytes -t disk.size --cros-version 6689.0.0 \\
--chrome-version 41.6689.0.0 2000400100
"""
from __future__ import print_function
import getpass
import os
import tempfile
import urllib
from chromite.lib import commandline
from chromite.lib import cros_build_lib
from chromite.lib import cros_logging as logging
from chromite.lib import perf_uploader
MASTER_NAME = 'ChromeOSPerfTest'
TEST_NAME = 'perf_uploader_tool.%s' % getpass.getuser()
def GetParser():
"""Return a command line parser"""
parser = commandline.ArgumentParser(description=__doc__)
parser.add_argument('-n', '--dry-run', default=False, action='store_true',
help='Show what would be uploaded')
parser.add_argument('--url', default=perf_uploader.LOCAL_DASHBOARD_URL,
help='Dashboard to send results to')
group = parser.add_argument_group('Bot Details')
group.add_argument('-m', '--master', default=MASTER_NAME,
help='The buildbot master field')
group.add_argument('-b', '--bot',
default=cros_build_lib.GetHostName(fully_qualified=True),
help='The bot name (e.g. buildbot config)')
group = parser.add_argument_group('Version Options (X-axis)')
group.add_argument('--revision', default=None,
help='Revision number')
group.add_argument('--cros-version', default=None,
help='Chrome OS version (X.Y.Z)')
group.add_argument('--chrome-version', default=None,
help='Chrome version (M.X.Y.Z)')
group = parser.add_argument_group('Data Options')
group.add_argument('-t', '--test', default=TEST_NAME,
help='The test name field')
group.add_argument('--higher-is-better', default=False, action='store_true',
help='Whether higher values are better than lower')
group.add_argument('-u', '--units', default='',
help='Units for the perf data (e.g. percent, bytes)')
group.add_argument('-g', '--graph',
help='Graph name (to group multiple tests)')
group.add_argument('-d', '--description', default='data',
help='Name for this data series')
group.add_argument('--stdio-uri',
help='Custom log page to link data point to')
group.add_argument('data',
help='Data point (int or float)')
return parser
def main(argv):
parser = GetParser()
opts = parser.parse_args(argv)
opts.Freeze()
logging.info('Uploading results to %s', opts.url)
logging.info('Master name: %s', opts.master)
logging.info('Test name: %s', opts.test)
with tempfile.NamedTemporaryFile() as output:
perf_uploader.OutputPerfValue(
output.name,
opts.description,
float(opts.data),
opts.units,
graph=opts.graph,
stdio_uri=opts.stdio_uri)
perf_values = perf_uploader.LoadPerfValues(output.name)
logging.debug('Uploading:')
for value in perf_values:
logging.debug(' %s', value)
perf_uploader.UploadPerfValues(
perf_values,
opts.bot,
opts.test,
revision=opts.revision,
cros_version=opts.cros_version,
chrome_version=opts.chrome_version,
dashboard=opts.url,
master_name=opts.master,
test_prefix='',
platform_prefix='',
dry_run=opts.dry_run)
data_name = opts.graph if opts.graph else opts.description
args = {
'masters': opts.master,
'tests': '%s/%s' % (opts.test, data_name),
'bots': opts.bot,
}
view_url = os.path.join(opts.url, 'report?%s' % urllib.urlencode(args))
logging.info('View results at %s', view_url)
logging.info('Note: To make tests public, visit %s',
os.path.join(opts.url, 'change_internal_only'))
logging.info('Note: To update the test list, visit %s',
os.path.join(opts.url, 'update_test_suites'))