blob: 81b4f65ca79875824a52326ed4943682e580dd19 [file] [log] [blame]
<!DOCTYPE html>
<!--
Copyright 2017 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.
-->
<link rel="import" href="/tracing/extras/chrome/cpu_time.html">
<link rel="import" href="/tracing/metrics/metric_registry.html">
<link rel="import" href="/tracing/metrics/system_health/cpu_time_tree_data_reporter.html">
<link rel="import" href="/tracing/value/histogram.html">
<script>
'use strict';
/**
* @fileoverview Implements the new CPU time metric. This will eventually
* replace the current cpu_time_metric.html, but we're running this alongside
* the existing metric while we monitor its quality.
*
*/
tr.exportTo('tr.metrics.sh', function() {
/**
* This metric measures total CPU time and CPU time per unit of wall clock
* time for all combinations of process type, thread type, RAIL
* stage, and RAIL stage initiator present in the model.
*
* The metric generates histograms of the form
* ${cpuTime|cpuPercentage}:${process_type}:${thread_type}:
* ${rail_stage}:${rail_stage_initiator}
*
* 'cpuTime' histograms represent total consumed CPU time, while
* 'cpuPercentage' histograms represent CPU time as a percentage of wall clock
* time.
*
* Example histograms generated by this metric:
* - cpuTime:browser_process:CrBrowserMain:Animation:CSS
* - cpuPercentage:gpu_process:CrGpuMain:Response:Scroll
* For a given model, a single sample is generated for each histogram. For
* example, if the model contains three renderer processes, and 10 different
* Scroll Response ranges, the histogram
* cpuPercentage:renderer_process:CrRendererMain:Response:Scroll will still
* contain a single sample: the total CPU time consumed by all three renderer
* main threads over all 10 Scroll Response phases, divided by the total
* duration of those ranges. Since the three different main threads can
* potentially be running on three different CPU cores, the sample value of a
* cpuPercentage histogram can be more than 100%.
*
* The histograms are created as needed from the model - if a certain
* combination of process, thread, RAIL stage and initiator does not occur in
* the model, the histogram for that combination is not added.
*
* This metric requires only the 'toplevel' tracing category.
*
* @param {!tr.v.HistogramSet} histograms
* @param {!tr.model.Model} model
* @param {!Object=} opt_options
*/
function newCpuTimeMetric(histograms, model, opt_options) {
const rangeOfInterest = opt_options && opt_options.rangeOfInterest ?
opt_options.rangeOfInterest : model.bounds;
const rootNode = tr.e.chrome.CpuTime.constructMultiDimensionalView(
model, rangeOfInterest);
tr.metrics.sh.CpuTimeTreeDataReporter.reportToHistogramSet(
rootNode, histograms);
}
tr.metrics.MetricRegistry.register(newCpuTimeMetric, {
supportsRangeOfInterest: true
});
return {
newCpuTimeMetric,
};
});
</script>