多端小程序监控方案
如果无法正常显示,请先停止浏览器的去广告插件。
1. 【第24期】线上保障专题
2. 【第4讲】小程序监控方案
分享嘉宾:刘敏-前端资深工程师
3. 目录
1. 业务背景 & 痛点
2. 业内小程序监控现状
3. 奥创小程序监控平台
4. 小程序监控SDK实现
5. 应用接入实践
6. 未来规划
分享人:余意
4. 业务背景
微信 百度 支付宝 QQ
字节 京东 360
2019年
首个微信小程序上线
各大产商纷纷发布了自己的
小程序平台
5. 一次线上问题定位分析
6. 一次线上问题定位分析
1
测试尝试复现
2 3 4
排查服务日志 微信小程序监控后台 手动打点上报
try {
...
var json=‘{“content":"品牌::宝马\n规车
点击多个帖子
} catch (error) {
型::宝马 1系\n行驶里程::8万公里\n”}’;
无法复现
使用不同手机
reportMonitor({
url,
无异常日志
json体含有特殊字符
联系用户
data,
error
})
存在JSON.parse异常
}
7. 复盘
由于平台、系统、机型、版本的兼容等问题,小程序出现线上问题排查困难!
• 线上白屏加载不出来数据是怎么回事?
• 线上代码质量如何,是否有bug?
• 线上出现问题,如何快速发现并解决?
• 对于多端小程序,如何更有效监控?
8. 业内小程序监控现状
小程序平台 js异常 http接口监控 用户行为记录 告警
微信 有 有统计,无详情 无 小程序助手
百度 有 (只有状态码) 无 无
头条 无 无 无 无
支付宝 有 有 无 360 有 有 无 邮件
京东 未知 未知 未知 未知
短信,邮件
分享人:余意
各平台监控能力不一致,考虑借助第三方监控平台的能力
9. 业内小程序监控现状
平台
脚本 网络
资源
下载 告警 平台
兼容 性能
访问 用户
行为 控制台 费用
Fundebug ✔ ✔ ✔ ✔ 微信
支付宝 无 ✔ 无 159/M
FrontJS ✔ ✔ ✔ ✔ 微信 ✔ 无 ✔ 899/M
多平台支持不满足业务场景 + 费用问题 -> 自
研
10. 奥创小程序监控平台_首页
11. 奥创小程序监控平台_列表
次数 错误类型 载体版本号 SDK版本 环境 时间
12. 奥创小程序监控平台_详情
13. 奥创小程序监控平台_系统架构
应用接入
数据清洗与存储
Kafka
各端SDK
采集异常
并上报
日志
平台
接收
数据服务
首页
ES
Node
Kafka
展示交互
MongoDB
定时任务
离线任务
日志分析
监控告警
列表
详情
14. SDK采集思路
小程序主要开发语言:JavaScript
小程序与普通网页开发的区别:
- 小程序中渲染线程和脚本线程独立
- 两大运行环境:IOS 和 Android 的微信客户端
15. SDK采集思路
SDK
16. SDK采集思路
程序注册
页面注册
API调用
17. API劫持方案
18. API劫持方案
19. API劫持方案
20. SDK业务架构
21. SDK上报模型
公共信息:
1. 系统信息(宿主版本、小程序基础库版本
、设备型号、设备品牌)
2. 用户信息
3. 网络状态
4. 场景值
异常信息:
1. JS异常:错误类型、堆栈信息
2. 接口日志:接口地址、状态码、异常响应信息
3. 资源异常
4. 性能日志:
[App纬度] 小程序初始化耗时、启动耗时
[Page纬度] 页面加载、显示、渲染耗时
5. 行为轨迹:
页面轨迹、函数调用轨迹、接口调用
22. 公共信息采集_常规思路
1. 用户信息获取: 3. 网络状态获取:
wx.getUserInfo() wx.getNetworkType()
2. 系统信息获取: 4. 场景信息获取:
wx.getSystemInfoSync() App.onLaunch()
23. 公共信息采集_多端兼容思路
const mp = MP.instance(); // 单例模式
用户信息获取:
ctx.getUserInfo()
系统信息获取:
ctx.getSystemInfoSync()
网络状态获取:
ctx.getNetworkType()
场景信息获取:
App.onLaunch()
-> mp.userInfo;
-> mp.systemInfo;
-> mp.networkInfo;
-> mp.sceneInfo;
24. 公共信息采集_多端兼容思路
当前页面路径信息获取:
其他端小程序:
getCurrentPages()
App.onLaunch: res
360小程序:
25. 公共信息采集_上报内容
26. 异常采集方案_多场景兼容
• 脚本异常
• 接口异常
• 资源异常
• …
分享人:余意
27. 脚本异常_常规思路
错误类型 类型错误
示例 a.b.toLowerCase
引用错误 语法错误 越界错误 URI 不正确 UnhandledRejection
a() function = 5 [].length = -5; decodeURI("%"); …
ReferenceError:
a is not defined SyntaxError:
Unexpected
token RangeError:
Invalid array
length URIError: URI
malformed UnhandledRejection
经常 偶尔 较少 较少 经常
TypeError: Cannot
错误信息
read property
'toLowerCase' of
undefined
发生频次
捕获方式
经常
App.onError
App.onUnhandledRejection
(各平台支持度不一致)
28. 脚本异常_常规思路
• App.onError
小程序发生脚本错误、
• App.onPageNotFound
页面路由不存在
API调用报错时触发
• App.onUnhandleRejection
微信: v2.10.0+ 支持onUnhandledRejection
QQ: 部分支持onUnhandledRejection
百度:不支持
头条:不支持
支付宝:v1.24.1+ 支持onUnhandledRejection 仅安卓
360:不支持
JD: 不支持
• App.onMemoryWarning
内存不足告警事件
29. 脚本异常_多端兼容思路
console.error()
小程序发生脚本错误、
API调用报错时触发、
Promise异常
自定义上报
30. 脚本异常_多端兼容思路
其他小程序:try..catch 包装 console.error(‘包装信息’ + new Error())
百度小程序:输出的时候将堆栈信息都转成了 string …
31. 脚本异常_上报内容
• ErrType
TypeError
ReferenceError
UnhandledRejection
RangeError
URIError
SyntaxError
32. 接口异常_常规思路
重写
wx.request
success:statusCode >=
400
fail:请求错误
33. 接口异常_多端兼容思路
微信小程序: wx.request()
百度小程序: swan.request()
头条小程序: tt.request()
支付宝小程序:my.request()
QQ小程序: qq.request()
360小程序: qh.request()
ctx.request()
分享人:余意
34. 接口异常_上报内容
35. 资源异常_多端兼容思路
重写
ctx.download
File
fail:资源下载错误
36. 资源异常_上报内容
37. 小程序加载过程
下载小程序包
启动小程序
解析app.json
注册App()
解析页面.json
渲染层.wxml
页面生命周期
逻辑层.js
加载页面
App生命周期
38. 性能采集_常规思路
微信
小程序
其他
小程序
wx.getPerformance()
• appLaunch: 小程序启动耗时
• firstRender: 页面首次渲染耗时
• evaluateScript: 注入脚本耗时
无
39. 性能采集_多端兼容思路
生命周期钩子
级别
说明
主流小程序 360小程
框架 序框架
onLaunch App级 监听小程序初始化 支持 onLoad
onShow App级 监听小程序启动或切前台 支持 支持
onLoad Page级 监听页面加载 支持 支持
onShow Page级 监听页面显示 支持 支持
onReady Page级 监听页面初次渲染完成 支持 支持
40. 性能采集方案_数据指标
应用级别性能
首屏时间
init
SDK初始化
onLaunch App级 监听小程序初始化
onShow App级 监听小程序启动或切前台
onLoad Page级 监听页面加载
onShow Page级 监听页面显示
onReady Page级 监听页面初次渲染完成
onHide Page级 监听页面隐藏
页面级别性能
页面加载耗时
页面显示耗时
分享人:余意
页面渲染耗时
页面加载耗时
41. 性能采集_Taro兼容
taro2.x 通过将React组件转化成小程序页面和组件
taro3.x 对外暴露小程序页面规范对象
分享人:余意
42. 性能采集_上报内容
43. 行为轨迹采集方案
• App函数堆栈
• Page函数堆栈
• HTTP请求堆栈
分享人:余意
44. 多端兼容核心实现
45. 小程序监控SDK_特性
多端、多框架适配
平台 微信
小程序 脚本异常 ✔ ✔ ✔ ✔ ✔ ✔ ✔
接口异常 ✔ ✔ ✔ ✔ ✔ ✔ ✔
资源异常 ✔ ✔ ✔ ✔ ✔ ✔ ✔
性能日志 ✔ ✔ ✔ ✔ ✔ ✔ ✔
行为轨迹 ✔ ✔ ✔ ✔ ✔ ✔ ✔
360
百度智能 字节跳动 支付宝小 QQ
小程序
小程序
程序
小程序 小程序
Taro
框架
46. 小程序监控SDK_特性
支持cmj、es模块化
轻量,49KB
47. 应用实践_快速接入
1. 安装依赖
npm i @mp-monitor --save
2. 在小程序管理后台配置对应的request合法域名
3. 在app.js中引用并初始化
a. 通过npm形式使用
b. 通过单文件形式使用
48. 应用实践_高阶用法
1. 自定义上报日志
2. 上报接口可配置
49. 应用实践_告警通知
短信
公众
号
邮件
50. 应用实践_异常监控
51. 应用实践_性能监控
考虑是否需要采用分包机制
52. 应用实践_数据统计
获取所有页面的PV
将PV等于0的页面代码移除
移除的路径做重定向处理
53. 未来规划
小程序异常采集SDK
• 开源
• 对接北斗
54.