错误监控----比如实现sentry一些思路

错误监控
⼀、引⾔
1.为什么需要前端错误监控
你的脚本在哪些边界条件下会报错?
你的脚本和样式兼容性如何?
有哪些地区不能正常访问你的⽹站?
出现问题之后,你如何快速定位排查,把损失降到最低?
如果你想解决以上这些问题,那么你需要给你的⽹站部署错误监控系统。
2.前端错误监控系统如何⼯作
监控系统分为上报端、服务端与管理后台。上报端的形式⼀般为SDK,主要功能是捕获错误与上
报,更进阶的话可以考虑错误的复现与⽤⼾数据的收集,还有保证⽤⼾体验的平顺降级。服务端则
负责存储、分析错误信息,在错误数量和严重性达到⼀定程度时进⾏告警。管理后台则负责对错误
信息进⾏可视化展⽰,⽅便开发⼈员分析、复现问题与修复问题。
请添加图片描述
二、前端常见错误类型

  1. 语法错误
const abc, // 应该在eslint阶段或编译阶段捕获
  1. JavaScript 运行时错误
 - 引用错误,类型错误等
console.log(notDefinedVariable) // 访问没有定义的变量
obj.undefinedFn() // 调用没有定义的函数- Rejected promise
const p = new Promise((resolve, reject) => {setTimeout(2000, () => {reject()})
})
  1. 网络请求错误
  - 404、500 等状态码错误- 超时错误- 跨域错误等
  1. 资源加载错误
  - 图片、脚本、样式表加载失败
<img src="404.png" alt=""><script>const img = new Image()img.src = '404.png'
</script>
  1. 安全漏洞
    注入漏洞:SQL注入、命令注入、危险文件上传,前端漏洞:XSS、CSRF等等……

三、错误捕获与处理

  1. 浏览器内置错误捕获机制

try/catch:将所有代码包裹在try语句块当中,但只能捕获第一个宏任务的错误。

window.onerror:可以捕获运行时错误与异步错误,但无法捕获资源错误
window.onerror = function (message, url, line, column, error) {console.log(message, url, line, column, error);
}window.addEventListener
window.addEventListener('error', event => {// 可以捕获运行时错误与资源错误
}, true)
window.addEventListener('unhandledrejection', event => {// 可以捕获rejected promise
})
  1. 框架提供的错误捕获
    错误边界:用于捕获子组件树在渲染过程中发生的错误,并展示一个备用 UI,而不是让整个应用崩溃。
  - Vue
// main.js
import { createApp } from 'vue'
import './style.css'
import App from './App.vue'const app = createApp(App)
// 全局错误捕获与处理
app.config.errorHandler = function (err, instance, info) {// 上报错误
}
app.mount('#app')// app.vue
import { onErrorCaptured } from 'vue';export default {setup() {// 错误边界onErrorCaptured((err, instance, info) => {console.error('Error caught in setup:', err, instance, info);// 改变组件状态,下个tick展示回退界面return false;});return {};},
};
React
class ErrorBoundary extends React.Component {constructor(props) {super(props);this.state = { hasError: false };}static getDerivedStateFromError(error) {// 设置状态,下个tick展示回退界面return { hasError: true };}componentDidCatch(error, info) {// Example "componentStack"://   in ComponentThatThrows (created by App)//   in ErrorBoundary (created by App)//   in div (created by App)//   in App// 上报错误}render() {if (this.state.hasError) {// 回退界面,平顺降级return this.props.fallback;}return this.props.children;}
}// 包裹易出错的业务组件
<ErrorBoundary fallback={<p>Something went wrong</p>}><Profile />
</ErrorBoundary>- Axios: 注册全局 response 钩子捕获与处理 Ajax 错误
axios.interceptors.response.use(function (response) {// Any status code that lie within the range of 2xx cause this function to trigger// Do something with response dataif(response.data.code !== 0 ){// 处理与上报}return response;
}, function (error) {// Any status codes that falls outside the range of 2xx cause this function to trigger// 处理与上报return Promise.reject(error);
});
  1. 用户操作路径记录
    用户事件记录:在 window 上绑定事件处理函数,在事件捕获阶段记录用户事件。优点:不侵入业务开发,不受 stopPropagation 影响。缺点:数据量大,需要剔除无效事件。
const events = []window.addEventListener('click', event => {// event.target pageX, pageY, buttonevents.push(event)
}, {capture: true})

状态仓库快照:在 Vuex/Redux 等状态仓库注册插件/中间件,记录下每次数据变化前后的状态快照。优点:能精确复现错误。缺点:需要在业务开发时将所有状态纳入状态仓库管理。

// snapshotPlugin.js
import _ from 'lodash'const snapshotPlugin = (store) => {let prevState = _.cloneDeep(store.state)store.subscribe((mutation, state) => {let nextState = _.cloneDeep(state)console.log('prevState', prevState)console.log('mutation', mutation)console.log('nextState', nextState)prevState = nextState})
}export { snapshotPlugin }// store/index.js
import { createStore } from 'vuex';
import { snapshotPlugin } from './snapshotPlugin';// 创建一个新的 store 实例
const store = createStore({state: {count: 0,},mutations: {increase(state) {state.count++}},devtools: true,plugins: [snapshotPlugin],
});export default store;

录屏: 利用 MutationObserver - Web API | MDN & html2canvas-pro 在页面 DOM 树发生变化时截屏或者记录 DOM 树,来重现 BUG 发生前一小段时间的显示画面。
在这里插入图片描述

  1. 捕获SDK设计原则
    类型全面:需能捕获各种类型的错误,兼容各种软硬件环境
    业务无感:业务开发无感:CI/CD注入,nginx 注入,Vuex/Redux 插件。用户体验无感:强缓存,CDN加速,性能影响忽略不计,控制上报频率。
    稳定: 版本稳定,运行稳定

四、错误上报策略

  1. 上报方式
    Image:手动构建一个Image,将上报内容赋值给src,后台则会返回一像素透明图片。优点:不影响页面观感,天然跨域,不占用ajax数量限额
    sendBeacon:POST承载数据量更大,http status 204无response body,页面退出也不影响发送。
  2. 上报数据内容
    错误信息:错误类型、message、源文件路径、行列号、堆栈跟踪
    终端信息:浏览器版本、操作系统版本、网络状态
    用户信息:用户id、业务id、关键数据
    用户行为路径:近一小段时间的用户事件、actions和state快照、录屏
  3. 上报控制
    重复错误剔除:根据错误信息做重复剔除
    节流上报:一定时间内的错误合并上报。
    熔断机制:大量持续重复的错误则停止上报。
    五、错误管理后台
  4. 错误信息聚合展示
    错误数量、频率、影响的业务、影响用户数、地域分布、趋势
  5. 告警
    触发条件:严重程度、错误频率、影响范围
    通知方式:IM、短信、邮件到AI电话等
  6. 辅助排查
    位置还原:从 CI/CD 系统推送来的sourcemap还原真实出错文件路径、行列号。
    复现错误:用户事件重播,录屏重播,actions重播,远程控制复现。
  7. 其他监控展示
    性能监控、流量监控、安全监控等。
    六、错误监控工具介绍

Sentry
Sentry 介绍和工作流程
Sentry 接入规范
Sentry 前端监控- 调研 & 实践
代码级监控Sentry使用手册-内测版

七、总结与思考

  1. 闭环
    “闭环” 一词在不同领域有着不同的含义,但总体来说,它强调的是一种形成完整回路、自我调节和持续改进的状态或过程。
    错误监控与闭环的关系?前端监控通过收集各种数据,如用户行为数据、页面性能数据、错误日志等,能够及时发现前端应用中存在的问题。对发现的问题进行及时处理。修复问题后,需要通过再次收集监控数据来验证问题是否得到解决,以及优化措施是否有效。
  2. 冰山
    冰山理论,又称冰山模型,最初由美国著名心理学家萨提亚提出,后在多个领域得到广泛应用。冰山理论将一个事物或现象比作一座冰山。我们能直接观察到的部分,就如同冰山露出水面的一小部分,而更大的部分则隐藏在水下,不可直接看见。
    在互联网开发的技术层面,表面上用户看到的是快速响应的界面、流畅的交互效果,但背后是复杂的技术架构和优化的性能表现。这就如同冰山理论中,水面下庞大而坚实的部分支撑着水面上的可见部分。

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

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

相关文章

linux内核调试

1. 前置安装 1.1 编译好的内核 参考&#xff1a; https://blog.csdn.net/qq_51950769/article/details/148596916 1.2 编译busybox BusyBox 是一个非常轻量级的多合一工具箱&#xff0c;常被称为“Linux 的瑞士军刀”。 简单来说&#xff1a; 它把很多常用的 Linux 命令&am…

什么是曲面细分

什么是曲面细分 在CAD格式中&#xff0c;通常使用曲线和数学函数来定义曲面和实体。这些曲面的精确度和光滑度非常适用于制造过程。但是&#xff0c;现代GPU芯片针对由三角形网格体组成的曲面的渲染计算进行了高度优化。通常&#xff0c;实时渲染器和虚幻之类的游戏引擎只能处…

CANFD加速是什么?和CANFD有什么区别?

文章目录 摘要什么是CANFD加速?CAN FD的基本原理:仲裁阶段(Arbitration Phase):数据阶段(Data Phase):关键特性:优势:总结摘要 下面的截图,大家肯定不陌生,在使用CAN设备上位机的时候,已经选择了CANFD,但还有一个选项是“CANFD加速”,那CANFD加速和不加速有什么…

minio 启动失败--Incorrect Usage: flag provided but not defined: -consoleaddress

根据错误信息 flag provided but not defined: -consoleaddress&#xff0c;这表明 Minio 服务启动时使用了未定义的命令行参数 --consoleaddress&#xff0c;导致启动失败。这个问题与 Minio 版本兼容性有关。 问题原因 参数名称变更&#xff1a; Minio 版本 > RELEASE.20…

基于Rust的Polars学习笔记

基于Rust的Polars学习笔记 Polars 学习笔记 Cargo.toml通用配置 [package] name = "rustP" version = "0.1.0" edition = "2024"[dependencies] polars = { version = "0.48.1", features = ["full"]}Quickstart use po…

SpringBoot扩展——定时任务!

定时任务 项目开发中会涉及很多需要定时执行的代码&#xff0c;如每日凌晨对前一日的数据进行汇总&#xff0c;或者系统缓存的清理、对每日的数据进行分析和总结等需求&#xff0c;这些都是定时任务。单体系统和分布式系统的分布式任务有很大的区别&#xff0c;单体系统就一个…

RTDETRv2 pytorch 官方版自己数据集训练遇到的问题解决

rtdetrv2 训练问题遇到的问题。 pip install torch2.0.1 torchvision0.15.2 torchaudio2.0.2 --index-url https://download.pytorch.org/whl/cu117 1 Please make sure torchvision version > 0.15.2 发现自己实际装的是 torchvison0.15.2cu117 修改_misc.py中修改为…

Linux系统移植⑤:uboot启动流程详解-board_init_f执行过程

Linux系统移植⑤&#xff1a;uboot启动流程详解-board_init_f执行过程 _main 中会调用 board_init_f 函数。 board_init_f 函数主要有两个工作&#xff1a; ①初始化一系列外设&#xff0c;比如串口、定时器&#xff0c;或者打印一些消息等。 ②初始化 gd 的各个成员变量&am…

Git命令与代码仓库管理

步骤一、完成Gitee码云上账号注册并新建代码仓库。 1.1 新建代码仓库 1.2 填写信息并创建 1.3 获取仓库地址 https://gitee.com/dog-kidney/2022082206.git 步骤二、建立本地代码仓库&#xff0c;并连接到远程代码仓库。 2.1初始化 git init 2.2添加仓库 git remote add o…

资源占用多,Linux 系统中如何降低 CPU 资源消耗并提升利用率?

在 Linux 系统中降低 CPU 资源消耗并提升利用率,需从系统服务优化、进程管理、资源调度及内核参数调整等多维度入手。以下是适用于各类 Linux 发行版的通用优化方案,涵盖基础操作与进阶策略: 一、服务与进程优化:减少无效资源占用 1. 关闭冗余系统服务 查看运行中的服务 …

技术与情感交织的一生 (八)

目录 融合 东西厂公 接风宴 头痛 “巴巴罗萨” 突击 推进 助攻 96小时 寒冬 食堂 反攻 消耗 Delphi 西厂 内困 外患 “敦刻尔克” 多线作战 大撤退 资源 融合 东西厂公 初次来到纸箱厂&#xff0c;是主厂区&#xff0c;感觉很大&#xff0c;相对西面正在…

webuploader分片上传示例,服务端上传文件到腾讯云CDN Teo 应用示例

本文环境&#xff1a;php7.3.4 CI3.0框架 一、大概步骤&#xff1a; &#xff08;1&#xff09;利用百度的webuploader插件&#xff0c;将大文件分片上传的自己的服务器 &#xff08;2&#xff09;利用腾讯云接口从本服务器上传到腾讯云 二、详细代码&#xff1a; 1、进入…

LeetCode 632.最小区间

你有 k 个 非递减排列 的整数列表。找到一个 最小 区间&#xff0c;使得 k 个列表中的每个列表至少有一个数包含在其中。 我们定义如果 b-a < d-c 或者在 b-a d-c 时 a < c&#xff0c;则区间 [a,b] 比 [c,d] 小。 示例 1&#xff1a; 输入&#xff1a;nums [[4,10,…

篇章五 系统性能优化——资源优化——CPU优化(2)

目录 1.高级并发模式 1.1 工作窃取&#xff08;Work Stealing&#xff09; 1.工作窃取模式 2.ForkJoinPool实现 3.具体例子 1.2 结构化并发&#xff08;Structured Concurrency&#xff09; 1.结构化并发模式 2.Java 19 的 StructuredTaskScope 3.具体例子 1.3 对比与…

《中国电信运营商骨干网:历史、现状与未来演进》系列 第四篇:后发先至——中国移动CMNET的快速扩张与IP专网布局

摘要&#xff1a; 本文深入探讨中国移动骨干网CMNET (AS9808) 的发展历程、网络架构及其与中国电信扁平化策略的差异。同时&#xff0c;解析其为承载高价值业务而构建的IP专用承载网的定位、结构与技术特点。最后&#xff0c;展望中国移动在5G、云计算和算力网络时代&#xff0…

R情感分析:解码文本中的情感

基于之前关于文本聚类和文本模型的博客&#xff0c;我们现在可以深入探讨一个经典主题 - 情感分析。情感分析通过计算方式识别和分类文本中的情感&#xff0c;帮助理解公众意见或消费者反馈。 什么是情感分析&#xff1f; 情感分析确定文本背后的情感基调&#xff0c;将其分类…

云徙渠道订货系统:赋能企业渠道管理的数字化引擎

在当今商业竞争日益激烈的环境下&#xff0c;企业如何高效管理和优化渠道成为关键问题。云徙渠道订货系统凭借其强大的数字化能力&#xff0c;为企业提供了全新的渠道管理解决方案&#xff0c;助力企业在复杂多变的市场环境中保持竞争力。 从渠道管理的痛点出发 传统渠道管理方…

Nacos基础使用(二):nacos作为配置中心

一、Nacos 配置中心核心属性 在学习nacos 作为配置中心的使用之前&#xff0c;先看下Nacos 作为配置中心时的三个属性&#xff0c;即&#xff1a; 命名空间、配置分组、配置集ID&#xff08;习惯称为配置文件ID&#xff09;&#xff1b;在使用Nacos 作为配置中心 的过程中可以通…

SpringBoot 插件化架构的4种实现方案

在复杂业务场景下&#xff0c;传统的单体应用架构往往面临着功能扩展困难、代码耦合严重、迭代效率低下等问题。 插件化架构作为一种模块化设计思想的延伸&#xff0c;能够使系统具备更好的扩展性和灵活性&#xff0c;实现"热插拔"式的功能扩展。 本文将介绍Spring…

VGG-19(Visual Geometry Group)模型

VGG-19 是由牛津大学视觉几何组和 Google DeepMind 的研究人员在 2014 年提出的一个非常经典的深度卷积神经网络模型。 一 核心结构 &#xff08;1&#xff09;深度&#xff1a; 模型名称中的 "19" 指的是模型拥有 19 层带有权重的层&#xff08;通常指&#xff1a;…