Sentry-javascript: ๋น„๋™๊ธฐ ๋กœ๋“œ ๋ฐ ์˜ค๋ฅ˜ ์บก์ฒ˜

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

raven.js๋ฅผ ๋น„๋™๊ธฐ์‹์œผ๋กœ ๋กœ๋“œํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ์Šคํฌ๋ฆฝํŠธ๊ฐ€ ๋กœ๋“œ๋˜๋Š” ๋™์•ˆ ์˜ค๋ฅ˜๋ฅผ ์บก์ฒ˜ํ•  ์ˆ˜ ์žˆ๊ธฐ๋ฅผ ์›ํ•ฉ๋‹ˆ๋‹ค. (Google Analytics๊ฐ€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ๋กœ๋“œ๋  ๋•Œ๊นŒ์ง€ ์ด๋ฒคํŠธ๋ฅผ ๋ณ€์ˆ˜์— ์ €์žฅํ•˜์—ฌ ์ด๋ฒคํŠธ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ์‹๊ณผ ์œ ์‚ฌ).

์—ฌ๊ธฐ ๋‚ด๊ฐ€ ์ง€๊ธˆ๊นŒ์ง€ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ๊ฒƒ์ด ์žˆ์Šต๋‹ˆ๋‹ค: https://gist.github.com/karolisdzeja/8010574

๊ทธ๋Ÿฌ๋‚˜ ๊ทธ๋ ‡๊ฒŒ ํ•˜๋ฉด Raven์ด ์ผ๋ฐ˜์ ์œผ๋กœ ์ œ๊ณตํ•˜๋Š” ์ผ๋ถ€ ์ •๋ณด์™€ ์„ธ๋ถ€ ์ •๋ณด๊ฐ€ ์†์‹ค๋ฉ๋‹ˆ๋‹ค. ์ด์™€ ์œ ์‚ฌํ•˜๊ฒŒ ์ „์ฒด ์˜ค๋ฅ˜ ์ •๋ณด๋ฅผ ์ €์žฅํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๊นŒ?

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

๋‹ค์Œ์€ Raven ๋ฉ”์„œ๋“œ์— ๋Œ€ํ•œ ํ˜ธ์ถœ์„ ํˆฌ๋ช…ํ•˜๊ฒŒ ๋Œ€๊ธฐ์—ด์— ๋„ฃ๋Š” ๋ฐ ์‚ฌ์šฉํ•˜๋Š” ์Šค๋‹ˆํŽซ์ž…๋‹ˆ๋‹ค. https://gist.github.com/Kl0tl/ed0a9e74462a2294f4c8842f5389d8ea.

๋ชจ์˜๋Š” ํ™•์‹คํžˆ ๊ฐœ์„ ๋  ์ˆ˜ ์žˆ์ง€๋งŒ ๋” ๋งŽ์€ ๊ธฐ๋Šฅ์„ ๋ณต์ œํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. Object.defineProperty ๋Š” Raven ๊ฐ€ ์ฐฝ์— ์—ฐ๊ฒฐ๋œ ์งํ›„ ํ›„ํฌ๋ฅผ ํ—ˆ์šฉํ•˜์ง€๋งŒ ์Šคํฌ๋ฆฝํŠธ ๋กœ๋“œ ์ด๋ฒคํŠธ๋กœ ์ถฉ๋ถ„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์„ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•˜๋Š” ๊ณต์‹์ ์ธ ๋ฐฉ๋ฒ•์ด ์žˆ์œผ๋ฉด ์ข‹์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

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

+1

+1

+1

+1

์ด์— ๋Œ€ํ•ด ์–ธ๊ธ‰ํ•œ ๋ชจ๋“  ์‚ฌ๋žŒ - @karolisdzeja์˜ ์†”๋ฃจ์…˜์— ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ?

๊ถ๊ทน์ ์œผ๋กœ Raven.js ์†Œ์Šค๊ฐ€ ํŽ˜์ด์ง€์— ์—†์„ ๋•Œ ์ž‘๋™ํ•ด์•ผ ํ•˜๋Š” ๊ธฐ๋Šฅ์„ Raven.js ์†Œ์Šค์— ์–ด๋–ป๊ฒŒ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ์ž˜ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ์ด๊ฒƒ์ด ํ•ญ์ƒ ๊ถ๊ทน์ ์œผ๋กœ ๋งž์ถคํ˜• ์†”๋ฃจ์…˜์ด ๋  ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ๊ปํ•ด์•ผ ๋ฌธ์„œ์— "๋ฐฉ๋ฒ•"์„ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@benvinegar ์†”๋ฃจ์…˜์€ ๊ดœ์ฐฎ์•„ ๋ณด์ด์ง€๋งŒ ์ด๊ฒƒ์ด ๊ณต์‹์ ์œผ๋กœ ์ง€์›๋˜๊ณ  ๋ฌธ์„œํ™”๋œ๋‹ค๋ฉด ๋” ์ข‹์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋ฌด์ž‘์œ„ ์š”์ ์„ ํ‰๊ฐ€ํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค Sentry ํŒ€์„ ์‹ ๋ขฐํ•˜๋Š” ๊ฒƒ๋งŒ์œผ๋กœ๋„ ๋งŒ์กฑํ•ฉ๋‹ˆ๋‹ค.

์‹ค์ œ๋กœ ํ›จ์”ฌ ๋” ๋‚˜์€ ์†”๋ฃจ์…˜์€ Twitter์˜ JS SDK ์ฝ”๋“œ์™€ ๊ฐ™์€ ๊ฒƒ์ž…๋‹ˆ๋‹ค. https://dev.twitter.com/web/javascript/loading

ํŽ˜์ด์ง€ ๋กœ๋“œ ์‹œ ํ•จ์ˆ˜ ๋Œ€๊ธฐ์—ด์„ ์„ค์ •ํ•œ ๋‹ค์Œ ์™ธ๋ถ€ js๊ฐ€ ๋กœ๋“œ๋  ๋•Œ ์‚ฌ์šฉ๋˜์–ด ํ”„๋ก์‹œ ๊ฐœ์ฒด๋ฅผ ๊ต์ฒดํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋ชจ๋“  API ํ˜ธ์ถœ์ด ํ”„๋ก์‹œ์— ๋Œ€ํ•œ .ready() ํ˜ธ์ถœ๊ณผ ๊ฐ™์€ ๊ฒƒ์„ ํ†ต๊ณผํ•˜๋Š”์ง€ ํ™•์ธํ•˜์‹ญ์‹œ์˜ค.

์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ๋ชจ๋“  ํ•จ์ˆ˜๋ฅผ ๊ฐœ๋ณ„์ ์œผ๋กœ ํ”„๋ก์‹œํ•  ํ•„์š” ์—†์ด captureMessage๊ฐ€ ์•„๋‹ˆ๋ผ js๊ฐ€ ๋กœ๋“œ๋˜๊ธฐ ์ „์— ๋ชจ๋“  ํ˜ธ์ถœ์„ ๋Œ€๊ธฐ์—ด์— ๋„ฃ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

raven.js๋ฅผ ๋น„๋™๊ธฐ/์ง€์—ฐ์œผ๋กœ ๋กœ๋“œํ•  ์ˆ˜ ์žˆ๊ธฐ๋ฅผ ์›ํ•˜๋ฉฐ ๊ฑฑ์ •ํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

์š”์ ์˜ ๋‹ค๋ฅธ ๋ฌธ์ œ: window.onerror๋ฅผ ๋ฐฉํ•ดํ•˜๊ณ  ํฌํ•จ๋˜์ง€ ์•Š์€ ๋ช‡ ๊ฐ€์ง€ ์ „์—ญ ๋ณ€์ˆ˜๋ฅผ ๋„์ž…ํ•ฉ๋‹ˆ๋‹ค.

๋˜ํ•œ raven.js๊ฐ€ ๋กœ๋“œ๋  ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ๋ชจ๋“  ๊ธฐ๋Šฅ์„ ๊ฐ–์ถ˜ traceKitWindowOnError ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์œ„์˜ ์š”์ ์„ ์•ฝ๊ฐ„ ๋‹ค์‹œ ์ˆ˜์ •ํ–ˆ์Šต๋‹ˆ๋‹ค. https://gist.github.com/oroce/ec3786ba7eff59963842220c3ffc56b4

๋ˆ„์ˆ˜ ๋ณ€์ˆ˜๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. window.onerror ํ•ธ๋“ค๋Ÿฌ๋ฅผ ์œ ์ง€ํ–ˆ์ง€๋งŒ ์ž์œ ๋กญ๊ฒŒ window.addEventListener('error', fn) .

ํ˜„์žฌ ๊ฐ€์žฅ ํฐ ๋„์›€์€ traceKitWindowOnError ๋ฅผ Raven์—์„œ ๋‚ด๋ณด๋‚ธ ํ•จ์ˆ˜๋กœ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•  ๋•Œ ํ˜ธ์ถœ๋˜๋Š” ํ•จ์ˆ˜์ด๊ธฐ ๋•Œ๋ฌธ์—: https://github.com/getsentry/raven-js/blob/master/dist/raven.js#L2074

๋‚˜๋Š” ์šฐ๋ฆฌ์—๊ฒŒ ์ ์ ˆํ•œ ์Šคํƒ ์ถ”์ ์ด ์—†์„ ๊ฒƒ์ด๋ผ๋Š” ๊ฒƒ์„ ์•Œ๊ณ  ์žˆ์ง€๋งŒ ์šฐ๋ฆฌ๋Š” ์ง€๊ธˆ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ๊ฒƒ๋ณด๋‹ค ๋” ๋‚˜์€ ๊ฒƒ์„ ๊ฐ–๊ฒŒ ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ๋‹ค๋ฅธ ๋‹จ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

  • Raven์ด ๋กœ๋“œ๋˜๊ธฐ ์ „์— ์˜ค๋ฅ˜๋ฅผ ํฌ์ฐฉํ•˜๊ธฐ ์œ„ํ•ด window.onerror ์— ์˜์กดํ•จ์œผ๋กœ์จ ๋ชจ๋“  ๋ธŒ๋ผ์šฐ์ €์—์„œ ์Šคํƒ ์ถ”์ ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

    • ์Šคํƒ ์ถ”์ ์ด ์—†๋Š” ๊ฒƒ ์™ธ์—๋„ ๊ทธ๋ฃนํ™”์— ๋ถ€์ •์ ์ธ ์˜ํ–ฅ์„ ๋ฏธ์นฉ๋‹ˆ๋‹ค.

    • ์ด๊ฒƒ์ด install() ๊ฐ€ ๊ณ„์ธก์„ ์‹œ๋„/์บ์น˜ํ•˜๋Š” ์ด์œ ์ž…๋‹ˆ๋‹ค.

  • ํ•ฉ์„ฑ ์ถ”์ ์€ ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค(๋ชจ๋‘ ์ด ์ฝ”๋“œ์—์„œ ์‹œ์ž‘๋œ ๊ฒƒ์œผ๋กœ ๋‚˜ํƒ€๋‚จ).
  • ํƒ์ƒ‰๊ฒฝ๋กœ ์ˆ˜์ง‘ ์—†์Œ

