[转] vue前端异常监控sentry实践
1. 监控原理
1.1 onerror
传统的前端监控原理分为异常捕获和异常上报。一般使用onerror捕获前端错误:
window.onerror = (msg, url, line, col, error) => {
console.log('onerror')
// TODO
}
1.2 promise
但是onerror事件无法捕获到网络异常的错误(资源加载失败、图片显示异常等),例如img标签下图片url 404 网络请求异常的时候,onerror无法捕获到异常,此时需要监听unhandledrejection。
window.addEventListener('unhandledrejection', function(err) {
console.log(err)
})
1.3 上报
捕获的异常如何上报?常用的发送形式主要有两种:
- 通过 ajax 发送数据(xhr、jquery...)
- 动态创建 img 标签的形式
function report(error) {
var reportUrl = 'http://xxxx/report'
new Image().src = reportUrl + '?error=' + error
}
1.4 使用sentry
sentry是一套开源的强大的前端异常监控上报工具,官网地址:https://sentry.io,官方提供了如何搭建sentry服务,此处略过安装流程,直接使用已有的服务。
1.5 与vue结合
针对vue,sentry官方推荐使用raven配合sentry进行异常捕获和上报。而在vue中,vue提供了错误捕获方法vue error handler,官方也推荐使用错误追踪服务 sentry 并通过vue error handler选项提供了官方支持。
2. 安装raven
raven是sentry官方针对vue推荐的插件,yarn安装raven-js即可。
$ yarn add raven-js
3. 初始化sentry
初始化引入Vue、Raven、RavenVue即可,sentry能主动监听上报错误。
import Raven from 'raven-js'
import RavenVue from 'raven-js/plugins/vue'
const dsn = 'https://<key1>@sentry.io/<key2>'
Raven.config(dsn).addPlugin(RavenVue, Vue).install()
4. 手动上报
对于一些其他信息,如提示日志等,无法自动捕获,需要手动进行上报。
log (data = null, type = 'error', options = {}) {
// 添加面包屑
Raven.captureBreadcrumb({
message: data,
category: 'manual message'
})
// 异常上报
if (data instanceof Error) {
Raven.captureException(data, {
level: type,
logger: 'manual exception',
tags: { options: options }
})
} else {
Raven.captureException('error', {
level: type,
logger: 'manual data',
extra: {
data: data,
options: this.options,
date: new Date()
}
})
}
}
5. 封装异常上报类 Report.js
针对上述内容,封装异常上报类Report,使用单例模式,避免监控类重复实例化。
/**
* by csxiaoyao
* 2019.03.17
* sunjianfeng@csxiaoyao.com
*/
import Raven from 'raven-js'
import RavenVue from 'raven-js/plugins/vue'
class Report {
static dsn = 'https://<key1>@sentry.io/<key2>'
constructor (Vue, options = {}) {
if (process.env.NODE_ENV === 'production') { // TODO }
this.Vue = Vue
this.options = options
}
/**
* 单例模式
*/
static getInstance (Vue, options) {
if (!(this.instance instanceof this)) {
this.instance = new this(Vue, options)
this.instance.install()
this.instance.registerError()
}
return this.instance
}
/**
* init
*/
install () {
Raven.config(Report.dsn, {
release: '1.0.0',
environment: 'production'
// whitelistUrls: [/localhost/, /test\.oa\.com/]
}).addPlugin(RavenVue, this.Vue).install()
// 记录用户信息
Raven.setUserContext({
user: this.options.user || ''
})
// 设置全局tag标签
Raven.setTagsContext({ environment: this.options.env || '' })
}
/**
* 注册全局错误处理
*/
registerError () {
// 监听error
window.onerror = (msg, url, line, col, error) => {
console.log('onerror')
if (msg !== 'Script error.' && !url) {
return true
}
setTimeout(() => {
let data = {}
col = col || (window.event && window.event.errorCharacter) || 0
data.url = url
data.line = line
data.col = col
data.error = error
if (&& error.stack) {
data.msg = error.stack.toString()
}
this.log(data)
}, 0)
return true
}
// 监听promise
window.addEventListener('unhandledrejection', err => {
console.log('unhandledrejection')
setTimeout(() => {
this.log(JSON.stringify(err))
}, 0)
})
}
/**
* 主动上报
* type: 'info','warning','error'
*/
log (data = null, type = 'error', options = {}) {
// 添加面包屑
Raven.captureBreadcrumb({
message: data,
category: 'manual message'
})
// 异常上报
if (data instanceof Error) {
Raven.captureException(data, {
level: type,
logger: 'manual exception',
tags: { options: options }
})
} else {
Raven.captureException('error', {
level: type,
logger: 'manual data',
extra: {
data: data,
options: this.options,
date: new Date()
}
})
}
}
}
export default Report
6. 调用 Report.js 类
main.js中引入Report类,并绑定实例化后的sentry实例到Vue上以便全局调用。
import Report from '@/assets/Report'
let sentry = Report.getInstance(Vue, {})
Vue.prototype.$sentry = sentry // 设置全局变量
在其他的vue组件中手动上报日志。
this.$sentry.log('test')
7. sourceMap
sentry针对压缩过的js文件提供了sourceMap分析,只需要上传版本对应的sourceMap,就可以在错误日志中查看对应的源码信息。详细方法见官方文档:https://docs.sentry.io/clients/javascript/sourcemaps/(https://docs.sentry.io/clients/javascript/sourcemaps/)
转自:https://cloud.tencent.com/developer/article/1404307
[转] vue前端异常监控sentry实践的更多相关文章
- 业务线接入前端异常监控sentry
1.前端异常处理的框架对比 是否开源 收费 语言 监控范围 sentry 是 自己搭建服务器(免费)价格 英文 Angular.AngularJs.Backbone.Ember.JavaScrip ...
- 从无到有<前端异常监控系统>落地
导火索 有一天一个测试同事的一个移动端页面白屏了,看样子是页面哪里报错了. 我自己打开页面并没有报错,最后发现报错只存在于他的手机,移动端项目又是在微信环境下,调试起来会比较麻烦,最后用他手机调试才 ...
- Fundebug前端异常监控插件更新至2.0.0,全面支持TypeScript
摘要: 是时候支持TS了! Fundebug前端异常监控服务 Fundebug提供专业的前端异常监控服务,我们的插件可以提供全方位的异常监控,可以帮助开发者第一时间定位各种前端异常,包括但不限于Jav ...
- 前端异常监控 - BadJS
前端异常监控 - BadJS 简介:BadJS 是 web 前端异常监控解决方案,提供一种 web 页面的脚本错误监控.上报.统计.查看等系统化的跟踪解决方案.目前BadJS覆盖了腾讯课堂.公众号.邮 ...
- Fundebug前端异常监控插件更新至 1.9.0,支持监控 HTTP 慢请求
摘要: 1.9.0新增 httpTimeout 配置选项,支持监控 HTTP 慢请求,同时修复了记录的 HTTP 响应时间偏小的 BUG. Fundebug提供专业的前端异常监控服务,可以第一时间捕获 ...
- Vue 前端配置多级目录实践(基于Nginx配置方式)
前情提要 有阵子没更新博客了,因为快年结了工作比较多,这不,最近公司的对外演示环境出现问题这个活儿也落到了我的头上-- 事情是这样的,原来演示环境有很多服务,每个服务都是对外单独开一个端口,比如 ht ...
- 【原】聊聊js代码异常监控
在平时的工作,js报错是比较常见的一个情景,尤其是有一些错误可能我们在本地测试的时候测试不出来,当发布到线上之后才可以发现,如果抢救及时,那还好,假如很晚才发 现,那就可能造成很大的损失了.如果我们前 ...
- 前端性能监控方案window.performance 调研(转)
1. 业界案例 目前前端性能监控系统大致为分两类:以GA为代表的代码监控和以webpagetest为代表的工具监控. 代码监控依托于js代码并部署到需监控的页面,手动计算时间差或者使用浏览器的的API ...
- vue+sentry 前端异常日志监控
敲代码最糟心不过遇到自己和测试的环境都OK, 客户使用有各种各样还复现不了的问题,被逼无奈只能走到这一步:前端异常日志监控! vue官方文档如下推荐: 就是说, vue有错误机制处理errorHand ...
随机推荐
- 英语JASPERITE碧玉Jasperite单词
碧玉为一种含矿物质较多的和田玉,其中氧化铁和粘土矿物等含量可达20%以上,不透.微透或半透,颜色多呈暗红色.绿色或杂色. 中文名碧玉 外文名Jasper,Jasperite 别 称玛钠斯玉 类 别按颜 ...
- OpenStack Train版 简单部署流程
environment 1.网络平面 management(管理网络)→软件安装,组件通信 provider(提供实例网络)→:提供者网络:直接获取ip地址,实例之间直接互通 自服务网络(私有网络 ...
- 虚拟机中的jenkins无法访问&Nginx配置
虚拟机中安装了Gitlab,gitlab中也有nginx,导致端口冲突,用curl显示连接已被重置 一开始发现jenkins在本地可以访问,外网无法访问,本想通过nginx进行反代,实现访问,可是访问 ...
- 201871010108-高文利《面向对象程序设计(java)》第十三周学习总结
项目 内容 这个作业属于哪个课程 <任课教师博客主页链接> https://www.cnblogs.com/nwnu-daizh/ 这个作业的要求在哪里 <作业链接地址> ht ...
- volatile关键字及Java内存模式
参考文档:https://www.cnblogs.com/_popc/p/6096517.html volatile关键字虽然从字面上理解起来比较简单,但是要用好不是一件容易的事情.它与Java的内存 ...
- spring cloud各个微服务之间如何相互调用(Feign、Feign带token访问服务接口)
1.首先先看什么是Feign. 这里引用“大漠知秋”的博文https://blog.csdn.net/wo18237095579/article/details/83343915 2.若其他服务的接口 ...
- BZOJ 4491: 我也不知道题目名字是什么 线段树+离线
code: #include <string> #include <cstring> #include <cstdio> #include <algorith ...
- Windows下找到JVM占用资源高的线程
与linux下top命令直接显示进程下线程资源占用不同,Windows下默认任务管理器只能显示出进程的资源占用,jconsle等工具也只能显示出java进程资源占用,无法显示出进程能具体线程的资源占用 ...
- Linux基于FPM制作RPM包(以Nginx为例)
1.搭建Epel Yum源 安装在线yum源 [root@localhost ~]# rpm -ivh epel-release-latest-.noarch.rpm //安装扩展源 [root@ ...
- DP问题(1) : hdu 2577
题目转自hdu 2577,题目传送门 题目大意: 现给你n个区分大小写的字符串,大小写可用Caps Lock和shift切换(学过计算机的都知道) 但是有一点需要注意(shift是切换,若现在是大写锁 ...