blob: 2a0a9bae3c1b56c5627aad879f45f16c06c8ec04 [file] [log] [blame]
<!DOCTYPE html>
<!--
Copyright 2016 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/metrics/metric_registry.html">
<link rel="import" href="/tracing/value/histogram.html">
<script>
'use strict';
tr.exportTo('tr.metrics.sh', function() {
function getCpuSnapshotsFromModel(model) {
var snapshots = [];
for (var pid in model.processes) {
var snapshotInstances = model.processes[pid].objects.getAllInstancesNamed(
'CPUSnapshots');
if (!snapshotInstances)
continue;
for (var object of snapshotInstances[0].snapshots)
snapshots.push(object.args.processes);
}
return snapshots;
}
function getProcessSumsFromSnapshot(snapshot) {
var processSums = new Map();
for (var processData of snapshot) {
var processName = processData.name;
if (!(processSums.has(processName)))
processSums.set(processName, {sum: 0.0, paths: new Set()});
processSums.get(processName).sum += parseFloat(processData.pCpu);
// The process path may be missing on Windows because of AccessDenied
// error thrown by psutil package used by CPU tracing agent.
if (processData.path)
processSums.get(processName).paths.add(processData.path);
}
return processSums;
}
function buildNumericsFromSnapshots(snapshots) {
var processNumerics = new Map();
for (var snapshot of snapshots) {
var processSums = getProcessSumsFromSnapshot(snapshot);
for (var [processName, processData] of processSums.entries()) {
if (!(processNumerics.has(processName))) {
processNumerics.set(processName, {
numeric: new tr.v.Histogram('cpu:percent:' + processName,
tr.b.Unit.byName.normalizedPercentage_smallerIsBetter),
paths: new Set()
});
}
processNumerics.get(processName).numeric.addSample(
processData.sum / 100.0);
for (var path of processData.paths)
processNumerics.get(processName).paths.add(path);
}
}
return processNumerics;
}
function cpuProcessMetric(values, model) {
var snapshots = getCpuSnapshotsFromModel(model);
var processNumerics = buildNumericsFromSnapshots(snapshots);
for (var [processName, processData] of processNumerics) {
var numeric = processData.numeric;
// Treat missing snapshots as zeros. A process is missing from a snapshots
// when its CPU usage was below minimum threshold when the snapshot was
// taken.
var missingSnapshotCount = snapshots.length - numeric.numValues;
for (var i = 0; i < missingSnapshotCount; i++)
numeric.addSample(0);
numeric.diagnostics.set('paths', new
tr.v.d.Generic([...processData.paths]));
values.addHistogram(numeric);
}
}
tr.metrics.MetricRegistry.register(cpuProcessMetric);
return {
cpuProcessMetric: cpuProcessMetric
};
});
</script>