๋”ฐ๋ผ์„œ ์ž ์žฌ์ ์œผ๋กœ ๋” ๋‚˜์€ ์„ฑ๋Šฅ์„ ๋‚ฎ์€ ํ’ˆ์งˆ์˜ ์˜ค๋ฅ˜ ๋ณด๊ณ ์„œ์™€ ๊ตํ™˜ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๋น„๋™๊ธฐ ์‹คํ–‰์ด ์ค‘์š”ํ•œ ๊ฒฝ์šฐ Raven์„ ๊ณ ์œ ํ•œ ์ฝ”๋“œ์™€ ํ•จ๊ป˜ ๋ฒˆ๋“ค๋กœ ์ œ๊ณตํ•˜์—ฌ ํ•จ๊ป˜ ์ œ๊ณตํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

@benvinegar ๋‹น์‹ ์ด ์™„์ „ํžˆ ์˜ณ์•˜์Šต๋‹ˆ๋‹ค. ๊ณต๊ฐœ๋˜์ง€ ์•Š์€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜(์ผ๋ช… Google์€ ํŽ˜์ด์ง€์— ๋„๋‹ฌํ•˜์ง€ ์•Š์Œ)์—์„œ๋Š” ๊ณ ์ „์ ์ธ(์ฐจ๋‹จ) ๊นŒ๋งˆ๊ท€ ๋ฐฉ์‹์€ ์™„์ „ํžˆ ๋ฌธ์ œ๊ฐ€ ์—†์ง€๋งŒ Google ํŽ˜์ด์ง€ ์ธ์‚ฌ์ดํŠธ ํฌ์ธํŠธ๊ฐ€ ์ค‘์š”ํ•œ ๊ณต๊ฐœ ์‚ฌ์ดํŠธ๊ฐ€ ์žˆ๋Š” ์ฆ‰์‹œ ์ตœ์ ํ™”ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ œ3์ž ์ฝ”๋“œ๋ฅผ ๋กœ๋“œํ•˜๋Š” ๋ฐฉ๋ฒ•(์ด๊ฒƒ์€ ux, ์†๋„ ๋ฐ ๋” ๋‚˜์€ ๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ ์œ„์น˜๋ฅผ ์œ„ํ•ด ์ง€๋ถˆํ•  ์šฉ์˜๊ฐ€ ์žˆ๋Š” ๊ฐ€๊ฒฉ์ž…๋‹ˆ๋‹ค).

๋˜ํ•œ raven์„ ๋ฒˆ๋“ค๋กœ ๋ฌถ๋Š” ๊ฒƒ์ด ํ•ด๊ฒฐ์ฑ…์ด์ง€๋งŒ factor-bundle ๊ณผ ๊ฐ™์€ ๋„๊ตฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฒˆ๋“ค์„ ์—ฌ๋Ÿฌ ๊ฐœ๋กœ ๋ถ„ํ• ํ•˜๊ฑฐ๋‚˜ ๋” ๋น ๋ฅธ ์†๋„๋ฅผ ์–ป๊ธฐ ์œ„ํ•ด ์—ฌ๋Ÿฌ ๋ฒˆ๋“ค์„ ํฌํ•จํ•˜๋Š” ๊ฒƒ๊ณผ ๊ฐ™์ด ์ ‘์„ ์ˆ˜ ์—†๋Š” ์ตœ์ ํ™”๋กœ ํ”„๋ก ํŠธ์—”๋“œ ์ฝ”๋“œ๋ฅผ ์ตœ์ ํ™”ํ•˜๋Š” ์ฆ‰์‹œ, ์œ„์˜ ์†”๋ฃจ์…˜์ด ๋” ๋‚˜์€ ๋ฐฉ๋ฒ•์ด ๋  ์ˆ˜ ์žˆ์ง€๋งŒ ์ œ์•ˆ์„ ์œ„ํ•ด ์—ด๋ ค ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋“ค์€ ๋ชจ๋‘ ์žฅ๋‹จ์ ์ด ์žˆ์œผ๋ฏ€๋กœ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๋ชจ๋“  ์ „๋žต์„ ๋ฌธ์„œํ™”ํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด ์ข‹์„ ๊ฒƒ์ด๋ฏ€๋กœ ํŠน์ • ์›น ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์— ๋”ฐ๋ผ ๋‹ค๋ฅธ ์ „๋žต์„ ์ ์šฉํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.
๋น„๋™๊ธฐ ์ „๋žต์„ ์‚ฌ์šฉํ•˜๋ฉด ๋น„๋™๊ธฐ๋งŒ ๋กœ๋“œํ•˜๋Š” ๋Œ€์‹  onload ์ด๋ฒคํŠธ ์ดํ›„์— ์Šคํฌ๋ฆฝํŠธ๋ฅผ ๋กœ๋“œํ•˜์—ฌ onload ์ด๋ฒคํŠธ ๋ Œ๋”๋ง์„ ์ฐจ๋‹จํ•˜์ง€ ์•Š๋„๋ก ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

