From dcc96300922d1c736d3be750720ca842944d18eb Mon Sep 17 00:00:00 2001 From: Rodrigo Nascimento Date: Mon, 14 May 2018 17:08:42 -0300 Subject: [PATCH 1/7] Add setting and expose prometheus on port 9100 --- packages/rocketchat-api/package.js | 1 - .../rocketchat-api/server/default/metrics.js | 8 ----- packages/rocketchat-lib/server/lib/metrics.js | 32 +++++++++++++++++++ .../rocketchat-lib/server/startup/settings.js | 9 +++++- 4 files changed, 40 insertions(+), 10 deletions(-) delete mode 100644 packages/rocketchat-api/server/default/metrics.js diff --git a/packages/rocketchat-api/package.js b/packages/rocketchat-api/package.js index f97043855418b..46d6194bdbd07 100644 --- a/packages/rocketchat-api/package.js +++ b/packages/rocketchat-api/package.js @@ -27,7 +27,6 @@ Package.onUse(function(api) { //Add default routes api.addFiles('server/default/info.js', 'server'); - api.addFiles('server/default/metrics.js', 'server'); //Add v1 routes api.addFiles('server/v1/channels.js', 'server'); diff --git a/packages/rocketchat-api/server/default/metrics.js b/packages/rocketchat-api/server/default/metrics.js deleted file mode 100644 index 89b761c199a13..0000000000000 --- a/packages/rocketchat-api/server/default/metrics.js +++ /dev/null @@ -1,8 +0,0 @@ -RocketChat.API.default.addRoute('metrics', { authRequired: false }, { - get() { - return { - headers: { 'Content-Type': 'text/plain' }, - body: RocketChat.promclient.register.metrics() - }; - } -}); diff --git a/packages/rocketchat-lib/server/lib/metrics.js b/packages/rocketchat-lib/server/lib/metrics.js index 43cf6590f7b26..80f6893b58e0c 100644 --- a/packages/rocketchat-lib/server/lib/metrics.js +++ b/packages/rocketchat-lib/server/lib/metrics.js @@ -1,9 +1,41 @@ import client from 'prom-client'; +import connect from 'connect'; +import http from 'http'; RocketChat.promclient = client; +client.collectDefaultMetrics(); RocketChat.metrics = {}; // one sample metrics only - a counter RocketChat.metrics.messagesSent = new client.Counter({'name': 'message_sent', 'help': 'cumulated number of messages sent'}); +RocketChat.metrics.ddpSessions = new client.Gauge({'name': 'ddp_sessions_count', 'help': 'number of open ddp sessions'}); + +Meteor.setInterval(() => { + RocketChat.metrics.ddpSessions.set(Object.keys(Meteor.server.sessions).length); +}, 5000); + + +const app = connect(); + +// const compression = require('compression'); +// app.use(compression()); + +app.use('/metrics', (req, res) => { + res.setHeader('Content-Type', 'text/plain'); + res.end(RocketChat.promclient.register.metrics()); +}); + +const server = http.createServer(app); + +RocketChat.settings.get('Prometheus_Enabled', (key, value) => { + if (value === true) { + server.listen({ + port: 9100, + host: process.env.BIND_IP || '0.0.0.0' + }); + } else { + server.close(); + } +}); diff --git a/packages/rocketchat-lib/server/startup/settings.js b/packages/rocketchat-lib/server/startup/settings.js index cd857ef925f6a..cefce97ddea89 100644 --- a/packages/rocketchat-lib/server/startup/settings.js +++ b/packages/rocketchat-lib/server/startup/settings.js @@ -1632,9 +1632,16 @@ RocketChat.settings.addGroup('Logs', function() { type: 'boolean', 'public': true }); - return this.add('Log_View_Limit', 1000, { + this.add('Log_View_Limit', 1000, { type: 'int' }); + + this.section('Prometheus', function() { + this.add('Prometheus_Enabled', false, { + type: 'boolean', + i18nLabel: 'Enabled' + }); + }); }); RocketChat.settings.addGroup('Setup_Wizard', function() { From 38a3283a6e3c581d21168e149ff70813810663fb Mon Sep 17 00:00:00 2001 From: Rodrigo Nascimento Date: Mon, 14 May 2018 17:26:30 -0300 Subject: [PATCH 2/7] Prometheus: Add number of connected users --- packages/rocketchat-lib/server/lib/metrics.js | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/packages/rocketchat-lib/server/lib/metrics.js b/packages/rocketchat-lib/server/lib/metrics.js index 80f6893b58e0c..370bee0c221da 100644 --- a/packages/rocketchat-lib/server/lib/metrics.js +++ b/packages/rocketchat-lib/server/lib/metrics.js @@ -1,6 +1,7 @@ import client from 'prom-client'; import connect from 'connect'; import http from 'http'; +import _ from 'underscore'; RocketChat.promclient = client; client.collectDefaultMetrics(); @@ -11,12 +12,14 @@ RocketChat.metrics = {}; RocketChat.metrics.messagesSent = new client.Counter({'name': 'message_sent', 'help': 'cumulated number of messages sent'}); RocketChat.metrics.ddpSessions = new client.Gauge({'name': 'ddp_sessions_count', 'help': 'number of open ddp sessions'}); +RocketChat.metrics.ddpConnectedUsers = new client.Gauge({'name': 'ddp_connected_users', 'help': 'number of connected users'}); + Meteor.setInterval(() => { RocketChat.metrics.ddpSessions.set(Object.keys(Meteor.server.sessions).length); + RocketChat.metrics.ddpConnectedUsers.set(_.compact(_.unique(Object.values(Meteor.server.sessions).map(s => s.userId))).length); }, 5000); - const app = connect(); // const compression = require('compression'); From 5d360ab114d2f9691acf468cb95045fe6ffdfa6b Mon Sep 17 00:00:00 2001 From: Rodrigo Nascimento Date: Mon, 14 May 2018 19:17:19 -0300 Subject: [PATCH 3/7] Send statistics to prometheus --- packages/rocketchat-lib/server/lib/metrics.js | 76 ++++++++++++++++++- 1 file changed, 74 insertions(+), 2 deletions(-) diff --git a/packages/rocketchat-lib/server/lib/metrics.js b/packages/rocketchat-lib/server/lib/metrics.js index 370bee0c221da..56fdfedb13ead 100644 --- a/packages/rocketchat-lib/server/lib/metrics.js +++ b/packages/rocketchat-lib/server/lib/metrics.js @@ -14,11 +14,80 @@ RocketChat.metrics.messagesSent = new client.Counter({'name': 'message_sent', 'h RocketChat.metrics.ddpSessions = new client.Gauge({'name': 'ddp_sessions_count', 'help': 'number of open ddp sessions'}); RocketChat.metrics.ddpConnectedUsers = new client.Gauge({'name': 'ddp_connected_users', 'help': 'number of connected users'}); +RocketChat.metrics.version = new client.Gauge({'name': 'version', labelNames: ['version'], 'help': 'Rocket.Chat version'}); +RocketChat.metrics.migration = new client.Gauge({'name': 'migration', 'help': 'migration versoin'}); +RocketChat.metrics.instanceCount = new client.Gauge({'name': 'instance_count', 'help': 'instances running'}); +RocketChat.metrics.oplogEnabled = new client.Gauge({'name': 'oplog_enabled', labelNames: ['enabled'], 'help': 'oplog enabled'}); + +// User statistics +RocketChat.metrics.totalUsers = new client.Gauge({'name': 'users_total', 'help': 'total of users'}); +RocketChat.metrics.activeUsers = new client.Gauge({'name': 'users_active', 'help': 'total of active users'}); +RocketChat.metrics.nonActiveUsers = new client.Gauge({'name': 'users_non_active', 'help': 'total of non active users'}); +RocketChat.metrics.onlineUsers = new client.Gauge({'name': 'users_online', 'help': 'total of users online'}); +RocketChat.metrics.awayUsers = new client.Gauge({'name': 'users_away', 'help': 'total of users away'}); +RocketChat.metrics.offlineUsers = new client.Gauge({'name': 'users_offline', 'help': 'total of users offline'}); + +// Room statistics +RocketChat.metrics.totalRooms = new client.Gauge({'name': 'rooms_total', 'help': 'total of rooms'}); +RocketChat.metrics.totalChannels = new client.Gauge({'name': 'channels_total', 'help': 'total of public rooms/channels'}); +RocketChat.metrics.totalPrivateGroups = new client.Gauge({'name': 'private_groups_total', 'help': 'total of private rooms'}); +RocketChat.metrics.totalDirect = new client.Gauge({'name': 'direct_total', 'help': 'total of direct rooms'}); +RocketChat.metrics.totalLivechat = new client.Gauge({'name': 'livechat_total', 'help': 'total of livechat rooms'}); + +// Message statistics +RocketChat.metrics.totalMessages = new client.Gauge({'name': 'messages_total', 'help': 'total of messages'}); +RocketChat.metrics.totalChannelMessages = new client.Gauge({'name': 'channel_messages_total', 'help': 'total of messages in public rooms'}); +RocketChat.metrics.totalPrivateGroupMessages = new client.Gauge({'name': 'private_group_messages_total', 'help': 'total of messages in private rooms'}); +RocketChat.metrics.totalDirectMessages = new client.Gauge({'name': 'direct_messages_total', 'help': 'total of messages in direct rooms'}); +RocketChat.metrics.totalLivechatMessages = new client.Gauge({'name': 'livechat_messages_total', 'help': 'total of messages in livechat rooms'}); + +client.register.setDefaultLabels({ + uniqueId: RocketChat.settings.get('uniqueID'), + siteUrl: RocketChat.settings.get('Site_Url') +}); + +const setPrometheusData = () => { + client.register.setDefaultLabels({ + unique_id: RocketChat.settings.get('uniqueID'), + site_url: RocketChat.settings.get('Site_Url'), + version: RocketChat.Info.version + }); -Meteor.setInterval(() => { RocketChat.metrics.ddpSessions.set(Object.keys(Meteor.server.sessions).length); RocketChat.metrics.ddpConnectedUsers.set(_.compact(_.unique(Object.values(Meteor.server.sessions).map(s => s.userId))).length); -}, 5000); + + const statistics = RocketChat.models.Statistics.findLast(); + if (!statistics) { + return; + } + + RocketChat.metrics.version.set({version: statistics.version}, 1); + RocketChat.metrics.migration.set(RocketChat.Migrations._getControl().version); + RocketChat.metrics.instanceCount.set(statistics.instanceCount); + RocketChat.metrics.oplogEnabled.set({enabled: statistics.oplogEnabled}, 1); + + // User statistics + RocketChat.metrics.totalUsers.set(statistics.totalUsers); + RocketChat.metrics.activeUsers.set(statistics.activeUsers); + RocketChat.metrics.nonActiveUsers.set(statistics.nonActiveUsers); + RocketChat.metrics.onlineUsers.set(statistics.onlineUsers); + RocketChat.metrics.awayUsers.set(statistics.awayUsers); + RocketChat.metrics.offlineUsers.set(statistics.offlineUsers); + + // Room statistics + RocketChat.metrics.totalRooms.set(statistics.totalRooms); + RocketChat.metrics.totalChannels.set(statistics.totalChannels); + RocketChat.metrics.totalPrivateGroups.set(statistics.totalPrivateGroups); + RocketChat.metrics.totalDirect.set(statistics.totalDirect); + RocketChat.metrics.totalLivechat.set(statistics.totlalLivechat); + + // Message statistics + RocketChat.metrics.totalMessages.set(statistics.totalMessages); + RocketChat.metrics.totalChannelMessages.set(statistics.totalChannelMessages); + RocketChat.metrics.totalPrivateGroupMessages.set(statistics.totalPrivateGroupMessages); + RocketChat.metrics.totalDirectMessages.set(statistics.totalDirectMessages); + RocketChat.metrics.totalLivechatMessages.set(statistics.totalLivechatMessages); +}; const app = connect(); @@ -32,13 +101,16 @@ app.use('/metrics', (req, res) => { const server = http.createServer(app); +let timer; RocketChat.settings.get('Prometheus_Enabled', (key, value) => { if (value === true) { server.listen({ port: 9100, host: process.env.BIND_IP || '0.0.0.0' }); + timer = Meteor.setInterval(setPrometheusData, 5000); } else { server.close(); + Meteor.clearInterval(timer); } }); From bb4ff6ac68d67fdc9cc970d530da37790577da34 Mon Sep 17 00:00:00 2001 From: Rodrigo Nascimento Date: Mon, 14 May 2018 19:55:54 -0300 Subject: [PATCH 4/7] Prometheus: Add methods, subscriptions and callbacks data --- packages/rocketchat-lib/lib/callbacks.js | 5 ++ packages/rocketchat-lib/server/lib/debug.js | 6 +- packages/rocketchat-lib/server/lib/metrics.js | 66 ++++++++++++------- 3 files changed, 54 insertions(+), 23 deletions(-) diff --git a/packages/rocketchat-lib/lib/callbacks.js b/packages/rocketchat-lib/lib/callbacks.js index f4f8e70865acd..3744491b0a3f1 100644 --- a/packages/rocketchat-lib/lib/callbacks.js +++ b/packages/rocketchat-lib/lib/callbacks.js @@ -80,6 +80,10 @@ RocketChat.callbacks.run = function(hook, item, constant) { const result = _.sortBy(callbacks, function(callback) { return callback.priority || RocketChat.callbacks.priority.MEDIUM; }).reduce(function(result, callback) { + let rocketchatCallbacksEnd; + if (Meteor.isServer) { + rocketchatCallbacksEnd = RocketChat.metrics.rocketchatCallbacks.startTimer({hook, callback: callback.id}); + } let time = 0; if (RocketChat.callbacks.showTime === true || RocketChat.callbacks.showTotalTime === true) { time = Date.now(); @@ -90,6 +94,7 @@ RocketChat.callbacks.run = function(hook, item, constant) { totalTime += currentTime; if (RocketChat.callbacks.showTime === true) { if (Meteor.isServer) { + rocketchatCallbacksEnd(); RocketChat.statsTracker.timing('callbacks.time', currentTime, [`hook:${ hook }`, `callback:${ callback.id }`]); } else { let stack = callback.stack && typeof callback.stack.split === 'function' && callback.stack.split('\n'); diff --git a/packages/rocketchat-lib/server/lib/debug.js b/packages/rocketchat-lib/server/lib/debug.js index 1a000e44b17a2..67b1df5e3be33 100644 --- a/packages/rocketchat-lib/server/lib/debug.js +++ b/packages/rocketchat-lib/server/lib/debug.js @@ -14,10 +14,13 @@ const logger = new Logger('Meteor', { const wrapMethods = function(name, originalHandler, methodsMap) { methodsMap[name] = function() { + const end = RocketChat.metrics.meteorMethods.startTimer({method: name}); const args = name === 'ufsWrite' ? Array.prototype.slice.call(arguments, 1) : arguments; logger.method(name, '-> userId:', Meteor.userId(), ', arguments: ', args); - return originalHandler.apply(this, arguments); + const result = originalHandler.apply(this, arguments); + end(); + return result; }; }; @@ -35,6 +38,7 @@ const originalMeteorPublish = Meteor.publish; Meteor.publish = function(name, func) { return originalMeteorPublish(name, function() { logger.publish(name, '-> userId:', this.userId, ', arguments: ', arguments); + RocketChat.metrics.meteorSubscriptions.inc({subscription: name}, 1, new Date()); return func.apply(this, arguments); }); diff --git a/packages/rocketchat-lib/server/lib/metrics.js b/packages/rocketchat-lib/server/lib/metrics.js index 56fdfedb13ead..0b05051fc314d 100644 --- a/packages/rocketchat-lib/server/lib/metrics.js +++ b/packages/rocketchat-lib/server/lib/metrics.js @@ -10,6 +10,26 @@ RocketChat.metrics = {}; // one sample metrics only - a counter +RocketChat.metrics.meteorMethods = new client.Summary({ + name: 'meteor_methods', + help: 'metric_help', + labelNames: ['method'] +}); +RocketChat.metrics.meteorMethods.observe(10); + +RocketChat.metrics.rocketchatCallbacks = new client.Summary({ + name: 'rocketchat_callbacks', + help: 'metric_help', + labelNames: ['hook', 'callback'] +}); +RocketChat.metrics.meteorMethods.observe(10); + +RocketChat.metrics.meteorSubscriptions = new client.Counter({ + name: 'meteor_subscriptions', + help: 'metric_help', + labelNames: ['subscription'] +}); + RocketChat.metrics.messagesSent = new client.Counter({'name': 'message_sent', 'help': 'cumulated number of messages sent'}); RocketChat.metrics.ddpSessions = new client.Gauge({'name': 'ddp_sessions_count', 'help': 'number of open ddp sessions'}); RocketChat.metrics.ddpConnectedUsers = new client.Gauge({'name': 'ddp_connected_users', 'help': 'number of connected users'}); @@ -47,46 +67,48 @@ client.register.setDefaultLabels({ }); const setPrometheusData = () => { + const date = new Date(); + client.register.setDefaultLabels({ unique_id: RocketChat.settings.get('uniqueID'), site_url: RocketChat.settings.get('Site_Url'), version: RocketChat.Info.version }); - RocketChat.metrics.ddpSessions.set(Object.keys(Meteor.server.sessions).length); - RocketChat.metrics.ddpConnectedUsers.set(_.compact(_.unique(Object.values(Meteor.server.sessions).map(s => s.userId))).length); + RocketChat.metrics.ddpSessions.set(Object.keys(Meteor.server.sessions).length, date); + RocketChat.metrics.ddpConnectedUsers.set(_.compact(_.unique(Object.values(Meteor.server.sessions).map(s => s.userId))).length, date); const statistics = RocketChat.models.Statistics.findLast(); if (!statistics) { return; } - RocketChat.metrics.version.set({version: statistics.version}, 1); - RocketChat.metrics.migration.set(RocketChat.Migrations._getControl().version); - RocketChat.metrics.instanceCount.set(statistics.instanceCount); - RocketChat.metrics.oplogEnabled.set({enabled: statistics.oplogEnabled}, 1); + RocketChat.metrics.version.set({version: statistics.version}, 1, date); + RocketChat.metrics.migration.set(RocketChat.Migrations._getControl().version, date); + RocketChat.metrics.instanceCount.set(statistics.instanceCount, date); + RocketChat.metrics.oplogEnabled.set({enabled: statistics.oplogEnabled}, 1, date); // User statistics - RocketChat.metrics.totalUsers.set(statistics.totalUsers); - RocketChat.metrics.activeUsers.set(statistics.activeUsers); - RocketChat.metrics.nonActiveUsers.set(statistics.nonActiveUsers); - RocketChat.metrics.onlineUsers.set(statistics.onlineUsers); - RocketChat.metrics.awayUsers.set(statistics.awayUsers); - RocketChat.metrics.offlineUsers.set(statistics.offlineUsers); + RocketChat.metrics.totalUsers.set(statistics.totalUsers, date); + RocketChat.metrics.activeUsers.set(statistics.activeUsers, date); + RocketChat.metrics.nonActiveUsers.set(statistics.nonActiveUsers, date); + RocketChat.metrics.onlineUsers.set(statistics.onlineUsers, date); + RocketChat.metrics.awayUsers.set(statistics.awayUsers, date); + RocketChat.metrics.offlineUsers.set(statistics.offlineUsers, date); // Room statistics - RocketChat.metrics.totalRooms.set(statistics.totalRooms); - RocketChat.metrics.totalChannels.set(statistics.totalChannels); - RocketChat.metrics.totalPrivateGroups.set(statistics.totalPrivateGroups); - RocketChat.metrics.totalDirect.set(statistics.totalDirect); - RocketChat.metrics.totalLivechat.set(statistics.totlalLivechat); + RocketChat.metrics.totalRooms.set(statistics.totalRooms, date); + RocketChat.metrics.totalChannels.set(statistics.totalChannels, date); + RocketChat.metrics.totalPrivateGroups.set(statistics.totalPrivateGroups, date); + RocketChat.metrics.totalDirect.set(statistics.totalDirect, date); + RocketChat.metrics.totalLivechat.set(statistics.totlalLivechat, date); // Message statistics - RocketChat.metrics.totalMessages.set(statistics.totalMessages); - RocketChat.metrics.totalChannelMessages.set(statistics.totalChannelMessages); - RocketChat.metrics.totalPrivateGroupMessages.set(statistics.totalPrivateGroupMessages); - RocketChat.metrics.totalDirectMessages.set(statistics.totalDirectMessages); - RocketChat.metrics.totalLivechatMessages.set(statistics.totalLivechatMessages); + RocketChat.metrics.totalMessages.set(statistics.totalMessages, date); + RocketChat.metrics.totalChannelMessages.set(statistics.totalChannelMessages, date); + RocketChat.metrics.totalPrivateGroupMessages.set(statistics.totalPrivateGroupMessages, date); + RocketChat.metrics.totalDirectMessages.set(statistics.totalDirectMessages, date); + RocketChat.metrics.totalLivechatMessages.set(statistics.totalLivechatMessages, date); }; const app = connect(); From eae40f91b7bf6c906b0113cac982f6489fb5f634 Mon Sep 17 00:00:00 2001 From: Rodrigo Nascimento Date: Mon, 14 May 2018 20:42:40 -0300 Subject: [PATCH 5/7] Prometheus: Add metrics of REST API calls --- packages/rocketchat-api/server/api.js | 12 +++++++++++- packages/rocketchat-lib/server/lib/metrics.js | 13 ++++++++++--- 2 files changed, 21 insertions(+), 4 deletions(-) diff --git a/packages/rocketchat-api/server/api.js b/packages/rocketchat-api/server/api.js index 29bd0c08c844c..dd48b3ab39fac 100644 --- a/packages/rocketchat-api/server/api.js +++ b/packages/rocketchat-api/server/api.js @@ -146,6 +146,10 @@ class API extends Restivus { //Add a try/catch for each endpoint const originalAction = endpoints[method].action; endpoints[method].action = function _internalRouteActionHandler() { + const rocketchatRestApiEnd = RocketChat.metrics.rocketchatRestApi.startTimer({ + method, + entrypoint: route + }); this.logger.debug(`${ this.request.method.toUpperCase() }: ${ this.request.url }`); let result; try { @@ -155,7 +159,13 @@ class API extends Restivus { return RocketChat.API.v1.failure(e.message, e.error); } - return result ? result : RocketChat.API.v1.success(); + result = result ? result : RocketChat.API.v1.success(); + + rocketchatRestApiEnd({ + status: result.statusCode + }); + + return result; }; for (const [name, helperMethod] of this.getHelperMethods()) { diff --git a/packages/rocketchat-lib/server/lib/metrics.js b/packages/rocketchat-lib/server/lib/metrics.js index 0b05051fc314d..2b7cbc51d8a45 100644 --- a/packages/rocketchat-lib/server/lib/metrics.js +++ b/packages/rocketchat-lib/server/lib/metrics.js @@ -12,21 +12,28 @@ RocketChat.metrics = {}; RocketChat.metrics.meteorMethods = new client.Summary({ name: 'meteor_methods', - help: 'metric_help', + help: 'summary of meteor methods count and time', labelNames: ['method'] }); RocketChat.metrics.meteorMethods.observe(10); RocketChat.metrics.rocketchatCallbacks = new client.Summary({ name: 'rocketchat_callbacks', - help: 'metric_help', + help: 'summary of rocketchat callbacks count and time', labelNames: ['hook', 'callback'] }); RocketChat.metrics.meteorMethods.observe(10); +RocketChat.metrics.rocketchatRestApi = new client.Summary({ + name: 'rocketchat_rest_api', + help: 'summary of rocketchat rest api count and time', + labelNames: ['method', 'entrypoint', 'status'] +}); +RocketChat.metrics.meteorMethods.observe(10); + RocketChat.metrics.meteorSubscriptions = new client.Counter({ name: 'meteor_subscriptions', - help: 'metric_help', + help: 'summary of meteor subscriptions count and time', labelNames: ['subscription'] }); From 983cf7404c7b3cbc5dbeff0df340a7bd48ddbb78 Mon Sep 17 00:00:00 2001 From: Rodrigo Nascimento Date: Mon, 14 May 2018 23:05:40 -0300 Subject: [PATCH 6/7] Prometheus: Record subscriptions time --- packages/rocketchat-api/server/api.js | 4 ++-- packages/rocketchat-lib/server/lib/debug.js | 8 +++++++- packages/rocketchat-lib/server/lib/metrics.js | 2 +- 3 files changed, 10 insertions(+), 4 deletions(-) diff --git a/packages/rocketchat-api/server/api.js b/packages/rocketchat-api/server/api.js index dd48b3ab39fac..227c21391f321 100644 --- a/packages/rocketchat-api/server/api.js +++ b/packages/rocketchat-api/server/api.js @@ -156,10 +156,10 @@ class API extends Restivus { result = originalAction.apply(this); } catch (e) { this.logger.debug(`${ method } ${ route } threw an error:`, e.stack); - return RocketChat.API.v1.failure(e.message, e.error); + result = RocketChat.API.v1.failure(e.message, e.error); } - result = result ? result : RocketChat.API.v1.success(); + result = result || RocketChat.API.v1.success(); rocketchatRestApiEnd({ status: result.statusCode diff --git a/packages/rocketchat-lib/server/lib/debug.js b/packages/rocketchat-lib/server/lib/debug.js index 67b1df5e3be33..103675dd5fb9e 100644 --- a/packages/rocketchat-lib/server/lib/debug.js +++ b/packages/rocketchat-lib/server/lib/debug.js @@ -38,7 +38,13 @@ const originalMeteorPublish = Meteor.publish; Meteor.publish = function(name, func) { return originalMeteorPublish(name, function() { logger.publish(name, '-> userId:', this.userId, ', arguments: ', arguments); - RocketChat.metrics.meteorSubscriptions.inc({subscription: name}, 1, new Date()); + const end = RocketChat.metrics.meteorSubscriptions.startTimer({subscription: name}); + + const originalReady = this.ready; + this.ready = function() { + end(); + return originalReady.apply(this, arguments); + }; return func.apply(this, arguments); }); diff --git a/packages/rocketchat-lib/server/lib/metrics.js b/packages/rocketchat-lib/server/lib/metrics.js index 2b7cbc51d8a45..c2f483f9b3d59 100644 --- a/packages/rocketchat-lib/server/lib/metrics.js +++ b/packages/rocketchat-lib/server/lib/metrics.js @@ -31,7 +31,7 @@ RocketChat.metrics.rocketchatRestApi = new client.Summary({ }); RocketChat.metrics.meteorMethods.observe(10); -RocketChat.metrics.meteorSubscriptions = new client.Counter({ +RocketChat.metrics.meteorSubscriptions = new client.Summary({ name: 'meteor_subscriptions', help: 'summary of meteor subscriptions count and time', labelNames: ['subscription'] From 0fafb5c2fb4b252cd389aa90e7bc60443d71ef1d Mon Sep 17 00:00:00 2001 From: Diego Sampaio Date: Tue, 15 May 2018 12:19:21 -0300 Subject: [PATCH 7/7] Add metrics to notifications --- .../rocketchat-lib/server/functions/notifications/audio.js | 1 + .../rocketchat-lib/server/functions/notifications/desktop.js | 1 + .../rocketchat-lib/server/functions/notifications/email.js | 1 + packages/rocketchat-lib/server/lib/PushNotification.js | 1 + packages/rocketchat-lib/server/lib/metrics.js | 5 +++++ 5 files changed, 9 insertions(+) diff --git a/packages/rocketchat-lib/server/functions/notifications/audio.js b/packages/rocketchat-lib/server/functions/notifications/audio.js index 1c45b18f336a1..9d94945a27137 100644 --- a/packages/rocketchat-lib/server/functions/notifications/audio.js +++ b/packages/rocketchat-lib/server/functions/notifications/audio.js @@ -23,6 +23,7 @@ export function shouldNotifyAudio({ } export function notifyAudioUser(userId, message, room) { + RocketChat.metrics.audioNotificationsSent.inc(); RocketChat.Notifications.notifyUser(userId, 'audioNotification', { payload: { _id: message._id, diff --git a/packages/rocketchat-lib/server/functions/notifications/desktop.js b/packages/rocketchat-lib/server/functions/notifications/desktop.js index fd351192270de..5997626937ec7 100644 --- a/packages/rocketchat-lib/server/functions/notifications/desktop.js +++ b/packages/rocketchat-lib/server/functions/notifications/desktop.js @@ -30,6 +30,7 @@ export function notifyDesktopUser({ return; } + RocketChat.metrics.desktopNotificationsSent.inc(); RocketChat.Notifications.notifyUser(userId, 'notification', { title, text, diff --git a/packages/rocketchat-lib/server/functions/notifications/email.js b/packages/rocketchat-lib/server/functions/notifications/email.js index 4bb4acd84efbf..6cead9a7c213d 100644 --- a/packages/rocketchat-lib/server/functions/notifications/email.js +++ b/packages/rocketchat-lib/server/functions/notifications/email.js @@ -137,6 +137,7 @@ export function sendEmail({ message, user, subscription, room, emailAddress, toA } Meteor.defer(() => { + RocketChat.metrics.emailNotificationsSent.inc(); Email.send(email); }); } diff --git a/packages/rocketchat-lib/server/lib/PushNotification.js b/packages/rocketchat-lib/server/lib/PushNotification.js index 15e50c780fe04..db3ff9137a004 100644 --- a/packages/rocketchat-lib/server/lib/PushNotification.js +++ b/packages/rocketchat-lib/server/lib/PushNotification.js @@ -47,6 +47,7 @@ class PushNotification { }; } + RocketChat.metrics.mobileNotificationsSent.inc(); return Push.send(config); } } diff --git a/packages/rocketchat-lib/server/lib/metrics.js b/packages/rocketchat-lib/server/lib/metrics.js index c2f483f9b3d59..21dcad0bf9922 100644 --- a/packages/rocketchat-lib/server/lib/metrics.js +++ b/packages/rocketchat-lib/server/lib/metrics.js @@ -38,6 +38,11 @@ RocketChat.metrics.meteorSubscriptions = new client.Summary({ }); RocketChat.metrics.messagesSent = new client.Counter({'name': 'message_sent', 'help': 'cumulated number of messages sent'}); +RocketChat.metrics.audioNotificationsSent = new client.Counter({'name': 'audio_sent', 'help': 'cumulated number of audio notifications sent'}); +RocketChat.metrics.desktopNotificationsSent = new client.Counter({'name': 'desktop_sent', 'help': 'cumulated number of desktop notifications sent'}); +RocketChat.metrics.mobileNotificationsSent = new client.Counter({'name': 'mobile_sent', 'help': 'cumulated number of mobile notifications sent'}); +RocketChat.metrics.emailNotificationsSent = new client.Counter({'name': 'email_sent', 'help': 'cumulated number of email notifications sent'}); + RocketChat.metrics.ddpSessions = new client.Gauge({'name': 'ddp_sessions_count', 'help': 'number of open ddp sessions'}); RocketChat.metrics.ddpConnectedUsers = new client.Gauge({'name': 'ddp_connected_users', 'help': 'number of connected users'});