Sentry-javascript: Исходный код для index.js не найден

Созданный на 6 дек. 2018  ·  28Комментарии  ·  Источник: getsentry/sentry-javascript

Пакет + версия

  • [ ] @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 Event Screenshot

Needs Information

Самый полезный комментарий

Итак, для меня это выглядит как ошибка UX. На мой взгляд, это должно (по крайней мере, для проектов Node.js) быть только предупреждением, и оно не должно говорить Source code was not found а что-то вроде Source maps were not found . Это предотвратило бы проблему с историей более года;)
Если вы хотите, вы можете повторно открыть эту проблему в качестве отчета для тех, кто работает над частью внешнего интерфейса/дисплея, или просто оставить ее закрытой и сообщить им об этом недоразумении. Большое спасибо, что наконец разъяснили это!

Все 28 Комментарий

Можно прямую ссылку на мероприятие?

(вы также пропустили некоторые пути на скриншоте трассировки стека, который вы замаскировали ранее 😅)

Есть какая-то конкретная причина, по которой вы не используете Sentry.captureException напрямую, а хотите создать свое собственное событие?

Да, это событие: https://sentry.io/share/issue/e2c8d20b66d2406cb32c540d87654b4a/ (немного изменено, чтобы не публиковать наш dsn)

Причина, по которой я использую Sentry.captureEvent() заключается в следующем: я поддерживаю плагин hapi, который фиксирует события ошибок, выдаваемые обработчиками маршрутов hapi (обогащенные данными запроса). См.: хапи- сентри ./index.js#L41-L67

@guischdi причина, по которой вы получаете эту ошибку, заключается в том, что локальные пути к файлам недоступны для удаленных серверов.
Sentry пытается получить и разрешить /something/local/src/app.js и прочитать из него исходный код, чтобы обеспечить лучшее сопоставление ошибок (это работает так же с файлами исходной карты).

Чтобы загрузить свои файлы, вы можете использовать наш интерфейс командной строки 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
  • загрузите свои исходники в тот же релиз в Sentry
  • убедитесь, что кадры в обнаруженных вами ошибках соответствуют кадрам из ваших загружаемых файлов

Надеюсь, это прояснит некоторые вещи для вас. Не стесняйтесь спрашивать что-нибудь, если вам нужна дополнительная помощь.

Привет @камилогорек
Спасибо за ваш подробный ответ.

Правильно ли я понял: Обычный способ отобразить трассировку стека приложения Node.js в Sentry — загрузить файлы каждого выпуска с помощью интеграции RewriteFrames или вручную? Если да, то почему отображается трассировка стека на captureException /catch-all и не возникает ошибка «исходный код не найден».

Я проверил, как работает выдача ошибки в библиотеке node_modules . Об ошибке сообщается правильно, включая исходный код, даже из библиотеки. См. https://sentry.io/share/issue/2b95ecb13ce24227b2184b2561e4f6e3/

Так почему же это работает с captureException и не работает с captureEvent ?

Sentry Screenshot

@guischdi не могли бы вы пройти полную ссылку на оба мероприятия? Не общие? Я могу получить к ним доступ через права администратора.

Кроме того, меня не будет в офисе следующие 3 недели, поэтому я постараюсь вернуться к этому, когда вернусь.

@камилогорек

  • это ссылка captureEvent
  • это ссылка captureException

Спасибо, что посмотрели это!

@kamilogorek Вы имеете в виду, что мне тоже нужно загружать всю папку node_modules для каждого выпуска? Почему @sentry/node при работе на сервере и наличии всех этих источников просто не может загрузить нужные файлы с отчетом об ошибке?

Я подтверждаю, что после настройки интеграции фреймов и загрузки целых node_modules эта проблема решается для меня. Но процесс загрузки такого количества файлов node_modules очень медленный.

Я считаю, что решение этого:

  1. разрешить часовому загружать .tar всего выпуска
  2. скомпилируйте проект узла в один файл .js и .map разверните и загрузите только эти два файла.

Кроме того, у меня возникла проблема с исходными картами, которые ссылались на исходный файл .ts , которого не было в пакете node_modules npm - https://github.com/prisma/graphql-middleware/issues/159.

@kamilogorek Есть новости по этому вопросу?

Я также могу подтвердить, что переписывание фреймов было для нас решением.

Наш случай немного отличается, мы пытались заставить работать исходные карты, но уменьшенный файл всегда использовался Sentry. Для соответствующего релиза мы загружаем уменьшенные файлы, а также связанные исходные карты. Похоже, Sentry не находил исходную карту и по умолчанию использовал уменьшенный файл (который, тем не менее, по-прежнему размещается по тому же пути, что и исходные карты).

Мы только что добавили new Integrations.RewriteFrames() к ключу интеграции в инициализацию Sentry, и исходные карты начали собираться для каждой новой проблемы.

Приятно знать, что интеграция RewriteFrames и загрузка node_modules решают проблему. Но во-первых (как уже упоминал @mieszko4 ), загрузка такого количества файлов довольно раздражает. И, кроме того, мой первоначальный вывод состоял в том,

