Sentry-javascript: ํ•˜์ด๋ธŒ๋ฆฌ๋“œ ์•ฑ ์Šคํƒ ๋ ˆ์ด์Šค์— ์ •๋ณด๊ฐ€ ์—†๊ธฐ ๋•Œ๋ฌธ์— ์ปคํŒจ์‹œํ„ฐ๋ฅผ ํ†ตํ•ด ์‹คํ–‰ํ•  ๋•Œ ์„ผํŠธ๋ฆฌ

์— ๋งŒ๋“  2019๋…„ 02์›” 01์ผ  ยท  28์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: getsentry/sentry-javascript

์š”๊ตฌ ์‚ฌํ•ญ: ์ƒˆ ํ˜ธ๋ฅผ ์—ด๊ธฐ ์ „์— ์ด ์ฒดํฌ๋ฆฌ์ŠคํŠธ๋ฅผ ์‚ดํŽด๋ณด์„ธ์š”.

ํŒจํ‚ค์ง€ + ๋ฒ„์ „

  • [ ] @sentry/browser
  • [ ] @sentry/node
  • [*] raven-js
  • [ ] raven-node _(๋…ธ๋“œ์šฉ ๋ ˆ์ด๋ธ)_
  • [ ] ๋‹ค๋ฅธ:

๋ฒ„์ „:

"raven-js": "3.27.0",

์„ค๋ช…

์„ค์น˜ํ•  ์ฝ”๋“œ

                    .config(dsnToUse, {
                        release: "WSVue-" + AppConst.application.version + "-" + AppConst.application.bundleVersion,
                        environment: bootstrapAppService.getEnvironment(),
                        ignoreErrors: content.ignoreErrorsList,
                        tags: {appversion: appInfo.applicationVersion},
                        dataCallback: function (data) {
                            // do something to data
                            data.extra.localStorageData = getLocalStorageData();
                            return data;
                        }
                    })
                    .addPlugin(RavenVue, Vue)
                    .install();

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

์ปคํŒจ์‹œํ„ฐ: https://capacitor.ionicframework.com/

๊ธฐ๋ก๋œ ์˜ค๋ฅ˜ ์ •๋ณด์— ์ค‘์•™ ์Šคํƒ ์ •๋ณด๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

๊ธฐ๋ก๋œ ์˜ค๋ฅ˜ ๋ฐ์ดํ„ฐ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

{
  "project": "181355",
  "logger": "javascript",
  "platform": "javascript",
  "request": {
    "headers": {
      "User-Agent": "Mozilla/5.0 (iPhone; CPU iPhone OS 12_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/16B91"
    },
    "url": "capacitor://localhost#/app/developer"
  },
  "exception": {
    "values": [
      {
        "type": "Error",
        "value": "Forcing error fooboo tester",
        "stacktrace": {
          "frames": [
            {
              "filename": "[native code]",
              "lineno": null,
              "colno": null,
              "function": "Promise",
              "in_app": true
            },
            {
              "filename": "[native code]",
              "lineno": null,
              "colno": null,
              "function": "initializePromise",
              "in_app": true
            },
            {
              "filename": "[native code]",
              "lineno": null,
              "colno": null,
              "function": "Promise",
              "in_app": true
            },
            {
              "filename": "[native code]",
              "lineno": null,
              "colno": null,
              "function": "initializePromise",
              "in_app": true
            },
            {
              "filename": "[native code]",
              "lineno": null,
              "colno": null,
              "function": "forceError",
              "in_app": true
            }
          ]
        }
      }
    ],
    "mechanism": {
      "type": "generic",
      "handled": true
    }
  },
  "transaction": "[native code]",
  "trimHeadFrames": 0,
  "extra": {
    "message": "Forcing error fooboo tester",
    "code": "Forcing error fooboo tester.",
    "emailTried": "Forcing error fooboo. tester",
    "name": "Forcing error fooboo tester.",
    "session:duration": 66618
  },
  "tags": {
    "appversion": "4.4.6"
  },
  "breadcrumbs": {
    "values": [
      {
        "timestamp": 1549015935.474,
        "message": "Input: enableInputBlurring",
        "level": "debug",
        "category": "console"
      },
      {
        "timestamp": 1549015935.474,
        "message": "Input: enableScrollPadding",
        "level": "debug",
        "category": "console"
      },
      {
        "timestamp": 1549015935.481,
        "type": "http",
        "category": "xhr",
        "data": {
          "method": "GET",
          "url": "static/json/airports.json",
          "status_code": 200
        }
      },
      {
        "timestamp": 1549015935.745,
        "type": "http",
        "category": "xhr",
        "data": {
          "method": "GET",
          "url": "static/json/wx.json",
          "status_code": 200
        }
      },
      {
        "timestamp": 1549015935.759,
        "message": "checkUserAuthenticated",
        "level": "log",
        "category": "console"
      },
      {
        "timestamp": 1549015935.783,
        "message": "checkUserAuthenticated:Refreshing session",
        "level": "log",
        "category": "console"
      },
      {
        "timestamp": 1549015937.922,
        "type": "http",
        "category": "fetch",
        "data": {
          "method": "POST",
          "url": "https://cognito-idp.us-east-1.amazonaws.com/",
          "status_code": 200
        }
      },
      {
        "timestamp": 1549015938.318,
        "type": "http",
        "category": "fetch",
        "data": {
          "method": "POST",
          "url": "https://cognito-idp.us-east-1.amazonaws.com/",
          "status_code": 200
        }
      },
      {
        "timestamp": 1549015939.911,
        "type": "http",
        "category": "xhr",
        "data": {
          "method": "POST",
          "url": "https://cognito-identity.us-east-1.amazonaws.com/",
          "status_code": 200
        }
      }
    ]
  },
  "user": {
    "email": "********@gmail.com"
  },
  "environment": "DEV:CORDOVA:TFXC",
  "release": "WSVue-4.4.6-0.19.02.01.04.07",
  "event_id": "f137e408f8114bdcbc013be0b04f1f6a"
}

