From 76b9cdd7f5f90fdbe3060747629879cfc5806108 Mon Sep 17 00:00:00 2001 From: "S. Li" Date: Mon, 23 Jan 2017 23:40:55 -0500 Subject: [PATCH 1/6] add prometheus monitoring foundation --- package.json | 3 +- packages/rocketchat-api/package.js | 3 + .../rocketchat-api/server/default/info.js | 4 + .../rocketchat-api/server/default/metrics.js | 5 ++ .../.npm/package/npm-shrinkwrap.json | 74 ++++++++++++------- packages/rocketchat-lib/package.js | 4 +- packages/rocketchat-lib/server/lib/metrics.js | 9 +++ .../server/methods/sendMessage.coffee | 3 +- 8 files changed, 75 insertions(+), 30 deletions(-) create mode 100644 packages/rocketchat-api/server/default/metrics.js create mode 100644 packages/rocketchat-lib/server/lib/metrics.js diff --git a/package.json b/package.json index 44ab2741c62..d28c29445a2 100644 --- a/package.json +++ b/package.json @@ -75,6 +75,7 @@ "mime-types": "^2.1.14", "file-type": "^4.0.0", "semver": "^5.3.0", - "codemirror": "^5.22.2" + "codemirror": "^5.22.2", + "prom-client": "^7.0.1" } } diff --git a/packages/rocketchat-api/package.js b/packages/rocketchat-api/package.js index 023e3b6a3c7..1cd38d72f78 100644 --- a/packages/rocketchat-api/package.js +++ b/packages/rocketchat-api/package.js @@ -11,6 +11,7 @@ Package.onUse(function(api) { 'ecmascript', 'rocketchat:lib', 'nimble:restivus' + ]); api.addFiles('server/api.js', 'server'); @@ -22,6 +23,8 @@ Package.onUse(function(api) { api.addFiles('server/v1/helpers/parseJsonQuery.js', 'server'); 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/info.js b/packages/rocketchat-api/server/default/info.js index adf7a094db0..cd5efeb6cfa 100644 --- a/packages/rocketchat-api/server/default/info.js +++ b/packages/rocketchat-api/server/default/info.js @@ -1,3 +1,7 @@ +var client = require('prom-client'); + +var defaultMetrics = client.defaultMetrics; + RocketChat.API.default.addRoute('info', { authRequired: false }, { get: function() { return RocketChat.Info; diff --git a/packages/rocketchat-api/server/default/metrics.js b/packages/rocketchat-api/server/default/metrics.js new file mode 100644 index 00000000000..f5b17aa8742 --- /dev/null +++ b/packages/rocketchat-api/server/default/metrics.js @@ -0,0 +1,5 @@ +RocketChat.API.default.addRoute('metrics', { authRequired: false }, { + get: function() { + return { headers: { 'Content-Type': 'text/plain' }, body: RocketChat.promclient.register.metrics()}; +} +}); diff --git a/packages/rocketchat-lib/.npm/package/npm-shrinkwrap.json b/packages/rocketchat-lib/.npm/package/npm-shrinkwrap.json index d2ac7e3c6b8..1f3369640de 100644 --- a/packages/rocketchat-lib/.npm/package/npm-shrinkwrap.json +++ b/packages/rocketchat-lib/.npm/package/npm-shrinkwrap.json @@ -6,13 +6,13 @@ "from": "acorn@>=1.0.3 <2.0.0" }, "amdefine": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.0.tgz", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz", "from": "amdefine@>=0.0.4" }, "ansi-regex": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.0.0.tgz", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", "from": "ansi-regex@>=2.0.0 <3.0.0" }, "ansi-styles": { @@ -75,6 +75,11 @@ "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.0.tgz", "from": "bcrypt-pbkdf@>=1.0.0 <2.0.0" }, + "bintrees": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/bintrees/-/bintrees-1.0.1.tgz", + "from": "bintrees@1.0.1" + }, "boom": { "version": "2.10.1", "resolved": "https://registry.npmjs.org/boom/-/boom-2.10.1.tgz", @@ -116,8 +121,8 @@ "from": "cryptiles@>=2.0.0 <3.0.0" }, "dashdash": { - "version": "1.14.0", - "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.0.tgz", + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", "from": "dashdash@>=1.12.0 <2.0.0", "dependencies": { "assert-plus": { @@ -183,8 +188,8 @@ "from": "forever-agent@>=0.6.1 <0.7.0" }, "form-data": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.1.1.tgz", + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.1.2.tgz", "from": "form-data@>=2.1.1 <2.2.0" }, "generate-function": { @@ -300,8 +305,8 @@ "from": "json-stringify-safe@>=5.0.1 <5.1.0" }, "jsonpointer": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jsonpointer/-/jsonpointer-4.0.0.tgz", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/jsonpointer/-/jsonpointer-4.0.1.tgz", "from": "jsonpointer@>=4.0.0 <5.0.0" }, "jsprim": { @@ -330,13 +335,13 @@ "from": "lokijs@1.4.1" }, "mime-db": { - "version": "1.24.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.24.0.tgz", - "from": "mime-db@>=1.24.0 <1.25.0" + "version": "1.26.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.26.0.tgz", + "from": "mime-db@>=1.26.0 <1.27.0" }, "mime-types": { - "version": "2.1.12", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.12.tgz", + "version": "2.1.14", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.14.tgz", "from": "mime-types@>=2.1.7 <2.2.0" }, "node-dogstatsd": { @@ -344,11 +349,6 @@ "resolved": "https://registry.npmjs.org/node-dogstatsd/-/node-dogstatsd-0.0.6.tgz", "from": "node-dogstatsd@0.0.6" }, - "node-uuid": { - "version": "1.4.7", - "resolved": "https://registry.npmjs.org/node-uuid/-/node-uuid-1.4.7.tgz", - "from": "node-uuid@>=1.4.7 <1.5.0" - }, "oauth-sign": { "version": "0.8.2", "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.8.2.tgz", @@ -379,6 +379,11 @@ "resolved": "https://registry.npmjs.org/private/-/private-0.1.6.tgz", "from": "private@>=0.1.5 <0.2.0" }, + "prom-client": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/prom-client/-/prom-client-7.0.1.tgz", + "from": "prom-client@7.0.1" + }, "promise": { "version": "7.1.1", "resolved": "https://registry.npmjs.org/promise/-/promise-7.1.1.tgz", @@ -417,8 +422,8 @@ } }, "request": { - "version": "2.76.0", - "resolved": "https://registry.npmjs.org/request/-/request-2.76.0.tgz", + "version": "2.79.0", + "resolved": "https://registry.npmjs.org/request/-/request-2.79.0.tgz", "from": "request@>=2.0.0 <3.0.0" }, "sntp": { @@ -432,8 +437,8 @@ "from": "source-map@0.1.31" }, "sshpk": { - "version": "1.10.1", - "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.10.1.tgz", + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.10.2.tgz", "from": "sshpk@>=1.7.0 <2.0.0", "dependencies": { "assert-plus": { @@ -468,6 +473,11 @@ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", "from": "supports-color@>=2.0.0 <3.0.0" }, + "tdigest": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/tdigest/-/tdigest-0.1.1.tgz", + "from": "tdigest@>=0.1.1 <0.2.0" + }, "through": { "version": "2.3.8", "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", @@ -489,8 +499,8 @@ "from": "tunnel-agent@>=0.4.1 <0.5.0" }, "tweetnacl": { - "version": "0.14.3", - "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.3.tgz", + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", "from": "tweetnacl@>=0.14.0 <0.15.0" }, "unreachable-branch-transform": { @@ -498,6 +508,16 @@ "resolved": "https://registry.npmjs.org/unreachable-branch-transform/-/unreachable-branch-transform-0.3.0.tgz", "from": "unreachable-branch-transform@>=0.3.0 <0.4.0" }, + "util-extend": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/util-extend/-/util-extend-1.0.3.tgz", + "from": "util-extend@>=1.0.1 <2.0.0" + }, + "uuid": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.0.1.tgz", + "from": "uuid@>=3.0.0 <4.0.0" + }, "verror": { "version": "1.3.6", "resolved": "https://registry.npmjs.org/verror/-/verror-1.3.6.tgz", @@ -506,7 +526,7 @@ "xtend": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", - "from": "xtend@>=4.0.0 <4.1.0-0" + "from": "xtend@>=4.0.0 <5.0.0" } } } diff --git a/packages/rocketchat-lib/package.js b/packages/rocketchat-lib/package.js index e97a859c80b..424d0da5916 100644 --- a/packages/rocketchat-lib/package.js +++ b/packages/rocketchat-lib/package.js @@ -11,7 +11,8 @@ Npm.depends({ 'node-dogstatsd': '0.0.6', 'localforage': '1.4.2', 'lokijs': '1.4.1', - 'bugsnag': '1.8.0' + 'bugsnag': '1.8.0', + 'prom-client': '7.0.1' }); Package.onUse(function(api) { @@ -62,6 +63,7 @@ Package.onUse(function(api) { api.addFiles('lib/MessageTypes.coffee'); api.addFiles('server/lib/bugsnag.js', 'server'); + api.addFiles('server/lib/metrics.js', 'server'); api.addFiles('server/lib/RateLimiter.coffee', 'server'); diff --git a/packages/rocketchat-lib/server/lib/metrics.js b/packages/rocketchat-lib/server/lib/metrics.js new file mode 100644 index 00000000000..2076b87f510 --- /dev/null +++ b/packages/rocketchat-lib/server/lib/metrics.js @@ -0,0 +1,9 @@ +var client = require('prom-client'); + +RocketChat.promclient = client; + +RocketChat.metrics = {}; + +// one sample metrics only - a counter + +RocketChat.metrics.messagesSent = new client.Counter('messages_sent', 'cumulated number of messages sent'); diff --git a/packages/rocketchat-lib/server/methods/sendMessage.coffee b/packages/rocketchat-lib/server/methods/sendMessage.coffee index e8defe8ed2e..2d121dc4ed2 100644 --- a/packages/rocketchat-lib/server/methods/sendMessage.coffee +++ b/packages/rocketchat-lib/server/methods/sendMessage.coffee @@ -49,8 +49,9 @@ Meteor.methods message.alias = user.name if not message.alias? and RocketChat.settings.get 'Message_SetNameToAliasEnabled' if Meteor.settings.public.sandstorm message.sandstormSessionId = this.connection.sandstormSessionId() - + RocketChat.sendMessage user, message, room + RocketChat.metrics.messagesSent.inc() # Limit a user, who does not have the "bot" role, to sending 5 msgs/second DDPRateLimiter.addRule From 1c05d4f32b661b80a32ed682bb6557b814efc8d0 Mon Sep 17 00:00:00 2001 From: "S. Li" Date: Tue, 24 Jan 2017 00:33:41 -0500 Subject: [PATCH 2/6] fix eslint complaints --- packages/rocketchat-api/package.js | 2 -- packages/rocketchat-api/server/default/info.js | 4 ---- packages/rocketchat-api/server/default/metrics.js | 9 ++++++--- packages/rocketchat-lib/server/lib/metrics.js | 2 +- 4 files changed, 7 insertions(+), 10 deletions(-) diff --git a/packages/rocketchat-api/package.js b/packages/rocketchat-api/package.js index 1cd38d72f78..006a3d764e4 100644 --- a/packages/rocketchat-api/package.js +++ b/packages/rocketchat-api/package.js @@ -11,7 +11,6 @@ Package.onUse(function(api) { 'ecmascript', 'rocketchat:lib', 'nimble:restivus' - ]); api.addFiles('server/api.js', 'server'); @@ -24,7 +23,6 @@ Package.onUse(function(api) { 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/info.js b/packages/rocketchat-api/server/default/info.js index cd5efeb6cfa..adf7a094db0 100644 --- a/packages/rocketchat-api/server/default/info.js +++ b/packages/rocketchat-api/server/default/info.js @@ -1,7 +1,3 @@ -var client = require('prom-client'); - -var defaultMetrics = client.defaultMetrics; - RocketChat.API.default.addRoute('info', { authRequired: false }, { get: function() { return RocketChat.Info; diff --git a/packages/rocketchat-api/server/default/metrics.js b/packages/rocketchat-api/server/default/metrics.js index f5b17aa8742..bae94b3f3f0 100644 --- a/packages/rocketchat-api/server/default/metrics.js +++ b/packages/rocketchat-api/server/default/metrics.js @@ -1,5 +1,8 @@ RocketChat.API.default.addRoute('metrics', { authRequired: false }, { - get: function() { - return { headers: { 'Content-Type': 'text/plain' }, body: RocketChat.promclient.register.metrics()}; -} + get: function() { + 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 2076b87f510..0ae0ed29eaf 100644 --- a/packages/rocketchat-lib/server/lib/metrics.js +++ b/packages/rocketchat-lib/server/lib/metrics.js @@ -4,6 +4,6 @@ RocketChat.promclient = client; RocketChat.metrics = {}; -// one sample metrics only - a counter +// one sample metrics only - a counter RocketChat.metrics.messagesSent = new client.Counter('messages_sent', 'cumulated number of messages sent'); From 1fdb25eadda71a90e67fa5c935a256aa2475cb75 Mon Sep 17 00:00:00 2001 From: Maki Nishifuji Date: Tue, 24 Jan 2017 20:23:09 +0900 Subject: [PATCH 3/6] Change curl example for Incoming Integrations --- .../client/views/integrationsIncoming.coffee | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/rocketchat-integrations/client/views/integrationsIncoming.coffee b/packages/rocketchat-integrations/client/views/integrationsIncoming.coffee index 06655c65187..e35e5ebaed9 100644 --- a/packages/rocketchat-integrations/client/views/integrationsIncoming.coffee +++ b/packages/rocketchat-integrations/client/views/integrationsIncoming.coffee @@ -91,7 +91,7 @@ Template.integrationsIncoming.helpers for key, value of data delete data[key] if value in [null, ""] - return "curl -X POST --data-urlencode 'payload=#{JSON.stringify(data)}' #{record.url}" + return "curl -X POST -H 'Content-Type: application/json' --data '#{JSON.stringify(data)}' #{record.url}" editorOptions: -> return {} = From 44b4ea7e1b0df904163612725e2a44ad80a53778 Mon Sep 17 00:00:00 2001 From: Rodrigo Nascimento Date: Tue, 24 Jan 2017 10:55:45 -0200 Subject: [PATCH 4/6] Return correct error when parsing json on api Closes #5742 --- .../rocketchat-integrations/server/api/api.coffee | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/packages/rocketchat-integrations/server/api/api.coffee b/packages/rocketchat-integrations/server/api/api.coffee index ff2a99e96da..06d3068fcdf 100644 --- a/packages/rocketchat-integrations/server/api/api.coffee +++ b/packages/rocketchat-integrations/server/api/api.coffee @@ -54,7 +54,18 @@ Api = new Restivus payloadIsWrapped = @bodyParams?.payload? and payloadKeys.length == 1 if payloadIsWrapped and @request.headers['content-type'] is 'application/x-www-form-urlencoded' - @bodyParams = JSON.parse @bodyParams.payload + try + @bodyParams = JSON.parse @bodyParams.payload + catch e + return { + error: { + statusCode: 400 + body: { + success: false + error: e.message + } + } + } @integration = RocketChat.models.Integrations.findOne _id: @request.params.integrationId From ac4137689e24d02e0592b5916c44d8d93e6ba215 Mon Sep 17 00:00:00 2001 From: Rodrigo Nascimento Date: Tue, 24 Jan 2017 11:03:21 -0200 Subject: [PATCH 5/6] Update package.json --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index f6dc67941df..1a3106592e5 100644 --- a/package.json +++ b/package.json @@ -76,6 +76,6 @@ "file-type": "^4.1.0", "semver": "^5.3.0", "codemirror": "^5.23.0", - "prom-client": "^7.0.1" + "prom-client": "^7.0.1" } } From 737aeb2365100a9e016e3929afe5f5603a0e0a66 Mon Sep 17 00:00:00 2001 From: Karl Prieb Date: Tue, 24 Jan 2017 11:24:54 -0200 Subject: [PATCH 6/6] show loading animation only when room is loading new messages --- packages/rocketchat-theme/client/imports/base.less | 1 + packages/rocketchat-ui/views/app/room.coffee | 3 --- packages/rocketchat-ui/views/app/room.html | 8 ++++++-- 3 files changed, 7 insertions(+), 5 deletions(-) diff --git a/packages/rocketchat-theme/client/imports/base.less b/packages/rocketchat-theme/client/imports/base.less index b1ed815f691..9e7c88f689c 100644 --- a/packages/rocketchat-theme/client/imports/base.less +++ b/packages/rocketchat-theme/client/imports/base.less @@ -4572,6 +4572,7 @@ body:not(.is-cordova) { .load-more { position: relative; padding: 1rem 0; + height: 10px; } .search-messages-list { diff --git a/packages/rocketchat-ui/views/app/room.coffee b/packages/rocketchat-ui/views/app/room.coffee index 8a9f59f4eb1..57f6c4d24da 100644 --- a/packages/rocketchat-ui/views/app/room.coffee +++ b/packages/rocketchat-ui/views/app/room.coffee @@ -314,9 +314,6 @@ Template.room.events RoomHistoryManager.getMoreNext(@_id) , 200 - 'click .load-more > button': -> - RoomHistoryManager.getMore(@_id) - 'click .new-message': (e) -> Template.instance().atBottom = true Template.instance().find('.input-message').focus() diff --git a/packages/rocketchat-ui/views/app/room.html b/packages/rocketchat-ui/views/app/room.html index af611e282cd..5597d136e02 100644 --- a/packages/rocketchat-ui/views/app/room.html +++ b/packages/rocketchat-ui/views/app/room.html @@ -84,7 +84,9 @@ {{#if canPreview}} {{#if hasMore}}
  • - {{> loading}} + {{#if isLoading}} + {{> loading}} + {{/if}}
  • {{else}}
  • @@ -97,7 +99,9 @@ {{/each}} {{#if hasMoreNext}}
  • - {{> loading}} + {{#if isLoading}} + {{> loading}} + {{/if}}
  • {{/if}}