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 }