Chromium Code Reviews| OLD | NEW |
|---|---|
| (Empty) | |
| 1 <!DOCTYPE html> | |
| 2 <!-- | |
| 3 Copyright 2017 The Chromium Authors. All rights reserved. | |
| 4 Use of this source code is governed by a BSD-style license that can be | |
| 5 found in the LICENSE file. | |
| 6 --> | |
| 7 | |
| 8 <link rel="import" href="/tracing/base/unit.html"> | |
| 9 <link rel="import" href="/tracing/metrics/metric_registry.html"> | |
| 10 <link rel="import" href="/tracing/metrics/system_health/utils.html"> | |
| 11 <link rel="import" href="/tracing/value/histogram.html"> | |
| 12 | |
| 13 <script> | |
| 14 'use strict'; | |
| 15 | |
| 16 tr.exportTo('tr.metrics.blink', function() { | |
| 17 function leakDetectionMetric(histograms, model) { | |
| 18 const pids = extractRendererPids(model); | |
| 19 | |
| 20 const chromeDumps = tr.metrics.sh | |
| 21 .splitGlobalDumpsByBrowserName(model, undefined).get('chrome'); | |
| 22 | |
| 23 let sumCounter = {}; | |
|
benjhayden
2017/09/14 19:18:50
Please use an ES6 Map instead:
let sumCounter = ne
yuzuchan
2017/09/15 08:32:25
Done.
| |
| 24 // Add up counters for all the renderer processes. | |
| 25 pids.forEach(function(pid) { | |
|
benjhayden
2017/09/14 19:18:50
Please use for..of loops instead of forEach and fo
yuzuchan
2017/09/15 08:32:24
Done.
| |
| 26 if (Object.keys(sumCounter).length === 0) { | |
|
benjhayden
2017/09/14 19:18:50
Is this just merging the maps, or is there somethi
yuzuchan
2017/09/15 08:32:24
Right! Thanks for teaching me the simple way.
Done
| |
| 27 sumCounter = countLeakedBlinkObjects(chromeDumps, pid); | |
| 28 } else { | |
| 29 const counterForAnotherRenderer = | |
| 30 countLeakedBlinkObjects(chromeDumps, pid); | |
| 31 for (const key in counters) { | |
| 32 sumCounter[key] += counterForAnotherRenderer[key]; | |
| 33 } | |
| 34 } | |
| 35 }); | |
| 36 | |
| 37 for (const key in sumCounter) { | |
| 38 const histogram = createNumericForBlinkObjectCount(key); | |
|
benjhayden
2017/09/14 19:18:50
Please use the existing helper function histograms
yuzuchan
2017/09/15 08:32:25
Done.
| |
| 39 histogram.addSample(sumCounter[key]); | |
| 40 histograms.addHistogram(histogram); | |
| 41 } | |
| 42 } | |
| 43 | |
| 44 tr.metrics.MetricRegistry.register(leakDetectionMetric); | |
| 45 | |
| 46 function extractRendererPids(model) { | |
|
benjhayden
2017/09/14 19:18:50
This looks short enough that you can inline it int
yuzuchan
2017/09/15 08:32:25
Done.
| |
| 47 const modelHelper = model.getOrCreateHelper( | |
| 48 tr.model.helpers.ChromeModelHelper); | |
| 49 if (Object.keys(modelHelper).length === 0) { | |
| 50 throw new Error('Chrome is not present.'); | |
| 51 } | |
| 52 const rendererHelpers = modelHelper.rendererHelpers; | |
| 53 if (Object.keys(rendererHelpers).length === 0) { | |
| 54 throw new Error('Renderer process is not present.'); | |
| 55 } | |
| 56 return Object.keys(rendererHelpers); | |
| 57 } | |
| 58 | |
| 59 const count_smallerIsBetter = tr.b.Unit.byName.count_smallerIsBetter; | |
| 60 | |
| 61 function createNumericForBlinkObjectCount(name) { | |
| 62 const n = new tr.v.Histogram(name, count_smallerIsBetter); | |
|
benjhayden
2017/09/14 19:18:50
Please prepend the name with something like 'leak:
yuzuchan
2017/09/15 08:32:24
Done.
| |
| 63 n.customizeSummaryOptions({ | |
| 64 avg: false, | |
| 65 count: true, | |
| 66 max: false, | |
| 67 min: false, | |
| 68 std: false, | |
| 69 sum: true, | |
| 70 percentile: [] | |
| 71 }); | |
| 72 return n; | |
| 73 } | |
| 74 | |
| 75 function countLeakedBlinkObjects(dumps, pid) { | |
| 76 if (dumps === undefined || dumps.length < 2) { | |
| 77 throw new Error('Memory dump did not happen twice, and thus leak could' + | |
|
keishi
2017/09/14 09:40:46
nit: Maybe something more concise like "Expected a
yuzuchan
2017/09/15 08:32:24
Done.
| |
| 78 ' not be calculated.'); | |
| 79 } | |
| 80 const firstCounter = countBlinkObjects(dumps[0], pid); | |
| 81 const lastCounter = countBlinkObjects(dumps[dumps.length - 1], pid); | |
| 82 const diffCounter = {}; | |
|
benjhayden
2017/09/14 19:18:50
Please use an ES6 Map instead.
yuzuchan
2017/09/15 08:32:24
Done.
| |
| 83 for (const key in lastCounter) { | |
| 84 diffCounter[key] = lastCounter[key] - firstCounter[key]; | |
| 85 } | |
| 86 return diffCounter; | |
| 87 } | |
| 88 | |
| 89 function countBlinkObjects(dump, pid) { | |
| 90 const counter = {}; | |
| 91 const processesMemoryDumps = dump.processMemoryDumps; | |
| 92 if (pid in processesMemoryDumps) { | |
| 93 const blinkObjectsDump = processesMemoryDumps[pid].memoryAllocatorDumps | |
| 94 .find(isBlinkObjects); | |
|
benjhayden
2017/09/14 19:18:50
Please use an arrow function instead:
find(dump =>
yuzuchan
2017/09/15 08:32:24
Done.
| |
| 95 blinkObjectsDump.children.forEach(function(v) { | |
| 96 counter[v.name] = v.numerics.object_count.value; | |
| 97 }); | |
| 98 } | |
| 99 return counter; | |
| 100 } | |
| 101 | |
| 102 function isBlinkObjects(memoryDump) { | |
| 103 return memoryDump.fullName === 'blink_objects'; | |
| 104 } | |
| 105 | |
| 106 return { | |
| 107 leakDetectionMetric, | |
| 108 }; | |
| 109 }); | |
| 110 </script> | |
| OLD | NEW |