Index: tracing/tracing/metrics/system_health/first_paint_metric.html |
diff --git a/tracing/tracing/metrics/system_health/first_paint_metric.html b/tracing/tracing/metrics/system_health/first_paint_metric.html |
index 3d12cf915f50f0ec38114d7b06bb20dd09a4fd72..8740ef0b358a54b736a6803c9b8d3ef034e6d9cf 100644 |
--- a/tracing/tracing/metrics/system_health/first_paint_metric.html |
+++ b/tracing/tracing/metrics/system_health/first_paint_metric.html |
@@ -74,8 +74,8 @@ tr.exportTo('tr.metrics.sh', function() { |
} |
} |
- function findUrlOfFrameAt(rendererHelper, frameIdRef, ts) { |
- var url; |
+ function findFrameLoaderSnapshotAt(rendererHelper, frameIdRef, ts) { |
+ var snapshot; |
var objects = rendererHelper.process.objects; |
var frameLoaderInstances = objects.instancesByTypeName_['FrameLoader']; |
@@ -88,18 +88,18 @@ tr.exportTo('tr.metrics.sh', function() { |
frameLoaderInstances.forEach(function(instance) { |
if (!instance.isAliveAt(ts)) |
return; |
- var snapshot = instance.getSnapshotAt(ts); |
- if (frameIdRef !== snapshot.args['frame']['id_ref']) |
+ var maybeSnapshot = instance.getSnapshotAt(ts); |
+ if (frameIdRef !== maybeSnapshot.args['frame']['id_ref']) |
return; |
- url = snapshot.args['documentLoaderURL']; |
+ snapshot = maybeSnapshot; |
}, this); |
- return url; |
+ return snapshot; |
} |
- function findFirstPaintEvents(rendererHelper, title) { |
- var firstPaintEvents = []; |
+ function findAllUserTimingEvents(rendererHelper, title) { |
+ var targetEvents = []; |
rendererHelper.process.iterateAllEvents( |
function(ev) { |
@@ -107,10 +107,10 @@ tr.exportTo('tr.metrics.sh', function() { |
ev.title !== title) |
return; |
- firstPaintEvents.push(ev); |
+ targetEvents.push(ev); |
}, this); |
- return firstPaintEvents; |
+ return targetEvents; |
} |
function prepareTelemetryInternalEventPredicate(rendererHelper) { |
@@ -142,6 +142,19 @@ tr.exportTo('tr.metrics.sh', function() { |
return URL_BLACKLIST.indexOf(url) >= 0; |
} |
+ var METRICS = [ |
+ { |
+ valueName: 'firstContentfulPaint', |
+ title: 'firstContentfulPaint', |
+ description: 'time to first contentful paint' |
+ }, |
+ { |
+ valueName: 'timeToOnload', |
+ title: 'loadEventStart', |
+ description: 'time to onload. ' + |
+ 'This is temporary metric used for PCv1/v2 sanity checking' |
+ }]; |
+ |
function firstPaintMetric(values, model) { |
var chromeHelper = model.getOrCreateHelper( |
tr.model.helpers.ChromeModelHelper); |
@@ -151,41 +164,45 @@ tr.exportTo('tr.metrics.sh', function() { |
var findNavigationStartEventForFrameBeforeTimestamp = |
navigationStartFinder(rendererHelper); |
- var numericBuilder = |
- new tr.v.NumericBuilder(timeDurationInMs_smallerIsBetter, 0) |
- .addLinearBins(1000, 20) // 50ms step to 1s |
- .addLinearBins(3000, 20) // 100ms step to 3s |
- .addExponentialBins(20000, 20); |
- var firstContentfulPaintHistogram = numericBuilder.build(); |
- firstContentfulPaintHistogram.customizeSummaryOptions({ |
- avg: true, |
- count: true, |
- max: true, |
- min: true, |
- std: true, |
- sum: false, |
- percentile: [0.90, 0.95, 0.99], |
- }); |
- |
- var firstPaintEvents = findFirstPaintEvents(rendererHelper, |
- 'firstContentfulPaint'); |
- firstPaintEvents = firstPaintEvents.filter( |
- (ev) => !isTelemetryInternalEvent(ev)); |
- firstPaintEvents.forEach(function(ev) { |
- var frameIdRef = ev.args['frame']; |
- var url = findUrlOfFrameAt(rendererHelper, frameIdRef, ev.start); |
- if (url === undefined || shouldIgnoreURL(url)) |
- return; |
- var navigationStartEvent = |
- findNavigationStartEventForFrameBeforeTimestamp(frameIdRef, ev.start); |
+ METRICS.forEach(function(metric) { |
+ var numericBuilder = |
+ new tr.v.NumericBuilder(timeDurationInMs_smallerIsBetter, 0) |
+ .addLinearBins(1000, 20) // 50ms step to 1s |
+ .addLinearBins(3000, 20) // 100ms step to 3s |
+ .addExponentialBins(20000, 20); |
+ var histogram = numericBuilder.build(); |
+ histogram.customizeSummaryOptions({ |
+ avg: true, |
+ count: false, |
+ max: true, |
+ min: true, |
+ std: true, |
+ sum: false, |
+ percentile: [0.90, 0.95, 0.99], |
+ }); |
+ |
+ var targetEvents = findAllUserTimingEvents(rendererHelper, metric.title); |
+ targetEvents = targetEvents.filter( |
+ (ev) => !isTelemetryInternalEvent(ev)); |
+ targetEvents.forEach(function(ev) { |
+ var frameIdRef = ev.args['frame']; |
+ var snapshot = |
+ findFrameLoaderSnapshotAt(rendererHelper, frameIdRef, ev.start); |
+ if (snapshot === undefined || !snapshot.args.isLoadingMainFrame) |
+ return; |
+ var url = snapshot.args.documentLoaderURL; |
+ if (shouldIgnoreURL(url)) |
+ return; |
+ var navigationStartEvent = |
+ findNavigationStartEventForFrameBeforeTimestamp(frameIdRef, ev.start); |
- var timeToFirstContentfulPaint = ev.start - navigationStartEvent.start; |
- firstContentfulPaintHistogram.add(timeToFirstContentfulPaint, {url: url}); |
+ var timeToEvent = ev.start - navigationStartEvent.start; |
+ histogram.add(timeToEvent, {url: url}); |
+ }, this); |
+ values.addValue(new tr.v.NumericValue( |
+ model.canonicalUrl, metric.valueName, histogram, |
+ { description: metric.description })); |
}, this); |
- values.addValue(new tr.v.NumericValue( |
- model.canonicalUrl, 'firstContentfulPaint', |
- firstContentfulPaintHistogram, |
- { description: 'time to first contentful paint' })); |
} |
firstPaintMetric.prototype = { |