diff --git a/packages/unleash-api/lib/client-metrics-service.js b/packages/unleash-api/lib/client-metrics-service.js index c0ed79f1a3..4ffec9bd95 100644 --- a/packages/unleash-api/lib/client-metrics-service.js +++ b/packages/unleash-api/lib/client-metrics-service.js @@ -1,16 +1,25 @@ 'use strict'; const POLL_INTERVAL = 10000; +const { EventEmitter } = require('events'); -module.exports = class UnleashClientMetrics { +module.exports = class UnleashClientMetricsService extends EventEmitter { constructor (metricsDb) { + super(); this.metricsDb = metricsDb; this.metrics = []; this.highestIdSeen = 0; - metricsDb.getMetricsLastWeek().then(metrics => { - this.addMetrics(metrics); - this.startPoller(); - }); + this.fetch(); + } + + fetch () { + return this.metricsDb + .getNewMetrics(this.highestIdSeen) + .then(metrics => { + this.startTimer(); + this.addMetrics(metrics); + return metrics; + }); } addMetrics (metrics) { @@ -18,13 +27,11 @@ module.exports = class UnleashClientMetrics { if (this.metrics && this.metrics.length > 0) { this.highestIdSeen = this.metrics[this.metrics.length - 1].id; } + this.emit('metrics', metrics); } - startPoller () { - setInterval(() => { - this.metricsDb.getNewMetrics(this.highestIdSeen) - .then(metrics => this.addMetrics(metrics)); - }, POLL_INTERVAL).unref(); + startTimer () { + setInterval(() => this.fetch(), POLL_INTERVAL).unref(); } getMetrics () { @@ -32,6 +39,6 @@ module.exports = class UnleashClientMetrics { } insert (metrics) { - this.metricsDb.insert(metrics).then(() => console.log('new metrics inserted!')); + return this.metricsDb.insert(metrics); } }; diff --git a/packages/unleash-api/lib/client-metrics.js b/packages/unleash-api/lib/client-metrics.js index 20933cc02f..52d1892329 100644 --- a/packages/unleash-api/lib/client-metrics.js +++ b/packages/unleash-api/lib/client-metrics.js @@ -14,8 +14,7 @@ module.exports = class UnleashClientMetrics { } getState () { - // TODO this payload will be WAY to big, need to flatten the store - // and possibly evict/flag stale clients + // TODO need to flatten the store / possibly evict/flag stale clients return { globalCount: this.globalCount, apps: this.apps, @@ -25,10 +24,13 @@ module.exports = class UnleashClientMetrics { }; } - addPayload (data) { - this.addApp(data.appName); - this.addClient(data.appName, data.instanceId, data.clientInitTime); + registerClient (data) { + this.addClient(data.appName, data.instanceId, data.started); this.addStrategies(data.appName, data.strategies); + } + + addPayload (data) { + this.addClient(data.appName, data.instanceId); this.addBucket(data.appName, data.instanceId, data.bucket); } @@ -70,7 +72,8 @@ module.exports = class UnleashClientMetrics { } } - addClient (appName, instanceId, clientInitTime) { + addClient (appName, instanceId, started = new Date()) { + this.addApp(appName); if (instanceId) { if (this.clients[instanceId]) { this.clients[instanceId].ping = new Date(); @@ -78,7 +81,7 @@ module.exports = class UnleashClientMetrics { this.clients[instanceId] = { appName, count: 0, - clientInit: clientInitTime, + started, init: new Date(), ping: new Date(), }; diff --git a/packages/unleash-api/lib/routes/metrics.js b/packages/unleash-api/lib/routes/metrics.js index 0650c10169..d0890c3585 100644 --- a/packages/unleash-api/lib/routes/metrics.js +++ b/packages/unleash-api/lib/routes/metrics.js @@ -9,28 +9,38 @@ module.exports = function (app, config) { const metrics = new ClientMetrics(); const service = new ClientMetricsService(metricsDb); - app.get('/metrics', (req, res) => { - res.json(service.getMetrics()); - - // Your stuff: - // res.json(metrics.getState()); + service.on('metrics', (entries) => { + entries.forEach((m) => metrics.addPayload(m.metrics)); }); - app.post('/metrics', (req, res) => { - // TODO: validate input and reply with http errorcode - try { - // not required with header: Content-Type: application/json - // const data = JSON.parse(req.body); - // metrics.addPayload(data); - service.insert(req.body); - } catch (e) { - logger.error('Error recieving metrics', e); - } - - res.end(); + app.get('/service-metrics', (req, res) => { + res.json(service.getMetrics()); }); app.get('/metrics', (req, res) => { res.json(metrics.getState()); }); + + app.post('/client/metrics', (req, res) => { + try { + const data = typeof req.body === 'string' ? JSON.parse(req.body) : req.body; + metrics.addPayload(data); + service.insert(data); + } catch (e) { + logger.error('Error receiving metrics', e); + } + + res.end(); + }); + + app.post('/client/register', (req, res) => { + try { + const data = typeof req.body === 'string' ? JSON.parse(req.body) : req.body; + metrics.registerClient(data); + } catch (e) { + logger.error('Error registering client', e); + } + + res.end(); + }); };