@sentry/browser
@sentry/node
raven-js
raven-node
_(λ
Έλμ© λ μ΄λΈ)_4.4.1
λ€μ μ΄λ²€νΈ μΊ‘μ² μ½λλ μ΄λ²€νΈλ₯Ό ꡬ문 λΆμνλ λμ Sentryμμ μ€λ₯λ₯Ό μμ±ν©λλ€. Source code was not found for /.../index.js
const Sentry = require('@sentry/node');
Sentry.init({ dsn: 'https://5d29[...][email protected]/13[...]6' });
(async () => {
const sentryEvent = await Sentry.Parsers.parseError(new Error('Test'));
Sentry.captureEvent(sentryEvent);
})();
Sentryμμ μ΄λ²€νΈλ λ€μκ³Ό κ°μ΅λλ€.
μ΄λ²€νΈμ λν μ§μ λ§ν¬λ₯Ό κ²μν μ μμ΅λκΉ?
(μ΄μ μ λ§μ€νΉν μ€ν μΆμ μ€ν¬λ¦°μ·μμλ μΌλΆ κ²½λ‘λ₯Ό λμ³€μ΅λλ€ π)
Sentry.captureException
μ§μ μ¬μ©νμ§ μκ³ μμ λ§μ μ΄λ²€νΈλ₯Ό λ§λ€κ³ μΆμ νΉλ³ν μ΄μ κ° μμ΅λκΉ?
μ, μ΄κ²μ μ΄λ²€νΈμ λλ€: https://sentry.io/share/issue/e2c8d20b66d2406cb32c540d87654b4a/ (μ°λ¦¬ dsnμ κ²μνμ§ μλλ‘ μ½κ° μμ λ¨)
Sentry.captureEvent()
μ¬μ©νλ μ΄μ λ λ€μκ³Ό κ°μ΅λλ€. hapi λΌμ°νΈ νΈλ€λ¬(μμ² λ°μ΄ν°κ° νλΆν¨)μμ λ°μνλ μ€λ₯ μ΄λ²€νΈλ₯Ό μΊ‘μ²νλ hapi νλ¬κ·ΈμΈμ μ μ§ κ΄λ¦¬νκ³ μμ΅λλ€. μ°Έμ‘°: hapi -sentry ./index.js#L41-L67
@guischdi μ΄ μ€λ₯κ° λ°μνλ μ΄μ λ λ‘컬 νμΌ κ²½λ‘κ° μ격 μλ²μ λλ¬ν μ μκΈ° λλ¬Έμ
λλ€.
Sentryλ /something/local/src/app.js
λ₯Ό κ°μ Έμ ν΄κ²°νκ³ λ λμ μ€λ₯ 맀νμ μ 곡νκΈ° μν΄ μμ€ μ½λλ₯Ό μ½μΌλ €κ³ ν©λλ€(μμ€ λ§΅ νμΌκ³Ό λμΌν λ°©μμΌλ‘ μλν¨).
νμΌμ μ λ‘λνλ €λ©΄ CLI https://docs.sentry.io/cli/ λλ Webpack νλ¬κ·ΈμΈ https://github.com/getsentry/sentry-webpack-pluginμ μ¬μ©ν μ μμ΅λλ€.
μ¬κΈ°μ μμ€ λ§΅μ λν λͺ κ°μ§ μ€λλ λ¬Έμκ° μμ§λ§ κ°λ μ μ SDK https://docs.sentry.io/clients/node/sourcemaps/ μ λν΄ λμΌν©λλ€(λͺ¨λ νμ¬ λ¬Έμ μ λμΌν λ°©μμΌλ‘ μ μ©λ¨).
λͺ¨λ νλ μμμ κ²½λ‘λ₯Ό λ€μ μ°λ λ° μ¬μ©ν μ μλ κΈ°μ‘΄ ν΅ν©λ μμ΅λλ€. https://github.com/getsentry/sentry-javascript/blob/master/packages/core/src/integrations/pluggable/rewriteframes.ts
μλ₯Ό λ€λ©΄ λ€μκ³Ό κ°μ΅λλ€.
Sentry.init({
dsn: "https://[email protected]/297378",
integrations: [new Sentry.Integrations.RewriteFrames()]
});
/something/local/src/app.js
λ₯Ό app:///app.js
( app:///
λ λ΄λΆ μ λμ¬μ
λλ€). λ°λΌμ app.js
λ₯Ό μΌνΈλ¦¬ λ¦΄λ¦¬μ€ μν°ν©νΈμ μ
λ‘λνλ©΄ μ€λ₯ μμ΄ μ¬λ°λ₯΄κ² μ½νλλ€. μΈλΆ νμΌμ κ°μ ΈμμΌ ν©λλ€.
κΈ°λ³Έμ μΌλ‘ ν΄μΌ ν μΌμ λ€μκ³Ό κ°μ΅λλ€.
release
μμ init
μ νλ₯Όκ·Έκ²μ΄ λΉμ μ μν΄ λͺ κ°μ§λ₯Ό μ§μ°κΈ°λ₯Ό λ°λλλ€. λμμ΄ λ νμνλ©΄ 무μμ΄λ μμ λ‘κ² λ¬Όμ΄λ³΄μΈμ.
μλ
νμΈμ @kamilogorek
μμΈν λ΅λ³ κ°μ¬ν©λλ€.
λ΄κ° μ¬λ°λ₯΄κ² μ΄ν΄νμ΅λκΉ? Sentryμ Node.js μ ν리μΌμ΄μ
μ μ€ν μΆμ μ νμνλ μΌλ°μ μΈ λ°©λ²μ RewriteFrames ν΅ν©μ ν΅ν΄ λλ μλμΌλ‘ κ° λ¦΄λ¦¬μ€μ νμΌμ μ
λ‘λνλ κ²μ
λκΉ? κ·Έλ λ€λ©΄ captureException
/catch-allμ λν μ€ν μΆμ μ΄ νμλκ³ 'μμ€ μ½λλ₯Ό μ°Ύμ μ μμ' μ€λ₯κ° λ°μνμ§ μλ μ΄μ λ 무μμ
λκΉ?
node_modules
libμμ μ€λ₯λ₯Ό λμ§λ λ°©λ²μ ν
μ€νΈνμ΅λλ€. libμμλ μμ€ μ½λλ₯Ό ν¬ν¨νμ¬ μ€λ₯κ° μ¬λ°λ₯΄κ² λ³΄κ³ λ©λλ€. https://sentry.io/share/issue/2b95ecb13ce24227b2184b2561e4f6e3/ μ°Έμ‘°
μ ν¨κ»μ΄ μμ
μ μν captureException
μ ν¨κ» μ€ν¨ captureEvent
?
@guischdi λ μ΄λ²€νΈμ λν μ 체 λ§ν¬λ₯Ό
λν μμΌλ‘ 3μ£Ό λμ μ¬λ¬΄μ€μ λΉμ°κ² λλ―λ‘ λμμ¬ λ λ€μ μ΄ μ λ¬΄λ‘ λμκ°λλ‘ λ Έλ ₯νκ² μ΅λλ€.
@kamilogorek λͺ¨λ 릴리μ€μ λν΄ μ 체 node_modules
ν΄λλ₯Ό μ
λ‘λν΄μΌ νλ€λ λ»μΈκ°μ? μ @sentry/node
μλ²μμ μ€ν μ€μ΄κ³ μ΄ λͺ¨λ μμ€λ₯Ό μ¬μ©ν μ μλλ° μ€λ₯ λ³΄κ³ μμ ν¨κ» νμν νμΌμ μ
λ‘λν μ μμ΅λκΉ?
νλ μ ν΅ν©μ μ€μ νκ³ κΈ°λ³Έμ μΌλ‘ μ 체 node_modules
μ
λ‘λνλ©΄ μ΄ λ¬Έμ κ° ν΄κ²°λ¨μ νμΈνμ΅λλ€. κ·Έλ¬λ λ무 λ§μ node_modules νμΌμ μ
λ‘λνλ νλ‘μΈμ€λ λ§€μ° λ립λλ€.
λλ μ΄κ²μ λν ν΄κ²°μ± μ΄ λ€μ μ€ νλλΌκ³ μκ°ν©λλ€.
.tar
μ
λ‘λ νμ©.js
λ° .map
μ»΄νμΌνκ³ μ΄ λ νμΌλ§ λ°°ν¬ λ° μ
λ‘λν©λλ€.λν node_modules
npm ν¨ν€μ§μ μλ μλ³Έ .ts
νμΌμ μ°Έμ‘°νλ μμ€ λ§΅μ λ¬Έμ κ° μμμ΅λλ€. - https://github.com/prisma/graphql-middleware/issues/159
@kamilogorek μ΄ λ¬Έμ μ λν μμμ΄ μμ΅λκΉ?
νλ μμ λ€μ μ°λ κ²μ΄ μ°λ¦¬λ₯Ό μν μ루μ μ΄λΌλ κ²λ νμΈν μ μμ΅λλ€.
μ°λ¦¬μ κ²½μ°λ μ½κ° λ€λ¦ λλ€. μμ€λ§΅μ΄ μλνλλ‘ νλ €κ³ νμ§λ§ μΆμλ νμΌμ νμ Sentryμμ μ¬μ©νλ νμΌμ΄μμ΅λλ€. ν΄λΉ 릴리μ€μ κ²½μ° μΆμλ νμΌκ³Ό κ΄λ ¨ μμ€λ§΅μ μ λ‘λνκ³ μμ΅λλ€. Sentryκ° μμ€λ§΅μ μ°Ύμ§ λͺ»νκ³ μΆμλ νμΌλ‘ κΈ°λ³Έ μ€μ λμ΄ μλ κ² κ°μ΅λλ€(μ΄λ μ¬μ ν μμ€λ§΅κ³Ό λμΌν κ²½λ‘μμ νΈμ€ν λ¨).
Sentryμ μ΄κΈ°νμ λν ν΅ν© ν€μ new Integrations.RewriteFrames()
λ₯Ό μΆκ°νμΌλ©° λͺ¨λ μλ‘μ΄ λ¬Έμ μ λν΄ μμ€λ§΅μ μ ννκΈ° μμνμ΅λλ€.
RewriteFrames
ν΅ν© λ° node_modules
μ
λ‘λκ° λ¬Έμ λ₯Ό ν΄κ²°νλ κ²μΌλ‘ 보μ
λλ€. νμ§λ§ λ¨Όμ ( @mieszko4κ° μ΄λ―Έ μΈκΈνλ―μ΄), λ무 λ§μ νμΌμ μ
λ‘λνλ κ²μ μλΉν μ±κ°μ μΌμ
λλ€. κ²λ€κ° λμ μ΄κΈ° λ°κ²¬μ,
captureException
/catch-allμ λν μ€ν μΆμ μ΄ νμλκ³ 'μμ€ μ½λλ₯Ό μ°Ύμ μ μμ' μ€λ₯κ° νΈλ¦¬κ±°λμ§ μμ
λ°λΌμ λ€μ μ§λ¬Έμ΄ μ΄λ € μμ΅λλ€.
μ ν¨κ»μ΄ μμ μ μν
captureException
μ ν¨κ» μ€ν¨captureEvent
?
λλ λ μ ννκ²: captureException
λ₯Ό ν΅ν΄ λ¬Έμ μμ΄ μ€λ₯λ₯Ό μΊ‘μ²ν μ μμ§λ§ captureEvent
λ₯Ό ν΅ν΄ μΊ‘μ²νλ κ²½μ° λͺ¨λ νμΌμ μ
λ‘λ( RewriteFrames
ν΅ν© λλ μλ)κ° νμν©λλ€. "μμ€ μ½λλ₯Ό μ°Ύμ μ μμ΅λλ€"-μ€λ₯. μ΄κ²μ λ²κ·Έμ
λκΉ μλλ©΄ μλλ κ²μ
λκΉ, @kamilogorek?
@guischdi λ΅λ³μ΄
@kamilogorek
μ, μ°λ¦¬μ λ¬Έμ λ λ€μκ³Ό κ°μ΅λλ€.
captureException
λ node_module
μμ μ€λ₯κ° λ°μνλλΌλ μ λλ‘ μλν©λλ€. μ΄ ν
μ€νΈ μμΈλ₯Ό μ°Έμ‘°νμμμ€captureEvent
λ³΄μ΄ μ¬μ΄: error encountered while processing this event: [...] Source code was not found
; μ΄ ν
μ€νΈ μ΄λ²€νΈ 보기@guischdi νμΈλ§ index.js
νμΌμΈκ°μ? κ°λ₯νλ€λ©΄ μ΄ νμΌμ λ΄μ©μ μ 곡ν μ μμ΅λκΉ?
@kamilogorek
μ, μμ nodeJSμ
λλ€. μμμ λ§ν¬ν λ λ²μ§Έ λ¬Έμ λ₯Ό μ΄ν΄λ³΄μμμ€. μ΄λ―Έ index.js
μ 13νμ΄ λͺ¨λ νμλ©λλ€.
@guischdi μ°λ¦¬λ μ μ΄λ κ² λμνλμ§ μ‘°μ¬νκ³ μμ΅λλ€(κ°μ URLμ κ°μ§ 2κ°μ μ°μ νλ μμ΄ μ΄λ₯Ό νΈλ¦¬κ±°ν¨). κ·Έλμ νλ‘μ νΈ μ€μ μμ "JavaScript μμ€ κ°μ Έμ€κΈ° μ¬μ©"μ λ μ μμ΅λλ€. https://sentry.io/settings/kamil-ogorek/projects/testing-project/
λ
Έλ μ±μ΄λ―λ‘ κ·Έλ κ² ν νμκ° μμ΅λλ€.
@kamilogorek μκ² μ΅λλ€ . "JavaScript μμ€ κ°μ Έμ€κΈ° μ¬μ©" μ€μ μ λκ³ λ€λ₯Έ μ€λ₯λ₯Ό λ°μμμΌ°μ΅λλ€. κ·Έλ¬λ μ¬μ ν 1 error encountered while processing this event: [...] Source code was not found
( μ΄ λ¬Έμ μ°Έμ‘°)
μ΄μνκ²λ μ μκ²λ μ λ§μ΅λλ€. μ΄μ¨λ , μ°λ¦¬λ κ·Έκ²μ΄ λ°μνλ μ΄μ λ₯Ό μ‘°μ¬νλ €κ³ λ Έλ ₯ν κ²μ λλ€. λΉλ‘ κ·Έκ²μ΄ μΈμ λ°μνλμ§ μ₯λ΄ν μλ μμ§λ§, μ΄λ€ κ²μ΄ μλνλ κ²μ λ°©ν΄νλ μ£Όμ λ¬Έμ κ° μλκΈ° λλ¬Έμ λλ€. κ³μ μλ €λ립λλ€!
@kamilogorek μ΄κ²μ λν μμμ΄ μμ΅λκΉ?
λμκ² λ¬Έμ 보기λ μμ€ μ½λμ λͺ κ°μ νμΌμ΄ λλ½λ κ²μΌλ‘ λ³΄κ³ νμ§λ§ λͺ¨λ μ‘΄μ¬νκ³ μ€ν μΆμ μλμμ λ³Ό μ μμ΅λλ€.
Sentryλ₯Ό μ체 νΈμ€ν
νκ³ @sentry/node 5.4.3
λ΄ μ½λλ λ€μκ³Ό κ°μ΅λλ€.
// file: <path>/code/cli
const Sentry = require('@sentry/node');
Sentry.init({ dsn: process.env.SENTRY_DSN });
function test () {
throw new Error('test');
}
test();
λν λ€μ μ€λ₯κ° λ°μν©λλ€.
μ€νμ λ€μκ³Ό κ°μ΅λλ€.
Error: test
File "<path>/code/cli", line 10, col 9, in test
throw new Error('test');
File "<path>/code/cli", line 13, col 1, in Object.<anonymous>
test();
File "internal/modules/cjs/loader.js", line 1063, col 30, in Module._compile
File "internal/modules/cjs/loader.js", line 1103, col 10, in Module._extensions..js
File "internal/modules/cjs/loader.js", line 914, col 32, in Module.load
File "internal/modules/cjs/loader.js", line 822, col 14, in Module._load
File "internal/modules/cjs/loader.js", line 1143, col 12, in Module.runMain
File "internal/main/run_main_module.js", line 16, col 11, in null.<anonymous>
μ λ μ΄ λ¬Έμ λ₯Ό κ²ͺκ³ μμ΅λλ€ Source code was not found
@LukeXF μν₯μ λ°λ μ΄λ²€νΈμ λν λ§ν¬λ₯Ό μ 곡ν μ μμ΅λκΉ?
"μμ€ μ½λλ₯Ό μ°Ύμ μ μμ" μ€λ₯κ° λ°μνλλΌλ μμ€ μ»¨ν μ€νΈ(μ¦, λ¬Έμ μ μ€ μμ μλμ μλ μ½λ)λ₯Ό λ³Ό μ μλ μ΄μ λ SDKμμ μ΄λ²€νΈλ₯Ό 보λ΄κΈ° μ μ μ€ν μΆμ μ²λ¦¬μ μΌλΆλ‘ μ΄ μ 보 λ₯Ό
νμ§λ§ μ΄κ²μ μ°λ¦¬ μΈ‘μ λ²κ·Έμ
λλ€. μλνλ©΄ μ°λ¦¬λ μ€μ λ‘ λͺ¨λ 릴리μ€μμ node_modules
λ₯Ό μ
λ‘λν κ²μΌλ‘ κΈ°λνμ§ μκΈ° λλ¬Έμ
λλ€(λ
Έλ μ±μ κ²½μ°, λΈλΌμ°μ μ±μ κ²½μ° μ΄μ¨λ λ²λ€/μΆμν κ°λ₯μ±μ΄ μμ). https://github.com/getsentry/sentry/pull/17538μμ μμ ν΄μΌ νλ©° λͺ μκ° λ΄μ λ°°ν¬λ©λλ€.
λ¬Έμ κ° ν΄κ²°λλ©΄ μ¬κΈ°μ λκΈμ λ¨ μ¬λμ΄ μμΌλ©΄ μ¬μ ν λ¬Έμ /μ§λ¬Έκ³Ό κ·Έκ²μ΄ 무μμΈμ§ μλ €μ£Όμ€ μ μμ΅λκΉ? νμν κ²½μ° μ΄λ₯Ό λ€μ μ΄ μ μμ΄ κΈ°μ©λλ€.
μλ
νμΈμ @lobsterkatie
λ€μ μ€λν«(npmμ νμ¬ READMEμμ μ κ±°λ¨)μΌλ‘ λ€μ ν
μ€νΈνμ΅λλ€.
const Sentry = require('@sentry/node');
Sentry.init({ dsn: process.env.DSN });
(async () => {
Sentry.captureException(new Error('Good bye'));
})();
λΆννλ https://sentry.io/share/issue/0247fe07741c4e358089461f113cef42/ μμ μ¬μ ν Source code was not found
μ€λ₯κ° λ°μν©λλ€.
μ΄μ λμ
ν μμ μ¬νμ΄ μ΄λ―Έ λ°°ν¬λμμ΅λκΉ?
λν @sentry/nodeμ νμ¬ v4.xx λ²μ (v4.6.6) λ° μ΅μ 릴리μ€(v5.14.0)λ‘ ν μ€νΈλμμ΅λλ€.
@guischdi μν°ν©νΈλ₯Ό μ λ‘λνμ§ μμκ±°λ ꡬμ±μ 릴리μ€λ₯Ό ν¬ν¨νμ§ μμμ΅λλ€.
λ¨Όμ λ¬Έμλ₯Ό λ°λ₯΄μμμ€: https://docs.sentry.io/platforms/node/sourcemaps/
@kamilogorek
SDKμμ μ΄λ²€νΈλ₯Ό 보λ΄κΈ° μ μ μ€ν μΆμ μ²λ¦¬μ μΌλΆλ‘ μ΄ μ 보λ₯Ό κΈ°λ‘ν©λλ€. ν΄λΉ μ 보λ₯Ό μ λ ₯νλ €κ³ μλνλ μλ²μμλ μ€λ₯κ° λ°μν©λλ€.
κ·Έλ¬λ μ°λ¦¬λ μ€μ λ‘ λͺ¨λ 릴리μ€μ ν¨κ» node_modulesλ₯Ό μ λ‘λν κ²μΌλ‘ κΈ°λνμ§ μκΈ° λλ¬Έμ μ°λ¦¬ μΈ‘μ λ²κ·Έμ λλ€.
κ·Έ μμ μμ @lobsterkatieλ₯Ό μ΄ν΄
컨ν
μ€νΈκ° μ λλ‘ μ 곡λμμ§λ§ μ€λ₯κ° νμλλ κ²μ΄ μ μΌν λ¬Έμ λΌκ³ μκ°ν©λλ€. μλ²κ° λ΄ μͺ½μμ μΆκ° μ
λ‘λκ° νμνμ§ μλ€λ κ²μ μΈμνμ§ λͺ»νλ κ² κ°μ΅λλ€. (λ΄κ° μ λλ‘ μ΄ν΄νκ³ μμ΅λκΉ
@guischdi μ°Ύκ³ μλ νμΌμ node_modulesκ° μλλΌ μ±μμ κ°μ Έμ¨ κ²μ΄λ―λ‘ λ΄κ° λ³κ²½ν μ¬ν(νμ¬ μ½λλ₯Ό λ μ±κ³΅μ μΌλ‘ μ μΈνκΈ° μν΄)μ μ¬κΈ°μ μ μ©λμ§ μμ΅λλ€.
λ Έλ μ±μ λν μμ€ λ§΅μ μ²λ¦¬νλ €κ³ νλ μ΄μ λ μ½λκ° μΆμλμ§ μμ κ°λ₯μ±μ΄ λ§€μ° λμ κ²μ μ¬μ€μ΄μ§λ§, (μλ₯Ό λ€μ΄ typescriptλ‘ μμ±λ κ²½μ°) λ§€μ° μ½κ² λ³νλ μ μμΌλ―λ‘ μμ€κ° νμνκΈ° λλ¬Έμ λλ€. babelμ μΆλ ₯μ΄ μλ μμ±λ λλ‘ μ½λλ₯Ό νμνλλ‘ λ§€νν©λλ€.
μ’μ, μ΄κ²μ λμκ² UX λ²κ·Έμ²λΌ 보μΈλ€. μ μκ°μλ (μ μ΄λ Node.js νλ‘μ νΈμ κ²½μ°) κ²½κ³ μΌ λΏμ΄κ³ Source code was not found
μλλΌ Source maps were not found
μ κ°μμΌ ν©λλ€. μ΄λ κ² νλ©΄ 1λ
μ΄μμ κΈ°λ‘μ΄ μλ λ¬Έμ λ₯Ό λ°©μ§ν μ μμμ΅λλ€. ;)
μνλ€λ©΄ μ΄ λ¬Έμ λ₯Ό νλ‘ νΈμλ/λμ€νλ μ΄ λΆλΆμμ μΌνλ λͺ¨λ μ¬λμ μν λ³΄κ³ μλ‘ λ€μ μ΄κ±°λ κ·Έλ₯ λ«ν μνλ‘ λκ³ μ΄ μ€ν΄λ₯Ό λ³΄κ³ ν μ μμ΅λλ€. λ§μΉ¨λ΄ μ΄κ²μ λͺ
νν ν΄ μ£Όμ
μ κ°μ¬ν©λλ€!
κ°μ₯ μ μ©ν λκΈ
μ’μ, μ΄κ²μ λμκ² UX λ²κ·Έμ²λΌ 보μΈλ€. μ μκ°μλ (μ μ΄λ Node.js νλ‘μ νΈμ κ²½μ°) κ²½κ³ μΌ λΏμ΄κ³
Source code was not found
μλλΌSource maps were not found
μ κ°μμΌ ν©λλ€. μ΄λ κ² νλ©΄ 1λ μ΄μμ κΈ°λ‘μ΄ μλ λ¬Έμ λ₯Ό λ°©μ§ν μ μμμ΅λλ€. ;)μνλ€λ©΄ μ΄ λ¬Έμ λ₯Ό νλ‘ νΈμλ/λμ€νλ μ΄ λΆλΆμμ μΌνλ λͺ¨λ μ¬λμ μν λ³΄κ³ μλ‘ λ€μ μ΄κ±°λ κ·Έλ₯ λ«ν μνλ‘ λκ³ μ΄ μ€ν΄λ₯Ό λ³΄κ³ ν μ μμ΅λλ€. λ§μΉ¨λ΄ μ΄κ²μ λͺ νν ν΄ μ£Όμ μ κ°μ¬ν©λλ€!