diff --git a/dashboard/src/models/SystemModel.js b/dashboard/src/models/SystemModel.js index 356fe0420..0f63e7eaf 100644 --- a/dashboard/src/models/SystemModel.js +++ b/dashboard/src/models/SystemModel.js @@ -95,7 +95,7 @@ function create() { return [null, result.body]; }, async getMetricStream() { - return new EventSource(`${API_ORIGIN}/api/v1/system/metricstream?access_token=${accessToken}`); + return new EventSource(`${API_ORIGIN}/api/v1/system/metricstream?access_token=${accessToken}&intervalSecs=3`); } }; } diff --git a/src/metrics.js b/src/metrics.js index d5f26ec9f..17d270cdc 100644 --- a/src/metrics.js +++ b/src/metrics.js @@ -304,8 +304,10 @@ async function getSystem(options) { }; } -async function getSystemStream() { - const INTERVAL_SECS = 2; +async function getSystemStream(options) { + assert.strictEqual(typeof options, 'object'); + + const INTERVAL_SECS = options.intervalSecs || 5; let intervalId = null, oldCpuMetrics = null; const metricsStream = new Readable({ diff --git a/src/routes/system.js b/src/routes/system.js index 4079b43c0..2769f7019 100644 --- a/src/routes/system.js +++ b/src/routes/system.js @@ -119,11 +119,11 @@ async function getLogStream(req, res, next) { } async function getMetrics(req, res, next) { - if (!req.query.fromSecs || !parseInt(req.query.fromSecs)) return next(new HttpError(400, 'fromSecs must be a number')); - if (!req.query.intervalSecs || !parseInt(req.query.intervalSecs)) return next(new HttpError(400, 'intervalSecs must be a number')); + if (!req.query.fromSecs || !parseInt(req.query.fromSecs, 10)) return next(new HttpError(400, 'fromSecs must be a number')); + if (!req.query.intervalSecs || !parseInt(req.query.intervalSecs, 10)) return next(new HttpError(400, 'intervalSecs must be a number')); - const fromSecs = parseInt(req.query.fromSecs); - const intervalSecs = parseInt(req.query.intervalSecs); + const fromSecs = parseInt(req.query.fromSecs, 10); + const intervalSecs = parseInt(req.query.intervalSecs, 10); const noNullPoints = !!req.query.noNullPoints; const [error, result] = await safe(metrics.getSystem({ fromSecs, intervalSecs, noNullPoints })); if (error) return next(new HttpError(500, error)); @@ -134,7 +134,10 @@ async function getMetrics(req, res, next) { async function getMetricStream(req, res, next) { if (req.headers.accept !== 'text/event-stream') return next(new HttpError(400, 'This API call requires EventStream')); - const [error, metricStream] = await safe(metrics.getSystemStream()); + const intervalSecs = typeof req.query.intervalSecs !== 'undefined' ? parseInt(req.query.intervalSecs, 10) : 5; + if (!intervalSecs || intervalSecs < 2) return next(new HttpError(400, 'intervalSecs query param must be >= 2')); + + const [error, metricStream] = await safe(metrics.getSystemStream({ intervalSecs })); if (error) return next(BoxError.toHttpError(error)); res.writeHead(200, {