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