【六】性能优化&前端监控_监控sdk的设计和实现

埋点协议

按照之前我们的设想,我们现在只需要一份埋点协议就可以完成这个性能监控 sdk 了;现在我们就来完成这个事情

埋点协议的设计

首先埋点协议这件事情是一件很严肃且复杂度较高的事情,这关系到我们 SDK 的应用场景,数据的清洗,数据的扩展等等问题,我们这里只是简单理一下思路,实际场景中协议肯定是要专门设计讨论的

首先我们埋点的参数可分为两类:

  1. 公参: 所有埋点携带的公共参数,用于串联数据以及描述基本的场景
  2. 私参: 具体到场景的参数,完全由用户输入自定义
js 复制代码
{
  // 公参
  sessionId: '', // 表示会话id,sdk 初始化时由服务器返回/sdk提供算法生成,这里要求 sessionId 具有唯一性;我们可以使用这个id来进行页面的漏斗分析
  ua: '', // user-agent
  url: '', // 页面当前的 url

  // 私参
  // 私参的设计有两种思路,1. 完全由用户自定义,但是限制参数数量和长度 2. 给点默认的 key,然后让用户去使用
  // 这里我们只定义一个 type 私参,然后所有的其他私参完全由用户自定义
  type: '', // 表示埋点的类型,pv|performance|interface|error|other
}

然后我们公参私参只是一个默认设置,允许用户在埋点的时候进行二次覆盖(兼容不同的场景)

这样我们就简单设计了一个协议

前端监控 sdk 的实现

基本架构

基于之前我们做的准备工作,我们的性能 sdk 基础架构为:

js 复制代码
class PerformaceOulaeSdk {
  constructor(obj) {
    // 单例对象的 cache
    this.i = undefined;
    // log promise 队列
    this.promiseCache = Promise.resolve();
    // 页面的会话id
    this.sessionId = undefined;

    // sdk 初始化函数
    this.init();
  }
  /**
   * 单例模式写法
   * @param  {...any} args
   * @returns
   */
  instance(obj) {
    this.i = this.i || new this(obj);
    return this.i;
  }
  /**
   * sdk 基础配置和公参的初始化
   */
  sdkLogInit() {
    let _resolve = undefined;
    let _reject = undefined;
    this.promiseCache = new Promise((resolve, reject) => {
      _resolve = resolve;
      _reject = reject;
    });

    // 这里假设我们的初始化流程是非常慢的,最起码需要 3 秒钟
    setTimeout(() => {
      this.sessionId = Math.random();
      _resolve();
    }, 3000);
  }
  init() {
    // 埋点 log 的初始化
    // sessionId 的初始化
    this.sdkLogInit();

    // TODO: 性能监控数据脚本初始化
    // TODO: 接口请求监控脚本初始化
    // TODO: 错误监控脚本初始化

    // TODO: 发送一个页面的pv点
  }
  log(...params) {
    this.promiseCache.then(() => {
      // 调用埋点
      // TODO: 将埋点发送给服务端
      console.log('成功发送一个埋点: ', params);
    });
  }
}

整个流程的交互为:

实现源码

实现的源码这部分其实很简单,只需要把我们之前完成的脚本嵌入到我们基本架构就可以了

实现源码

场景测试

测试方案: 暴力猴

这里我们使用掘金首页作为我们的测试场景, 下面是测试结果:

参考链接

系列&demo 相关

  1. github blog
  2. demos 仓库
  3. 浏览器渲染流程
  4. 测试 url - ieubs
  5. 测试 url - 交易猫

参考资料

  1. 深入了解前端监控原理
  2. 前端监控 SDK 的一些技术要点原理分析
  3. 腾讯二面:现在要你实现一个埋点监控 SDK,你会怎么设计?
  4. Displaying an error to users with a error boundary
相关推荐
下位子4 分钟前
『AI 编程』用 Claude Code 从零到一开发全栈减脂追踪应用
前端·ai编程·claude
tyro曹仓舒4 分钟前
Vue单文件组件到底需不需要写name
前端·vue.js
用户47949283569155 分钟前
面试官:讲讲2FA 双因素认证原理
前端·后端·安全
乐影5 分钟前
TS 模板字符串类型:从基础到进阶的类型编程魔法
前端·typescript
龙在天7 分钟前
CSS 属性值的计算与过程
前端
云鹤_7 分钟前
【Amis源码阅读】组件注册方法远比预想的多!
前端·低代码
xinfei9 分钟前
ES6 新特性 从 ECMAScript 2015(ES6)到 ECMAScript 2025
前端
GBVFtou12 分钟前
vue响应式 track 和trigger 过程
前端
Chan1620 分钟前
批处理优化:从稳定性、性能、数据一致性、健壮性、可观测性五大维度,优化批量操作
java·spring boot·后端·性能优化·java-ee·intellij-idea·优化
耀耀切克闹灬20 分钟前
生成tag号的脚本
前端