/**
 * Setup Js error lazy tracking
 * - Pros: doesn't block rendering, onload event
 * - Cons: lower quality error reports for lazy errors
 *
 * <strong i="9">@author</strong> vinhlh
 *
 * <strong i="10">@param</strong>  {object} window
 * <strong i="11">@param</strong>  {object} labJs
 * <strong i="12">@param</strong>  {string} ravenCdn
 * <strong i="13">@param</strong>  {string} sentryDsn
 */
(function(window, labJs, ravenCdn, sentryDsn) {
  var errors = [];
  var oldOnError = window.onerror;

  window.onerror = function() {
    errors.push(arguments);
    oldOnError && oldOnError.apply(this, arguments);
  };
  window.addEventListener('load', function() {
    labJs
      .script(ravenCdn)
      .wait(function() {
        window.onerror = oldOnError;
        Raven.config(sentryDsn).install();
        errors.forEach(function(args) {
          window.onerror.apply(this, args);
        });
      });
  });
})(window, $LAB, 'raven-js-3.8.1/dist/raven.js', 'https://[email protected]/9');

์œ„์— ์ œ๊ณต๋œ ๊ฒƒ๊ณผ ๊ฐ™์€ ๋น„๋™๊ธฐ ์Šค๋‹ˆํŽซ์„ ๋ฌธ์„œํ™”ํ•  ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜์ง€๋งŒ ์—ฌ๊ธฐ์—๋Š” ์žฅ๋‹จ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

๋‹ค๋ฅธ ์˜๊ฒฌ ํ•˜๋‚˜๋งŒ ๋”. ์ด๋Ÿฌํ•œ ์ ˆ์ถฉ์•ˆ์€ ์ˆ˜์šฉ ๊ฐ€๋Šฅํ•œ ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ผ ์ˆ˜ ์žˆ์ง€๋งŒ, ์ €๋Š” Raven.js์—์„œ ํŒŒ์ƒ๋œ ๊ฒƒ์œผ๋กœ (์ž˜๋ชป) ๋ฏฟ์–ด์ง€๋Š” ์ €์ถฉ์‹ค๋„ ์˜ค๋ฅ˜์— ๋Œ€ํ•œ ์‚ฌ์šฉ์ž์˜ ๋งŽ์€ ์ง€์› ํ‹ฐ์ผ“์„ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ์‚ฌ๋žŒ๋“ค์—๊ฒŒ ๋น„๋™๊ธฐ ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•˜๋„๋ก ๊ถŒ์žฅํ•˜๋ฉด "์Šคํƒ ์ถ”์ ์ด ์—†๋Š” ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?"๋ผ๊ณ  ๋ฌป๋Š” ์‚ฌ๋žŒ๋“ค์ด ์ ์  ๋” ๋งŽ์•„์ง€๊ณ  ์ด ๋ฐฉ์‹์ด ์ถฉ์‹ค๋„๊ฐ€ ๋‚ฎ๊ธฐ ๋•Œ๋ฌธ์— ๋‹ค๋ฅธ ๋ถˆ๋งŒ ์‚ฌํ•ญ์ด ์ƒ๊ธธ๊นŒ๋ด ๋‘๋ ต์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ๊ทธ๊ฒƒ์„ ๊ธฐ๊บผ์ด ๋ฐ›์•„๋“ค์ด์ง€๋งŒ ์‚ผํ‚ค๊ธฐ ํž˜๋“  ์•Œ์•ฝ์ž…๋‹ˆ๋‹ค. ๐Ÿ˜“

@benvinegar ๋‚˜๋Š” ๋‹น์‹ ์ด ์–ด๋””์—์„œ ์™”๋Š”์ง€ ์™„์ „ํžˆ ์•Œ์•˜์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ๋‚ด๊ฐ€ ๋ฌด์—‡์„ํ•˜๊ณ  ์žˆ๋Š”์ง€ ์•Œ๊ณ  ์žˆ์œผ๋ฏ€๋กœ ์Šคํƒ ์ถ”์ ์ด ์—†์–ด์•ผ ํ•  ๋•Œ ์Šคํƒ

@oroce โ€“ ์˜ˆ, ์ด๊ฒƒ์€ ์ด ์Šค๋ ˆ๋“œ์— ์žˆ๋Š” ์‚ฌ๋žŒ๋“ค๊ณผ 100% ๊ด€๋ จ์ด ์—†์ง€๋งŒ ์ฃผ์˜ ์‚ฌํ•ญ์„ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ดํ•ดํ•˜์ง€ ์•Š๊ณ  ์ด ์ „๋žต์„ ์ถ”๊ตฌํ•  ์ˆ˜ ์žˆ๋Š” ์‚ฌ๋žŒ๋“ค(์˜ˆ: ๋ณต์‚ฌ/๋ถ™์—ฌ๋„ฃ๊ธฐ)์ž…๋‹ˆ๋‹ค.

Install ๋ฌธ์„œ์— ์Šค๋‹ˆํŽซ์„ ์ถ”๊ฐ€ํ•  ๊ณ„ํš๊ณผ ํ•จ๊ป˜ ์ด ๋ฌธ์ œ๋ฅผ ๊ณ„์† ๊ณต๊ฐœํ•˜๊ณ  ์—ฌ๊ธฐ์ €๊ธฐ์— ๋งŽ์€ ๊ฒฝ๊ณ ๋ฅผ ํ‘œ์‹œํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

