Ember.js Ember sentry/raven:在加载用户模型时设置用户上下文?
%Preamble% 我正在设置ember cli sentry,并希望识别用户,以便在报告异常时,我们知道这些异常与哪个用户关联,以防它们是特定于用户的。(比如说,我们部署到staging,我们从后端获得了一些坏数据,这导致了某些错误,只有那个些将坏数据存入其帐户的用户才会出现这些错误) 实际问题& 我想在加载用户模型后立即执行一些代码。我不知道什么路由将触发用户模型加载 理论上,实际上,我最早可能获得用户模型数据的地方是在数据请求完成之后。我想知道,劫持XHR方法是否疯狂,当请求用户id时,运行我的代码告诉raven/sentry这个用户是谁 如果模型文件有一个“加载”的钩子就更好了,但我从来没有听说过这样的事情。也许这是一个需要这样做的用例 谷歌/搜索引擎优化的h1: 余烬:钩子在模型从任何路径加载后执行代码?从任何路由加载模型后,如何执行代码?也许在您的应用程序中,您可以执行以下操作:Ember.js Ember sentry/raven:在加载用户模型时设置用户上下文?,ember.js,ember-data,sentry,raven,Ember.js,Ember Data,Sentry,Raven,%Preamble% 我正在设置ember cli sentry,并希望识别用户,以便在报告异常时,我们知道这些异常与哪个用户关联,以防它们是特定于用户的。(比如说,我们部署到staging,我们从后端获得了一些坏数据,这导致了某些错误,只有那个些将坏数据存入其帐户的用户才会出现这些错误) 实际问题& 我想在加载用户模型后立即执行一些代码。我不知道什么路由将触发用户模型加载 理论上,实际上,我最早可能获得用户模型数据的地方是在数据请求完成之后。我想知道,劫持XHR方法是否疯狂,当请求用户id时,
user: alias('model')
userModelLoaded: observer('user.id', function() {
// execute code to set up Raven
})
我建议两个都去
- 在您的余烬数据存储上设置一个观察者——但这似乎很挑剔,或者李>
- 登录路由回调后,设置上下文:
谢谢你@duizendnegen和@Isaac Askew,观察员是一个很好的起点,引导我找到了最终的解决方案。这个放置在我的应用程序路径中的观察者代码帮助我准确地确定了可以添加哪些内容作为用户上下文:
window.serviceState = {};
// eslint-disable-next-line
let serviceState = window.serviceState;
export default Route.extend(ApplicationRouteMixin, {
// observes services for state changes we care about and stores them in
// a separate variable so when an exception occurs, we can simply include that
// variable and avoid the risk of causing another exception by trying
// to read them in `captureException`
serviceStateTracker: observer(
'service1.prop1',
'service2.propA',
function() {
[
'service1.prop1',
'service2.propA',
].forEach((prop) => {
let newValue = this.get(prop);
if (serviceState[prop] !== newValue) {
if (serviceState[prop] === undefined) {
console.log(prop, newValue);
} else {
console.log(prop, 'changed from:', serviceState[prop], 'to:', newValue);
}
serviceState[prop] = newValue;
}
});
}
),
然而,我确实尝试过在异常时间使用我在日志记录程序服务中关心的道具,这很有效。这样做更好,因为您不会在每次要记录属性更改时都执行不必要的代码:
// app/services/logr.js
// initially generated with ember-cli-sentry's `ember g logger logr`
import RavenLogger from 'ember-cli-deploy-sentry/services/raven';
import Ember from 'ember';
const { Logger, inject: { service } } = Ember;
export default RavenLogger.extend({
unhandledPromiseErrorMessage: '',
user: service(),
i18n: service(),
addContext() {
if (this == null) {
// eslint-disable-next-line
console.warn('logr cannot addContext because this is null/undefined, continuing without');
return;
}
let tagsContext = {
locale: this.get('i18n.locale'),
id: this.get('user.id'),
firstName: this.get('user.firstName'),
lastName: this.get('user.lastName'),
email: this.get('user.email')
};
// console.log('tagsContext', tagsContext);
// For some reason setUserContext was not working, but setTagsContext was,
// so I am using tags for all the user info. Maybe upgrading raven could fix this?
this.callRaven('setTagsContext', tagsContext);
// why use callRaven: https://github.com/damiencaselli/ember-cli-sentry/issues/58
},
// work around for unmerged PR:
// https://github.com/damiencaselli/ember-cli-sentry/pull/97
captureException(/* error */) {
if (this.get('isRavenUsable')) {
this.addContext();
window.Raven.captureException(...arguments);
} else {
Logger.debug(...arguments);
}
return true;
},
captureMessage(/* message */) {
if (this.get('isRavenUsable')) {
this.addContext();
window.Raven.captureMessage(...arguments);
} else {
Logger.debug(...arguments);
}
return true;
}
});
由于某种原因,观察员无法在我的日志服务中工作
附加说明:
- 使用ember cli deploy sentry插件,不要忘记将该配置放入
config/deploy.js
,而不是config/environment.js
要在某个应用程序路由挂钩中的某个位置触发错误,请执行以下操作:
setTimeout(() => {
// I was having some issue with `throw new Error()` so I did this instead
// It's actually just a better way to manually 'throw an exception'
// because it will not forcibly crash the application, but instead
// at least attempt to continue running
this.get('logr').captureException(new Error('sentry user context test'));
}, 10000);
- 别忘了设置
development:false
,让raven将此测试错误发送给sentry(除非您不是端到端测试)(我通常有以下设置:development:environment=='development'
在应用程序路由操作中,将其添加到错误操作处理程序:
error(error) {
// Trap unhandled failures during routing:
// Should maybe be handled by the sentry addon, but is not as of now:
// https://github.com/damiencaselli/ember-cli-sentry/issues/105
this.get('logr').captureException(error);
注意:在app route init hook中或之前调用logr.captureException(在raven设置之前)
error(error) {
// Trap unhandled failures during routing:
// Should maybe be handled by the sentry addon, but is not as of now:
// https://github.com/damiencaselli/ember-cli-sentry/issues/105
this.get('logr').captureException(error);