์„ผํŠธ๋ฆฌ์—์„œ ์Šคํƒ ์ •๋ณด๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.
screenshot 2019-02-01 at 6 01 19 pm

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

52032491-2975c300-2547-11e9-8800-2e0b23bc69f6

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

@seanwu1105 ๋‚˜์—๊ฒŒ์„œ ์•„๋ฌด๊ฒƒ๋„. ํ˜„์žฌ ํ”„๋กœ๋•์…˜ ํ™˜๊ฒฝ์—์„œ ์‹คํ–‰ ์ค‘์ด๋ฉฐ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.

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

@kamilogorek๋‹˜ , ์ด ์ผ์„ ๋„์™€์ฃผ์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ?

์Šคํƒ ํ”„๋ ˆ์ž„์˜ ํŒŒ์ผ ์ด๋ฆ„์ด ์ž˜๋ชป ํ‘œ์‹œ๋จ

{
              "filename": "[native code]",
              "lineno": null,
              "colno": null,
              "function": "forceError",
              "in_app": true
            }

์ƒ˜ํ”Œ ์˜ค๋ฅ˜ ์ฝ˜์†”์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. Raven.js๋Š” ์˜ค๋ฅ˜ ์ •๋ณด๋ฅผ ์–ป์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค.

screenshot 2019-01-31 at 10 50 43 am

์„ผํŠธ๋ฆฌ์—์„œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ณด์ž…๋‹ˆ๋‹ค.

screenshot 2019-02-02 at 9 59 15 am

์˜ค๋ฅ˜ ์ž์ฒด์—์„œ ์ ์ ˆํ•œ ํ”„๋ ˆ์ž„ ์ •๋ณด๋ฅผ ์ถ”์ถœํ•˜๋Š” ๊ฒƒ์€ TraceKit์˜ ์ฑ…์ž„์ž…๋‹ˆ๋‹ค. โ€“ https://github.com/getsentry/sentry-javascript/blob/master/packages/raven-js/vendor/TraceKit/tracekit.js

ํ•˜์ง€๋งŒ ์ƒˆ๋กœ์šด @sentry/browser SDK์—์„œ ์ผ๋ถ€ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ์ ์šฉํ–ˆ์œผ๋ฏ€๋กœ ๋” ์ด์ƒ์˜ ์กฐ์‚ฌ๋ฅผ ์ˆ˜ํ–‰ํ•˜๊ธฐ ์ „์— ๋จผ์ € ์‹œ๋„ํ•ด ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@kamilogorek
@sentry/browser๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋” ๋‚˜๋น ์ ธ์„œ Raven์œผ๋กœ ์˜ฎ๊ฒผ์Šต๋‹ˆ๋‹ค.

์•„๋ž˜๋Š” ์•ฑ์ด capacitor + Ionic 4 + VueJS + @sentry/browser๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ Hybrid ์•ฑ์œผ๋กœ ์‹คํ–‰๋  ๋•Œ์˜ ๋ชจ์Šต์ž…๋‹ˆ๋‹ค.

screenshot 2019-02-07 at 10 32 20 am

screenshot 2019-02-07 at 10 32 12 am

์•„๋ž˜๋Š” @sentry/browser๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ ๊ธฐ๋ก๋˜๋Š” ์˜ค๋ฅ˜ ๋งํฌ์ž…๋‹ˆ๋‹ค.

