Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(624)

Side by Side Diff: tracing/tracing/metrics/system_health/utils.html

Issue 3012153002: Add leakDetectionMetric for tracing (Closed)
Patch Set: Reflect comments Created 3 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 <!DOCTYPE html> 1 <!DOCTYPE html>
2 <!-- 2 <!--
3 Copyright (c) 2015 The Chromium Authors. All rights reserved. 3 Copyright (c) 2015 The Chromium Authors. All rights reserved.
4 Use of this source code is governed by a BSD-style license that can be 4 Use of this source code is governed by a BSD-style license that can be
5 found in the LICENSE file. 5 found in the LICENSE file.
6 --> 6 -->
7 <link rel="import" href="/tracing/extras/chrome/chrome_processes.html">
7 <link rel="import" href="/tracing/model/user_model/user_expectation.html"> 8 <link rel="import" href="/tracing/model/user_model/user_expectation.html">
8 9
9 <script> 10 <script>
10 'use strict'; 11 'use strict';
11 12
12 tr.exportTo('tr.metrics.sh', function() { 13 tr.exportTo('tr.metrics.sh', function() {
13 // Returns a weight for this score. 14 // Returns a weight for this score.
14 // score should be a number between 0 and 1 inclusive. 15 // score should be a number between 0 and 1 inclusive.
15 // This function is expected to be passed to tr.b.math.Statistics.weightedMean 16 // This function is expected to be passed to tr.b.math.Statistics.weightedMean
16 // as its weightCallback. 17 // as its weightCallback.
(...skipping 11 matching lines...) Expand all
28 if (!(ir instanceof tr.model.um.UserExpectation)) return; 29 if (!(ir instanceof tr.model.um.UserExpectation)) return;
29 30
30 if (!opt_range || 31 if (!opt_range ||
31 opt_range.intersectsExplicitRangeInclusive(ir.start, ir.end)) { 32 opt_range.intersectsExplicitRangeInclusive(ir.start, ir.end)) {
32 filteredExpectations.push(ir); 33 filteredExpectations.push(ir);
33 } 34 }
34 }); 35 });
35 return filteredExpectations; 36 return filteredExpectations;
36 } 37 }
37 38
39 /**
40 * Splits the global memory dumps in |model| by browser name.
41 *
42 * @param {!tr.Model} model The trace model from which the global dumps
43 * should be extracted.
44 * @param {!tr.b.math.Range=} opt_rangeOfInterest If provided, global memory
45 * dumps that do not inclusively intersect the range will be skipped.
46 * @return {!Map<string, !Array<!tr.model.GlobalMemoryDump>} A map from
47 * browser names to the associated global memory dumps.
48 */
49 function splitGlobalDumpsByBrowserName(model, opt_rangeOfInterest) {
50 const chromeModelHelper =
51 model.getOrCreateHelper(tr.model.helpers.ChromeModelHelper);
52 const browserNameToGlobalDumps = new Map();
53 const globalDumpToBrowserHelper = new WeakMap();
54
55 // 1. For each browser process in the model, add its global memory dumps to
56 // |browserNameToGlobalDumps|. |chromeModelHelper| can be undefined if
57 // it fails to find any browser, renderer or GPU process (see
58 // tr.model.helpers.ChromeModelHelper.supportsModel).
59
60 if (chromeModelHelper) {
61 chromeModelHelper.browserHelpers.forEach(function(helper) {
62 // Retrieve the associated global memory dumps and check that they
63 // haven't been classified as belonging to another browser process.
64 const globalDumps = skipDumpsThatDoNotIntersectRange(
65 helper.process.memoryDumps.map(d => d.globalMemoryDump),
66 opt_rangeOfInterest);
67 globalDumps.forEach(function(globalDump) {
68 const existingHelper = globalDumpToBrowserHelper.get(globalDump);
69 if (existingHelper !== undefined) {
70 throw new Error('Memory dump ID clash across multiple browsers ' +
71 'with PIDs: ' + existingHelper.pid + ' and ' + helper.pid);
72 }
73 globalDumpToBrowserHelper.set(globalDump, helper);
74 });
75
76 makeKeyUniqueAndSet(browserNameToGlobalDumps,
77 tr.e.chrome.chrome_processes.canonicalizeName(helper.browserName),
78 globalDumps);
79 });
80 }
81
82 // 2. If any global memory dump does not have any associated browser
83 // process for some reason, associate it with an 'unknown_browser' browser
84 // so that we don't lose the data.
85
86 const unclassifiedGlobalDumps = skipDumpsThatDoNotIntersectRange(
87 model.globalMemoryDumps.filter(g => !globalDumpToBrowserHelper.has(g)),
88 opt_rangeOfInterest);
89 if (unclassifiedGlobalDumps.length > 0) {
90 makeKeyUniqueAndSet(
91 browserNameToGlobalDumps, 'unknown_browser', unclassifiedGlobalDumps);
92 }
93
94 return browserNameToGlobalDumps;
95 }
96
97 /**
98 * Function for adding entries with duplicate keys to a map without
99 * overriding existing entries.
100 *
101 * This is achieved by appending numeric indices (2, 3, 4, ...) to duplicate
102 * keys. Example:
103 *
104 * const map = new Map();
105 * // map = Map {}.
106 *
107 * makeKeyUniqueAndSet(map, 'key', 'a');
108 * // map = Map {"key" => "a"}.
109 *
110 * makeKeyUniqueAndSet(map, 'key', 'b');
111 * // map = Map {"key" => "a", "key2" => "b"}.
112 * ^^^^
113 * makeKeyUniqueAndSet(map, 'key', 'c');
114 * // map = Map {"key" => "a", "key2" => "b", "key3" => "c"}.
115 * ^^^^ ^^^^
116 */
117 function makeKeyUniqueAndSet(map, key, value) {
118 let uniqueKey = key;
119 let nextIndex = 2;
120 while (map.has(uniqueKey)) {
121 uniqueKey = key + nextIndex;
122 nextIndex++;
123 }
124 map.set(uniqueKey, value);
125 }
126
127 function skipDumpsThatDoNotIntersectRange(dumps, opt_range) {
128 if (!opt_range) return dumps;
129 return dumps.filter(d => opt_range.intersectsExplicitRangeInclusive(
130 d.start, d.end));
131 }
132
38 return { 133 return {
39 perceptualBlend, 134 perceptualBlend,
40 filterExpectationsByRange, 135 filterExpectationsByRange,
136 splitGlobalDumpsByBrowserName
41 }; 137 };
42 }); 138 });
43 </script> 139 </script>
OLDNEW
« no previous file with comments | « tracing/tracing/metrics/system_health/memory_metric.html ('k') | tracing/tracing/model/memory_dump_test_utils.html » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698