github.com/manicqin/nomad@v0.9.5/ui/app/utils/classes/node-stats-tracker.js (about)

     1  import EmberObject, { computed } from '@ember/object';
     2  import { alias } from '@ember/object/computed';
     3  import RollingArray from 'nomad-ui/utils/classes/rolling-array';
     4  import AbstractStatsTracker from 'nomad-ui/utils/classes/abstract-stats-tracker';
     5  
     6  const percent = (numerator, denominator) => {
     7    if (!numerator || !denominator) {
     8      return 0;
     9    }
    10    return numerator / denominator;
    11  };
    12  
    13  const empty = ts => ({ timestamp: ts, used: null, percent: null });
    14  
    15  const NodeStatsTracker = EmberObject.extend(AbstractStatsTracker, {
    16    // Set via the stats computed property macro
    17    node: null,
    18  
    19    url: computed('node', function() {
    20      return `/v1/client/stats?node_id=${this.get('node.id')}`;
    21    }),
    22  
    23    append(frame) {
    24      const timestamp = new Date(Math.floor(frame.Timestamp / 1000000));
    25  
    26      const cpuUsed = Math.floor(frame.CPUTicksConsumed) || 0;
    27      this.cpu.pushObject({
    28        timestamp,
    29        used: cpuUsed,
    30        percent: percent(cpuUsed, this.reservedCPU),
    31      });
    32  
    33      const memoryUsed = frame.Memory.Used;
    34      this.memory.pushObject({
    35        timestamp,
    36        used: memoryUsed,
    37        percent: percent(memoryUsed / 1024 / 1024, this.reservedMemory),
    38      });
    39    },
    40  
    41    pause() {
    42      const ts = new Date();
    43      this.memory.pushObject(empty(ts));
    44      this.cpu.pushObject(empty(ts));
    45    },
    46  
    47    // Static figures, denominators for stats
    48    reservedCPU: alias('node.resources.cpu'),
    49    reservedMemory: alias('node.resources.memory'),
    50  
    51    // Dynamic figures, collected over time
    52    // []{ timestamp: Date, used: Number, percent: Number }
    53    cpu: computed('node', function() {
    54      return RollingArray(this.bufferSize);
    55    }),
    56    memory: computed('node', function() {
    57      return RollingArray(this.bufferSize);
    58    }),
    59  });
    60  
    61  export default NodeStatsTracker;
    62  
    63  export function stats(nodeProp, fetch) {
    64    return computed(nodeProp, function() {
    65      return NodeStatsTracker.create({
    66        fetch: fetch.call(this),
    67        node: this.get(nodeProp),
    68      });
    69    });
    70  }