https://sentry.io/share/issue/d0c7e9529ac94dba9c4b7b04e16361ba/

์ฝ˜์†”์€ ์ด๋ ‡๊ฒŒ ์ƒ๊ฒผ์Šต๋‹ˆ๋‹ค
screenshot 2019-02-07 at 11 41 18 am

์„ผํŠธ๋ฆฌ ์„ค์ •

Sentry.init({
    release: "WSVue-" + AppConst.application.version + "-" + AppConst.application.bundleVersion,
    dsn: "https://[email protected]/181356",
    transport: Sentry.Transports.FetchTransport,
    integrations: [new Sentry.Integrations.Vue({Vue})],
    environment: "DEVTEST",
    beforeSend: function (exception) {
        return exception;
    }
});

์‹คํ–‰์ค‘์ธ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์›น์‚ฌ์ดํŠธ๋กœ ์‹คํ–‰๋  ๋•Œ ๋ณด๊ธฐ์—๋Š” ์•„๋ฆ„๋‹ต์ง€๋งŒ
screenshot 2019-02-07 at 10 30 44 am

์•„๋ž˜๋Š” ์•ฑ์ด ์›น์‚ฌ์ดํŠธ๋กœ ์‹คํ–‰๋  ๋•Œ ๊ธฐ๋ก๋˜๋Š” ๋™์ผํ•œ ์˜ค๋ฅ˜์ž…๋‹ˆ๋‹ค.
https://sentry.io/share/issue/4133deab3fc240f2bc85c680fae922a0/

๋‚˜๋Š” Capacitor๋‚˜ Ionic 4 tbh๋ฅผ ์‚ฌ์šฉํ•œ ์ ์ด ์—†์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์„ ๋””๋ฒ„๊น…ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๊ฐ€์žฅ ์ž‘์€ ์žฌํ˜„ ์‚ฌ๋ก€๋ฅผ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ์„ค์ •ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋ฐฐ์šธ ์‹œ๊ฐ„์ด ์ถฉ๋ถ„ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

@kamilogorek ๋ฌธ์ œ๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค ๋ฌธ์ œ๋ฅผ ์žฌํ˜„ํ•˜๊ธฐ ์œ„ํ•œ ํ…Œ์ŠคํŠธ ํ”„๋กœ์ ํŠธ๋ฅผ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค. ์ปคํŒจ์‹œํ„ฐ๋Š” ์ฝ”๋ฅด๋„๋ฐ”์™€ ์ •ํ™•ํžˆ ์œ ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ๋™์ผํ•œ ๋””๋ฒ„๊น… ํ”„๋กœ์„ธ์Šค.

https://github.com/stripathix/ionic-vue

์˜ค๋ฅ˜๋ฅผ ํŠธ๋ฆฌ๊ฑฐํ•˜๋ ค๋ฉด ์˜ค๋ฅ˜ ํŠธ๋ฆฌ๊ฑฐ ๋ฒ„ํŠผ์„ ํด๋ฆญํ•˜๊ธฐ๋งŒ ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.
screenshot 2019-02-07 at 5 40 50 pm

์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์„ ์‹คํ–‰ํ•˜๊ธฐ ์œ„ํ•ด README.md์— ๋‹จ๊ณ„๋ฅผ ์ถ”๊ฐ€ํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ฝค ์‰ฝ์Šต๋‹ˆ๋‹ค. Cordova ํ™˜๊ฒฝ๊ณผ ๊ฑฐ์˜ ์œ ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

ํ•˜์ด๋ธŒ๋ฆฌ๋“œ ์•ฑ์„ ๋””๋ฒ„๊น…ํ•˜๋Š” ๊ฒƒ์€ Cordova ๋””๋ฒ„๊น…๊ณผ ์ •ํ™•ํžˆ ์œ ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ์‹œ๋ฎฌ๋ ˆ์ดํ„ฐ์—์„œ ์•ฑ์„ ์‹คํ–‰ํ•œ ๋‹ค์Œ ์‚ฌํŒŒ๋ฆฌ์—์„œ ์‹œ๋ฎฌ๋ ˆ์ดํ„ฐ์—์„œ ์‹คํ–‰๋˜๋Š” ์•ฑ์˜ Inspector๋ฅผ ์—ฝ๋‹ˆ๋‹ค.

์•„๋ž˜๋Š” ์•ฑ์ด ํ•˜์ด๋ธŒ๋ฆฌ๋“œ ๋ชจ๋ฐ”์ผ ์•ฑ์„ ์‹คํ–‰ํ–ˆ์„ ๋•Œ ๊ธฐ๋ก๋œ ์˜ค๋ฅ˜ ๋งํฌ์ž…๋‹ˆ๋‹ค.
https://sentry.io/share/issue/a19f3ecd72eb4e6fa216e4146ad91038/