์—ฌ๊ธฐ์— ์ฐธ์—ฌํ•ด ์ฃผ์…”์„œ ๋‹ค์‹œ ํ•œ ๋ฒˆ ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค.

๋‹ค์Œ์€ Raven ๋ฉ”์„œ๋“œ์— ๋Œ€ํ•œ ํ˜ธ์ถœ์„ ํˆฌ๋ช…ํ•˜๊ฒŒ ๋Œ€๊ธฐ์—ด์— ๋„ฃ๋Š” ๋ฐ ์‚ฌ์šฉํ•˜๋Š” ์Šค๋‹ˆํŽซ์ž…๋‹ˆ๋‹ค. https://gist.github.com/Kl0tl/ed0a9e74462a2294f4c8842f5389d8ea.

๋ชจ์˜๋Š” ํ™•์‹คํžˆ ๊ฐœ์„ ๋  ์ˆ˜ ์žˆ์ง€๋งŒ ๋” ๋งŽ์€ ๊ธฐ๋Šฅ์„ ๋ณต์ œํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. Object.defineProperty ๋Š” Raven ๊ฐ€ ์ฐฝ์— ์—ฐ๊ฒฐ๋œ ์งํ›„ ํ›„ํฌ๋ฅผ ํ—ˆ์šฉํ•˜์ง€๋งŒ ์Šคํฌ๋ฆฝํŠธ ๋กœ๋“œ ์ด๋ฒคํŠธ๋กœ ์ถฉ๋ถ„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์„ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•˜๋Š” ๊ณต์‹์ ์ธ ๋ฐฉ๋ฒ•์ด ์žˆ์œผ๋ฉด ์ข‹์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์—ฌ๋Ÿฌ๋ถ„, Raygun์ด ๋น„๋™๊ธฐ์ ์œผ๋กœ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ฐฉ์‹์— ๋ฌธ์ œ๊ฐ€ ์žˆ๋Š”์ง€ ๊ถ๊ธˆํ•˜์‹ญ๋‹ˆ๊นŒ?
์ž˜ ๋ชจ๋ฅด๊ฒ ์ง€๋งŒ ์—ฃ์ง€ ์ผ€์ด์Šค๋ฅผ ์ž˜ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ฒƒ ๊ฐ™์ฃ ? ํ‹€๋ฆด ์ˆ˜๋„ ์žˆ์ง€๋งŒ :)

@Kl0tl ์•„์ฃผ ์ข‹์•„์š”, ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค

์ด๊ฒƒ์€ ๋™์  ๊ฐ€์ ธ์˜ค๊ธฐ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋งค์šฐ ๊ฐ„๋‹จํ•ฉ๋‹ˆ๋‹ค. ์•„์ง stage3์— ์žˆ์ง€๋งŒ webpack์—์„œ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.

์šฐ๋ฆฌ๋Š” ๋‹จ์ˆœํžˆ ์•ฝ์†์„ ๋Œ€๊ธฐ์—ด๋กœ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ๊ฐ€๋“ ์ฐจ๋ฉด ๋ชจ๋“  ์ฝœ๋ฐฑ์ด ์ˆœ์„œ๋Œ€๋กœ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.

const RavenPromise = import('raven-js'); // async load raven bundle

// initial setup
RavenPromise.then(Raven => {
    Raven.config('url-to-sentry', options).install();
}):

// exported log function
export const logMessage = (level, logger, text) => {
    RavenPromise.then(Raven => {
        Raven.captureMessage(text, {level, logger});
    });
};

@zanona ์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ Raygun ๋˜๋Š” Google Analytics ์™€ ๊ฐ™์€ ๊ฐ„๋‹จํ•œ ์ถ”์  ์ฝ”๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์„ ์„ ํ˜ธํ•ฉ๋‹ˆ๋‹ค. ๋‹ค์Œ์€ analytics.js ์˜ ์˜ˆ์ž…๋‹ˆ๋‹ค.

<script async src="https://www.google-analytics.com/analytics.js"></script>
<script>
    window.ga = window.ga || function () {
        (ga.q = ga.q || []).push(arguments)
    }
    ga.l = +new Date

    ga('create', 'UA-XXXXX-Y', 'auto')
    ga('send', 'pageview')
</script>

@benvinegar Raven.js ์—์„œ ์ด์™€ ๊ฐ™์€ ๊ฒƒ์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๊นŒ? ์•„๋งˆ ๋ฏธ๋ž˜์—๋Š”?

@kireerik ๊ทธ๊ฒƒ์€ ํ™•์‹คํžˆ ๊ตฌํ˜„๋ 

@kamilogorek ํ›Œ๋ฅญํ•˜๊ฒŒ ๋“ค๋ฆฝ๋‹ˆ๋‹ค (ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์ด ์†”๋ฃจ์…˜์œผ๋กœ ๋งˆ์Œ์— ๋“ค์ง€ ์•Š์Šต๋‹ˆ๋‹ค). ๊ดœ์ฐฎ์•„์š”!

๊ด€์‹ฌ ์žˆ๋Š” ์‚ฌ๋žŒ์„ ์œ„ํ•ด ravenjs๋ฅผ ๋น„๋™๊ธฐ์‹์œผ๋กœ ๋กœ๋“œํ•˜๋Š” ๋˜ ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์˜ ์š”์ ์„ ์ œ์‹œํ–ˆ์Šต๋‹ˆ๋‹ค.
https://gist.github.com/MaxMilton/e2338b02b7381fc7bef2ccd96f434201

