summaryrefslogtreecommitdiff
path: root/chromium/third_party/catapult/tracing/tracing/metrics/system_health/new_cpu_time_metric.html
blob: 81b4f65ca79875824a52326ed4943682e580dd19 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
<!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>