screenshot 2019-02-07 at 5 44 22 pm

์•ˆ๋…•ํ•˜์„ธ์š”, @kamilogorek ๋‹น์‹ ์€ ์ด๊ฒƒ์„ ์กฐ์‚ฌํ•  ๊ธฐํšŒ๊ฐ€ ์žˆ์—ˆ๋‚˜์š”?

์•„๋‹ˆ์š”, ์š”์ฆ˜์€ ์—ฌ๊ฐ€ ์‹œ๊ฐ„์ด ๋ณ„๋กœ ์—†์–ด์š”. ์–ธ์  ๊ฐ€๋Š” ๊ทธ๊ฒƒ์„ ์กฐ์‚ฌํ•˜๋ ค๊ณ  ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค, ์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค.

@kamilogorek ์ €๋„ ์ด ๋ฌธ์ œ๋ฅผ ๊ฒช๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๋ฌธ์ œ๋ฅผ ์กฐ์‚ฌํ•  ์ˆ˜ ์žˆ๋Š” ๋‹ค๋ฅธ ์‚ฌ๋žŒ์ด ์žˆ์Šต๋‹ˆ๊นŒ?

์ฃ„์†กํ•˜์ง€๋งŒ ์ง€๊ธˆ์€ ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์‹œ๊ฐ„์ด ์—†์Šต๋‹ˆ๋‹ค.

์กฐ์‚ฌํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด ๋‹ค์Œ์„ ์ œ์•ˆํ•ฉ๋‹ˆ๋‹ค.

  • beforeSend ์ฝœ๋ฐฑ์„ ์‚ฌ์šฉํ•˜๊ณ  ๋‘ ๋ฒˆ์งธ ์ธ์ˆ˜ hint ์ด๊ณ  hint.originalException ์†์„ฑ์ด ์žˆ๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ ‡๋‹ค๋ฉด ์Šคํƒ์„ ์กฐ์‚ฌํ•˜๊ณ  ์ •๋ณด๊ฐ€ ์ „ํ˜€ ์—†๋Š”์ง€ ํ™•์ธํ•˜์‹ญ์‹œ์˜ค.
  • ๊ทธ๋ ‡์ง€ ์•Š๋‹ค๋ฉด ์šฐ๋ฆฌ๊ฐ€ ํ•  ์ˆ˜ ์žˆ๋Š” ์ผ์ด ๋ณ„๋กœ ์—†๋‹ค.
  • ๊ทธ๋ ‡๋‹ค๋ฉด https://github.com/getsentry/sentry-javascript/blob/master/packages/browser/src/tracekit.ts ์˜ computeStackTrace ๋ฉ”์†Œ๋“œ์— ์ค‘๋‹จ์ ์„ ์„ค์ •ํ•˜๊ณ  ๊ฑฐ๊ธฐ์—์„œ ๋‹จ๊ณ„๋ณ„๋กœ error.stack ์ •๋ณด๋ฅผ ์†Œํ™”ํ•˜๋Š” ๋ฐฉ๋ฒ•

Cordova์™€ ํ•จ๊ป˜ Ionic Angular v4 ์•ฑ์—์„œ @sentry/browser ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์†Œ์Šค ๋งคํ•‘ ์Šคํƒ ์ถ”์ ๊ณผ ์œ ์‚ฌํ•œ ๋ฌธ์ œ๊ฐ€ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

