小程序性能Performance监控

背景

小程序通常运行在不同的平台(如微信、支付宝、百度等)且用户期望快速、流畅的体验,因此确保其性能表现成为开发者和运营团队的关键任务。性能监控的重要性:

  • 用户体验优化:用户对慢加载、卡顿或崩溃的小程序容忍度低,性能监控可以帮助及时发现并解决这些问题,提升用户体验。
  • 业务影响分析:性能问题直接影响到转化率、用户留存等关键业务指标,通过监控可以量化性能对业务的影响。
  • 资源优化:监控可帮助识别资源消耗过大的功能或代码段,指导开发者进行针对性优化,减少不必要的资源浪费。

性能指标收集

  1. 通过 wx.getPerformance 获取navigation、render、script、resource的资源类型数据。
export function usePerformance(config = {}) {
  if (wx.canIUse('getPerformance')) {

    const performance = wx.getPerformance()

    const performanceObserver = performance.createObserver((entryList) => {
      const entries = entryList.getEntries()

      // 获取性能信息
      entries.forEach((entry) => {
        // entryType:navigation、render、script、loadPackage、resource
        switch (entry.entryType) {
          case 'resource': // 收集图片信息
          	break
          case 'script': // 收脚本耗时信息
          	break
          case 'navigation': // 收集路由信息
          	break
          case 'render': // 收集渲染信息
            break
        }
      })
    })

    performanceObserver.observe({ entryTypes: ['render', 'resource', 'navigation', 'script'] })

  } else {
  	// ...
  }
}
  1. wx.getPerformance无法获取接口请求的信息,采用uni.addInterceptor拦截器,对uni.request进行拦截,通过请求拦截记录时间,响应拦截的时候再记录个时间,从而计算出耗时duration。
const collectApiLogMap = new Map()

export function useRequestLog() {
  uni.removeInterceptor('request')

  // 拦截器:https://uniapp.dcloud.net.cn/api/interceptor.html
  uni.addInterceptor('request', {
    invoke(config) {
      const startTime = Date.now()
      const requestId= `${UUID()}-${startTime}`

      config.header.requestId= requestId

      collectApiLogMap.set(requestId, { startTime })
    },
    complete(...args) {
      const [res, config] = args as any;

      if (res.statusCode === 200) {
        // 收集成功响应信息
        // collectResponse({ config, ...res })
      } else {
        // 收集错误响应信息
        // collectError({ config, ...res })
      }
    }
  })
}

数据呈现

  1. 通过上面的方式,可以收集到小程序中的路由、渲染、资源加载耗时指标,以及接口耗时时长
  2. 收集后,通过接口上报到内部日志平台(如:kibana)
  3. 再结合grafana进行数据查询及可视化

各页面FCP值图:
在这里插入图片描述

总结

本次仅作为参考,记录实践的过程。

核心代码参考,执行 npm install log-sdk-miniprogram 可了解部分源码

  • 4
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 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、付费专栏及课程。

余额充值