【前端】前端监控体系

news2024/12/23 15:25:56

文章目录

    • 一、所需的数据
      • 1.1、生命周期数据
      • 1.2、HTTP测速数据
      • 1.3、系统异常数据
      • 1.4、用户行为数据
      • 1.5、用户日志
    • 二、埋点与收集
      • 2.1、数据埋点
      • 2.1、数据上报
      • 2.3、数据监控

对于一个应用来说,除了前期的开发和设计,在项目上线后端维护很重要,其中就包括监控体系的搭建。
系统需要具备发布灰度过程中的监控以及用户问题的反馈和定位等能力。
这些问题可以从2个点解决:数据采集 和 数据上报与监控

  • 一般来说我们之所以要搭建前端监控体系,主要是为了解决2个问题:
1. 如何及时发现问题?
2. 如何快速定位并解决问题?
  • 主要是通过对以下信息的观察:
- 页面的整体访问情况,包括常见的PVUV、用户操作行为
- 页面的性能情况,包括页面加载耗时、接口耗时等各项数据统计
  • 最有效的解决方案:
- 对相似的问题进行归类
- 思考这类问题出现的原因有哪些
- 尝试从源头组织他们的出现

一、所需的数据

  • 系统的质量主要看这三方面:
- 页面访问速度
- 页面稳定性/异常
- 外部服务调用情况
  • 我们所要关注的数据主要是这这个
1. 系统的生命周期数据:可用于观察页面性能情况、整体访问情况等
2. HTTP测速数据:可用于观察外部服务调用情况、页面性能优化等
3. 系统异常数据:可用于观察系统稳定性、系统异常问题
4. 用户行为数据:可用于观察页面稳定性,整体访问情况等
5. 用户日志:用于进行用户反馈的问题排查

1.1、生命周期数据

  • 前端应用的生命周期指页面加载的关键时间点
  • 通常包括页面打开、更新、关闭等耗时数据
  • 通过PerformanceTiming 属性中获取到一些生命周期相关的数据
- 用于页面跳转:navigationStart、unloadEventStart、unloadEventEnd等
- 用于页面加载:domloading、domInteractiv、loadEventStart、loadEventEnd、domcontentLoadedEventStart、domContentLoadedEventEn
- 获取页面关键加载点:通过document的DOMcontentLoaded、readystatechange等事件
  • 但是由于框架的使用,页面的渲染过程、页面间的切换等逻辑都交给了框架进行控制
// 以vue的生命周期为例
- beforeCreate、created
- beforeMount、mounted
- beforeUpdate、updated
- beforeDestroy、destroyed
  • 除了框架的生命周期以外,我们还可以使用MutationObserver接口,提供了监听页面DOM树变化的能力
// 注册监听函数
const observer = new MutationObserver((mutations)=>{
	console.log(`时间:${performance.now()}`,DOM树发生了变化:)
	mutations.forEach(item=>{
		console.log(item.type)
	})
})
// 开始监听
observer.observe(document,{
	childList: true,
	subtree: true,
})

1.2、HTTP测速数据

  • HTTP 请求相关的数据,同样可以通过PerformanceTiming属性获取,包括HTTP跳转开始/结束、域名查询开始/结束等各种时间戳
  • 通过这些数据我们可以观察后端服务是否稳定,是否还有优化空间。

1.3、系统异常数据

  • 常见的前端异常有:
1. 逻辑错误:开发实现功能的时候,逻辑梳理不符合预期
2. 代码健壮性:代码边距情况考虑不周,异常逻辑执行错误
3. 网络错误:用户网络异常、后台服务异常等错误
4. 系统错误:代码运行环境兼容性问题导致出错
5. 页面内容异常:缺少内容、绑定事件异常、样式异常等
  • 前面4种异常可以使用以下方法拦截
- window.onerror:获取项目中的错误和分析堆栈,将错误信息自动上报到后台服务中
- document.addEventlistener(err)
- XMLHttpRequest status
  • 第5种异常
- 可观察页面中用户操作的数据、页面访问的数据是否异常。
- 一般情况下,可以通过回归测试,UI界面测试等方式在上线前进行避免

1.4、用户行为数据

  • 用户行为数据一般指:
- 页面浏览量或点击量
- 用户在每一个页面的停留时间
- 用户通过什么入口来访问的该页面
- 用户在页面中的一些操作行为
  • 主要用来:
- 行为数据的统计可以用来监控页面的功能是否正常
- 针对性的调整页面功能,更好的发挥页面的作用
- 统计出用户在时间轴上的操作顺序,以及每个步骤的操作时间、操作内容等
- 通过可视化系统直观的展示用户的链路情况
- 用户链路相关信息还可以用来点位问题,比如配合用户日志进行分析

1.5、用户日志

  • 当系统出现异常,我们一般会使用日志进行定位,需要提前在代码中打印日志,否则当我们需要定位问题的时候,才发现我们没有输出相关日志。
  • 有些问题由于复现困难,在后续补上日志发布后也未必能够复现,这样就比较被动。
  • 这种前端可以通过提前添加装饰器:

在这里插入图片描述

  • 比如在每个功能模块运行时,通过约定的格式来打印输入参数、执行信息、输出参数
    在这里插入图片描述
  • 系统运行所输出的日志可以通过2种方式存放
1. 上报到服务器:
- 由于日志内容很多,如果全量上报到服务器会导致存储成本过大,同时频繁的上报也会增加接口的维护成本
- 除此之外,由于网络原因等还可能导致部分或全部的日志丢失等问题
2. 本地存储:
- 该方案需要引导用户手动操作提交本地日志、或者通过服务端下发配置自动上传,才可以获取到日志内容,从而可以进行具体的问题定位;
- 如果无法联系用户,或者缓存被清理的情况下,则可能由于异常无法重现无法修复。
  • 在资源运行的情况下也可以两种方式配合一起使用

二、埋点与收集

2.1、数据埋点

  • 通常情况下我们会根据使用场景来将这些方案配合使用
  • 不管使用哪种埋点方式,我们都需要对数据进行标准化处理
  • 也需要将采集的数据,按照服务端约定好的协议格式进行转换
  • 配合本地缓存的方式,将数据进行缓存,在应用恢复的时候进行数据的上报
埋点方案使用方式自定义数据业界成熟产品更新代价使用成本
代码埋点手动编码可自定义友盟、百度统计等第三方数据统计服务商需要版本更新
可视化埋点可视化圈选较难自定义Mixpanel需要下发配置
无痕埋点嵌入SDK难以自定义GrowingIO不需要

2.1、数据上报

  • 数据上报示意图:
    在这里插入图片描述
  • 为了避免数据的上报过于频繁,增加服务端压力,我们可以在本地进行数据的整合(比如通过队列或数组的形式)
  1. 定期定量的上报
- 过于频繁的请求可能会影响到用户其他正常请求的体验,通常我们需要将收集到的数据存储到本地。
- 当收集到一定数据之后再打包一次性上报,或者按照一定的频率打包上传
- 打包上传将多次数据合并为一次,就可以减轻服务器的压力
  1. 关键生命周期上报
    通过关键点监听这些事件,获取相关数据,并进行标准化处理后,上报到服务端
    在这里插入图片描述
  2. 用户主动提交
- 当用户触发上传的操作后,可以将本地的数据和日志一并进行提交
- 系统生命周期相关数据、系统错误数据、用户行为数据等需要及时的进行上报
- 用户主动提交的行为可能更适合日志的上报

2.3、数据监控

通过对监控数据、配置告警阈值等方式,结合邮件、机器人等方式推送到相关的人员

  • 通过上报的页面整体情况和用户行为数据:
- 实时对各个操作信息进行分析,得到用户的操作链路
- 每个页面和功能操作步骤间的耗时和转换率,并进行有效的监控
- 当页面出现异常的时候,可以及时的发现,并进行告警,从而快速的解决问题
  • 前端监控在发布和灰度的过程中也发挥着极其重要的作用
- 对于链路复杂的前端应用,通过开发自测的方式保证功能是否正确是很低效的
- 人工测试也常常无法覆盖到所有的功能跟各个链路的分支
- 同时自动化测试也常常因为性价比等问题无法做到完善
- 因此在新版本上线时,除了对改动相关的功能进行自测,并使用自动化测试进行回归测试之外
- 我们还可以在上报数据的时候,更新当前系统的版本号,发布过程中,可以根据版本号来区分各个版本的曲线情况
  • 在灰度过程中,我们可以关注以下信息
- 错误告警是否有新增错误,可通过错误内容找到报错位置修复
- 全版本监控观察:整体的功能点覆盖曲线是否正常,是否有异常涨跌
- 分版本监控观察:新版本是否所有功能都能正常访问、灰度占比是否正常,新旧版本的转换率是否一致

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/66774.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Docker 讲解与基本操作

哈喽~大家好,这篇来看看Docker 讲解与基本操作。 🥇个人主页:个人主页​​​​​ 🥈 系列专栏:【微服务】 🥉与这篇相关的文章: SpringCloud Sentinel 使用Spr…

最优化方法——QR分解

目录 系列文章目录 一、问题 二、实验思路综述 1.实验工具及算法 2.实验数据 3.实验目标 4.实验步骤 三、相关线性代数知识导入 1.线性无关与基 2.标准正交 3.Gram-Schmidt(正交化)算法 四、QR分解 1.Gram-Schmidt QR 1.1 算法原理 1.2 算法流程 1.3 复杂度分析…

JSP连接MySQL数据库

✅作者简介:热爱国学的Java后端开发者,修心和技术同步精进。 🍎个人主页:Java Fans的博客 🍊个人信条:不迁怒,不贰过。小知识,大智慧。 💞当前专栏:JAVA开发者…

Allegro如何设置走线禁布区操作指导

Allegro如何设置走线禁布区操作指导 Allegro可以任意设置走线的禁布区,以下图为例,需要在两个pin中间设置一个所有层都不能走线的禁布区域 具体操作如下 选择shape Add Rect命令 Option选择画在Route keepout-All层,type选择Static solid 鼠标移动到器件pad附近,右击会…

JavaScript -- Map对象及常用方法介绍

文章目录Map1 Map介绍2 创建一个Map3 常用方法介绍4 将Map转换为数组5 从数组构建Map6 遍历MapMap 1 Map介绍 Map用来存储键值对结构的数据**(key-value)**Object中存储的数据就可以认为是一种键值对结构Map和Object的主要区别: Object中的…

在vue3项目中使用新版高德地图

高德开发平台 : 高德开放平台 | 高德地图API (amap.com) 1. 首先你要注册好账号登录 2. 获取key和密钥 自2021年12月02日升级,升级之后所申请的 key 必须配备安全密钥 jscode 一起使用 NPM方式安装和使用(基础版): 按 NPM 方式安装使用 Loader : npm i amap/amap…

OS——进程并发控制(五大经典问题信号量机制描述)

目录 一、经典问题信号量机制描述 1、任意两个进程可以并发的条件(Bernstein条件) 2、临界区管理原则 3、信号量的P、V操作 (1)P、V操作 (2)P、V操作的原则 (3)用信号量解决进…

[开发浏览器实战]关于Firefox火狐浏览器的说明一二(国内版 国际版区别 账号切换 插件-恢复关闭的标签页 插件-tempermonkey油猴)

[开发浏览器实战]关于Firefox火狐浏览器的说明一二1.下载地址2.同步账号不一样国内版3.浏览器关于内容不同:国内版国际版![在这里插入图片描述](https://img-blog.csdnimg.cn/8ca563d2aa2d43b0b52b6cf50bbffa0c.png)灵活使用firefox推荐插件1.tempermonkey油猴2.恢复关闭的标签…

从零学习VINS-Mono/Fusion源代码(五):VIO初始化

本节分析VIO初始化部分 VINS-Mono/Fusion代码学习系列: 从零学习VINS-Mono/Fusion源代码(一):主函数 从零学习VINS-Mono/Fusion源代码(二):前端图像跟踪 从零学习VINS-Mono/Fusion源代码&#x…

Orin PPS failed to request pps gpio修改

前言 在使用Orin PPS过程中,已经配置了设备树文件,但是遇到了申请GPIO失败的问题,如下图: 申请GPIO失败。 1.分析及解决过程 1.1 设备树文件修改 在设备树文件hardware/nvidia/platform/t23x/concord/kernel-dts/cvb/tegra234-p3737-0000-a00.dtsi 中,添加关于pps gpi…

k8s,30分钟部署一个kubernetes集群【1.17】

作者:李振良 官方网站:http://www.ctnrs.com kubeadm是官方社区推出的一个用于快速部署kubernetes集群的工具。 这个工具能通过两条指令完成一个kubernetes集群的部署: # 创建一个 Master 节点 $ kubeadm init# 将一个 Node 节点加入到当前集群中 $ kubeadm join <Mast…

基于jsp+java+ssm的农产品购物商城系统-计算机毕业设计

项目介绍 随着计算机、信息化网络的普及&#xff0c;电子商务的兴起&#xff0c;网络支付以及网络安全体系逐渐完善&#xff0c;将人们的生活带入到网络时代&#xff0c;越来越多的人喜欢网上购物&#xff0c;消费者足不出户便可以买到自己喜欢的物品&#xff0c;只要轻轻点击…

TypeScript算法题实战——二叉搜索树篇

二叉搜索树&#xff0c;也叫二叉查找树、二叉排序树&#xff0c;是具有下列性质的二叉树&#xff1a; 若它的左子树不空&#xff0c;则左子树上所有结点的值均小于它的根结点的值&#xff1b; 若它的右子树不空&#xff0c;则右子树上所有结点的值均大于它的根结点的值。 注意…

零拷贝(Zero Copy)技术

概念 我们知道Linux系统分为用户态和内核态&#xff0c;在用户态每发起一次IO请求&#xff0c;就需要进行2次上下文切换&#xff08;分别是用户态->内核态&#xff0c;内核态→用户态&#xff09;&#xff0c;和一次CPU拷贝&#xff08;将数据从内核缓存拷贝到用户缓存&…

redis设置密码并修改查看的几种方式

前言 最近正值世纪杯期间&#xff0c;不知道大家心目中的球队成绩如何&#xff0c;最近在工作中需要设置redis服务器的密码的场景 设置密码可以在很大的程度保护redis服务器&#xff0c;但是相关的命令需要通过密码校验之后才能使用 下面就分享给大家两种设置redis服务器的密…

Java并发编程—CompletableFuture的异步执行案例

在博主前几篇博客中&#xff0c;https://blog.csdn.net/qq_52545155/article/details/128167519?spm1001.2014.3001.5501&#xff0c;给大家分享了关于多线程中异步任务的执行和一些相关概念&#xff0c;在这篇博客中&#xff0c;主要是通过一个实际的案例让大家对于Completab…

利用卷神经网络实现IOSLab数字手写图像识别

利用卷神经网络实现IOSLab数字手写图像识别 文章目录利用卷神经网络实现IOSLab数字手写图像识别一、前言二、作业要求三、数据集样本分析四、代码实现1、运行环境2、导入依赖项3、导入数据集4、加载数据和数据预处理5、划分数据集6、CNN网络结构构建7、编译模型8、训练模型9、模…

性能分析之解析 RESAR 性能分析七步法

文章目录一、压力场景数据分析二、架构分析三、响应时间分析四、全局监控分析五、定向监控六、判断性能瓶颈七、提出解决方案一、压力场景数据分析 下面是⼀个登录接⼝的基准场景测试&#xff0c;JMeter 启动后&#xff0c;线程在 1-2 个的时候 TPS 已经达到 200 左右&#xf…

JavaScript -- 字符串常用方法及示例代码介绍

文章目录字符串的方法1 length2 索引3 str.at()4 str.charAt()5 str.concat()6 str.includes()7 str.indexOf() 和 str.lastIndexOf()8 str.startsWith() 和 str.endsWith()9 str.padStart() 和 str.padEnd()10 str.replace() 和 str.replaceAll()11 str.slice() 和 str.substr…

Mysql调优(一)——性能监控

一、大纲图 【Mysql调优.xmind】 二、Mysql调优简写 2.1 性能监控 2.1.1 使用show profile查询剖析工具&#xff0c;可以指定具体的type 此工具默认是禁用的&#xff0c;可以通过服务器变量在会话级别动态的修改&#xff1a; set profiling1;当设置完成之后&#xff0c;在…