์šฐ๋ฆฌ๋Š” ๊ทธ๊ฒƒ์ด Cordova์šฉ Ionic Web View ๋ฐ iOS์—์„œ ์‚ฌ์šฉ์ž ์ •์˜ ๊ตฌ์„ฑํ‘œ์˜ ์‚ฌ์šฉ๊ณผ ๊ด€๋ จ์ด ์žˆ๋‹ค๊ณ  ํŒ๋‹จํ–ˆ์Šต๋‹ˆ๋‹ค(Cordova์˜ ๊ฒฝ์šฐ ionic:// capacitor:// ). ์Šคํƒ ์ถ”์  ํ”„๋ ˆ์ž„์˜ ํŒŒ์ผ ์ด๋ฆ„์— ์žˆ๋Š” ์‚ฌ์šฉ์ž ์ง€์ • ์ฒด๊ณ„๋Š” ์••์ถ• ํ•ด์ œ์— ๋ฌธ์ œ๊ฐ€ ์žˆ๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

ionic:// ์—์„œ http:// ๋กœ ํŒŒ์ผ ์ด๋ฆ„ ์Šคํ‚ค๋งˆ๋ฅผ ๋‹ค์‹œ ์ž‘์„ฑํ•˜๋Š” ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์„ ์ž‘์„ฑํ•œ ๋‹ค์Œ ์˜ˆ์ƒ๋Œ€๋กœ ์ž‘๋™ํ–ˆ์Šต๋‹ˆ๋‹ค. ๋‹ค์Œ์€ ์ œ๊ฑฐ๋œ ๋ฒ„์ „์ž…๋‹ˆ๋‹ค.

beforeSend = (event: Event) => {
  const exceptionValue = event.exception && event.exception.values && event.exception.values[0];

  // Approach taken from Sentry's React Native SDK.
  // See https://github.com/getsentry/sentry/issues/4719#issuecomment-333836573
  const stacktrace = event.stacktrace || (exceptionValue && exceptionValue.stacktrace);

  if (stacktrace) {
    stacktrace.frames.forEach(frame => {
      if (frame.filename !== "[native code]") {
        // The iOS webview uses a custom URL scheme for serving the web app.
        // See https://github.com/ionic-team/cordova-plugin-ionic-webview#iosscheme
        // The full URL with that scheme will be used for filenames in the stacktrace.
        // The URL begins with "ionic://localhost/".
        // The custom "ionic" scheme in the URL creates issues for source-mapped stacktraces.
        // Replacing "ionic" with "http" in the stackframe filename will enable source-mapped stacktraces.
        frame.filename = frame.filename.replace(/^ionic/, "http");
      }
    });
  }

  return event;
}

๋„์›€์ด ๋˜์—ˆ๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค!

@KevinKelchen : ์ด๊ฒƒ์€ ์ž˜๋ชป๋œ ํŒŒ์ผ ์ด๋ฆ„์„ ํ•ด๊ฒฐํ•˜์ง€๋งŒ ์ •์˜๋˜์ง€ ์•Š์€ lineno ๋ฐ colno ๋ฅผ ์–ด๋–ป๊ฒŒ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๊นŒ? @stripathix ์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ํ”„๋ ˆ์ž„์€ iOS ์›น ์•ฑ์˜ ์ปคํŒจ์‹œํ„ฐ ๋‚ด๋ถ€์—์„œ ์‹คํ–‰ํ•  ๋•Œ ์ •์˜๋˜์ง€ ์•Š์€ ํ”„๋ ˆ์ž„์„ ๊ฐ–์Šต๋‹ˆ๋‹ค. ์˜ˆ์‹œ:

image

๋Œ€
image

๋‚˜์—๊ฒŒ๋Š” ์ •๋ณด๊ฐ€ ๋ˆ„๋ฝ๋œ ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ์ „์ฒด ํ”„๋ ˆ์ž„ ์ด ๋ˆ„๋ฝ๋œ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

@kamilogorek : originalException์— ์—ด๊ณผ ์ค„ ์ •๋ณด๊ฐ€ ์žˆ๋Š”์ง€ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์•„๋ž˜๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

image

tracekit ๋””๋ฒ„๊น…์„ ์‹œ์ž‘ํ•˜๋Š” ๋ฐฉ๋ฒ•์กฐ์ฐจ ๋ชจ๋ฅด์ง€๋งŒ ์œ„์—์„œ ๋ˆ„๊ตฐ๊ฐ€๊ฐ€ ๋ถ„๋ช…ํžˆ ๋ฐœ๊ฒฌํ•œ ๊ฒƒ์ด ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@silviogutierrez ์ด๊ฒƒ์„ ๋””๋ฒ„๊น…ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์ž‘์€ ์žฌํ˜„์ด ์žˆ์Šต๋‹ˆ๊นŒ? ์ด์ƒ์ ์œผ๋กœ๋Š” col/line์ด ๋ˆ„๋ฝ๋œ ํ”„๋ ˆ์ž„์ด ์žˆ๋Š” ๊ธฐ๋ณธ ์ฝ”๋ฅด๋„๋ฐ” ์•ฑ์ž…๋‹ˆ๋‹ค.

@kamilogorek : ํ•˜๋‚˜๋กœ ํ•ฉ์น˜๋ ค๊ณ  ํ•˜๊ฒ ์ง€๋งŒ ์‹ค์ œ๋กœ ๋ฌธ์ œ๋ฅผ ๋ฐœ๊ฒฌํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์€ ๋งค์šฐ ๊ฐ„๋‹จํ•˜๋ฉฐ ์ •ํ™•ํžˆ ์˜ˆ์ƒํ–ˆ๋˜ ์œ„์น˜์ž…๋‹ˆ๋‹ค.

๋ฐ”๋กœ ์—ฌ๊ธฐ: https://github.com/getsentry/sentry-javascript/blob/master/packages/browser/src/tracekit.ts

gecko ๋ฐ chrome ๋ณ€์ˆ˜๋Š” ๋ชจ๋‘ ์ปคํŒจ์‹œํ„ฐ ํ”„๋ ˆ์ž„์— ๋Œ€ํ•œ ์ •๊ทœ์‹ ํ…Œ์ŠคํŠธ๋ฅผ ์œ„ํ•ด ๋น„์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ฆ‰, iOS์—์„œ ์‹คํ–‰ํ•  ๋•Œ ์ปคํŒจ์‹œํ„ฐ์˜ ํ”„๋ ˆ์ž„์€ capacitor://localhost/foo/bar ์ด๊ณ  Android์—์„œ๋Š” http://localhost ์ž…๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ Tracekit์€ ์ •๊ทœ์‹๊ณผ ์ผ์น˜ํ•˜๋Š” [native code] ํ”„๋ ˆ์ž„์„ ์ œ์™ธํ•œ iOS์˜ ๋ชจ๋“  ํ”„๋ ˆ์ž„์„ ์‚ญ์ œํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” ๊ทธ๊ฒƒ์ด ์•ˆ๋“œ๋กœ์ด๋“œ์—์„œ ์ž˜ ์ž‘๋™ํ•œ๋‹ค๊ณ  ์ƒ์ƒํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

gecko ๋ณ€์ˆ˜๋ฅผ ๋ณ€๊ฒฝํ•˜๊ธฐ ์œ„ํ•ด ์ด (๋”์ฐํ•œ) sed ๋ช…๋ น์„ ์‹คํ–‰ํ•˜๋ฉด ๋ฌธ์ œ๊ฐ€ ํ•ด๊ฒฐ๋ฉ๋‹ˆ๋‹ค.

sed -i "s/moz-extension/moz-extension|capacitor/" node_modules/@sentry/browser/esm/tracekit.js

์ปคํŒจ์‹œํ„ฐ ํ”„๋กœํ† ์ฝœ์„ ์ถ”๊ฐ€ํ•˜๋ ค๋ฉด Tracekit์— ๋Œ€ํ•œ PR์„ ์—ด์–ด์•ผ ํ•ฉ๋‹ˆ๊นŒ? chrome regex๋Š” ์ข€ ๋” ์œ ์—ฐํ•˜๋ฉฐ ์ด๋ฏธ ์—ฌ๋Ÿฌ ํ”„๋กœํ† ์ฝœ์— ๋Œ€ํ•œ regex์˜ ์ผ๋ถ€๋กœ [-a-z] ๊ฐ€ ์žˆ๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. gecko ์—์„œ๋„ ์‹œ๋„ํ•ด ๋ณผ๊นŒ์š”?

@silviogutierrez - ์—ฌ๊ธฐ์„œ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๊นŒ? ํ•„์š”ํ•œ ๊ฒฝ์šฐ ์ˆ˜์ • ์‚ฌํ•ญ์œผ๋กœ PR์„ ์ž‘์„ฑํ•˜๊ฑฐ๋‚˜ ๋กœ์ปฌ์—์„œ ํ…Œ์ŠคํŠธํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‚ด ์ˆ˜์ •์ด ์ž‘๋™ํ–ˆ์Šต๋‹ˆ๋‹ค. ๋ถˆํ–‰ํžˆ๋„ ์ „/ํ›„๋กœ ์ž‘์€ ๋ณต์ œ ์ €์žฅ์†Œ๋ฅผ ๋งŒ๋“ค ์‹œ๊ฐ„์ด ์—†์—ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋‚˜๋Š” ์ž ์‹œ ๋™์•ˆ ์ˆ˜์ • ํ”„๋กœ๊ทธ๋žจ์„ ์„ฑ๊ณต์ ์œผ๋กœ ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค.

๋‘ ๊ฐ€์ง€ ์งˆ๋ฌธ์ด ๋‚จ์•„ ์žˆ์Šต๋‹ˆ๋‹ค.

  1. ์„ผํŠธ๋ฆฌ ์ธก์—์„œ ์ผ๋ฐ˜ํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ํ”„๋กœํ† ์ฝœ์˜ ๊ฒฝ์šฐ *://์™€ ๊ฐ™์€ ๊ฒƒ์ž…๋‹ˆ๊นŒ?
  2. ๋˜๋Š” ๋Œ€์‹  ์ปคํŒจ์‹œํ„ฐ๊ฐ€ ์ž์ฒด ํ”„๋กœํ† ์ฝœ(iOS์—์„œ๋งŒ)์„ ๊ณ ์ง‘ํ•˜๋Š” ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? ์ด๋ฏธ tracekit.ts์— ๋‚˜์—ด๋œ ๊ฒƒ ์ค‘ ํ•˜๋‚˜๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

๊ทธ๊ฒƒ๋“ค์€ ์ข‹์€ ์งˆ๋ฌธ์ด๊ณ , ๋‚˜๋Š” ๋‘˜ ๋‹ค์— ๋Œ€ํ•ด ์•„์ฃผ ์ข‹์€ ๋Œ€๋‹ต์„ ๊ฐ€์ง€๊ณ  ์žˆ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

  1. ์ •๊ทœ์‹์œผ๋กœ ์•Œ์•„๋‚ธ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  2. ๋‚˜๋Š” ๊ทธ๊ฒƒ์ด ์ „์ฒด Cordova / Ionic / Capacitor ์‚ฌ์šฉ์ž ์ •์˜ ๊ตฌ์„ฑํ‘œ์˜ ์ผ๋ถ€์ผ ๋ฟ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์•ฑ์—์„œ CORS ์‚ฌ์ „ ๋น„ํ–‰์„ ํ”ผํ•˜๊ธฐ ์œ„ํ•ด SSL ๊ณ ์ • ์ „๋žต๊ณผ๋„ ๊ด€๋ จ์ด ์žˆ๋Š” ๊ฒƒ ๊ฐ™์ง€๋งŒ ํ™•์‹คํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

@kamilogorek - ๋‚˜๋Š” ๋‹น์‹ ์ด ์žฌํ˜„์„ ์œ„ํ•ด ๋ฌด์—‡์„ ์›ํ•˜๋Š”์ง€ ์ž˜ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค. ์ œ๊ฐ€ ์ƒ๊ฐํ•˜๋Š” ๋ฒ ์ŠคํŠธ ์ƒท์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

https://github.com/toddtarsi/cordova-create-react-app

์ด ์ €์žฅ์†Œ๋ฅผ ๋ถ„๊ธฐํ•˜๊ณ  Sentry๋ฅผ ์ถ”๊ฐ€ํ•˜๊ณ  React ์˜ค๋ฅ˜ ๊ฒฝ๊ณ„๋ฅผ ์ถ”๊ฐ€ํ•˜๊ณ  ์ถฉ๋Œ ๋ฒ„ํŠผ์„ ์ถ”๊ฐ€ํ–ˆ์Šต๋‹ˆ๋‹ค. Cordova ์‹คํ–‰ ์ง€์นจ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ํ˜„๋Œ€ Cordova์—์„œ ์‹ค์ œ๋กœ ์–ป์„ ์ˆ˜ ์žˆ๋Š” ๊ฒƒ๊ณผ ๊ฐ™์€ ๊ธฐ์ค€์„ ์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ๋‹น์‹ ์ด ์ฐพ๊ณ  ์žˆ๋Š” ๊ฒƒ์ธ์ง€ ์•Œ๋ ค์ฃผ์‹ญ์‹œ์˜ค.

@kamilogorek @silviogutierrez - ์•Œ๊ฒ ์Šต๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์—์„œ ๋ถˆํ‰์„ ๋๋ƒˆ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ์ด ๋ฌธ์ œ์˜ ๋ถ€๋‹ด์ด Gecko/safari ์ธก์—์„œ ์ž”์ธํ•˜๊ฒŒ ๋‘”ํ•œ ์˜ค๋ฅ˜ ๊ตฌํ˜„์œผ๋กœ ๊ท€๊ฒฐ๋œ๋‹ค๋Š” ๊ฒฐ๋ก ์— ๋„๋‹ฌํ–ˆ์Šต๋‹ˆ๋‹ค. ์ธ๋‚ด์‹ฌ์„ ๊ฐ–๊ณ  ๋„์™€์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

@toddtarsi ์‹œ๊ฐ„์ด ๋ถ€์กฑํ•ด์„œ ์ฃ„์†กํ•˜์ง€๋งŒ ์•Œ๋ ค์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ์ด ๋ฌธ์ œ๋ฅผ ์ข…๋ฃŒํ•˜๋„๋ก ํ•˜๊ณ  ์ž์œ ๋กญ๊ฒŒ ping์„ ๋ณด๋‚ด๊ฑฐ๋‚˜ ํ•„์š”ํ•œ ๊ฒฝ์šฐ ์ƒˆ ๋ฌธ์ œ๋ฅผ ์—ฝ๋‹ˆ๋‹ค. ๊ฐ์‚ฌ ํ•ด์š”!

@kamilogorek ๋‹˜ ์ด @toddtarsi ์—๊ฒŒ ์ œ์•ˆํ•œ ๋Œ€๋กœ ์ƒˆ ๋ฌธ์ œ๋ฅผ ๋งŒ๋“ค๊ฑฐ๋‚˜ ์ด ๋ฌธ์ œ๋ฅผ ์–ธ๊ธ‰ํ•˜๋Š” PR์„ ์ œ์ถœํ•˜์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ?

์œ„์˜ @silviogutierrez ์˜ ์˜๊ฒฌ(https://github.com/getsentry/sentry-javascript/issues/1863#issuecomment-563364652)์—์„œ ์ง€์ ํ–ˆ๋“ฏ์ด ์ด๊ฒƒ์€ sentry-javascript์˜ ์กฐ์ •๋œ tracekit ๋ฒ„์ „์— ํŠน์ •ํ•œ ๋ฌธ์ œ์ด๋ฉฐ ์‰ฝ๊ฒŒ ์ด ํ”„๋กœ์ ํŠธ์—์„œ ์ˆ˜์ •๋˜์—ˆ์Šต๋‹ˆ๋‹ค(https://github.com/getsentry/sentry-javascript/blob/master/packages/browser/src/tracekit.ts#L49).

๋ฌธ์ œ: gecko regex๊ฐ€ capacitor:// url ์ฒด๊ณ„๋ฅผ ํ—ˆ์šฉํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— Capacitor ์•ฑ์€ iOS์—์„œ ๋งคํ•‘ ๊ฐ€๋Šฅํ•œ ์Šคํƒ ์ถ”์ ์„ ๋ณด๋‚ด์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
์†”๋ฃจ์…˜: gecko regex์— capacitor url ์Šคํ‚ค๋งˆ๋ฅผ ์ถ”๊ฐ€ํ•˜์‹ญ์‹œ์˜ค.

ํ”„๋กœ์ ํŠธ๋ฅผ ํฌํฌํ•˜๊ณ  ๋‚ด ์šฉ๋„๋กœ ๋ณ€๊ฒฝํ•˜๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ํ’€ ์š”์ฒญ์„ ์ œ์ถœํ•˜๋ ค๋ฉด ์ €์—๊ฒŒ ์•Œ๋ ค์ฃผ์„ธ์š”!

@seanwu1105 ๋‚˜์—๊ฒŒ์„œ ์•„๋ฌด๊ฒƒ๋„. ํ˜„์žฌ ํ”„๋กœ๋•์…˜ ํ™˜๊ฒฝ์—์„œ ์‹คํ–‰ ์ค‘์ด๋ฉฐ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.

@mrlowe ๋‹ค์Œ ๋ฆด๋ฆฌ์Šค์—์„œ ๋ชจ๋“  ์‚ฌ๋žŒ์ด ํ•ด๋‹น ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ํ™๋ณดํ•  ๊ณ„ํš์ด ์žˆ์Šต๋‹ˆ๊นŒ? ์šฐ๋ฆฌ๋Š” iOS์˜ ํ•˜์ด๋ธŒ๋ฆฌ๋“œ ์•ฑ์—์„œ ์ปคํŒจ์‹œํ„ฐ๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ ๋™์ผํ•œ ๋ฌธ์ œ์— ์ง๋ฉดํ•˜๊ณ  ์žˆ์œผ๋ฉฐ ์ด ์ˆ˜์ • https://github.com/mrlowe/sentry-javascript/commit/3a09f918e0cbadfdbc1c11d6d779d4718d597fb0 ๊ฐ€ ์šฐ๋ฆฌ์—๊ฒŒ ํšจ๊ณผ์ ์ž…๋‹ˆ๋‹ค. ๊ฐ์‚ฌ ํ•ด์š”!

@albertinad @kamilogorek ์œผ๋กœ๋ถ€ํ„ฐ ์•„๋ฌด ๋Œ€๋‹ต๋„ ๋“ฃ์ง€ ๋ชปํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— PR์„ ์ž‘์„ฑํ•˜๊ณ  ์ด ๋ฌธ์ œ๋ฅผ ์ฐธ์กฐํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์ด ์„ ํƒ๋˜์ง€ ์•Š์œผ๋ฉด ์šฐ๋ฆฌ๋Š” ์ƒˆ๋กœ์šด ๋ฌธ์ œ๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

@mrlowe ๋‹ต๋ณ€์ด ๋Šฆ์–ด ์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฏธ ๋งˆ๊ฐ๋œ ๋ฌธ์ œ์—์„œ ์–ธ๊ธ‰์„ ๋†“์น˜๊ธฐ ๋„ˆ๋ฌด ์‰ฝ์Šต๋‹ˆ๋‹ค. PR์„ ๊ณ„์† ์ฃผ์‹œํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค, ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค!

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