Skip to content

Commit

Permalink
Bug 1314317 - Generalize e10s dashboard to prepare for future compari…
Browse files Browse the repository at this point in the history
…sons (#1986)
  • Loading branch information
Rob Wood committed Nov 18, 2016
1 parent ba8165c commit 4bee8f1
Show file tree
Hide file tree
Showing 6 changed files with 115 additions and 84 deletions.
118 changes: 71 additions & 47 deletions ui/js/controllers/perf/e10s.js → ui/js/controllers/perf/dashboard.js
@@ -1,26 +1,41 @@
"use strict";

perf.value('e10sDefaultTimeRange', 86400 * 2);
perf.value('defaultTimeRange', 86400 * 2);

perf.controller('e10sCtrl', [
perf.controller('dashCtrl', [
'$state', '$stateParams', '$scope', '$rootScope', '$q', '$http', '$httpParamSerializer',
'ThRepositoryModel', 'ThResultSetModel', 'PhSeries', 'PhCompare',
'thServiceDomain', 'thDefaultRepo', 'phTimeRanges', 'e10sDefaultTimeRange', 'phBlockers',
function e10sCtrl($state, $stateParams, $scope, $rootScope, $q, $http, $httpParamSerializer,
'ThRepositoryModel', 'ThResultSetModel', 'PhSeries', 'PhCompare', 'thServiceDomain',
'thDefaultRepo', 'phTimeRanges', 'defaultTimeRange', 'phBlockers', 'phDashboardValues',
function dashCtrl($state, $stateParams, $scope, $rootScope, $q, $http, $httpParamSerializer,
ThRepositoryModel, ThResultSetModel, PhSeries, PhCompare,
thServiceDomain, thDefaultRepo, phTimeRanges,
e10sDefaultTimeRange, phBlockers) {
defaultTimeRange, phBlockers, phDashboardValues) {

$scope.dataLoading = true;
$scope.timeRanges = phTimeRanges;
$scope.selectedTimeRange = _.find($scope.timeRanges, {
value: ($stateParams.timerange) ? parseInt($stateParams.timerange) : e10sDefaultTimeRange
value: ($stateParams.timerange) ? parseInt($stateParams.timerange) : defaultTimeRange
});
$scope.revision = $stateParams.revision;
$scope.topic = $stateParams.topic;

// dashboard customization values
['variantDataOpt', 'framework', 'header', 'descP1', 'descP2',
'linkUrl', 'linkDesc', 'baseTitle', 'variantTitle'].forEach(function(k) {
$scope[k] = phDashboardValues[$scope.topic][k];
});

// custom series filters based on dashboard topic
function filterSeriesByTopic(series) {
if ($scope.topic === "e10s") {
return series.options.indexOf('pgo') >= 0 ||
(series.platform === 'osx-10-10' && series.options.indexOf('opt') >= 0);
}
}

function loadData() {
var resultsMap = {
e10s: {},
variant: {},
base: {}
};
$scope.testList = [];
Expand All @@ -42,11 +57,9 @@ perf.controller('e10sCtrl', [
getSeriesList = PhSeries.getSeriesList($scope.selectedRepo.name, {
interval: $scope.selectedTimeRange.value,
subtests: 0,
framework: 1}).then(function(seriesList) {
framework: $scope.framework}).then(function(seriesList) {
return _.filter(seriesList, function(series) {
return series.options.indexOf('pgo') >= 0 ||
(series.platform === 'osx-10-10' &&
series.options.indexOf('opt') >= 0);
return filterSeriesByTopic(series);
});
});
}
Expand All @@ -59,7 +72,7 @@ perf.controller('e10sCtrl', [

$q.all(_.chunk(seriesToMeasure, 20).map(function(seriesChunk) {
var params = { signatures: _.map(seriesChunk, 'signature'),
framework: 1 };
framework: $scope.framework };
if ($scope.revision) {
params.push_id = resultSetId;
} else {
Expand All @@ -69,7 +82,7 @@ perf.controller('e10sCtrl', [
return PhSeries.getSeriesData($scope.selectedRepo.name, params).then(function(seriesData) {
_.forIn(seriesData, function(data, signature) {
var series = _.find(seriesChunk, { signature: signature });
var type = (series.options.indexOf('e10s') >= 0) ? 'e10s' : 'base';
var type = (series.options.indexOf($scope.variantDataOpt) >= 0) ? 'variant' : 'base';
resultsMap[type][signature] = {
platform: series.platform,
name: series.testName,
Expand All @@ -89,30 +102,31 @@ perf.controller('e10sCtrl', [
return resultsMap['base'][sig].name === testName &&
resultsMap['base'][sig].platform === platform;
});
var e10sSig = _.find(Object.keys(resultsMap['e10s']), function(sig) {
return resultsMap['e10s'][sig].name === testName &&
resultsMap['e10s'][sig].platform === platform;
var variantSig = _.find(Object.keys(resultsMap['variant']), function(sig) {
return resultsMap['variant'][sig].name === testName &&
resultsMap['variant'][sig].platform === platform;
});
if (e10sSig && baseSig) {
if (variantSig && baseSig) {
var cmap = PhCompare.getCounterMap(
testName, resultsMap['base'][baseSig],
resultsMap['e10s'][e10sSig], phBlockers);
resultsMap['variant'][variantSig], phBlockers);
cmap.name = platform + ' ' + resultsMap['base'][baseSig].option;
cmap.links = [{
title: 'graph',
href: PhCompare.getGraphsLink(
_.map([baseSig, e10sSig], function(sig) {
_.map([baseSig, variantSig], function(sig) {
return {
projectName: $scope.selectedRepo.name,
signature: sig,
frameworkId: 1
frameworkId: $scope.framework
};
}))
}];
if (resultsMap['base'][baseSig].hasSubTests) {
var params = {
topic: $stateParams.topic,
baseSignature: baseSig,
e10sSignature: e10sSig,
variantSignature: variantSig,
repo: $scope.selectedRepo.name
};
if ($scope.revision) {
Expand All @@ -122,7 +136,7 @@ perf.controller('e10sCtrl', [
}
cmap.links.push({
title: 'subtests',
href: 'perf.html#/e10s_comparesubtest?' + $httpParamSerializer(params)
href: 'perf.html#/dashboardsubtest?' + $httpParamSerializer(params)
});
if (!$scope.compareResults[testName]) {
$scope.compareResults[testName] = [cmap];
Expand All @@ -148,13 +162,14 @@ perf.controller('e10sCtrl', [
};

function updateURL() {
$state.transitionTo('e10s', {
$state.transitionTo('dashboard', {
topic: $scope.topic,
filter: $scope.filterOptions.filter,
showOnlyImportant: $scope.filterOptions.showOnlyImportant ? 1 : undefined,
showOnlyConfident: $scope.filterOptions.showOnlyConfident ? 1 : undefined,
showOnlyBlockers: $scope.filterOptions.showOnlyBlockers ? 1 : undefined,
repo: $scope.selectedRepo.name === thDefaultRepo ? undefined : $scope.selectedRepo.name,
timerange: ($scope.selectedTimeRange.value !== e10sDefaultTimeRange) ? $scope.selectedTimeRange.value : undefined
timerange: ($scope.selectedTimeRange.value !== defaultTimeRange) ? $scope.selectedTimeRange.value : undefined
}, {
location: true,
inherit: true,
Expand All @@ -168,6 +183,7 @@ perf.controller('e10sCtrl', [
$scope.selectedRepo = _.findWhere($scope.projects, {
name: $stateParams.repo ? $stateParams.repo : thDefaultRepo
});

$scope.$watchGroup(['filterOptions.filter',
'filterOptions.showOnlyImportant',
'filterOptions.showOnlyConfident',
Expand All @@ -190,28 +206,35 @@ perf.controller('e10sCtrl', [

]);

perf.controller('e10sSubtestCtrl', [
perf.controller('dashSubtestCtrl', [
'$state', '$stateParams', '$scope', '$rootScope', '$q', '$http',
'ThRepositoryModel', 'ThResultSetModel', 'PhSeries', 'PhCompare',
'thServiceDomain', 'thDefaultRepo', 'phTimeRanges', 'e10sDefaultTimeRange',
'ThRepositoryModel', 'ThResultSetModel', 'PhSeries', 'PhCompare', 'thServiceDomain',
'thDefaultRepo', 'phTimeRanges', 'defaultTimeRange', 'phDashboardValues',
function($state, $stateParams, $scope, $rootScope, $q, $http,
ThRepositoryModel, ThResultSetModel, PhSeries, PhCompare,
thServiceDomain, thDefaultRepo, phTimeRanges,
e10sDefaultTimeRange) {
thServiceDomain, thDefaultRepo, phTimeRanges, defaultTimeRange,
phDashboardValues) {

var baseSignature = $stateParams.baseSignature;
var e10sSignature = $stateParams.e10sSignature;
var variantSignature = $stateParams.variantSignature;

$scope.dataLoading = true;
$scope.timeRanges = phTimeRanges;
$scope.selectedTimeRange = _.find(phTimeRanges, {
value: ($stateParams.timerange) ? parseInt($stateParams.timerange) : e10sDefaultTimeRange
value: ($stateParams.timerange) ? parseInt($stateParams.timerange) : defaultTimeRange
});
$scope.revision = $stateParams.revision;
$scope.topic = $stateParams.topic;

// dashboard customization values
['variantDataOpt', 'framework', 'header', 'descP1', 'baseTitle',
'variantTitle'].forEach(function(k) {
$scope[k] = phDashboardValues[$scope.topic][k];
});

function loadData() {
var resultsMap = {
e10s: {},
variant: {},
base: {}
};
$scope.testList = [];
Expand All @@ -225,14 +248,14 @@ perf.controller('e10sSubtestCtrl', [
$scope.selectedRepo.name, $scope.revision).then(function(resultSets) {
resultSetId = resultSets[0].id;
return PhSeries.getSeriesList($scope.selectedRepo.name, {
parent_signature: [ baseSignature, e10sSignature ],
framework: 1
parent_signature: [ baseSignature, variantSignature ],
framework: $scope.framework
});
});
} else {
getSeriesList = PhSeries.getSeriesList($scope.selectedRepo.name, {
parent_signature: [ baseSignature, e10sSignature ],
framework: 1
parent_signature: [ baseSignature, variantSignature ],
framework: $scope.framework
});
}

Expand All @@ -244,7 +267,7 @@ perf.controller('e10sSubtestCtrl', [

return $q.all(_.chunk(seriesList, 20).map(function(seriesChunk) {
var params = { signatures: _.map(seriesChunk, 'signature'),
framework: 1 };
framework: $scope.framework };
if ($scope.revision) {
params.push_id = resultSetId;
} else {
Expand All @@ -254,7 +277,7 @@ perf.controller('e10sSubtestCtrl', [
$scope.selectedRepo.name, params).then(function(seriesData) {
_.forIn(seriesData, function(data, signature) {
var series = _.find(seriesList, { signature: signature });
var type = (series.options.indexOf('e10s') >= 0) ? 'e10s' : 'base';
var type = (series.options.indexOf($scope.variantDataOpt) >= 0) ? 'variant' : 'base';
resultsMap[type][signature] = {
platform: series.platform,
suite: series.suite,
Expand All @@ -274,22 +297,22 @@ perf.controller('e10sSubtestCtrl', [
var baseSig = _.find(Object.keys(resultsMap['base']), function (sig) {
return resultsMap['base'][sig].name === subtestName;
});
var e10sSig = _.find(Object.keys(resultsMap['e10s']), function (sig) {
return resultsMap['e10s'][sig].name === subtestName;
var variantSig = _.find(Object.keys(resultsMap['variant']), function (sig) {
return resultsMap['variant'][sig].name === subtestName;
});
if (e10sSig && baseSig) {
if (variantSig && baseSig) {
var cmap = PhCompare.getCounterMap(
subtestName, resultsMap['base'][baseSig],
resultsMap['e10s'][e10sSig]);
resultsMap['variant'][variantSig]);
cmap.name = subtestName;
cmap.links = [{
title: 'graph',
href: PhCompare.getGraphsLink(
_.map([baseSig, e10sSig], function(sig) {
_.map([baseSig, variantSig], function(sig) {
return {
projectName: $scope.selectedRepo.name,
signature: sig,
frameworkId: 1
frameworkId: $scope.framework
};
}))
}];
Expand All @@ -315,12 +338,13 @@ perf.controller('e10sSubtestCtrl', [
parseInt($stateParams.showOnlyBlockers))
};
function updateURL() {
$state.transitionTo('e10s_comparesubtest', {
$state.transitionTo('dashboardsubtest', {
topic: $scope.topic,
filter: $scope.filterOptions.filter,
showOnlyImportant: $scope.filterOptions.showOnlyImportant ? 1 : undefined,
showOnlyConfident: $scope.filterOptions.showOnlyConfident ? 1 : undefined,
repo: $scope.selectedRepo.name === thDefaultRepo ? undefined : $scope.selectedRepo.name,
timerange: ($scope.selectedTimeRange.value !== e10sDefaultTimeRange) ? $scope.selectedTimeRange.value : undefined
timerange: ($scope.selectedTimeRange.value !== defaultTimeRange) ? $scope.selectedTimeRange.value : undefined
}, {
location: true,
inherit: true,
Expand Down
18 changes: 9 additions & 9 deletions ui/js/perfapp.js
Expand Up @@ -32,15 +32,6 @@ perf.config(function($compileProvider, $httpProvider, $stateProvider, $urlRouter
templateUrl: 'partials/perf/comparechooserctrl.html',
url: '/comparechooser?originalProject&originalRevision&newProject&newRevision',
controller: 'CompareChooserCtrl'
}).state('e10s', {
title: 'e10s talos dashboard',
templateUrl: 'partials/perf/e10s.html',
url: '/e10s?filter&showOnlyImportant&showOnlyConfident&showOnlyBlockers&repo&timerange&revision',
controller: 'e10sCtrl'
}).state('e10s_comparesubtest', {
templateUrl: 'partials/perf/e10s-subtest.html',
url: '/e10s_comparesubtest?filter&showOnlyImportant&showOnlyConfident&baseSignature&e10sSignature&repo&timerange&revision',
controller: 'e10sSubtestCtrl'
}).state('e10s_trend', {
title: 'e10s trend dashboard',
templateUrl: 'partials/perf/e10s-trend.html',
Expand All @@ -50,6 +41,15 @@ perf.config(function($compileProvider, $httpProvider, $stateProvider, $urlRouter
templateUrl: 'partials/perf/e10s-trend-subtest.html',
url: '/e10s_trendsubtest?filter&showOnlyImportant&showOnlyConfident&showOnlyBlockers&repo&basedate&newdate&timerange&revision&baseSignature&e10sSignature',
controller: 'e10sTrendSubtestCtrl'
}).state('dashboard', {
title: 'Perfherder Dashboard',
templateUrl: 'partials/perf/dashboard.html',
url: '/dashboard?topic&filter&showOnlyImportant&showOnlyConfident&showOnlyBlockers&repo&timerange&revision',
controller: 'dashCtrl'
}).state('dashboardsubtest', {
templateUrl: 'partials/perf/dashboardsubtest.html',
url: '/dashboardsubtest?topic&filter&showOnlyImportant&showOnlyConfident&baseSignature&variantSignature&repo&timerange&revision',
controller: 'dashSubtestCtrl'
});

$urlRouterProvider.otherwise('/graphs');
Expand Down
22 changes: 22 additions & 0 deletions ui/js/values.js
Expand Up @@ -342,3 +342,25 @@ treeherder.value("thBugzillaProductObject", {
treeherder.value("strReloadTreeherder",
"Reload Treeherder windows to see changes reflected."
);

treeherder.value("phDashboardValues",
{
e10s: {
baseTitle: "non-e10s",
defaultRepo: "mozilla-inbound",
descP1: "Comparing results of all Talos tests over the last two days on mozilla-inbound " +
"(using pgo configuration on all platforms that support it). Because we're taking " +
"a sample over a period of time, improvements or regressions will take a while " +
"to be reflected in results. When in doubt, check the graphs by hovering over each " +
"line. Also, if there are no results for the default time range, try specifying a " +
"longer one.",
descP2: "For more information on what is considered 'acceptable' in terms of a Talos regression, see ",
framework: 1,
header: "Perfherder e10s dashboard",
linkDesc: "the official e10s release criteria.",
linkUrl: "https://wiki.mozilla.org/index.php?title=Electrolysis/Release_Criteria",
variantDataOpt: "e10s",
variantTitle: "e10s"
}
}
);

0 comments on commit 4bee8f1

Please sign in to comment.