Ворон не использует исходные карты в Sentry для кода TS/JS
Я уже использовал Sentry в проекте на C# и был очень рад этому. Поэтому я также хочу использовать его в новом проекте NodeJS с TypeScript. К сожалению, необходимые исходные карты здесь не работают нормально. Я сначала попробовал это в простом проекте TS без успеха. Даже в простом необработанном проекте JS он не выполняет сопоставление исходного кода.
Для тестового проекта я точно следовал документации по node / sourcemaps:
- https://docs.sentry.io/clients/node/config/
- https://docs.sentry.io/clients/node/sourcemaps/
- https://docs.sentry.io/clients/node/typescript/
Результат всегда один и тот же, Sentry показывает мне ужасный код без использования исходных карт:
Кажется, что Sentry не использует исходные карты по неизвестным причинам, потому что соответствующая версия содержит требуемую исходную карту:
Я трачу много часов на это. Пробовал несколько вещей, в том числе разные пути / имена файлов для файлов, отправляемых в часовой. Я также использовал инструмент Sentry cli напрямую, чтобы убедиться, что нет проблем с плагином webpack. Ничего не работает, Sentry всегда показывает мне исходный код и игнорирует исходную карту.
Следующие файлы взяты из моей второй программы nodejs, использующей простой сырой JavaScript. Это максимально минимизировано для работы. Я не знаю, что здесь не так, потому что я сделал именно то, что требует документация.
В чем проблема?
Исходные карты были сгенерированы и загружены. Сначала я подумал, что имена файлов / пути не совпадают. Этот старый вопрос показывает аналогичную проблему, где пути не совпадают, так как они не были относительными, используя ~/
но в SentryPlugin
это префикс по умолчанию. На другой стороне, dataCallback
убедитесь, что все пути относительно корня проекта, а не абсолютные пути, такие как /home/user/project/dist/app.js
что было бы поведением по умолчанию. Я сделал console.log
там, чтобы увидеть, что они правильно относительны.
Простой тестовый проект NodeJS, использующий простой сырой JavaScript
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 Docs ./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
внутренне использует CLI Sentry. CLI должен знать некоторую информацию, такую как url или auth-token от Sentry. Это можно передать как переменные среды, но мне нравится подход с использованием файла конфигурации, который полностью действителен в соответствии с документами. Токен имеет разрешение 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
Это использовать веб-пакет для минимизации src/app.js
и поместите минимизированную версию в dist/app.js
, Кроме того, он создает исходную карту под названием dist/app.js.map
,
При каждом запуске я менял RELEASE
(например, увеличение до 3.0.21). Это важно, поскольку Sentry предполагает, что выпуски и исходные файлы (также исходные карты) имеют отношение 1:1. Поэтому, если мы загрузим наши файлы до версии 3.0.20, это будет сделано в первый раз. Во второй раз файлы остаются без изменений, потому что клиент видит, что они уже существуют. Используя новую версию, убедитесь, что наши последние измененные файлы всегда загружаются, и мы не зацикливаемся на старых.
Я трачу много часов на эту проблему и понятия не имею, что я делаю неправильно. Подводя итог, я сделал каждый шаг из учебников документации, с некоторыми небольшими исправлениями очевидных ошибок.
Информация об окружающей среде
Я использую самодостаточный Sentry 8.22 в док-контейнерах на Arch Linux. NodeJS используется в версии 9.7.1.
0 ответов
После нескольких месяцев борьбы с этим мы наконец нашли проблему.
Вы можете видеть, что артефакты здесь с исходными картами, что вы правильно помечаете версии, и все выглядит нормально?
Бьюсь об заклад Sentry самостоятельно? Мы тоже.
Ну, это проблема.
Sentry разделен на разные службы, и для того, чтобы они могли обмениваться данными (исходными картами...), вам необходимо разделить объем между ними. Пожалуйста, прочитайте этот пост, где он правильно объяснил.
Кроме того, если вы предпочитаете, вы можете разместить их на S3, и Sentry может работать с этим тоже!