Sentry-javascript: Angular ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ์‚ฌ์šฉํ•  ๋•Œ ๊ฐœ๋ฐœ ํ™˜๊ฒฝ์—์„œ ์„ผํŠธ๋ฆฌ ๋น„ํ™œ์„ฑํ™”

์— ๋งŒ๋“  2015๋…„ 12์›” 17์ผ  ยท  15์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: getsentry/sentry-javascript

ํ˜„์žฌ๋กœ์„œ๋Š” ngRaven ๋ชจ๋“ˆ์ด ๋กœ๋“œ๋˜์ง€ ์•Š์•„ ์„ผํŠธ๋ฆฌ ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ๋น„ํ™œ์„ฑํ™”ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

๊ฐœ๋ฐœ ํ™˜๊ฒฝ์—์„œ DSN์„ ์ œ๊ณตํ•˜์ง€ ์•Š๊ณ  ๋‹ค์Œ์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
Raven.config().install()

๊นŒ๋งˆ๊ท€ ๊ณต๊ธ‰์ž๋ฅผ ๋“ฑ๋กํ•˜๋Š” ์ฝœ๋ฐฑ์ด ํ˜ธ์ถœ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

Raven.addPlugin(function () {
    angular.module('ngRaven', [])
        .provider('Raven',  RavenProvider)
        .config(['$provide', ExceptionHandlerProvider]);
});

install ํ•จ์ˆ˜๋Š” ๋ชจ๋“ˆ์„ ์„ค์น˜ํ•˜๋Š” ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ํ˜ธ์ถœํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์—
globalServer๊ฐ€ null์ด๊ธฐ ๋•Œ๋ฌธ์— isSetup()์ด ์‹คํŒจํ–ˆ์Šต๋‹ˆ๋‹ค.

install: function() {
    if (isSetup() && !isRavenInstalled) {
        TraceKit.report.subscribe(handleStackInfo);

        // Install all of the plugins
        each(plugins, function(_, plugin) {
            plugin();
        });

        isRavenInstalled = true;
    }

    return Raven;
},

๊ฐ€์žฅ ์œ ์šฉํ•œ ๋Œ“๊ธ€

@benvinegar ๋กœ๋ถ€ํ„ฐ ๋น„์Šทํ•œ ์š”์ฒญ์„

Raven.config('your dsn', {
  shouldSendCallback: function () {
    return false;
  }
}).install();

๊ทธ๋Ÿฌ๋ฉด Raven์ด ๋ณด๊ณ ํ•˜์ง€ ๋ชปํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. return ์ƒํƒœ๋ฅผ TRUE๋กœ ์ „ํ™˜ํ•˜๋ฉด ๋ณด๊ณ ๊ฐ€ ์‹œ์ž‘๋ฉ๋‹ˆ๋‹ค. ์ ์–ด๋„ ์ด๊ฒƒ์ด ๋‚ด๊ฐ€ ๋งํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด ๋ช…๋ น๊ณผ ๋ฐฐํฌ sed ๋ช…๋ น์„ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐฐํฌ ์‹œ ๋ถ€์šธ์„ ๋’ค์ง‘์„ ๊ณ„ํš์ž…๋‹ˆ๋‹ค.

๋ชจ๋“  15 ๋Œ“๊ธ€

#414 ๋ฐ #413 ๊ด€๋ จ

@Sija @odedfos โ€“ #414์— ๋Œ€ํ•ด ๋Œ“๊ธ€์„ ๋‹ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ์˜ˆ๋ฅผ ๋“ค์–ด, ๊ทธ PR์ด ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ๊ฒƒ์ž…๋‹ˆ๊นŒ?

@benvinegar ๋Š” ๋‚˜์—๊ฒŒ ํ•ฉ๋ฒ•์ ์ธ ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ด์ง€๋งŒ .config() ๋ฅผ ํ˜ธ์ถœํ•˜์ง€ ์•Š๊ณ ๋„ Raven ๊ณต๊ธ‰์ž๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ธฐ๋ฅผ ์›ํ•˜๋Š” ๊ฒฝ์šฐ๋ฅผ ์ƒ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด Raven.debug ํ”Œ๋ž˜๊ทธ๋ฅผ ์„ค์ •ํ•˜๋Š” ๊ฒƒ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

@benvinegar ๋กœ๋ถ€ํ„ฐ ๋น„์Šทํ•œ ์š”์ฒญ์„

Raven.config('your dsn', {
  shouldSendCallback: function () {
    return false;
  }
}).install();

