WebTracing:如何使用一款SDK实现前端全链路监控

简介: WebTracing:如何使用一款SDK实现前端全链路监控

引言

在产品的开发和运营过程中我们经常会遇到一些问题,如用户反馈说无法对某某商品下单,而另一位负责运营的同事也提到某某广告在手机上打不开。尽管这些问题被多次报告,但我们却难以复现这些故障,这让团队感到十分棘手。如何有效地记录项目中的错误并能够重现这些问题,正是我们需要通过监控平台来解决的关键痛点之一。

WebTracing是一款专为前端项目量身定制的 JavaScript埋点 SDK,它提供了完善的前端监控手段和解决方案。通过集成行为追踪、性能监测、异常捕获、请求记录、资源管理、路由监控、曝光分析以及录屏功能,让数据驱动决策变得更加直观和高效。

作者的目标是减轻前端开发者在监控方面的工作负担。致力于为各种场景提供全面的解决方案,并希望开发者能从项目中获得一些启发。

安装


// 核心实现包 - js
pnpm install @web-tracing/core
// vue2版本
pnpm install @web-tracing/vue2
// vue3版本
pnpm install @web-tracing/vue3

html 安装


<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
  </head>
  <script src="https://cdn.jsdelivr.net/npm/@web-tracing/core"></script>
  <script>
    webtracing.init({
      appName: 'cxh',
      debug: true,
      pv: true,
      performance: true,
      error: true,
      event: true,
      cacheMaxLength: 10,
      cacheWatingTime: 1000,
      userUuid: 'init_userUuid',
      scopeError: true,
      ...
    })
  </script>
  <body></body>
</html>

Vue2 安装


import WebTracing from '@web-tracing/vue2'
Vue.use(WebTracing, {
  dsn: '/trackweb',
  appName: 'cxh',
  ...
})

Vue3 安装


import WebTracing from '@web-tracing/vue3'
app.use(WebTracing, {
  dsn: '/trackweb',
  appName: 'cxh',
  ...
})

介绍

这里以作者提供的 Vue2示例项目来演示:

地址:github.com/M-cheng-web…

将示例项目 clone到本地安装


pnpm install
pnpm run start

开启 node服务


node server.js

打开示例项目首页

image.png

image

该项目是一个前端监控解决方案,它使用 Monorepo + pnpm 的构建方式,支持多包联调和发版,并且提供钩子函数、批量如何错误(去重)、抽样发送、过滤等能力。

配置项

名称 类型 必填 默认值 说明
dsn string - 上报地址
appName string - 应用名称
appCode string - 应用code
appVersion string - 应用版本
userUuid string - 用户id
debug boolean false 是否开启触发事件时控制台输出
recordScreen boolean false 是否开启录屏功能
pv object/boolean false 见下方 pv 解释
performance object/boolean false 见下方 performance 解释
error object/boolean false 见下方 error 解释
event object/boolean false 见下方 event 解释
ext object undefined ��定义的全局附加参数
tracesSampleRate number 1 抽样发送(0-1)
cacheMaxLength number 5 上报数据最大缓存数
cacheWatingTime number 5000 上报数据最大等待时间(ms)
ignoreErrors Array<string/RegExp> [] 错误类型事件过滤
ignoreRequest Array<string/RegExp> [] 请求类型事件过滤
scopeError boolean false 开启范围错误
localization boolean false 是否本地化
sendTypeByXmlBody boolean false 是否强制指定发送形式为xml,body请求方式
beforePushEventList function - 添加到行为列表前的 hook
beforeSendData function - 数据上报前的 hook
afterSendData function - 数据上报后的 hook

事件采集

项目的基本原理包括自动和手动两种采集方式,自动采集通过劫持或监听浏览器事件来获取错误、性能和页面跳转等信息;手动采集则是通过调用 SDK暴露的方法来触发事件采集。

image.png

image

事件对象具体属性如下:

属性名称 说明
eventId 详见下面的采集规则 事件ID
eventType click 事件类型
title 详见下面的采集规则 事件名
triggerPageUrl 当前页面URL
params 详见下面的采集规则 事件参数
elementPath 例如: div>div>button 被点击元素的层级
triggerTime 事件发生时间
sendTime 发送时间
x 见下方 被点击元素与屏幕左边距离
y 见下方 被点击元素与屏幕上边距离