@oroce ์˜ ์ฝ”๋“œ ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•˜์ง€๋งŒ ์ฃผ์š” ์ฐจ์ด์ ์€ ๋” ๋‚˜์€ ์„ฑ๋Šฅ์„ ์œ„ํ•ด ๋ฌธ์„œ ํ—ค๋“œ์— ์ผ๋ฐ˜ <script async src'='..."> ํƒœ๊ทธ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค(๋ธŒ๋ผ์šฐ์ €๋Š” ๋ฆฌ์†Œ์Šค ๊ฐ€์ ธ์˜ค๊ธฐ๋ฅผ ๋” ์ผ์ฐ ์˜ˆ์•ฝํ•  ์ˆ˜ ์žˆ์Œ). IIFE ๋ฐ ๊ธฐํƒ€ ์•ฝ๊ฐ„์˜ ์กฐ์ •.

@MaxMilton ๋ฉ‹์ง€๋„ค์š” ! ๋‚˜๋Š” ๋‹น์‹ ์„ ๊ธฐ๋ฐ˜์œผ๋กœ ๋‚˜๋งŒ์˜ ๋ง›์„ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค.

<script async src="https://cdn.ravenjs.com/3.22.1/raven.min.js" crossorigin="anonymous" id="raven"></script>
<script>
    (function (sentryDataSourceName) {
        var raven = document.getElementById('raven')
        , isNotLoaded = true
        , errors = []
        raven.onreadystatechange = raven.onload = function () {
            if (isNotLoaded) {
                Raven.config(sentryDataSourceName).install()
                isNotLoaded = !isNotLoaded
                errors.forEach(function (error) {
                    Raven.captureException(error[4] || new Error(error[0]), {
                        extra: {
                            file: error[1]
                            , line: error[2]
                            , col: error[3]
                        }
                    })
                })
            }
        }
        window.onerror = function (message, source, lineNumber, colmnNumber, error) {
            if (isNotLoaded)
                errors.push([message, source, lineNumber, colmnNumber, error])
        }
    })('https://<key>@sentry.io/<project>')
</script>

์งˆ๋ฌธ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

  • script ํƒœ๊ทธ์— crossorigin ์†์„ฑ์„ ์ •์˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๊นŒ?
  • ๋‹ค๋ฅธ ์†”๋ฃจ์…˜ ๋Œ€์‹  jsut ์˜ค๋ฅ˜ ๊ฐœ์ฒด๋ฅผ ์ „๋‹ฌํ•˜๋Š” ๊ฒƒ์œผ๋กœ ์ถฉ๋ถ„ํ•ฉ๋‹ˆ๊นŒ?

์–ด๋–ป๊ฒŒ ์ƒ๊ฐํ•ด? ์ด์— ๋Œ€ํ•œ ์ €์ž(@kamilogorek)์˜ ์˜๊ฒฌ์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

@kireerik ์Šคํฌ๋ฆฝํŠธ์— crossorigin="anonymous" ๋ฅผ ๋„ฃ์œผ๋ฉด window.onerror ์ด๋ฒคํŠธ๋กœ ์˜ค๋ฅ˜(ํ•ด๋‹น ์™ธ๋ถ€ ์Šคํฌ๋ฆฝํŠธ์—์„œ)๋ฅผ ์™„์ „ํžˆ ์บก์ฒ˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ๊ฐ€์ ธ์˜ค๊ธฐ ์š”์ฒญ๊ณผ ํ•จ๊ป˜ ์ž๊ฒฉ ์ฆ๋ช…์„ ๋ณด๋‚ด๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ ํƒ€์‚ฌ ๋ฆฌ์†Œ์Šค์—์„œ ์›ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. MDN ์ฐธ์กฐ 1 , MDN ์ฐธ์กฐ 2 .

์˜ค๋ฅ˜๋ฅผ ์ „๋‹ฌํ•˜๋ฉด _๋Œ€๋ถ€๋ถ„_ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ์˜ค๋ž˜๋œ ๋ธŒ๋ผ์šฐ์ €(์˜ˆ: Firefox ๋ฒ„์ „ 31 ์ด์ „)์˜ ์ฃผ์˜ ์‚ฌํ•ญ์€ columnNo ๋˜๋Š” Error Object ์†์„ฑ์„ window.onerror ์ด๋ฒคํŠธ์— ์ „๋‹ฌํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ •๋ง ์ข‹์€ ํ˜ธํ™˜์„ฑ์„ ์›ํ•œ๋‹ค๋ฉด ์ถ”๊ฐ€ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. MDN ์ฐธ์กฐ .

ํŽธ์ง‘: ๋ณด๋„ˆ์Šค ํŒ: crossorigin ๊ฐ’ ์—†์ด ์ž…๋ ฅํ•˜๋ฉด crossorigin="anonymous" ์™€ ๋™์ผํ•˜๊ฒŒ ์ฒ˜๋ฆฌ๋ฉ๋‹ˆ๋‹ค.

