簡體   English   中英

Raven不在Sentry中將源映射用於TS / JS代碼

[英]Raven doesn't use source maps in Sentry for TS/JS code

我已經在C#項目中使用Sentry,對此感到非常滿意。 因此,我也想在帶有TypeScript的新NodeJS項目中使用它。 可悲的是,所需的源地圖在這里無法正常工作。 我首先在一個簡單的TS項目中嘗試了它,但沒有成功。 即使在普通的原始JS項目中,它也不會執行任何源代碼映射。

對於測試項目,我完全遵循了關於node / sourcemaps的文檔:

結果始終是相同的,Sentry向我展示了不使用sourcemaps的丑陋代碼:

哨兵忽略了源地圖

似乎Sentry出於未知原因未使用源地圖,原因是相應的Release包含所需的源地圖:

釋放神器

我花了很多時間。 嘗試了幾件事,包括推送到哨兵的文件的不同路徑/文件名。 我還直接使用了Sentry cli工具,以確保webpack插件沒有問題。 什么都行不通,Sentry總是向我顯示原始源代碼,並忽略了源地圖。

以下文件來自我的第二個nodejs程序,使用純原始JavaScript。 盡可能縮小工作范圍。 我不知道這里出了什么問題,因為我確實按照文檔的要求做了。

問題是什么?

源圖已生成並上傳。 首先,我認為文件名/路徑不匹配。 這個較早的問題顯示了一個類似的問題,其中路徑不匹配,因為它們不是使用~/相對的,但是在SentryPlugin這是默認前綴。 另一方面, dataCallback確保所有路徑都相對於項目根目錄,而不是像/home/user/project/dist/app.js這樣的絕對路徑,這是默認行為。 我在那里做了一個console.log ,看它們是相對正確的。

使用純原始JavaScript的簡單NodeJS測試項目

src / app.js(主程序)

var Raven = require('raven')
const path = require('path')

let options = {
    release: process.env.RELEASE,
    dataCallback: function (data) {
        var stacktrace = data.exception && data.exception[0].stacktrace;
        if (stacktrace && stacktrace.frames) {
            stacktrace.frames.forEach(function (frame) {
                if (frame.filename.startsWith('/')) {
                    frame.filename = 'app:///' + path.basename(frame.filename);
                }
            });
        }

        return data;
    }
}
Raven.config('http://<DnKey>@<SentryHost>:9000/3', options).install();
//Raven.captureException(new Error('abc'))

throw new Error('Hello123')

webpack.config.js

在此文件中,我將輸入路徑從src/app.js更改為./src/app.js Sentry文檔使用./src/app.js但這會導致錯誤,導致無法解析路徑。 這似乎是文檔的錯誤。

const path = require('path')
const fs = require('fs')
const SentryPlugin = require('@sentry/webpack-plugin')

module.exports = {
    target: 'node',
    devtool: 'source-map',
    entry: {
        "app": './src/app.js'
    },
    output: {
        path: path.join(__dirname, 'dist'),
        filename: '[name].js'
    },
    plugins: [
        new SentryPlugin({
            release: process.env.RELEASE,
            configFile: 'sentry.properties',
            include: './dist',
            ignore: ['node_modules', 'webpack.config.js'],
        })
    ]
};

sentry.properties

我添加了configFile屬性,因為SentryPlugin內部使用了Sentry的CLI。 CLI需要知道一些信息,例如Sentry中的url或auth-token。 這可以作為環境變量傳遞,但是我喜歡使用配置文件的方法,根據文檔,該文件是完全有效的。 令牌具有所需的project.write權限。

defaults.url=http://SentryHost:9000
defaults.org=sentry
defaults.project=js-test
auth.token=xxx

package.json

{
  "name": "sentry-js-test",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "build": "rm -rf dist/* && webpack --mode production"
  },
  "keywords": [],
  "author": "",
  "license": "ISC",
  "dependencies": {
    "@sentry/cli": "^1.30.2",
    "@sentry/webpack-plugin": "^1.3.3",
    "raven": "^2.4.2",
    "webpack": "^4.0.1"
  },
  "devDependencies": {
    "webpack-cli": "^2.0.10"
  }
}

啟動測試程序

export RELEASE=3.0.20 && npm run build && node dist/app.js

這使用webpack縮小src/app.js並將縮小的版本放在dist/app.js 此外,它創建了一個名為dist/app.js.map

在每次運行中,我都更改了RELEASE (例如,增加到3.0.21)。 這很重要,因為Sentry假定發行版和源文件(也包括源映射)是1:1的關系。 因此,如果我們上傳文件以發布版本3.0.20,則這是第一次完成。 第二次,文件保持不變,因為客戶端發現它們已經存在。 使用新版本時,請確保始終上傳我們最新更改的文件,並且不要與舊文件混在一起。

我在這個問題上花了很多時間,不知道我在做什么錯。 總而言之,我從文檔教程的每一步開始,對一些明顯的錯誤進行了一些小的修復。

有關環境的信息

我在Arch Linux的Docker容器中使用自托管的Sentry 8.22。 在9.7.1版中使用了NodeJS。

經過幾個月的努力,我們終於找到了問題。

您可以看到工件與源映射在這里,您正確標記了版本,一切似乎還好嗎?

我敢打賭自己運行哨兵嗎? 我們也是。

嗯,這就是問題所在。

Sentry分為不同的服務,為了使它們共享數據(源映射...),您需要在它們之間共享卷。 請仔細閱讀該職位在那里的正確解釋。

另外,如果您願意,可以將它們托管在S3上,Sentry也可以使用它!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM