繁体   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