<!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>
