diff --git a/package.json b/package.json index 59bfb9a0cac..1a3106592e5 100644 --- a/package.json +++ b/package.json @@ -75,6 +75,7 @@ "mime-types": "^2.1.14", "file-type": "^4.1.0", "semver": "^5.3.0", - "codemirror": "^5.23.0" + "codemirror": "^5.23.0", + "prom-client": "^7.0.1" } } diff --git a/packages/rocketchat-api/package.js b/packages/rocketchat-api/package.js index 023e3b6a3c7..006a3d764e4 100644 --- a/packages/rocketchat-api/package.js +++ b/packages/rocketchat-api/package.js @@ -22,6 +22,7 @@ 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/metrics.js b/packages/rocketchat-api/server/default/metrics.js new file mode 100644 index 00000000000..bae94b3f3f0 --- /dev/null +++ b/packages/rocketchat-api/server/default/metrics.js @@ -0,0 +1,8 @@ +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-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 {} = diff --git a/packages/rocketchat-integrations/server/api/api.coffee b/packages/rocketchat-integrations/server/api/api.coffee index 4dfa4f3033b..49774f5c270 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 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..0ae0ed29eaf --- /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 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}}