blob: 2b017c4c679c1c529f88711854082ea740d57124 [file] [log] [blame]
#!/usr/bin/env python2.7
# Copyright 2015 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.
"""Script to pull chromium.perf step timings from chrome-infra-stats API.
Currently this pulls the list of steps per builder. For each step, if it is not
a setup step, we get the step stats for the last 20 runs for that builder.
The API documentation for chrome-infra-stats is at:
https://apis-explorer.appspot.com/apis-explorer/?
base=https://chrome-infra-stats.appspot.com/_ah/api#p/
"""
import calendar
import csv
import json
import sys
import urllib
import urllib2
from dateutil import parser as dateparser
from datetime import datetime, timedelta
BUILDER_STEPS_URL = ('https://chrome-infra-stats.appspot.com/_ah/api/stats/v1/'
'masters/chromium.perf/%s')
STEP_ACTIVE_URL = ('https://chrome-infra-stats.appspot.com/_ah/api/stats/v1/'
'steps/last/chromium.perf/%s/%s/1')
STEP_STATS_URL = ('https://chrome-infra-stats.appspot.com/_ah/api/stats/v1/'
'stats/last/chromium.perf/%s/%s/20')
IGNORED_STEPS = [
'List Perf Tests',
'Sharded Perf Tests',
'authorize_adb_devices',
'bot_update',
'build__schedule__time__',
'clean local files',
'cleanup_temp',
'device_status_check',
'extract build',
'gclient runhooks',
'get compile targets for scripts',
'get perf test list',
'gsutil download_build_product',
'host_info',
'install ChromeShell.apk',
'json.output cache',
'json.output cache',
'overall__build__result__',
'overall__queued__time__',
'provision_devices',
'read test spec',
'rmtree build directory',
'setup_build',
'spawn_logcat_monitor',
'stack_tool_for_tombstones',
'stack_tool_with_logcat_dump',
'steps',
'test_report',
'unzip_build_product',
'update_scripts'
]
KNOWN_TESTERS_LIST = [
'Android Nexus4 Perf',
'Android Nexus5 Perf',
'Android Nexus6 Perf',
'Android Nexus10 Perf',
'Android Nexus7v2 Perf',
'Android One Perf',
'Linux Perf (1)',
'Linux Perf (2)',
'Linux Perf (3)',
'Linux Perf (4)',
'Linux Perf (5)',
'Mac 10.8 Perf (1)',
'Mac 10.8 Perf (2)',
'Mac 10.8 Perf (3)',
'Mac 10.8 Perf (4)',
'Mac 10.8 Perf (5)',
'Mac 10.9 Perf (1)',
'Mac 10.9 Perf (2)',
'Mac 10.9 Perf (3)',
'Mac 10.9 Perf (4)',
'Mac 10.9 Perf (5)',
'Win 7 ATI GPU Perf',
'Win 7 Intel GPU Perf',
'Win 7 Low-End Perf (1)',
'Win 7 Low-End Perf (2)',
'Win 7 Nvidia GPU Perf',
'Win 7 Perf (1)',
'Win 7 Perf (2)',
'Win 7 Perf (3)',
'Win 7 Perf (4)',
'Win 7 Perf (5)',
'Win 7 x64 Perf (1)',
'Win 7 x64 Perf (2)',
'Win 8 Perf (1)',
'Win 8 Perf (2)',
'Win XP Perf (1)',
'Win XP Perf (2)',
'Win XP Perf (3)',
'Win XP Perf (4)',
'Win XP Perf (5)'
]
USAGE = 'Usage: chrome-perf-step-timings.py <outfilename>'
if len(sys.argv) != 2:
print USAGE
sys.exit(0)
outfilename = sys.argv[1]
threshold_time = datetime.now() - timedelta(days=2)
col_names = [('builder', 'step', 'run_count', 'stddev', 'mean', 'maximum',
'median', 'seventyfive', 'ninety', 'ninetynine')]
with open(outfilename, 'wb') as f:
writer = csv.writer(f)
writer.writerows(col_names)
for builder in KNOWN_TESTERS_LIST:
step_timings = []
url = BUILDER_STEPS_URL % urllib.quote(builder)
response = urllib2.urlopen(url)
results = json.load(response)
steps = results['steps']
steps.sort() # to group tests and their references together.
for step in steps:
if step in IGNORED_STEPS:
continue
url = STEP_ACTIVE_URL % (urllib.quote(builder), urllib.quote(step))
response = urllib2.urlopen(url)
results = json.load(response)
if ('step_records' not in results.keys() or
len(results['step_records']) == 0):
continue
first_record = results['step_records'][0]
last_step_time = dateparser.parse(first_record['step_start'])
# ignore steps that did not run for more than 2 days
if last_step_time < threshold_time:
continue
url = STEP_STATS_URL % (urllib.quote(builder), urllib.quote(step))
response = urllib2.urlopen(url)
results = json.load(response)
step_timings.append([builder, step, results['count'], results['stddev'],
results['mean'], results['maximum'], results['median'],
results['seventyfive'], results['ninety'],
results['ninetynine']])
with open(outfilename, 'ab') as f:
writer = csv.writer(f)
writer.writerows(step_timings)