collect asset & page url for slow pages #464

This commit is contained in:
soulgalore 2014-09-22 22:08:10 +02:00
parent acdc076aef
commit a5d37edef7
3 changed files with 59 additions and 36 deletions

View File

@ -5,12 +5,15 @@
* Released under the Apache 2.0 License
*/
var util = require('../util');
var domains = {};
var Stats = require('fast-stats').Stats;
var util = require('../util'),
domains = {},
Stats = require('fast-stats').Stats,
DomainTiming = require('../DomainTiming'),
log = require('winston');
exports.processPage = function(pageData) {
if (pageData.har) {
var pageURL = util.getURLFromPageData(pageData);
pageData.har.forEach(function(har) {
har.log.entries.forEach(function(entry) {
var domain = domains[util.getHostname(entry.request.url)];
@ -18,41 +21,40 @@ exports.processPage = function(pageData) {
if (domain) {
if (entry.timings) {
domain.count++;
total = entry.timings.blocked + entry.timings.dns + entry.timings.connect + entry.timings.ssl + entry.timings.send + entry.timings.wait + entry.timings.receive;
if (total>domain.total.max) {
domain.slowestUrl = entry.request.url;
}
domain.blocked.push(entry.timings.blocked);
domain.dns.push(entry.timings.dns);
domain.connect.push(entry.timings.connect);
domain.ssl.push(entry.timings.ssl);
domain.send.push(entry.timings.send);
domain.wait.push(entry.timings.wait);
domain.receive.push(entry.timings.receive);
domain.total.push(total);
total = entry.timings.blocked + entry.timings.dns + entry.timings.connect + entry.timings.ssl + entry.timings
.send + entry.timings.wait + entry.timings.receive;
domain.blocked.add(entry.timings.blocked, entry.request.url, pageURL);
domain.dns.add(entry.timings.dns, entry.request.url, pageURL);
domain.connect.add(entry.timings.connect, entry.request.url, pageURL);
domain.ssl.add(entry.timings.ssl, entry.request.url, pageURL);
domain.send.add(entry.timings.send, entry.request.url, pageURL);
domain.wait.add(entry.timings.wait, entry.request.url, pageURL);
domain.receive.add(entry.timings.receive, entry.request.url, pageURL);
domain.total.add(total, entry.request.url, pageURL);
} else {
console.log('Missing timings in the HAR');
log.log('info', 'Missing timings in the HAR');
}
} else {
if (entry.timings) {
total = entry.timings.blocked + entry.timings.dns + entry.timings.connect + entry.timings.ssl + entry.timings.send + entry.timings.wait + entry.timings.receive;
total = entry.timings.blocked + entry.timings.dns + entry.timings.connect + entry.timings.ssl + entry.timings
.send + entry.timings.wait + entry.timings.receive;
domains[util.getHostname(entry.request.url)] = {
domain: util.getHostname(entry.request.url),
blocked: new Stats().push(entry.timings.blocked),
dns: new Stats().push(entry.timings.dns),
connect: new Stats().push(entry.timings.connect),
ssl: new Stats().push(entry.timings.ssl),
send: new Stats().push(entry.timings.send),
wait: new Stats().push(entry.timings.wait),
receive: new Stats().push(entry.timings.receive),
slowestUrl: entry.request.url,
total: new Stats().push(total),
blocked: new DomainTiming(entry.timings.blocked, entry.request.url, pageURL),
dns: new DomainTiming(entry.timings.dns, entry.request.url, pageURL),
connect: new DomainTiming(entry.timings.connect, entry.request.url, pageURL),
ssl: new DomainTiming(entry.timings.ssl, entry.request.url, pageURL),
send: new DomainTiming(entry.timings.send, entry.request.url, pageURL),
wait: new DomainTiming(entry.timings.wait, entry.request.url, pageURL),
receive: new DomainTiming(entry.timings.receive, entry.request.url, pageURL),
total: new DomainTiming(total, entry.request.url, pageURL),
count: 1
};
} else {
console.log('Missing timings in the HAR');
log.log('info', 'Missing timings in the HAR');
}
}
});
@ -73,4 +75,4 @@ exports.generateResults = function() {
exports.clear = function() {
domains = {};
};
};

21
lib/domainTiming.js Normal file
View File

@ -0,0 +1,21 @@
Stats = require('fast-stats').Stats;
function DomainTiming(time, url, pageUrl) {
this.stats = new Stats().push(time);
this.maxTimeUrl = url;
this.maxTimePageUrl = pageUrl;
};
DomainTiming.prototype.add = function(time, url, pageUrl) {
if (time > this.stats.max) {
this.maxTimeUrl = url;
this.maxTimePageUrl = pageUrl;
}
this.stats.push(time);
};
DomainTiming.prototype.stats = function() {
return this.stats;
}
module.exports = DomainTiming;

View File

@ -26,14 +26,14 @@
{{#each domains}}
<tr>
<td>{{this.domain}}</td>
<td>{{this.blocked.max}}</td>
<td>{{this.dns.max}}</td>
<td>{{this.connect.max}}</td>
<td>{{this.ssl.max}}</td>
<td>{{this.send.max}}</td>
<td>{{this.wait.max}}</td>
<td>{{this.receive.max}}</td>
<td><a href="{{this.slowestUrl}}">{{this.total.max}}</a></td>
<td><a href="{{this.blocked.maxTimeUrl}}">{{this.blocked.stats.max}}</a></td>
<td><a href="{{this.dns.maxTimeUrl}}">{{this.dns.stats.max}}</a></td>
<td><a href="{{this.connect.maxTimeUrl}}">{{this.connect.stats.max}}</a></td>
<td><a href="{{this.ssl.maxTimeUrl}}">{{this.ssl.stats.max}}</a></td>
<td><a href="{{this.send.maxTimeUrl}}">{{this.send.stats.max}}</a></td>
<td><a href="{{this.wait.maxTimeUrl}}">{{this.wait.stats.max}}</a></td>
<td><a href="{{this.receive.maxTimeUrl}}">{{this.receive.stats.max}}</a></td>
<td><a href="{{this.total.maxTimeUrl}}">{{this.total.stats.max}}</a></td>
<td>{{this.count}}</td>
</tr>
{{/each}}