var DB_FILE = 'db/stats.db'; var sqlite3 = require('sqlite3'); var bodyParser = require('body-parser'); var moment = require('moment'); var express = require("express"); var app = express(); var db = new sqlite3.Database(DB_FILE, sqlite3.OPEN_READONLY); var isValidChart = function(s) { return /^(net_in|net_out|block_in|block_out|mem|cpu)$/.test(s); }; var isValidZoom = function(s) { return /^(hour|day|week|month)$/.test(s); }; var thinOutRows = function(rows, chart, maxNum) { if (rows.length <= maxNum) { return rows; } var factor = Math.ceil(rows.length / maxNum); var res = []; var index = 0; while (index < rows.length - factor) { var subArr = rows.slice(index, index + factor) var stat = {}; stat['ts'] = subArr[0].ts; stat[chart] = subArr[0][chart] ?? 0; for (var i = 1; i < factor; ++i) { var checkValue = subArr[i][chart] ?? 0; if (checkValue > stat[chart]) { stat['ts'] = subArr[i].ts; stat[chart] = checkValue; } } res.push(stat) index += factor; } return res; } var getMinDate = function(zoom) { var now = moment(); now.subtract(1, zoom + 's'); return now.format('YYYY-MM-DD HH:mm:ss'); }; var processPreResult = function(result, containers, preResult) { var timestamps = []; var ts; for (ts in preResult) { timestamps.push(ts); } timestamps.sort(); for (var k=0; k= ? ORDER BY ts ASC", id, minDate, function(err, rows) { var prev = 0; rows = thinOutRows(rows, chart, 1000); for (var i=0; i= ? ORDER BY ts ASC", req.params.id, minDate, function(err, rows) { var json = [['Time', chart == 'cpu' ? 'CPU %' : 'Bytes']]; var prev = 0; rows = thinOutRows(rows, chart, 1000); for (var i=0; i