На данный момент невозможно отключить плагин sentry, потому что модуль ngRaven не загружается.
В среде разработки я использую следующее без предоставления DSN
Raven.config (). Install ()
Обратный вызов, который регистрирует поставщика raven, не вызывается
Raven.addPlugin(function () {
angular.module('ngRaven', [])
.provider('Raven', RavenProvider)
.config(['$provide', ExceptionHandlerProvider]);
});
Поскольку функция установки не вызывает плагин, устанавливающий модуль
isSetup () не удалось, потому что globalServer имеет значение null
install: function() {
if (isSetup() && !isRavenInstalled) {
TraceKit.report.subscribe(handleStackInfo);
// Install all of the plugins
each(plugins, function(_, plugin) {
plugin();
});
isRavenInstalled = true;
}
return Raven;
},
Относятся к № 414 и № 413
@Sija @odedfos - вы можете прокомментировать # 414? Мол, этот PR решит эту проблему?
@benvinegar кажется мне законным, хотя я мог представить себе случай, когда вы хотите, чтобы был доступен Raven
provider, даже без вызова .config()
- например, установка флага Raven.debug
У меня был аналогичный запрос от @benvinegar, и он указал, что вы можете использовать:
Raven.config('your dsn', {
shouldSendCallback: function () {
return false;
}
}).install();
И это остановит Рейвен от репортажей. Измените статус return
на ИСТИНА, и он начнет отчет. По крайней мере, так мне сказали. Мы планируем использовать это плюс команду развертывания sed
чтобы перевернуть логическое значение во время развертывания.
Я сделал что-то похожее на приведенное выше, чтобы разрешить install () успешно и избежать выполнения каких-либо HTTP-запросов для фактической отправки ошибок ( window.SERVER_FLAGS
- это то, как я передаю свой sentryURL из моего бэкэнда во внешний интерфейс).
if (!window.SERVER_FLAGS.sentryURL) {
// Never bother sending data to sentry
Raven.setShouldSendCallback(function() { return false });
// Allow Raven.install() to succeed
Raven.isSetup = function() {
return true;
}
}
Raven
.config(window.SERVER_FLAGS.sentryURL, {
release: window.SERVER_FLAGS.version,
debug: true,
})
.addPlugin(Raven.Plugins.Angular)
.install();
Кажется, это работает достаточно хорошо и все еще позволяет Raven работать, но он просто не сообщает. Мне действительно не нравится взламывать isSetup
но это единственный способ, который я мог найти, был минимально инвазивным, чтобы загрузить ngRaven
.
Для других, кто наткнется на это
Если вы используете webpack для создания своего приложения, вы используете переменные среды для настройки raven с помощью подключаемого модуля среды.
https://webpack.js.org/plugins/environment-plugin/
например
if (process.env.NODE_ENV === 'dev') {
Raven.setShouldSendCallback(() => { return false; });
Raven.isSetup = () => { return true; };
}
Raven
.config(process.env.RAVEN_DSN, {
debug: process.env.RAVEN_DEBUG,
})
.addPlugin(require('raven-js/plugins/angular'), angular)
.install();
isSetup теперь доступен только для чтения, поэтому указанный выше метод больше не работает.
Я нашел следующее обходное решение, которое, похоже, работает, хотя я понятия не имею, почему.
let isProduction = process.env.ENV === 'build'; // variable provided by webpack
Raven
.config('https://<key>@sentry.io/<project>', {
shouldSendCallback: function () {
return isProduction;
}
})
.install();
if (!isProduction) {
Raven.uninstall(); // this is necessary! for some reason
}
export class RavenErrorHandler implements ErrorHandler {
handleError(err: any): void {
console.error(err); // this still fires after uninstalling!!! it's because it's already listed as Angular provider
Raven.captureException(err)
}
}
Это все еще ужасное решение, потому что оно перехватывает все мои ошибки, поэтому я не знаю, из какой строки они были выброшены. По крайней мере, я думаю, это не так страшно, как их вообще не видеть.
Я использовал этот способ. Кажется, у меня работает
`if (environment.production) {
Raven.config ('https: //
.установить();
}
и в провайдерах
поставщики: [environment.production? {предоставить: ErrorHandler, useClass: RavenErrorHandler}: [], ... `
Пожалуйста, дайте мне знать, если я здесь что-то не так делаю.
Мне кажется, это нормально. По-видимому, здесь уже был дан ответ на исходную проблему, поэтому закрываем эту. Не стесняйтесь открывать снова, если это все еще актуально.
Проще на app.module.ts
import {environment} from '../environments/environment';
...
providers: [
LocalStorageService,
EventLocalStorageService,
EventService,
ActionButtonService,
WeatherUndergroundWeatherService,
GeoLocationInfoService,
AppEventColorService,
// {provide: ErrorHandler, useClass: RavenErrorHandler}
{provide: ErrorHandler, useClass: environment.production ? RavenErrorHandler : ErrorHandler} // See here
],
а также
.config('key', {
shouldSendCallback: function () {
return environment.production;
}
})
.install();
Таким образом, у вас есть сообщения localdev в вашей консоли (иначе Sentry захватит некоторые), а на производстве вы получите те, которые хотите иметь.
По крайней мере, в Chrome (не уверен в других браузерах) еще один способ предотвратить «захват» Raven консоли разработчика - это черный ящик raven.js
:
https://gist.github.com/paulirish/c307a5a585ddbcc17242
https://developer.chrome.com/devtools/docs/blackboxing
А что насчет Sentry? Я не использую Raven, у меня есть Sentry, и я хочу отключить его в среде разработки на моем локальном хосте.
https://dev.to/angular/tracking-errors-in-angular-with-sentry-4oo0 - вот он
@artuska вы можете либо предоставить пустой DSN, либо использовать beforeSend
чтобы остановить транспорт.
Sentry.init({
dsn: process.env.development ? '' : 'your-real-dsn'
})
или
Sentry.init({
dsn: 'your-real-dsn',
beforeSend(event) {
if (process.env.development) return null;
return event;
}
})
Я не думаю, что это действительно отключает Sentry. Он просто останавливается, если от отправки
данные. Тем не менее, панировочные сухари покрывают большинство проблем, что отстой
В понедельник, 9 декабря 2019 г., в 10:15 Камил Огорек [email protected]
написал:
@artuska https://github.com/artuska вы можете указать пустой DSN или
используйте beforeSend, чтобы остановить транспортировку.Sentry.init ({
dsn: process.env.development? '': 'твой-настоящий-dsn'
})или
Sentry.init ({
dsn: 'твой-реальный-dsn',
beforeSend (событие) {
если (process.env.development) вернет ноль;
событие возврата;
}
})-
Вы получили это, потому что прокомментировали.
Ответьте на это письмо напрямую, просмотрите его на GitHub
https://github.com/getsentry/sentry-javascript/issues/436?email_source=notifications&email_token=AAJVX45ZEIJWZSXZSBQ5ZQLQXYECDA5CNFSM4BW42VRKYY3PNVWWK3TREEG63BW42VRKYY3PNVWWK3TULXW2GWWW2NVWWWK3TREXMXWW2GWWW2NVWWWK3TREGWWW2
или отказаться от подписки
https://github.com/notifications/unsubscribe-auth/AAJVX4YBWA3R6SM63NV5JPDQXYECDANCNFSM4BW42VRA
.
@jimmykane правильно, если вы хотите отключить Sentry, просто вызовите init
условно
Самый полезный комментарий
У меня был аналогичный запрос от @benvinegar, и он указал, что вы можете использовать:
И это остановит Рейвен от репортажей. Измените статус
return
на ИСТИНА, и он начнет отчет. По крайней мере, так мне сказали. Мы планируем использовать это плюс команду развертыванияsed
чтобы перевернуть логическое значение во время развертывания.