nsolid-manager
Version:
A manager that sets up and runs N|Solid for you
93 lines (75 loc) • 2.63 kB
JavaScript
var d3 = require('d3')
var createGraph = require('../graph-cache')
var GB = 1024 * 1024 * 1024
// create a width * height 2d array
function zero (out) {
for (var i = 0; i < out.length; i++) {
var row = out[i]
for (var j = 0; j < row.length; j++) {
out[i][j] = 0
}
}
return out
}
function computeCPUSpectrogram (application, width, height) {
var appGraph = createGraph({type: 'app', id: application.id})
appGraph.grid('CPUSpectrogram', width, height, function buildCPUSpectrogram (graph) {
var processes = application.processes
// input ranges
var min = 0
var max = 100
var data = d3.layout.histogram()
.frequency(false)
.bins(d3.range(min, max, max / height).concat(max))
.value(p => p.cpu)(processes)
// update columns
var insert = data.map(d => d.y)
graph.push(insert)
graph.shift()
return insert
})
}
function computeRSSSpectrogram (application, width, height) {
var appGraph = createGraph({type: 'app', id: application.id})
appGraph.grid('RSSSpectrogram', width, height, function buildRSSSpectrogram (graph) {
var processes = application.processes
var totalRSS = Math.max(d3.sum(processes, p => p.memory.rss), GB)
// input ranges
var min = 0
var max = 1
var data = d3.layout.histogram()
.frequency(false)
.bins(d3.range(min, max, max / height).concat(max))
.value(p => p.memory.rss / totalRSS)(processes)
// update columns
var insert = data.map(d => d.y)
graph.push(insert)
graph.shift()
return insert
})
}
function computeSpiffygram (application, width, height) {
var appGraph = createGraph({type: 'app', id: application.id})
appGraph.grid('spiffygram', width, height, function buildSpiffygraom (grid) {
// since the spiffygram computation is additive, reset
// all of the grid cells to 0 befor processing
zero(grid)
var processes = application.processes
var totalRSS = Math.max(d3.sum(processes, p => p.memory.rss), GB)
var incrementor = 1 / processes.length
processes.forEach(function (g) {
var Xratio = Math.min(g.cpu / 100, 0.99)
var Yratio = Math.min(g.memory.rss / totalRSS, 0.99)
var x = Math.floor(Xratio * width)
// flip the Y-Axis so small values are on the bottom
var y = (height - 1) - Math.floor(Yratio * height)
var gridX = grid[x]
if (gridX && y < gridX.length) {
gridX[y] += incrementor
}
})
})
}
exports.computeRSSSpectrogram = computeRSSSpectrogram
exports.computeCPUSpectrogram = computeCPUSpectrogram
exports.computeSpiffygram = computeSpiffygram