๊ทธ๋Ÿฌ๋ฉด Raven์ด ๋ณด๊ณ ํ•˜์ง€ ๋ชปํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. return ์ƒํƒœ๋ฅผ TRUE๋กœ ์ „ํ™˜ํ•˜๋ฉด ๋ณด๊ณ ๊ฐ€ ์‹œ์ž‘๋ฉ๋‹ˆ๋‹ค. ์ ์–ด๋„ ์ด๊ฒƒ์ด ๋‚ด๊ฐ€ ๋งํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด ๋ช…๋ น๊ณผ ๋ฐฐํฌ sed ๋ช…๋ น์„ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐฐํฌ ์‹œ ๋ถ€์šธ์„ ๋’ค์ง‘์„ ๊ณ„ํš์ž…๋‹ˆ๋‹ค.

install()์ด ์„ฑ๊ณตํ•˜๋„๋ก ํ•˜๊ณ  ์‹ค์ œ๋กœ ์˜ค๋ฅ˜๋ฅผ ๋ณด๋‚ด๊ธฐ ์œ„ํ•œ http ์š”์ฒญ์„ ํ”ผํ•˜๊ธฐ ์œ„ํ•ด ์œ„์™€ ์œ ์‚ฌํ•œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ–ˆ์Šต๋‹ˆ๋‹ค( window.SERVER_FLAGS ๋Š” ๋ฐฑ์—”๋“œ์—์„œ ํ”„๋ก ํŠธ์—”๋“œ๋กœ ๋‚ด sentryURL์„ ์ „๋‹ฌํ•˜๋Š” ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค).

if (!window.SERVER_FLAGS.sentryURL) {
  // Never bother sending data to sentry
  Raven.setShouldSendCallback(function() { return false });
  // Allow Raven.install() to succeed
  Raven.isSetup = function() {
    return true;
  }
}
Raven
.config(window.SERVER_FLAGS.sentryURL, {
  release: window.SERVER_FLAGS.version,
  debug: true,
})
.addPlugin(Raven.Plugins.Angular)
.install();

์ด๊ฒƒ์€ ๊ฝค ์ž˜ ์ž‘๋™ํ•˜๋Š” ๊ฒƒ์œผ๋กœ ๋ณด์ด๋ฉฐ ์—ฌ์ „ํžˆ Raven์„ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ๋‹จ์ˆœํžˆ ๋ณด๊ณ ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” isSetup ๋ฅผ ํ•ดํ‚นํ•˜๋Š” ๊ฒƒ์„ ์ •๋ง ์‹ซ์–ดํ•˜์ง€๋งŒ ๊ทธ๊ฒƒ์ด ngRaven ๋กœ๋“œํ•˜๊ธฐ ์œ„ํ•ด ์ตœ์†Œํ•œ์˜ ์นจ์ž…์ด๋ผ๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ๋Š” ์œ ์ผํ•œ ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค.

์ด๊ฒƒ์— ๊ฑธ๋ ค ๋„˜์–ด์ง€๋Š” ๋‹ค๋ฅธ ์‚ฌ๋žŒ๋“ค์„ ์œ„ํ•ด

์›นํŒฉ์„ ์‚ฌ์šฉํ•˜์—ฌ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋นŒ๋“œํ•˜๋Š” ๊ฒฝ์šฐ ํ™˜๊ฒฝ ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ์‚ฌ์šฉํ•˜์—ฌ ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ raven์„ ๊ตฌ์„ฑํ•ฉ๋‹ˆ๋‹ค.

https://webpack.js.org/plugins/environment-plugin/

์˜ˆ

if (process.env.NODE_ENV === 'dev') {
  Raven.setShouldSendCallback(() => { return false; });
  Raven.isSetup = () => { return true; };
}

Raven
  .config(process.env.RAVEN_DSN, {
    debug: process.env.RAVEN_DEBUG,
  })
  .addPlugin(require('raven-js/plugins/angular'), angular)
  .install();

isSetup์€ ์ด์ œ ์ฝ๊ธฐ ์ „์šฉ์ด๋ฏ€๋กœ ์œ„์˜ ๋ฐฉ๋ฒ•์€ ๋” ์ด์ƒ ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ด์œ ๋Š” ๋ชจ๋ฅด๊ฒ ์ง€๋งŒ ์ž‘๋™ํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ด๋Š” ๋‹ค์Œ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์„ ์ฐพ์•˜์Šต๋‹ˆ๋‹ค.