что отображается трассировка стека на captureException /catch-all и не возникает ошибка «исходный код не найден»

Поэтому остается открытым следующий вопрос:

Так почему же это работает с captureException и не работает с captureEvent ?

Или точнее: Можно просто перехватить ошибку через captureException без проблем, но для перехвата через captureEvent требуется загрузка всех файлов (интеграция RewriteFrames или вручную) во избежание ошибка "исходный код не найден". Это ошибка или задумано, @kamilogorek?

@guischdi извините за такой поздний ответ. Я немного потерял трек. Можете ли вы освежить мою память о том, что здесь происходит, и привести несколько примеров событий?

@камилогорек
Да, наша проблема:

  • captureException работает нормально, даже если node_module выдает ошибку; см. это тестовое исключение
  • captureEvent дают часовым хай-ап: error encountered while processing this event: [...] Source code was not found ; увидеть это тестовое событие

@guischdi просто для подтверждения, это необработанный файл node js, верно? без веб-пакета, без компиляции, без исходных карт. Всего один файл index.js с двумя разными вызовами на разных линиях? Можете ли вы предоставить содержимое этого файла, если это возможно?

@камилогорек
Да, необработанный nodeJS. Взгляните на вторую проблему, которую я связал выше . Вы уже видите там все 13 строк index.js .

@guischdi мы изучаем, почему он ведет себя так (это вызывает 2 последовательных кадра с одним и тем же URL-адресом). Тем временем вы можете отключить «Включить выборку исходного кода JavaScript» в настройках вашего проекта, например. https://sentry.io/settings/kamil-ogorek/projects/testing-project/
Это приложение node, поэтому в этом нет смысла.

@kamilogorek Хорошо, я отключил параметр «Включить 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();

Я также получаю эту ошибку:

image

А вот стек:

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, которое будет развернуто через несколько часов.

Как только это исправление появится, может ли кто-нибудь, кто прокомментировал здесь, сообщить нам, если у вас все еще есть проблемы / вопросы, и каковы они? С удовольствием открою заново, если понадобится.

Привет @лобстеркати
снова протестировал его со следующим фрагментом (удален из текущего README на npm):

const Sentry = require('@sentry/node');

Sentry.init({ dsn: process.env.DSN });

(async () => {
  Sentry.captureException(new Error('Good bye'));
})();

К сожалению, мы по-прежнему получаем ошибку Source code was not found на странице https://sentry.io/share/issue/0247fe07741c4e358089461f113cef42/.
Исправление, которое вы представили вчера, уже развернуто?

Также протестировано с текущей версией v4.xx (v4.6.6) и последней версией (v5.14.0) @sentry/node.

@guischdi вы не загрузили никаких артефактов и не включили выпуск в свою конфигурацию.

Пожалуйста, сначала следуйте документам: https://docs.sentry.io/platforms/node/sourcemaps/

@камилогорек

в SDK перед отправкой события мы записываем эту информацию как часть обработки трассировки стека. Ошибка исходит от сервера, который также пытается заполнить эту информацию.
Однако это ошибка с нашей стороны, потому что на самом деле мы не ожидаем, что вы будете загружать node_modules с каждым выпуском.

Если бы я понял @lobsterkatie прямо в этом пункте (цитируется выше), мне не нужно было бы загружать код. В ссылке на проблему вы можете увидеть весь контекст исходного кода, необходимый для понимания проблемы (в данном случае весь исходный код скрипта). Так что вроде правильно записали. Я не думаю, что мне нужно загружать/обслуживать исходные карты (как предлагает ваша ссылка), потому что это неминифицированная простая программа Node.js.
Я думаю, что единственная оставшаяся проблема - это отображаемая ошибка, хотя контекст предоставлен правильно. Сервер, кажется, не распознает, что ему не нужны дополнительные загрузки с моей стороны. (Я правильно понимаю @lobsterkatie ?)

@guischdi Файл, который он ищет, находится в вашем приложении, а не в node_modules, поэтому внесенное мной изменение (для более успешного исключения стороннего кода) здесь не применимо.

Причина, по которой мы пытаемся обрабатывать исходные карты для приложений узла, заключается в том, что, хотя код, скорее всего, не минимизирован, его можно довольно легко транспилировать (например, если он был написан на машинописном языке), и поэтому нам понадобится исходный код. maps для отображения написанного кода, а не вывода из babel.

Итак, для меня это выглядит как ошибка UX. На мой взгляд, это должно (по крайней мере, для проектов Node.js) быть только предупреждением, и оно не должно говорить Source code was not found а что-то вроде Source maps were not found . Это предотвратило бы проблему с историей более года;)
Если вы хотите, вы можете повторно открыть эту проблему в качестве отчета для тех, кто работает над частью внешнего интерфейса/дисплея, или просто оставить ее закрытой и сообщить им об этом недоразумении. Большое спасибо, что наконец разъяснили это!

Была ли эта страница полезной?
0 / 5 - 0 рейтинги