github.com/iqoqo/nomad@v0.11.3-0.20200911112621-d7021c74d101/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 }