์ฐธ๊ณ ๋กœ ์ €๋Š” ์ด์ „ ์š”์ง€ ๋ฅผ ํ›จ์”ฌ ๋” ์ƒ์‚ฐ ์ค€๋น„๊ฐ€ ๋œ ๊ฒƒ์œผ๋กœ ์—…๋ฐ์ดํŠธํ–ˆ์Šต๋‹ˆ๋‹ค.

  • ์‹ค์ œ๋กœ ๋ฌด์Šจ ์ผ์ด ์ผ์–ด๋‚˜๊ณ  ์žˆ๋Š”์ง€ ์„ค๋ช…ํ•˜๋Š” ๋งŽ์€ ์˜๊ฒฌ
  • ํฐ ์ •๋ฆฌ + ์„ค๋ช… ๋ณ€์ˆ˜ ์ด๋ฆ„ ์‚ฌ์šฉ (ํ•ญ์ƒ ์ข‹์€ ๋ณด๋„ˆ์Šค :wink: )
  • ์ „์—ญ ๋„ค์ž„์ŠคํŽ˜์ด์Šค๋ฅผ ์˜ค์—ผ์‹œํ‚ค์ง€ ์•Š๋„๋ก IIFE๋กœ ๋ž˜ํ•‘
  • ์˜ค๋ฅ˜ ๋ฐฐ์—ด ํ•ญ๋ชฉ์— ์ „๋‹ฌ๋œ ์ž˜๋ชป๋œ ๋งค๊ฐœ๋ณ€์ˆ˜ ์ˆ˜์ •

๋ชจ๋“  ๊ฒƒ์„ ์ดํ•ดํ•˜๋ ค๋ฉด ์š”์ง€๋ฅผ ์ฐธ์กฐํ•˜๊ฑฐ๋‚˜ ๋น ๋ฅธ ๋ณต์‚ฌ+๋ถ™์—ฌ๋„ฃ๊ธฐ๋ฅผ ์„ ํ˜ธํ•˜๋Š” ๊ฒฝ์šฐ ์ถ•์†Œ๋œ ๋ฒ„์ „์ด ์žˆ์Šต๋‹ˆ๋‹ค.

<!-- Sentry JS error tracking -->
<script async src="https://cdn.ravenjs.com/3.22.0/raven.min.js" crossorigin id="raven"></script>
<script>
(function(b,e,c,d){b.onerror=function(a,b,d,f,g){c||e.push([a,b,d,f,g])};b.onunhandledrejection=function(a){c||e.push([a.reason.reason||a.reason.message,a.type,JSON.stringify(a.reason)])};d.onreadystatechange=d.onload=function(){c||(c=!0,
Raven.config("___PUBLIC_DSN___").install(),
b.onunhandledrejection=function(a){Raven.captureException(Error(a.reason.reason||a.reason.message),{extra:{type:a.type,reason:JSON.stringify(a.reason)}})},e.forEach(function(a){Raven.captureException(a[4]||Error(a[0]),{extra:{file:a[1],line:a[2],col:a[3]}})}))}})(window,[],!1,document.getElementById("raven"));
</script>

<link rel="preconnect" href="https://sentry.io">

___PUBLIC_DSN___ ๋ฅผ DSN์œผ๋กœ ๋ฐ”๊พธ๊ณ  ๋‹ซ๋Š” </head> ํƒœ๊ทธ ๊ทผ์ฒ˜์˜ ๋จธ๋ฆฌ ๋ถ€๋ถ„์— ๋ถ™์—ฌ๋„ฃ์Šต๋‹ˆ๋‹ค. ๋˜๋Š” <head> ๋ฐ <body> ํƒœ๊ทธ๋ฅผ ๋” ์ด์ƒ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ํž™์Šคํ„ฐ๋ผ๋ฉด ์ค‘์š”ํ•œ/์•ฑ ๋ฆฌ์†Œ์Šค(์˜ˆ: CSS) ๋’ค์— ๋งจ ์œ„์— ๋ถ™์—ฌ๋„ฃ๊ธฐ๋งŒ ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค. ์ด์ƒ์ ์œผ๋กœ๋Š” ์ด ์ฝ”๋“œ ๋‹ค์Œ์— ๋กœ๋“œ๋œ ์Šคํฌ๋ฆฝํŠธ์—์„œ ์˜ค๋ฅ˜๋ฅผ ์บก์ฒ˜ํ•  ์ˆ˜ ์žˆ๋„๋ก ๋‹ค๋ฅธ JavaScript ๋ณด๋‹ค ๋จผ์ € ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋‚ด ๋น ๋ฅธ ํ…Œ์ŠคํŠธ์—์„œ๋Š” ๋ฌธ์ œ๊ฐ€ ์—†์—ˆ์œผ๋ฏ€๋กœ ๊ธฐ๋ณธ ๋™๊ธฐ ๋ฒ„์ „๋ณด๋‹ค ์ด๊ฒƒ์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š์„ ์ด์œ ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

๋ˆ„๊ตฌ๋“ ์ง€ ๋” ๋‚˜์€ ์ ‘๊ทผ ๋ฐฉ์‹์— ๋Œ€ํ•œ ์•„์ด๋””์–ด๊ฐ€ ์žˆ์œผ๋ฉด ๋“ฃ๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

์ˆ˜์ •: ์ด ๋Œ“๊ธ€์„ ์—ฌ๋Ÿฌ ๋ฒˆ ์ˆ˜์ •ํ•ด์„œ ์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค. ์ง€๊ธˆ์€ ์•ˆ์ •์ ์ธ ์ˆ˜์ค€์ž…๋‹ˆ๋‹ค. ์ด ์ƒํƒœ๋กœ ๊ฐ€์ ธ ์˜ค๋Š” ๊ฒƒ์ด ์žฌ๋ฏธ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค! : ์Šค๋งˆ์ผ :

