BigW Consortium Gitlab

Added sampling function and blacklisted common urls and error messages

parent 86b4f49c
import Raven from 'raven-js'; import Raven from 'raven-js';
const IGNORE_ERRORS = [
// Random plugins/extensions
'top.GLOBALS',
// See: http://blog.errorception.com/2012/03/tale-of-unfindable-js-error. html
'originalCreateNotification',
'canvas.contentDocument',
'MyApp_RemoveAllHighlights',
'http://tt.epicplay.com',
'Can\'t find variable: ZiteReader',
'jigsaw is not defined',
'ComboSearch is not defined',
'http://loading.retry.widdit.com/',
'atomicFindClose',
// Facebook borked
'fb_xd_fragment',
// ISP "optimizing" proxy - `Cache-Control: no-transform` seems to
// reduce this. (thanks @acdha)
// See http://stackoverflow.com/questions/4113268
'bmi_SafeAddOnload',
'EBCallBackMessageReceived',
// See http://toolbar.conduit.com/Developer/HtmlAndGadget/Methods/JSInjection.aspx
'conduitPage',
];
const IGNORE_URLS = [
// Facebook flakiness
/graph\.facebook\.com/i,
// Facebook blocked
/connect\.facebook\.net\/en_US\/all\.js/i,
// Woopra flakiness
/eatdifferent\.com\.woopra-ns\.com/i,
/static\.woopra\.com\/js\/woopra\.js/i,
// Chrome extensions
/extensions\//i,
/^chrome:\/\//i,
// Other plugins
/127\.0\.0\.1:4001\/isrunning/i, // Cacaoweb
/webappstoolbarba\.texthelp\.com\//i,
/metrics\.itunes\.apple\.com\.edgesuite\.net\//i,
];
const SAMPLE_RATE = 95;
const RavenConfig = { const RavenConfig = {
IGNORE_ERRORS,
IGNORE_URLS,
SAMPLE_RATE,
init(options = {}) { init(options = {}) {
this.options = options; this.options = options;
...@@ -13,6 +59,9 @@ const RavenConfig = { ...@@ -13,6 +59,9 @@ const RavenConfig = {
Raven.config(this.options.sentryDsn, { Raven.config(this.options.sentryDsn, {
whitelistUrls: this.options.whitelistUrls, whitelistUrls: this.options.whitelistUrls,
environment: this.options.isProduction ? 'production' : 'development', environment: this.options.isProduction ? 'production' : 'development',
ignoreErrors: this.IGNORE_ERRORS,
ignoreUrls: this.IGNORE_URLS,
shouldSendCallback: this.shouldSendSample,
}).install(); }).install();
}, },
...@@ -42,6 +91,10 @@ const RavenConfig = { ...@@ -42,6 +91,10 @@ const RavenConfig = {
}, },
}); });
}, },
shouldSendSample() {
return Math.random() * 100 <= this.SAMPLE_RATE;
},
}; };
export default RavenConfig; export default RavenConfig;
...@@ -2,6 +2,28 @@ import Raven from 'raven-js'; ...@@ -2,6 +2,28 @@ import Raven from 'raven-js';
import RavenConfig from '~/raven/raven_config'; import RavenConfig from '~/raven/raven_config';
describe('RavenConfig', () => { describe('RavenConfig', () => {
describe('IGNORE_ERRORS', () => {
it('should be an array of strings', () => {
const areStrings = RavenConfig.IGNORE_ERRORS.every(error => typeof error === 'string');
expect(areStrings).toBe(true);
});
});
describe('IGNORE_URLS', () => {
it('should be an array of regexps', () => {
const areRegExps = RavenConfig.IGNORE_URLS.every(url => url instanceof RegExp);
expect(areRegExps).toBe(true);
});
});
describe('SAMPLE_RATE', () => {
it('should be a finite number', () => {
expect(typeof RavenConfig.SAMPLE_RATE).toEqual('number');
});
});
describe('init', () => { describe('init', () => {
let options; let options;
...@@ -76,6 +98,9 @@ describe('RavenConfig', () => { ...@@ -76,6 +98,9 @@ describe('RavenConfig', () => {
expect(Raven.config).toHaveBeenCalledWith(options.sentryDsn, { expect(Raven.config).toHaveBeenCalledWith(options.sentryDsn, {
whitelistUrls: options.whitelistUrls, whitelistUrls: options.whitelistUrls,
environment: 'production', environment: 'production',
ignoreErrors: Raven.IGNORE_ERRORS,
ignoreUrls: Raven.IGNORE_URLS,
shouldSendCallback: Raven.shouldSendSample,
}); });
}); });
...@@ -93,6 +118,9 @@ describe('RavenConfig', () => { ...@@ -93,6 +118,9 @@ describe('RavenConfig', () => {
expect(Raven.config).toHaveBeenCalledWith(options.sentryDsn, { expect(Raven.config).toHaveBeenCalledWith(options.sentryDsn, {
whitelistUrls: options.whitelistUrls, whitelistUrls: options.whitelistUrls,
environment: 'development', environment: 'development',
ignoreErrors: Raven.IGNORE_ERRORS,
ignoreUrls: Raven.IGNORE_URLS,
shouldSendCallback: Raven.shouldSendSample,
}); });
}); });
}); });
...@@ -213,4 +241,38 @@ describe('RavenConfig', () => { ...@@ -213,4 +241,38 @@ describe('RavenConfig', () => {
}); });
}); });
}); });
describe('shouldSendSample', () => {
let randomNumber;
beforeEach(() => {
RavenConfig.SAMPLE_RATE = 50;
spyOn(Math, 'random').and.callFake(() => randomNumber);
});
it('should call Math.random', () => {
RavenConfig.shouldSendSample();
expect(Math.random).toHaveBeenCalled();
});
it('should return true if the sample rate is greater than the random number * 100', () => {
randomNumber = 0.1;
expect(RavenConfig.shouldSendSample()).toBe(true);
});
it('should return false if the sample rate is less than the random number * 100', () => {
randomNumber = 0.9;
expect(RavenConfig.shouldSendSample()).toBe(false);
});
it('should return true if the sample rate is equal to the random number * 100', () => {
randomNumber = 0.5;
expect(RavenConfig.shouldSendSample()).toBe(true);
});
});
}); });
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment