All files / app/assets/javascripts/sentry sentry_config.js

100% Statements 19/19
83.33% Branches 5/6
100% Functions 5/5
100% Lines 18/18

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106        2x                                             2x                                 2x   2x         7x   7x 7x 7x       11x   11x                   11x       6x           7x       5x 5x 5x 5x   5x                              
import * as Sentry from '@sentry/browser';
import $ from 'jquery';
import { __ } from '~/locale';
 
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)
  'bmi_SafeAddOnload',
  'EBCallBackMessageReceived',
  // See http://toolbar.conduit.com/Developer/HtmlAndGadget/Methods/JSInjection.aspx
  'conduitPage',
];
 
const BLACKLIST_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 = 0.95;
 
const SentryConfig = {
  IGNORE_ERRORS,
  BLACKLIST_URLS,
  SAMPLE_RATE,
  init(options = {}) {
    this.options = options;
 
    this.configure();
    this.bindSentryErrors();
    if (this.options.currentUserId) this.setUser();
  },
 
  configure() {
    const { dsn, release, tags, whitelistUrls, environment } = this.options;
 
    Sentry.init({
      dsn,
      release,
      whitelistUrls,
      environment,
      ignoreErrors: this.IGNORE_ERRORS, // TODO: Remove in favor of https://gitlab.com/gitlab-org/gitlab/issues/35144
      blacklistUrls: this.BLACKLIST_URLS,
      sampleRate: SAMPLE_RATE,
    });
 
    Sentry.setTags(tags);
  },
 
  setUser() {
    Sentry.setUser({
      id: this.options.currentUserId,
    });
  },
 
  bindSentryErrors() {
    $(document).on('ajaxError.sentry', this.handleSentryErrors);
  },
 
  handleSentryErrors(event, req, config, err) {
    const error = err || req.statusText;
    const { responseText = __('Unknown response text') } = req;
    const { type, url, data } = config;
    const { status } = req;
 
    Sentry.captureMessage(error, {
      extra: {
        type,
        url,
        data,
        status,
        response: responseText,
        error,
        event,
      },
    });
  },
};
 
export default SentryConfig;