blob: 18cc3cd1d9ded5aa5b02ca856920a34b3715a018 [file] [log] [blame]
<!DOCTYPE html>
<html>
<head>
<script src='https://cdn.jsdelivr.net/npm/vue/dist/vue.js'></script>
<script src='https://unpkg.com/vue-select'></script>
<script src='http://underscorejs.org/underscore-min.js'></script>
<script src='metrics_parser.js'></script>
<link rel='stylesheet' href='filter.css'>
</head>
<body>
<style>
body {
font-family: Helvetica, sans-serif;
}
</style>
<div class='menuLeft' id='menu'>
<div id='filterItem'>
<sup>Memory metrics</sup>
<v-select placeholder='browser'
:options='browserOptions'
v-model='browser'
id='filterBox'
></v-select>
<v-select placeholder='subprocess'
:options='subprocessOptions'
v-model='subprocess'
id='filterBox'
></v-select>
<v-select placeholder='probe'
:options='probeOptions'
v-model='probe'
id='filterBox'
></v-select>
<v-select placeholder='component'
:options='componentOptions'
v-model='component'
id='filterBox'
></v-select>
<v-select placeholder='subcomponent'
id='subcomponentBox'
v-model='subcomponent'
:options='firstSubcompOptions'
v-if='seen'
></v-select>
<v-select placeholder='subcomponent'
id='subcomponentBox_'
v-model='subcomponent_'
:options='secondSubcompOptions'
v-if='seen_'
></v-select>
<v-select placeholder='size'
:options='sizeOptions'
v-model='size'
id='filterBox'
></v-select>
<button v-on:click='apply'
id='apply_button'>
Apply</button>
<textarea v-model='text'
id='teaxtarea'
rows='6'
cols='80'
></textarea>
</div>
</div>
<script>
'use strict';
const MiB = 1024 * 1024;
Vue.component('v-select', VueSelect.VueSelect);
const menu = new Vue({
el: '#menu',
data: {
sampleArr: null,
guidValueInfo: null,
browser: null,
subprocess: null,
probe: null,
component: null,
size: null,
metricNames: null,
browserOptions: [],
subprocessOptions: [],
probeOptions: [],
componentObject: null,
sizeObject: null,
subcomponent: null,
subcomponent_: null,
text: null
},
computed: {
// Compute size options depending on the type of probe.
sizeOptions() {
if (this.sizeObject !== null) {
if (this.probe === 'reported_by_chrome') {
return this.sizeObject.sizeChrome;
}
return this.sizeObject.sizeOs;
}
return undefined;
},
// The components are different depending on the type of probe.
componentOptions() {
if (this.componentObject !== null) {
if (this.probe === 'reported_by_chrome') {
const component = [];
for (const [key, value] of this.componentObject
.componentByChrome.entries()) {
component.push(key);
}
return component;
}
const component = [];
for (const [key, value] of this.componentObject
.componentByOs.entries()) {
component.push(key);
}
return component;
}
return undefined;
},
// Compute the options for the first subcomponent depending on the probes.
// When the user chooses a component, it might be a hierarchical one.
firstSubcompOptions() {
if (this.component !== null) {
if (this.probe === 'reported_by_chrome') {
if (this.componentObject.componentByChrome
.get(this.component) !== undefined) {
const map = this.componentObject
.componentByChrome.get(this.component);
const array = [];
for (const [key, value] of map.entries()) {
array.push(key);
}
return array;
}
return undefined;
}
return this.componentObject.componentByOs.get(this.component);
}
return undefined;
},
// In case when the component is from Chrome, the hierarchy might have more
// levels.
secondSubcompOptions() {
if (this.probe === 'reported_by_chrome' && this.subcomponent !== null) {
const map = this.componentObject.componentByChrome.get(this.component);
return map.get(this.subcomponent);
}
return undefined;
},
seen() {
return this.component !== null;
},
seen_() {
return this.subcomponent !== null;
}
},
watch: {
probe() {
this.component = null;
this.subcomponent = null;
this.subcomponent_ = null;
this.size = null;
},
component() {
this.subcomponent = null;
this.subcomponent_ = null;
},
subcomponent() {
this.subcomponent_ = null;
},
},
methods: {
// Build the available metrics upon the chosen items.
// The method applies an intersection for all of them and
// return the result as a collection of metrics that matched.
apply() {
const metrics = [];
for (const name of this.metricNames) {
if (this.browser !== null && name.includes(this.browser) &&
this.subprocess !== null && name.includes(this.subprocess) &&
this.component !== null && name.includes(this.component) &&
this.size !== null && name.includes(this.size) &&
this.probe !== null && name.includes(this.probe)) {
if (this.subcomponent === null) {
metrics.push(name);
} else {
if (name.includes(this.subcomponent)) {
if (this.subcomponent_ === null) {
metrics.push(name);
} else {
if (name.includes(this.subcomponent_)) {
metrics.push(name);
}
}
}
}
}
}
if (_.uniq(metrics).length === 0) {
alert('No metrics found');
} else {
this.text = _.uniq(metrics);
}
}
}
});
const metricNames =
['memory:chrome:renderer_processes:' +
'reported_by_chrome:discardable:effective_size',
'memory:chrome:renderer_processes:reported_by_chrome:' +
'partition_alloc:allocated_objects_size',
'memory:chrome:browser_process:reported_by_chrome:omnibox:' +
'effective_size',
'memory:chrome:all_processes:reported_by_chrome:v8:' +
'heap:old_space:effective_size',
'memory:chrome:browser_process:reported_by_os:' +
'system_memory:ashmem:proportional_resident_size',
'memory:chrome:all_processes:' +
'reported_by_chrome:tracing:effective_size',
'memory:chrome:renderer_processes:reported_by_chrome:' +
'v8:allocated_by_malloc:peak_size',
'memory:chrome:all_processes:' +
'reported_by_chrome:discardable:effective_size',
'memory:chrome:renderer_processes:reported_by_chrome:' +
'v8:heap:map_space:allocated_objects_size',
'memory:chrome:all_processes:reported_by_os:' +
'system_memory:native_heap:private_dirty_size',
'memory:chrome:renderer_processes:reported_by_chrome:' +
'v8:allocated_by_malloc:effective_size',
'memory:chrome:gpu_process:reported_by_os' +
':system_memory:private_footprint_size',
'memory:chrome:all_processes:reported_by_chrome:' +
'net:effective_size',
'memory:chrome:renderer_processes:' +
'reported_by_chrome:v8:heap:effective_size',
'memory:chrome:gpu_process:reported_by_chrome:' +
'allocated_objects_size',
'memory:chrome:renderer_processes:' +
'reported_by_os:system_memory:stack:proportional_resident_size',
'memory:chrome:renderer_processes:' +
'reported_by_chrome:shared_memory:effective_size',
'memory:chrome:all_processes:reported_by_os' +
':system_memory:stack:proportional_resident_size',
'memory:chrome:all_processes:reported_by_os:' +
'private_dirty_size',
'memory:chrome:all_processes:reported_by_chrome:sqli' +
'te:effective_size',
'memory:chrome:browser_process:reported_by_os' +
':system_memory:java_heap:proportional_resident_size',
'memory:chrome:browser_process:reported_b' +
'y_chrome:effective_size',
'memory:chrome:all_processes:reported_by_chrome:' +
'discardable:locked_size',
'memory:chrome:browser_process:reported_by_os:' +
'system_memory:private_dirty_size',
'memory:chrome:renderer_processes:reported_by_os:s' +
'ystem_memory:native_heap:private_dirty_size',
'memory:chrome:all_processes:reported_by_os:sy' +
'stem_memory:stack:private_dirty_size',
'memory:chrome:all_processes:reported_by_chrome:v8:he' +
'ap:code_space:allocated_objects_size',
'memory:chrome:gpu_process:reported_by_os:system' +
'memory:native_heap:proportional_resident_size',
'memory:chrome:all_processes:reported_by_chrome:' +
'partition_alloc:allocated_objects_size',
'memory:chrome:renderer_processes:reported_by' +
'_chrome:allocated_objects_size',
'memory:chrome:renderer_processes:reported_by_ch' +
'rome:cc:effective_size',
'memory:chrome:all_processes:reported_by' +
'_chrome:locked_size',
'memory:chrome:browser_process:reported_by_ch' +
'rome:shared_memory:effective_size',
'memory:chrome:browser_process:reporte' +
'd_by_chrome:tracing:effective_size',
'memory:chrome:browser_process:reported_by' +
'_chrome:sharedbitmap:effective_size'];
const result = parseAllMetrics(metricNames);
menu.browserOptions = result.browsers;
menu.subprocessOptions = result.subprocesses;
menu.probeOptions = result.probes;
menu.componentObject = result.components;
menu.sizeObject = result.sizes;
menu.metricNames = result.names;
</script>
</body>
</html>