stackviz/app/js/util/dstat-parse.js

98 lines
2.4 KiB
JavaScript

'use strict';
var timeFormat = require('d3-time-format');
var dsv = require('d3-dsv');
var fillArrayRight = function(array) {
// "fill" the array to the right, overwriting empty values with the next
// non-empty value to the left
// only false values will be overwritten (e.g. "", null, etc)
for (var i = 0; i < array.length - 1; i++) {
if (!array[i + 1]) {
array[i + 1] = array[i];
}
}
};
var mergeNames = function(primary, secondary) {
// "zip" together strings in the same position in each array, and do some
// basic cleanup of results
var ret = [];
for (var i = 0; i < primary.length; i++) {
ret.push((primary[i] + '_' + secondary[i]).replace(/[ /]/g, '_'));
}
return ret;
};
var parseDstat = function(data, year) {
var primaryNames = null;
var secondaryNames = null;
var names = null;
var minimums = {};
var maximums = {};
// assume UTC - may not necessarily be the case?
// dstat doesn't include the year in its logs, so we'll need to copy it
// from the subunit logs
var dateFormat = timeFormat.utcParse('%Y-%d-%m %H:%M:%S');
var parsed = dsv.csvParseRows(data, function(row, i) {
if (i === 0) {
if (row.length !== 1 ||
!row[0].startsWith('Dstat') ||
!row[0].endsWith('CSV output')) {
throw new Error('Invalid Dstat CSV');
}
} else if (i <= 3) { // header rows - ignore
return null;
} else if (i === 4) { // primary
primaryNames = row;
fillArrayRight(primaryNames);
return null;
} else if (i === 5) { // secondary
secondaryNames = row;
names = mergeNames(primaryNames, secondaryNames);
return null;
} else {
var ret = {};
for (var col = 0; col < row.length; col++) {
var name = names[col];
var value = row[col];
if (value && name) {
if (name === 'system_time') {
value = dateFormat((1900 + year) + '-' + value);
} else {
value = parseFloat(value);
}
if (!(name in minimums) || value < minimums[name]) {
minimums[name] = value;
}
if (!(name in maximums) || value > maximums[name]) {
maximums[name] = value;
}
ret[name] = value;
}
}
return ret;
}
});
return {
minimums: minimums,
maximums: maximums,
entries: parsed
};
};
module.exports = parseDstat;