์„ผํŠธ๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ๋กœ๋“œ๋˜๋ฉด ์˜ค๋ฅ˜ ๋ณด๊ณ  ํ’ˆ์งˆ์ด ๋กœ๋“œํ•˜๋Š” ๊ฒƒ๊ณผ ์ •ํ™•ํžˆ ๋™์ผํ•ฉ๋‹ˆ๋‹ค. (๊ทธ๋ ‡๋‹ค๊ณ  ๊ฐ€์ •ํ•˜๊ณ  ๊ทธ๋ƒฅ ํ™•์ธ)

๋˜ํ•œ ์ถ”๊ฐ€ํ•˜๊ณ  ์‹ถ์€ ๋ฌธ์„œ์—์„œ lib๊ฐ€ ๋กœ๋“œ๋  ๋•Œ๊นŒ์ง€ Raven์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์œผ๋ฉฐ ์˜ต์…˜์— ์ฝœ๋ฐฑ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜์—ฌ ์‚ฌ์šฉ์ž ์ปจํ…์ŠคํŠธ ๋“ฑ์„ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

@dalyr95์— ๋™์˜ํ•ฉ๋‹ˆ๋‹ค. ์ฝœ๋ฐฑ ํ•จ์ˆ˜๊ฐ€ ์œ ์šฉํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์•„๋งˆ๋„ ์ปค์Šคํ…€ ๋ ˆ์ด๋ธ ๋กœ๋“œ ์ด๋ฒคํŠธ์ผ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

@dalyr95์™€ ๋น„์Šทํ•œ ์š”์ฒญ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ํ˜„์žฌ setUserContext() ๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ์œ ์ผํ•œ ๋ฐฉ๋ฒ•์€ ๊ธฐ๋ณธ ๊ตฌ์„ฑ ๊ฐœ์ฒด์—์„œ ์ฝœ๋ฐฑ์„ ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ๋งŒํผ ๊นจ๋—ํ•˜์ง€ ์•Š์€ ๋กœ๋” ์Šค๋‹ˆํŽซ์„ ์ˆ˜์ •ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์•ˆ๋…•ํ•˜์„ธ์š”, ๋ฌธ์ œ๋ฅผ ์‹ ๊ณ ํ•ด ์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

์šฐ๋ฆฌ๋Š” SDK์˜ ๋‹ค์Œ ์ฃผ์š” ๋ฆด๋ฆฌ์Šค์— ๋Œ€ํ•œ ์ž‘์—…์„ ์ง„ํ–‰ ์ค‘์ž…๋‹ˆ๋‹ค.
๊ทธ ๋•Œ๋ฌธ์— ์šฐ๋ฆฌ๋Š” ํ˜„์žฌ ๋ฒ„์ „(์ฃผ์š” ๋˜๋Š” ๋ณด์•ˆ ๋ฒ„๊ทธ ์ œ์™ธ)์— ๋Œ€ํ•œ ์ž‘์—…์„ ๋ณด๋ฅ˜ํ•ด์•ผ ํ–ˆ์Šต๋‹ˆ๋‹ค.
๊ฐ€๋Šฅํ•œ ํ•œ ๋นจ๋ฆฌ ๋ชจ๋“  ๋ณด๊ณ ๋ฅผ ๋ฐ›์„ ์ˆ˜ ์žˆ๋„๋ก ๋…ธ๋ ฅํ•  ๊ฒƒ์ด๋ฏ€๋กœ ์กฐ๊ธˆ๋งŒ ๊ธฐ๋‹ค๋ ค ์ฃผ์‹ญ์‹œ์˜ค.

์ดํ•ดํ•ด ์ค˜์„œ ๊ณ ๋งˆ์›Œ,
๊ฑด๋ฐฐ!

๋‚ด ์†”๋ฃจ์…˜์€ .install() ํ˜ธ์ถœ ์งํ›„์— 'undefined'!=k.setup&&k.setup(); ์ถ”๊ฐ€ํ•œ ๋‹ค์Œ ๊ฒŒ์‹œ๋ฌผ ์ดˆ๊ธฐํ™” ์ฝ”๋“œ๋กœ setup ๋ผ๋Š” ํ•จ์ˆ˜๋ฅผ SENTRY_SDK ํ–ˆ์Šต๋‹ˆ๋‹ค.

๋น„๋™๊ธฐ ๋กœ๋”๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ Raven.config ๋‘ ๋ฒˆ์งธ ์ธ์ˆ˜๋กœ ์ „๋‹ฌํ•˜์—ฌ ์‚ฌ์šฉ์ž ์ปจํ…์ŠคํŠธ ๋ฐ ๊ธฐํƒ€ ์ •๋ณด๋ฅผ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

<script>
    Raven.config("https://<mydsn>@sentry.io/<projectid>", 
      {"release":"0.3.1",
       "environment":"dev",
       "user": {"id":"7b031fa0-32ff-46fe-b94b-e6bc201c3c5f",
                "organisation-id":"b1a50c41-b85e-4c50-9cec-c55ff36cf6d1"}}).install();
</script>

์ด์— ๋Œ€ํ•œ ๋ชจ๋“  ๊ฒƒ์ด ์ด๋ฏธ ์กด์žฌํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋ฌธ์„œํ™”ํ•˜๋Š” ๊ฒƒ์ด ๋” ์ข‹์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@danielcompton ์€ ๋ฐฑ์—”๋“œ API๋ฅผ ํ†ตํ•ด์„œ๋งŒ ์‚ฌ์šฉ์ž ์ •๋ณด๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

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