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 }