ํ์ฌ๋ก์๋ 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;
},
#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://
.์ค์น();
}
๊ทธ๋ฆฌ๊ณ ๊ณต๊ธ์์์
์ ๊ณต์: [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
๊ทธ๋ฆฌ๊ณ 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
์กฐ๊ฑด๋ถ๋ก ํธ์ถํ๋ฉด ๋ฉ๋๋ค.
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
@benvinegar ๋ก๋ถํฐ ๋น์ทํ ์์ฒญ์
๊ทธ๋ฌ๋ฉด Raven์ด ๋ณด๊ณ ํ์ง ๋ชปํ๊ฒ ๋ฉ๋๋ค.
return
์ํ๋ฅผ TRUE๋ก ์ ํํ๋ฉด ๋ณด๊ณ ๊ฐ ์์๋ฉ๋๋ค. ์ ์ด๋ ์ด๊ฒ์ด ๋ด๊ฐ ๋งํ ๊ฒ์ ๋๋ค. ์ด ๋ช ๋ น๊ณผ ๋ฐฐํฌsed
๋ช ๋ น์ ํจ๊ป ์ฌ์ฉํ์ฌ ๋ฐฐํฌ ์ ๋ถ์ธ์ ๋ค์ง์ ๊ณํ์ ๋๋ค.