let isProduction = process.env.ENV === 'build'; // variable provided by webpack

Raven
.config('https://<key>@sentry.io/<project>', {
  shouldSendCallback: function () {
    return isProduction;
  }
})
.install();

if (!isProduction) {
  Raven.uninstall(); // this is necessary! for some reason
}

export class RavenErrorHandler implements ErrorHandler {
  handleError(err: any): void {
    console.error(err); // this still fires after uninstalling!!! it's because it's already listed as Angular provider 
    Raven.captureException(err)
  }
}

๋‚ด ๋ชจ๋“  ์˜ค๋ฅ˜๋ฅผ ๊ฐ€๋กœ์ฑ„๊ธฐ ๋•Œ๋ฌธ์— ์–ด๋–ค ์ค„์—์„œ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ–ˆ๋Š”์ง€ ์•Œ ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์— ์—ฌ์ „ํžˆ ๋”์ฐํ•œ ์†”๋ฃจ์…˜์ž…๋‹ˆ๋‹ค. ์ ์–ด๋„ ๋‚˜๋Š” ๊ทธ๋“ค์„ ์ „ํ˜€ ๋ณด์ง€ ์•Š๋Š” ๊ฒƒ๋งŒํผ ๋”์ฐํ•˜์ง€ ์•Š๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

์ €๋Š” ์ด ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์€ ๋‚˜๋ฅผ ์œ„ํ•ด ์ผํ•˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค

`if (ํ™˜๊ฒฝ.์ƒ์‚ฐ) {
Raven.config('https://@sentry.io/')
.์„ค์น˜();
}

๊ทธ๋ฆฌ๊ณ  ๊ณต๊ธ‰์ž์—์„œ
์ œ๊ณต์ž: [environment.production ? { ์ œ๊ณต: ErrorHandler, useClass: RavenErrorHandler } : [], ...`

๋‚ด๊ฐ€ ์—ฌ๊ธฐ์„œ ์ž˜๋ชปํ•˜๊ณ  ์žˆ๋Š” ๊ฒƒ์ด ์žˆ์œผ๋ฉด ์•Œ๋ ค์ฃผ์„ธ์š”.

๋‚ด๊ฐ€ ๋ณด๊ธฐ์—” ๊ดœ์ฐฎ์•„. ๋ถ„๋ช…ํžˆ ์›๋ž˜ ๋ฌธ์ œ๋Š” ์—ฌ๊ธฐ์—์„œ ์ด๋ฏธ ๋‹ต๋ณ€๋˜์—ˆ์œผ๋ฏ€๋กœ ์ด ๋ฌธ์ œ๋ฅผ ๋‹ซ์Šต๋‹ˆ๋‹ค. ์–ด๋–ค ์‹์œผ๋กœ๋“  ์—ฌ์ „ํžˆ ๊ด€๋ จ์ด ์žˆ๋Š” ๊ฒฝ์šฐ ์ž์œ ๋กญ๊ฒŒ ๋‹ค์‹œ ์—ฝ๋‹ˆ๋‹ค.

'app.module.ts'์—์„œ ๋” ์‰ฝ๊ฒŒ

import {environment} from '../environments/environment';
...
    providers: [
    LocalStorageService,
    EventLocalStorageService,
    EventService,
    ActionButtonService,
    WeatherUndergroundWeatherService,
    GeoLocationInfoService,
    AppEventColorService,
    // {provide: ErrorHandler, useClass: RavenErrorHandler}
    {provide: ErrorHandler, useClass: environment.production ? RavenErrorHandler : ErrorHandler} // See here
  ],

๊ทธ๋ฆฌ๊ณ 

  .config('key', {
    shouldSendCallback: function () {
      return environment.production;
    }
  })
  .install();

์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ์ฝ˜์†”์— localdev ๋ฉ”์‹œ์ง€๊ฐ€ ์žˆ๊ณ (๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด Sentry๊ฐ€ ์ผ๋ถ€๋ฅผ ๊ฐ€์ ธ์˜ด) ํ”„๋กœ๋•์…˜์—์„œ ์›ํ•˜๋Š” ๋ฉ”์‹œ์ง€๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ ์–ด๋„ Chrome์—์„œ(๋‹ค๋ฅธ ๋ธŒ๋ผ์šฐ์ €๋Š” ํ™•์‹คํ•˜์ง€ ์•Š์Œ) Raven์ด ๊ฐœ๋ฐœ ์ฝ˜์†”์„ "ํ•˜์ด์žฌํ‚น"ํ•˜๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ํ•˜๋Š” ๋˜ ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์€ raven.js ๋ธ”๋ž™๋ฐ•์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

