From bd2fb7f5db5da3e607c419004dea3e47e211d823 Mon Sep 17 00:00:00 2001 From: Andrew Ledvina Date: Tue, 27 Jun 2017 18:27:24 -0700 Subject: [PATCH] fix the rate limiter payload --- src/browser/rollbar.js | 2 +- src/rateLimiter.js | 47 ++++++++++++++++++++++++++++++---------- src/rollbar.js | 3 ++- src/server/rollbar.js | 2 +- test/rateLimiter.test.js | 2 +- 5 files changed, 41 insertions(+), 15 deletions(-) diff --git a/src/browser/rollbar.js b/src/browser/rollbar.js index 3accdd7ed..972f2762c 100644 --- a/src/browser/rollbar.js +++ b/src/browser/rollbar.js @@ -14,7 +14,7 @@ var errorParser = require('./errorParser'); function Rollbar(options, client) { this.options = _.extend(true, defaultOptions, options); var api = new API(this.options, transport, urllib); - this.client = client || new Client(this.options, api, logger); + this.client = client || new Client(this.options, api, logger, 'browser'); addTransformsToNotifier(this.client.notifier); addPredicatesToQueue(this.client.queue); if (this.options.captureUncaught) { diff --git a/src/rateLimiter.js b/src/rateLimiter.js index 0a9e00d93..9970cdd97 100644 --- a/src/rateLimiter.js +++ b/src/rateLimiter.js @@ -7,6 +7,8 @@ function RateLimiter(options) { this.startTime = (new Date()).getTime(); this.counter = 0; this.perMinCounter = 0; + this.platform = null; + this.platformOptions = {}; this.configureGlobal(options); } @@ -62,15 +64,20 @@ RateLimiter.prototype.shouldSend = function(item, now) { var globalRateLimitPerMin = RateLimiter.globalSettings.itemsPerMinute; if (checkRate(item, globalRateLimit, this.counter)) { - return shouldSendValue(globalRateLimit + ' max items reached', false); + return shouldSendValue(this.platform, this.platformOptions, globalRateLimit + ' max items reached', false); } else if (checkRate(item, globalRateLimitPerMin, this.perMinCounter)) { - return shouldSendValue(globalRateLimitPerMin + ' items per minute reached', false); + return shouldSendValue(this.platform, this.platformOptions, globalRateLimitPerMin + ' items per minute reached', false); } this.counter++; this.perMinCounter++; var shouldSend = !checkRate(item, globalRateLimit, this.counter); - return shouldSendValue(null, shouldSend, globalRateLimit); + return shouldSendValue(this.platform, this.platformOptions, null, shouldSend, globalRateLimit); +}; + +RateLimiter.prototype.setPlatformOptions = function(platform, options) { + this.platform = platform; + this.platformOptions = options; }; /* Helpers */ @@ -79,25 +86,43 @@ function checkRate(item, limit, counter) { return !item.ignoreRateLimit && limit >= 1 && counter >= limit; } -function shouldSendValue(error, shouldSend, globalRateLimit) { +function shouldSendValue(platform, options, error, shouldSend, globalRateLimit) { var payload = null; if (error) { error = new Error(error); } if (!error && !shouldSend) { - payload = rateLimitPayload(globalRateLimit); + payload = rateLimitPayload(platform, options, globalRateLimit); } return {error: error, shouldSend: shouldSend, payload: payload}; } -function rateLimitPayload(globalRateLimit) { - return { - message: 'maxItems has been hit. Ignoring errors until reset.', - err: null, - custom: { - maxItems: globalRateLimit +function rateLimitPayload(platform, options, globalRateLimit) { + var environment = options.environment || (options.payload && options.payload.environment); + var item = { + body: { + message: { + body: 'maxItems has been hit. Ignoring errors until reset.', + extra: { + maxItems: globalRateLimit + } + } + }, + language: 'javascript', + environment: environment, + notifier: { + version: (options.notifier && options.notifier.version) || options.version } }; + if (platform === 'browser') { + item.platform = 'browser'; + item.framework = 'browser-js'; + item.notifier.name = 'rollbar-browser-js'; + } else if (platform === 'server') { + item.framework = options.framework || 'node-js'; + item.notifier.name = options.notifier.name; + } + return item; } module.exports = RateLimiter; diff --git a/src/rollbar.js b/src/rollbar.js index 6d487cc40..0b2ce88a3 100644 --- a/src/rollbar.js +++ b/src/rollbar.js @@ -10,9 +10,10 @@ var _ = require('./utility'); * @param api * @param logger */ -function Rollbar(options, api, logger) { +function Rollbar(options, api, logger, platform) { this.options = _.extend(true, {}, options); this.logger = logger; + Rollbar.rateLimiter.setPlatformOptions(platform, options); this.queue = new Queue(Rollbar.rateLimiter, api, logger, this.options); this.notifier = new Notifier(this.queue, this.options); } diff --git a/src/server/rollbar.js b/src/server/rollbar.js index 77be3bc87..06cbf8184 100644 --- a/src/server/rollbar.js +++ b/src/server/rollbar.js @@ -27,7 +27,7 @@ function Rollbar(options, client) { this.options = _.extend(true, {}, Rollbar.defaultOptions, options); this.options.environment = this.options.environment || 'unspecified'; var api = new API(this.options, transport, urllib, jsonBackup); - this.client = client || new Client(this.options, api, logger); + this.client = client || new Client(this.options, api, logger, 'server'); addTransformsToNotifier(this.client.notifier); addPredicatesToQueue(this.client.queue); diff --git a/test/rateLimiter.test.js b/test/rateLimiter.test.js index e60ae0bcf..f92c6976a 100644 --- a/test/rateLimiter.test.js +++ b/test/rateLimiter.test.js @@ -115,7 +115,7 @@ describe('shouldSend', function() { expect(result4.shouldSend).to.not.be.ok(); expect(result4.error).to.not.be.ok(); expect(result4.payload).to.be.ok(); - expect(result4.payload.custom.maxItems).to.eql(options.maxItems); + expect(result4.payload.body.message.extra.maxItems).to.eql(options.maxItems); done(); });