前端监控

2023/04/12 文章推荐 共 4954 字,约 15 分钟

前端监控包括性能监控,行为监控,错误监控

为了项目更好的运行,用户体验更好,而作出一系列的异常处理,保证页面的正常运动。有些时候有些错误或是边界条件在测试阶段没法复现,亦或是隐藏较深,难以复现,需要留下可复现的路径,或是查看用户使用习惯等行为的时候,就需要前端监控。

错误监控

捕获前端页面中的错误和异常信息,例如 JavaScript 错误信息,网络请求失败等,以便开发人员对错误进行分析和处理

Sentry

Sentry 是一款开源的实时错误跟踪(Real-time error tracking)和日志聚合(Log aggregation)平台。它可以收集和展示应用程序中出现的所有错误和异常信息,并将这些信息以可视化的方式展示给开发者和团队。

原理是通过监听 window.onerror 和 unhandledrejection 事件等方式,捕获前端项目中的错误和异常,例如 JavaScript 异常、网络请求失败、控制台日志等。此外,Sentry 通过自定义 JavaScript 异常可进行丰富的错误信息搜集。

由于线上环境的代码都进行了压缩和混淆,导致上报的错误无法很好地排查和解决。让错误可以有效地被定位到,为此我们可以在sentry 上传source map信息和项目的版本

.map 文件是一种用于前端开发的文件,它提供了一个映射表,将编译后的 JavaScript 代码中的个体元素映射到原始源代码中对应的位置,包括变量名、函数名、行号等信息。通过.map 文件的映射,开发者可以轻松地查找到编译后的 JavaScript 代码中出现问题的位置,并快速进行调试

以vite为例,首先安装插件@sentry/vite-plugin

npm install @sentry/vite-plugin --save-dev

vite.config.js中使用

import { defineConfig, loadEnv } from "vite";
import { sentryVitePlugin } from "@sentry/vite-plugin";

export default defineConfig(({ command, mode }) => {
  const env = loadEnv(mode, process.cwd(), '')

  return {
    build: {
      sourcemap: true,
    },
    plugins: [
      sentryVitePlugin({
        org: "组织",
        project: "项目",
        include: "./dist",//source map的目录,只需要包含就可以了
		    url: "https://sentry.io", //这个是sentry的域名,默认是https://sentry.io。如果你的sentry是内部自建的,需要指明。比如公司的内部域名是这样的
		    urlPrefix: '~/', //上传 source map 的前缀,也就是会给所有要上传到 sentry 的文件名前面加个标记,默认是~/,表示项目根目录
        authToken: 'xxxxxxxx',//上传的秘钥,不然就没有权限去上传。生成方式也很简单,打开以下路径
        release: release, // 每次上传一次source map都会生成一次新的版本
      }),
    ],
  }
});

如需手动上报一个错误,可用 Sentry.withScope() 是一个 API 方法,它的作用是为错误和日志信息创建一个新的 Scope 并将其推送到 Sentry。具体使用方法可参考文档

资源加载失败

以js资源为例,别的可类比实现。我们通过监听 error 事件来捕获 JavaScript 文件加载失败的异常。事件对象中的 target 属性表示发生异常的对象,如果它的标签名为 script,就说明是加载 JavaScript 文件出现了异常。然后我们可以根据 event.target.src 属性来获取加载失败的 JavaScript 文件的 URL 来进行处理。

另外,为了更好的用户体验,当 JavaScript 文件加载失败时,我们也可以考虑在代码中添加备用方案,比如加载一个备用的 JavaScript 文件或者给用户友好的提示信息

window.addEventListener('error', function(event) {
  if (event.target.tagName.toLowerCase() === 'script') {
    console.log('----Load script failed: ---' + event.target.src);
  }
}, true);

js执行报错

当 JavaScript 代码执行失败时,浏览器会抛出 JavaScript 异常。我们可以通过 window.onerror 方法来监听 JavaScript 异常,实现错误捕捉和处理。 以下是一个示例代码:

window.onerror = function (msg, url, lineNo, columnNo, error) { console.log(‘Error message: ‘ + msg); console.log(‘URL: ‘ + url); console.log(‘Line: ‘ + lineNo + ‘, column: ‘ + columnNo); console.log(‘Stack trace: ‘ + error.stack); return true; // 阻止错误继续抛出 }

在这个示例代码中,我们通过 window.onerror 方法来捕获 JavaScript 异常,然后在控制台中输出错误信息、错误的来源 URL、发生错误的行号和列号以及错误的堆栈信息。最后,我们 return true 来告诉浏览器阻止错误的继续抛出,这样可以有效地防止错误被重复上报。

需要注意的是,window.onerror 只能捕获全局范围内的 JavaScript 异常。如果是在函数内抛出的异常,需要使用 try-catch 语句来捕获异常并进行处理。比如说a组件用了b方法,b方法里面报错了,这种情况我们是没办法监控的

promise 执行错误

当 Promise 中的执行错误没有被捕获时,就会被抛出到全局,我们可以通过监听 global 对象上的 unhandledrejection 事件来全局捕获未处理的 Promise 错误。 以下是一个示例代码:

window.addEventListener('unhandledrejection', function(event) {
  console.error('Unhandled promise rejection:', event.reason);
});

在这个示例代码中,我们通过监听 unhandledrejection 事件来捕获未处理的 Promise 错误,并将其输出到控制台中。事件对象的 reason 属性包含了 Promise 错误的详细信息。 需要注意的是,即使我们通过 unhandledrejection 事件捕获了 Promise 中的错误,我们依然应该在 Promise 操作中使用 catch() 方法或者 done() 方法进行错误处理并进行相应的异常处理。

图片加载失败

图片加载失败,若是没有异常处理,会大大降低用户体验,这一块我们也可以做一个兜底

具体可参考张老师文章文章

简单代码处理

img::after {
  content: attr(alt);
  position: absolute;
  left: 0; bottom: 0;
  width: 100%;
  line-height: 2;
  background-color: rgba(0,0,0,.5);
  color: white;
  font-size: 12px;
  text-align: center;
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
}
img::before {
  content: '';
  position: absolute;
  left: 0; top: 0;
  width: 100%; height: 100%;
  background: #f5f5f5 url("data:image/svg+xml,%3Csvg class='icon' viewBox='0 0 1024 1024' xmlns='http://www.w3.org/2000/svg' width='200' height='200'%3E%3Cpath d='M304.128 456.192c48.64 0 88.064-39.424 88.064-88.064s-39.424-88.064-88.064-88.064-88.064 39.424-88.064 88.064 39.424 88.064 88.064 88.064zm0-116.224c15.36 0 28.16 12.288 28.16 28.16s-12.288 28.16-28.16 28.16-28.16-12.288-28.16-28.16 12.288-28.16 28.16-28.16z' fill='%23e6e6e6'/%3E%3Cpath d='M887.296 159.744H136.704C96.768 159.744 64 192 64 232.448v559.104c0 39.936 32.256 72.704 72.704 72.704h198.144L500.224 688.64l-36.352-222.72 162.304-130.56-61.44 143.872 92.672 214.016-105.472 171.008h335.36C927.232 864.256 960 832 960 791.552V232.448c0-39.936-32.256-72.704-72.704-72.704zm-138.752 71.68v.512H857.6c16.384 0 30.208 13.312 30.208 30.208v399.872L673.28 408.064l75.264-176.64zM304.64 792.064H165.888c-16.384 0-30.208-13.312-30.208-30.208v-9.728l138.752-164.352 104.96 124.416-74.752 79.872zm81.92-355.84l37.376 228.864-.512.512-142.848-169.984c-3.072-3.584-9.216-3.584-12.288 0L135.68 652.8V262.144c0-16.384 13.312-30.208 30.208-30.208h474.624L386.56 436.224zm501.248 325.632c0 16.896-13.312 30.208-29.696 30.208H680.96l57.344-93.184-87.552-202.24 7.168-7.68 229.888 272.896z' fill='%23e6e6e6'/%3E%3C/svg%3E") no-repeat center / 50% 50%;
  color: transparent;
}

行为监控

即前端应用程序页面的用户交互行为进行跟踪和记录,常采用的措施就是在某个时机进行埋点上报(点击、滚动、输入等

A/B 测试监控:可以对不同的用户进行 A/B 测试,记录用户不同的操作行为和数据,用于分析不同测试方案的效果。

前端行为监控可以帮助开发者更好地了解用户的使用情况和体验,以及检查、测试应用程序的稳定性、可靠性和性能

性能监控

即对前端应用程序的性能数据进行跟踪、记录和分析,以提升网站的性能和用户体验。

前端性能监控的主要目标是找到性能瓶颈,并对其进行优化,以提高应用程序的加载速度、响应速度和可用性。

页面加载速度监控:记录页面加载时间、资源加载时间、HTTP 请求次数、页面大小等信息。

网络请求监控:记录网络请求的响应时间、成功或失败情况、返回错误码等信息。

JavaScript 错误监控:捕获 JavaScript 错误信息,包括错误类型、错误堆栈、发生错误的位置等。

页面渲染性能监控:记录页面渲染完成的时间、渲染过程中的 CPU 占用率等信息。

前端性能监控可以帮助开发者对应用程序的性能进行全面的监控,从而能够及时地发现和解决性能问题,使用户获得更好的使用体验。

总结

所谓的监控目的只有一个,提升用户体验,让我们的代码变得更加强壮


在技术的历史长河中,虽然我们素未谋面,却已相识已久,很微妙也很知足。互联网让世界变得更小,你我之间更近。

在逝去的青葱岁月中,虽然我们未曾相遇,却共同经历着一样的情愫。谁的青春不曾迷茫或焦虑亦是无奈,谁不曾年少过

在未来的日子里,让我们共享好的文章,共同学习进步。有不错的文章记得分享给我,我不会写好的文章,所以我只能做一个搬运工

我叫 sunseekers(张敏) ,千千万万个张敏与你同在,18年电子商务专业毕业,毕业后在前端搬砖

如果喜欢我的话,恰巧我也喜欢你的话,让我们手拉手,肩并肩共同前行,相互学习,互相鼓励

文档信息

Search

    Table of Contents