https://gist.github.com/paulirish/c307a5a585ddbcc17242
https://developer.chrome.com/devtools/docs/blackboxing

2018-05-11_12-45-12

๊ทธ๋ฆฌ๊ณ  Sentry๋Š” ์–ด๋–ป์Šต๋‹ˆ๊นŒ? ๋‚˜๋Š” Raven์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  Sentry๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๊ณ  ๋‚ด ๋กœ์ปฌ ํ˜ธ์ŠคํŠธ์˜ ๊ฐœ๋ฐœ ํ™˜๊ฒฝ์—์„œ ๊ทธ๊ฒƒ์„ ๋น„ํ™œ์„ฑํ™”ํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

https://dev.to/angular/tracking-errors-in-angular-with-sentry-4oo0 โ€” ์—ฌ๊ธฐ ์žˆ์Šต๋‹ˆ๋‹ค

@artuska ๋นˆ DSN์„ ์ œ๊ณตํ•˜๊ฑฐ๋‚˜ beforeSend ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ „์†ก์„ ์ค‘์ง€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Sentry.init({
  dsn: process.env.development ? '' : 'your-real-dsn'
})

๋˜๋Š”

Sentry.init({
  dsn: 'your-real-dsn',
  beforeSend(event) {
    if (process.env.development) return null;
    return event;
  }
})

๋‚˜๋Š” ๊ทธ๊ฒƒ์ด ์‹ค์ œ๋กœ Sentry๋ฅผ ๋น„ํ™œ์„ฑํ™”ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ๋ƒฅ ๋ณด๋‚ด๋ฉด ๋ฉˆ์ถฅ๋‹ˆ๋‹ค.
๋ฐ์ดํ„ฐ. ์—ฌ์ „ํžˆ ๋นต ๋ถ€์Šค๋Ÿฌ๊ธฐ๋Š” ์งœ์ฆ๋‚˜๋Š” ๋Œ€๋ถ€๋ถ„์˜ ๋ฌธ์ œ๋ฅผ ํฌ์žฅํ•ฉ๋‹ˆ๋‹ค.

2019๋…„ 12์›” 9์ผ ์›”์š”์ผ ์˜ค์ „ 10:15 Kamil Ogรณrek [email protected]
์ผ๋‹ค:

@artuska https://github.com/artuska ๋นˆ DSN์„ ์ œ๊ณตํ•˜๊ฑฐ๋‚˜
์ „์†ก์„ ์ค‘์ง€ํ•˜๋ ค๋ฉด beforeSend๋ฅผ ์‚ฌ์šฉํ•˜์‹ญ์‹œ์˜ค.

Sentry.init({
dsn: process.env.development? '' : '์ง„์งœ dsn'
})

๋˜๋Š”

Sentry.init({
dsn: '์‹ค์ œ dsn',
beforeSend(์ด๋ฒคํŠธ) {
(process.env.development)๊ฐ€ null์„ ๋ฐ˜ํ™˜ํ•˜๋ฉด;
๋ฐ˜ํ™˜ ์ด๋ฒคํŠธ;
}
})

โ€”
๋‹น์‹ ์ด ๋Œ“๊ธ€์„ ๋‹ฌ์•˜๊ธฐ ๋•Œ๋ฌธ์— ์ด๊ฒƒ์„ ๋ฐ›๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.
์ด ์ด๋ฉ”์ผ์— ์ง์ ‘ ๋‹ต์žฅํ•˜๊ณ  GitHub์—์„œ ํ™•์ธ
https://github.com/getsentry/sentry-javascript/issues/436?email_source=notifications&email_token=AAJVX45ZEIJWZSXZSBQ5ZQLQXYECDA5CNFSM4BW42VRKYY3PNVWWK3TUL52HS4DFVREXG43VMXVB
๋˜๋Š” ๊ตฌ๋… ์ทจ์†Œ
https://github.com/notifications/unsubscribe-auth/AAJVX4YBWA3R6SM63NV5JPDQXYECDANCNFSM4BW42VRA
.

@jimmykane ๋งž์Šต๋‹ˆ๋‹ค. Sentry๋ฅผ ๋น„ํ™œ์„ฑํ™”ํ•˜๋ ค๋ฉด init ์กฐ๊ฑด๋ถ€๋กœ ํ˜ธ์ถœํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