插件会根据 DOM元素上一些属性来获取需要采集该元素的事件,以及采集该元素事件时应该传递哪些参数

属性名称 说明
data-warden-container 该元素作为采集容器,内部的需要采集的元素上如果没有这些属性会使用容器上的属性作为填充
data-warden-event-id 元素上标记事件的eventId,会作为传给后台的eventId
data-warden-title 元素上标记事件的title,也可以使用原生的title属性,都会作为传给后台的title
data-warden-* 其他的属性都会被当作参数,例如 data-warden-name="a" 会被收集为

事件示例


<div
  class="box-div"
  data-warden-title="xxx"
  data-warden-bigTitle="bigTitle"
  width="100%"
>
  示例div
</div>

点击事件示例div产生如下对象


{
  eventId: 'div',
  eventType: 'click',
  title: 'xxx',
  triggerPageUrl: 'http://localhost:6656/#/event',
  x: 280,
  y: 20,
  params: { bigtitle: "bigTitle" }
  elementPath: 'div',
  triggerTime: 1689726300399,
  sendTime: 1689726301406
}

错误采集

页面错误自动收集,主要原理是 监听/劫持 error unhandledrejection console.error,采集这三类错误

资源加载错误,代码异常(error) promise调用链异常(reject) console.error异常

image.png

image

我们主动触发了代码错误,可以在控制台看到的报错,然后被 webTracing事件采集

触发错误事件时生成的对象

属性名称 说明
eventId code / HTML元素上发生异常则为元素名 事件ID
eventType error 事件类型
triggerPageUrl 当前页面URL
errMessage 错误信息
errStack 完整的错误信息
line 错误信息发生在第几行
col 错误信息发生在第几列
recordscreen 错误录屏数据
params 主动方法触发错误收集可以带参数
sendTime 发送时间
triggerTime 事件发生时间

将配置项中的 scopeError 设置为 true 可对错误事件去重。

此外还包括资源监听、路由采集、请求采集、资源采集、曝光采集,由于篇幅原因这里就不一一展开介绍,大家感兴趣可以去官网自行查阅。

image.png

image

其他核心介绍

数据流向方面,监听到的事件会经过预处理并生成描述事件信息的对象,然后放入列表中等待统一发送。发送数据时,会根据最大缓存数和延迟发送事件时长的设置来决定何时发送数据,支持多种发送方式,包括 navigator.sendBeaconimageXML,以及本地化存储和自定义发送方式。

SDK还提供了丰富的导出项,包括钩子函数和可动态更改的内部 options 对象,以方便开发人员自定义功能,如加密传输、发送事件后的提醒、配置项更改和获取基础数据等。

此外,项目还定义了事件类型和事件ID的枚举,以及用于标识用户和细分业务的特殊标识,如 pageIdsessionIddeviceIdappNameappCode

未来计划

作者提出会写一套服务端(nest) + 后台查看监控数据平台(vue),有以下几点考量

提供服务端能力(目前只是在采集端发力) 可以在线体验此项目 提供更多示例代码给开发们,再次降低这一套代码在公司的推广难度 作者也想站在业务的角度多思考还能从哪些方面此项目还缺失哪些功能

总结

附上github地址:github.com/M-cheng-web…

我们了解到 WebTracing是一款优秀的埋点项目,并提供了多种监控手段,帮助我们对页面交互和用户操作进行分析。

WebTracing提供了原生、Vue2Vue3等多种安装方式供我们使用。

它的主要功能包括事件采集、错误采集、路由采集、请求采集、资源采集、曝光采集等。



