github.com/hernad/nomad@v1.6.112/ui/app/utils/classes/node-stats-tracker.js (about)

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