小程序异常监控收集

前言

你是否经常碰到业务反馈,线上的小程序某个页面打不开了,订单没法结算了,但是你当时测试的时候都是好好的。

由于线上环境复杂,一些问题只会在特定网络环境或者设备上发生,对于这类问题,异常信息的收集就显得格外重要了,我们不但希望收集错误的堆栈信息,还需要用户操作流程,设备信息等,以便复现错误。

简单收集

小程序App()生命周期里提供了onError函数,可以通过在onError里收集异常信息

App({
  // 监听错误
  onError: function (err) {
    // 上报错误
    wx.request({
      url: "https://url", // 自行定义报告服务器
      method: "POST",
      errMsg: err
    })
  }
})
复制代码

用户操作路径收集

一些较隐蔽的错误如果只有错误栈信息,排查起来会比较难,如果有用户操作的路径,在排查时就方便多了。

方法一:暴力打点方法收集

优点:简单直接

缺点:污染业务代码,造成较多垃圾代码

方法二:函数劫持(推荐使用)

需要在App函数中的onLaunch、onShow、onHide生命周期插入监控代码,我们通过重写App生命周期函数来实现。

App = function(app) {
    ["onLaunch", "onShow", "onHide"].forEach(methodName => {
        app[methodName] = function(options) {
          // 构造访问日志对象
          var breadcrumb = {
            type: "function",
            time: utils.now(),
            belong: "App", // 来源
            method: methodName,
            path: options && options.path, // 页面路径
            query: options && options.query, // 页面参数
            scene: options && options.scene // 场景编号
          };
          self.pushToBreadcrumb(breadcrumb); // 把执行对象加入到面包屑中
    })
}
复制代码

但是这样写,会把用户自定义的内容给覆盖掉,所以我们还需要把用户定义的函数和监控代码合并。

 var originApp = App // 保存原对象
 App = function(app) {
 	// .... 此处省略监控代码
 	// .... 此处省略监控代码
 	originApp(app) // 执行用户定义的方法
 }
复制代码

记录结果

可以从下面的json看出,用户到了detail页面,执行了onLoad => getDetail => onReady => buy 当执行buy方法的时候报错。

[{"method":"onLoad","route":"pages/film/detail","options":{"id":"4206"}},
{"method":"getDetail","route":"pages/film/detail","options":{"id":"4206"}},
{"method":"onReady","route":"pages/film/detail","options":{"id":"4206"}},
{"method":"buy","route":"pages/film/detail","options":{"id":"4206"}}]
复制代码

上报策略

考虑到在大型应用中,日志量比较大,我们采取抽样,合并,过滤三个方法减少日志的输出,代码实现可以参考lib/report.js

代码组织

项目使用rollup作为构建工作,实现ES6转ES5,模块加载功能。

项目目录如下:

config.js  // 配置文件
core.js	 // 劫持小程序核心代码
events.js  // 监听自定义事件
report.js // 上报类
utils.js // 工具类
复制代码

?喜欢的点个star:

https://github.com/zhengguorong/xbossdebug-wechat

参考资料

fundebug

前端异常监控系统落地

转载于:https://juejin.im/post/5b1794f16fb9a01e2a0e4b01

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
应用场景1、监听线上未知错误// 例如:调用错误 var result = {} console.log(result.data.msg) // 抛出错误2、记录用户操作路径,更方便重现错误小程序使用1、引入资源在app.js中加入dist目录下的xbossdebug.min.js,记得放在App对象上面var xbossdebug = require('xbossdebug.min.js') // 引用xbossdebug xbossdebug.config.key = 'maizuo' // key为自定义唯一值,用于后端记录时区分应用 xbossdebug.config.url = 'https://domain.com/'; // 上报服务端地址 // 可选参数 xbossdebug.config.setSystemInfo = true; // 获取系统信息 xbossdebug.config.setLocation = true; // 获取用户位置信息2、测试是否正常使用App({   onLaunch: function () {     xbossdebug.error('error')   } })3、控制台查看network,如果看到一个指向你配置url的请求,那就成功了。// 发送的结构如下 {     key: String // 应用唯一id     breadcrumbs: Array // 函数执行面包线,方便用于错误重现     error: String // 错误堆栈信息     systemInfo: Object // 用户系统信息     notifierVersion: String // 插件版本     locationInfo: Object // 用户位置信息 }高级配置如果你的应用日志量较大,可以通过以下参数合并日志和随机抽样。xbossdebug.config.random = 1 // 默认为1,表示100%上报,如果设置0.5,就会随机上报 xbossdebug.config.repeat = 5 // 重复上报次数(对于同一个错误超过多少次不上报) xbossdebug.config.mergeReport = true, // mergeReport 是否合并上报, false 关闭, true 启动(默认) xbossdebug.config.except = [ /^Script error\.?/, /^Javascript error: Script error\.? on line 0/ ], // 忽略某个错误二次开发1**、安装依赖**// 进入项目目录安装依赖 npm install // 安装rollup,用于js编译打包 npm install -g rollup2、开发模式 (监听代码变化,生成xbossdebug.js)npm run watch3、编译(生成xbossdebug.min.js)npm run build方案设计思想TODO服务端记录数据数据并可视化资源加载监控页面性能监控typescript版本✅自动化单元测试参考资料代码思想参考fundebug,如果大家觉得还不错,希望大家支持fundebug的saas服务。代码风格参考https://github.com/gomeplusFED/GER

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值