相关文章
|
18天前
|
缓存 监控 前端开发
基于 CoffeeScript 的内网管理监控软件前端代码优化
本文探讨了基于CoffeeScript的内网管理监控软件前端代码优化方法,包括数据请求缓存、界面更新采用虚拟DOM技术以及增强错误处理机制,旨在提升软件性能、响应速度和用户体验。
28 4
|
17天前
|
监控 前端开发 JavaScript
OCamlScript 用于局域网电脑监控软件前端开发的探索
在数字化时代,局域网电脑监控软件广泛应用于企业管理和教育机构。OCamlScript 作为新兴技术,在此类软件的前端开发中展现出独特潜力,特别是在网络请求、界面更新及用户交互处理方面。通过合理利用其特性,可构建高效稳定的前端应用,提升用户体验,具有广阔的应用前景。
31 9
|
2月前
|
Web App开发 前端开发 安全
前端研发链路之测试
本文由前端徐徐撰写,介绍了前端测试的重要性及其主要类型,包括单元测试、E2E测试、覆盖率测试、安全扫描和自动化测试。文章详细讲解了每种测试的工具和应用场景,并提供了选择合适测试策略的建议,帮助开发者提高代码质量和用户体验。
43 3
前端研发链路之测试
|
2月前
|
资源调度 前端开发 JavaScript
前端研发链路之脚手架
本文首发于微信公众号“前端徐徐”。文章介绍了前端开发中脚手架工具的重要性及其工作原理。脚手架工具能够大幅提升开发效率,确保代码质量和项目一致性。文章详细探讨了脚手架的历史、工作原理、常见工具及其优势与潜在问题,并展望了其未来发展方向,帮助开发者更好地理解和应用脚手架工具。
61 4
前端研发链路之脚手架
|
2月前
|
负载均衡 前端开发 JavaScript
前端研发链路之开发
本文首发于微信公众号“前端徐徐”,作者徐徐。文章介绍了前端研发链路中的开发部分,重点探讨了开发服务器(dev-server)、热更新(hot-reload)、数据模拟(mock)和代理(proxy)等关键技术,帮助开发者理解其基本原理和应用场景,提升开发效率和代码质量。
39 2
前端研发链路之开发
|
2月前
|
敏捷开发 前端开发 Devops
前端研发链路之 CI/CD
本文首发于微信公众号“前端徐徐”,作者徐徐介绍了前端研发链路中的CI/CD。文章从CI/CD的背景、意义、运作方式及常用工具等方面进行了详细探讨,帮助读者理解如何在前端开发中有效应用CI/CD,提升开发效率和产品质量。
55 1
前端研发链路之 CI/CD
|
2月前
|
前端开发 JavaScript 编译器
前端研发链路之构建
本文首发于微信公众号“前端徐徐”,作者徐徐探讨了前端研发链路中的构建过程。文章介绍了构建器、JavaScript编译器和CSS编译器的作用及常见工具,详细解析了它们如何协同工作,提高开发效率和项目可维护性。适合前端开发者阅读,帮助理解现代前端构建体系。
23 1
前端研发链路之构建
|
2月前
|
前端开发 JavaScript 测试技术
前端研发链路之代码规范
大家好,我是徐徐。本文将探讨前端研发链路中的代码规范,包括业界流行规范、CSS命名规范和相关工具。通过保持代码整洁和一致性,不仅能提高团队协作效率,还能减少错误,提升开发质量。文中详细对比了几种常见的代码规范和工具,如 Airbnb Style Guide、BEM、Eslint 和 Prettier,并展望了未来代码规范的发展趋势。希望对大家有所帮助。
94 1
前端研发链路之代码规范
|
2月前
|
缓存 资源调度 前端开发
前端研发链路之包管理器
本文首发于微信公众号“前端徐徐”。作者徐徐将探讨前端研发链路中的包管理器,分析 Npm、Yarn 和 Pnpm 的特点与应用场景,帮助开发者选择最适合项目的包管理工具,提升开发效率和项目稳定性。文章涵盖包管理器的基本概念、解决的问题、组成部分及各工具的优缺点对比。
41 2
|
2月前
|
缓存 JavaScript 前端开发
拿下奇怪的前端报错(三):npm install卡住了一个钟- 从原理搞定安装的全链路问题
本文详细分析了 `npm install` 过程中可能出现的卡顿问题及解决方法,包括网络问题、Node.js 版本不兼容、缓存问题、权限问题、包冲突、过时的 npm 版本、系统资源不足和脚本问题等,并提供了相应的解决策略。同时,还介绍了开启全部日志、使用替代工具和使用 Docker 提供 Node 环境等其他处理方法。
1195 0