Support showing correlations for FennecAndroid. Fixes #27

This commit is contained in:
Marco Castelluccio 2016-09-30 13:52:31 +01:00
Родитель 16bd45dfe5
Коммит 945a6dad02
4 изменённых файлов: 65 добавлений и 37 удалений

Просмотреть файл

@ -10,6 +10,10 @@
<script src="correlations.js" type="text/javascript"></script> <script src="correlations.js" type="text/javascript"></script>
<script src="correlations_page.js" type="text/javascript"></script> <script src="correlations_page.js" type="text/javascript"></script>
<span id="date" style="font-size: xx-small;"></span> <span id="date" style="font-size: xx-small;"></span>
<select name="product" id="product">
<option selected>Firefox</option>
<option>FennecAndroid</option>
</select>
<select name="channel" id="channel"> <select name="channel" id="channel">
<option selected>release</option> <option selected>release</option>
<option>beta</option> <option>beta</option>

Просмотреть файл

@ -1,5 +1,5 @@
var correlations = (() => { var correlations = (() => {
let correlationData; let correlationData = {};
function sha1(str) { function sha1(str) {
return crypto.subtle.digest('SHA-1', new TextEncoder('utf-8').encode(str)) return crypto.subtle.digest('SHA-1', new TextEncoder('utf-8').encode(str))
@ -25,20 +25,30 @@ var correlations = (() => {
return hexCodes.join(''); return hexCodes.join('');
} }
function loadChannelsData() { function getDataURL(product) {
if (correlationData) { if (product === 'Firefox') {
return 'https://analysis-output.telemetry.mozilla.org/top-signatures-correlations/data/';
} else if (product === 'FennecAndroid') {
return 'https://analysis-output.telemetry.mozilla.org/top-fennec-signatures-correlations/data/';
} else {
throw new Error('Unknown product: ' + product);
}
}
function loadChannelsData(product) {
if (correlationData[product]) {
return Promise.resolve(); return Promise.resolve();
} }
return fetch('https://analysis-output.telemetry.mozilla.org/top-signatures-correlations/data/all.json.gz') return fetch(getDataURL(product) + 'all.json.gz')
.then(response => response.json()) .then(response => response.json())
.then(totals => { .then(totals => {
correlationData = { correlationData[product] = {
'date': totals['date'], 'date': totals['date'],
}; };
for (let ch of ['release', 'beta', 'aurora', 'nightly']) { for (let ch of ['release', 'beta', 'aurora', 'nightly']) {
correlationData[ch] = { correlationData[product][ch] = {
'total': totals[ch], 'total': totals[ch],
'signatures': {}, 'signatures': {},
} }
@ -46,27 +56,28 @@ var correlations = (() => {
}); });
} }
function loadCorrelationData(signature, channel) { function loadCorrelationData(signature, channel, product) {
return loadChannelsData() return loadChannelsData(product)
.then(() => { .then(() => {
if (signature in correlationData[channel]['signatures']) { if (signature in correlationData[product][channel]['signatures']) {
return; return;
} }
return sha1(signature) return sha1(signature)
.then(sha1signature => fetch('https://analysis-output.telemetry.mozilla.org/top-signatures-correlations/data/' + channel + '/' + sha1signature + '.json.gz')) .then(sha1signature => fetch(getDataURL(product) + channel + '/' + sha1signature + '.json.gz'))
.then(response => response.json()) .then(response => response.json())
.then(data => { .then(data => {
correlationData[channel]['signatures'][signature] = data; correlationData[product][channel]['signatures'][signature] = data;
}) });
.catch(() => {});
}) })
.catch(() => {})
.then(() => correlationData); .then(() => correlationData);
} }
function getAnalysisDate() { function getAnalysisDate(product) {
return loadChannelsData() return loadChannelsData(product)
.then(() => correlationData['date']); .then(() => correlationData[product]['date'])
.catch(() => '');
} }
function itemToLabel(item) { function itemToLabel(item) {
@ -107,20 +118,25 @@ var correlations = (() => {
}); });
} }
function text(textElem, signature, channel) { function text(textElem, signature, channel, product) {
loadCorrelationData(signature, channel) loadCorrelationData(signature, channel, product)
.then(data => { .then(data => {
textElem.textContent = ''; textElem.textContent = '';
if (!(signature in data[channel]['signatures']) || !data[channel]['signatures'][signature]['results']) { if (!(product in data)) {
textElem.textContent = 'No correlation data was generated for the signature "' + signature + '" on the ' + channel + ' channel.' textElem.textContent = 'No correlation data was generated for the \'' + product + '\' product.'
return; return;
} }
let correlationData = data[channel]['signatures'][signature]['results']; if (!(signature in data[product][channel]['signatures']) || !data[product][channel]['signatures'][signature]['results']) {
textElem.textContent = 'No correlation data was generated for the signature "' + signature + '" on the ' + channel + ' channel, for the \'' + product + '\' product.'
return;
}
let total_reference = data[channel].total; let correlationData = data[product][channel]['signatures'][signature]['results'];
let total_group = data[channel]['signatures'][signature].total;
let total_reference = data[product][channel].total;
let total_group = data[product][channel]['signatures'][signature].total;
textElem.textContent = sortCorrelationData(correlationData, total_reference, total_group) textElem.textContent = sortCorrelationData(correlationData, total_reference, total_group)
.reduce((prev, cur) => .reduce((prev, cur) =>
@ -129,19 +145,19 @@ var correlations = (() => {
}); });
} }
function graph(svgElem, signature, channel) { function graph(svgElem, signature, channel, product) {
loadCorrelationData(signature, channel) loadCorrelationData(signature, channel, product)
.then(data => { .then(data => {
d3.select(svgElem).selectAll('*').remove(); d3.select(svgElem).selectAll('*').remove();
if (!(signature in data[channel]['signatures']) || !data[channel]['signatures'][signature]['results']) { if (!(product in data) || !(signature in data[product][channel]['signatures']) || !data[product][channel]['signatures'][signature]['results']) {
return; return;
} }
let total_reference = data[channel].total; let total_reference = data[product][channel].total;
let total_group = data[channel]['signatures'][signature].total; let total_group = data[product][channel]['signatures'][signature].total;
let correlationData = data[channel]['signatures'][signature]['results'] let correlationData = data[product][channel]['signatures'][signature]['results']
.filter(elem => Object.keys(elem.item).length <= 1); .filter(elem => Object.keys(elem.item).length <= 1);
correlationData = sortCorrelationData(correlationData, total_reference, total_group); correlationData = sortCorrelationData(correlationData, total_reference, total_group);
correlationData.reverse(); correlationData.reverse();

Просмотреть файл

@ -1,4 +1,8 @@
let options = { let options = {
'product': {
value: null,
type: 'option',
},
'channel': { 'channel': {
value: null, value: null,
type: 'option', type: 'option',
@ -31,24 +35,26 @@ function getCorrelations() {
} }
let url = new URL(location.href); let url = new URL(location.href);
url.search = '?channel=' + getOption('channel') + '&signature=' + getOption('signature'); url.search = '?product=' + getOption('product') + '&channel=' + getOption('channel') + '&signature=' + getOption('signature');
history.replaceState({}, document.title, url.href); history.replaceState({}, document.title, url.href);
let signature = decodeURIComponent(getOption('signature')); let signature = decodeURIComponent(getOption('signature'));
let channel = getOption('channel'); let channel = getOption('channel');
let product = getOption('product');
let preElem = document.getElementById('correlations_text'); let preElem = document.getElementById('correlations_text');
correlations.text(preElem, signature, channel); correlations.text(preElem, signature, channel, product);
let svgElem = document.getElementById('correlations_image'); let svgElem = document.getElementById('correlations_image');
correlations.graph(svgElem, signature, channel); correlations.graph(svgElem, signature, channel, product);
}
function updateAnalysisDate() {
correlations.getAnalysisDate(getOption('product'))
.then(date => document.getElementById('date').textContent = date)
} }
onLoad onLoad
.then(function() {
correlations.getAnalysisDate()
.then(date => document.getElementById('date').textContent = date)
})
.then(function() { .then(function() {
let queryVars = new URL(location.href).search.substring(1).split('&'); let queryVars = new URL(location.href).search.substring(1).split('&');
@ -89,6 +95,7 @@ onLoad
elem.onchange = function() { elem.onchange = function() {
setOption(optionName, elem.options[elem.selectedIndex].value); setOption(optionName, elem.options[elem.selectedIndex].value);
updateAnalysisDate();
getCorrelations(); getCorrelations();
}; };
} else if (optionType === 'button') { } else if (optionType === 'button') {
@ -108,6 +115,7 @@ onLoad
}); });
}) })
.then(function() { .then(function() {
updateAnalysisDate();
getCorrelations(); getCorrelations();
}) })
.catch(function(err) { .catch(function(err) {

Просмотреть файл

@ -230,7 +230,7 @@ function addRow(signature, obj) {
signatureImage.setAttribute('height', 900); signatureImage.setAttribute('height', 900);
signatureTooltip.appendChild(signatureImage); signatureTooltip.appendChild(signatureImage);
signatureDiv.appendChild(signatureTooltip); signatureDiv.appendChild(signatureTooltip);
correlations.graph(signatureImage, signature, getOption('version')); correlations.graph(signatureImage, signature, getOption('version'), 'Firefox');
}; };
key.appendChild(signatureDiv); key.appendChild(signatureDiv);