10分钟快速构建错误监控系统

本文介绍了如何利用Sentry搭建一个实时错误监控系统,以快速发现和定位前端应用中的异常。Sentry是一个开源的日志记录和聚合平台,支持多种语言的客户端,能够提供详细的错误信息、调用栈、用户设备信息等,帮助开发者高效排查问题。通过Docker进行部署,适合小型团队使用。此外,还讲解了如何集成Sentry到前端项目,利用SourceMap精确定位错误,并配置报警机制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言

作为程序员,每次开发完自测充分的时候,但还是会有线上异常情况。如何快速发现 或者提前监控到这些异常的出现呢,是不是需要一个错误监控系统?

调研

一个错误监控系统应该做下面这些事情

9ac3f8a482097b5be4ae08760efe188d.png

当错误发生的时候我们更需要一些辅助信息来帮我们更快的定位错误,比如 JS错误类型、 JS错误信息、JS错误堆栈、JS错误发生的位置以及相关位置的代码;JS错误发生的几率、浏览器的类型,版本号,设备机型等等辅助信息

技术方案

  • 自研

  • fundebug、sentry、bat的...

  • 由于我们前端不到10人没有太多的精力搞基建自研,然后付费的一般公司都不会愿意花钱(大家懂的),所以选了国外比较成熟的方案 sentry[1]

sentry

  • 有免费版的付费版,免费版。付费版和免费版其实差不多,免费够我们用了,付费的就是他啥都帮你弄好,你只需要装sdk 就行了

  • sentry 是一个实时事件日志记录和聚合平台。它专门用于监视错误和提取执行适当的事后操作所需的所有信息, 而无需使用标准用户反馈循环的任何麻烦。

  • Sentry 是一个日志平台,分为客户端和服务端,客户端(目前客户端有Python, PHP,C#, Ruby等多种语言)就嵌入在你的应用程序中间,程序出现异常就向服务端发送消息,服务端将消息记录到数据库中并提供一个web节目方便查看。Sentry由python编写,源码开放,性能卓越,易于扩展,目前著名的用户有Disqus, Path, mozilla, Pinterest等

有哪些功能

e6c15be47b469b02f4eed6055ba8fd20.png

项目

配置多个项目如下图

9472a88ea348c2fdc10ce3fb2460e296.png

上报过来的问题

这个就是你的应用所有的异常

  • 问题总数是指当前不同的问题,同一个问题出现的次数会在末尾那个数字体现

  • 然后管理员可以将这个问题勾选后分配给其它成员

  • 有的问题可以将其 ignore 或者 resolve, 之后就不会出现在你的列表里面

  • 还有自定义搜索:最多出现、最后出现时间、首页出现等等

9519cfdfd7c9ed0ae220b37ef257b993.png
  • 当前错误所发生的 url

  • 浏览器的名字、版本、ua

  • 用户的设备信息例如 XiaoMi MI MAX 3 android10.0 ipxxx

  • 用户的基础信息例如 name 、userid等更多业务相关的需要自己配置

  • 如果页面有 xhr 信息会将请求信息响应状态码显示出来

  • 画重点——当碰到 js 错误的时候会将调用栈、错误类型、错误发生文章打印出来,如果配了sourcemap 可以将压缩混淆前的代码清楚的定位到哪一行

可视化

  • 内置各种维度的数据可视化

  • 如果不满意,它也提供了一些 api、类似 gitlab、 github会提供一样的 api 进行二次开发

f603bbb366df888dc2c1f92d6143f30b.png

报警

可以安装一些额外的插件,比如 钉钉机器人、邮件提醒

安装与部署

安装方式

  • Python

  • Docker 这里使用了 docker 安装比较简单一点

环境

MIN_DOCKER_VERSION='1.10.0' //docker -v
MIN_COMPOSE_VERSION='1.17.0' //docker-compose -v
MIN_RAM=3072 # MB //你的内存至少3G

一键生成

官方在19年的时候提供给了脚本一键生成的方式,仓库在这里onpremise[2]

git clone https://github.com/getsentry/onpremise
cd onpremise
./install.sh

如果 docker 没有配置国内镜像估计会很慢,提一下配置镜像

## 有的话就忽略
mkdir /etc/docker 
## 没有的直接执行
vim /etc/docker/daemon.json
{
 "registry-mirrors" : [
   "https://mirror.ccs.tencentyun.com",
   "http://registry.docker-cn.com",
   "http://docker.mirrors.ustc.edu.cn",
   "http://hub-mirror.c.163.com"
 ],
 ...
}

中间会有一次让你配置管理员账号密码的过程 下载完毕以后执行

docker-comose up -d

配置完以后基本上就整个安装过程应该不会有啥大问题,有问题估计是网络问题

手动安装

准备
  • Docker-ce

  • Docker-compose

镜像拉取
docker pull sentry
docker pull redis
docker pull postgres
启动
docker run -d --name sentry-redis --restart=always redis   ###保证了,异常自动拉起
docker run -d --name sentry-postgres -e POSTGRES_PASSWORD=secret -e POSTGRES_USER=sentry --restart=always postgres
生成唯一秘钥
docker run --rm sentry config generate-secret-key
12345  ###打印出secret-keys,这里最好复制一下,接下来会用到
初始化以及创建Admin
docker run -it --rm -e SENTRY_SECRET_KEY='12345' --link sentry-postgres:postgres --link sentry-redis:redis sentry upgrade
启动三个服务
### web服务
docker run -d -p 9000:9000 --name my-sentry -e SENTRY_SECRET_KEY='12345' --link sentry-redis:redis --link sentry-postgres:postgres --restart=always sentry
### cropn 服务
docker run -d --name sentry-cron -e SENTRY_SECRET_KEY='12345' --link sentry-postgres:postgres --link sentry-redis:redis sentry run cron
### work 服务
docker run -d --name sentry-worker-1 -e SENTRY_SECRET_KEY='12345' --link sentry-postgres:postgres --link sentry-redis:redis sentry run worker
打开

账号密码是刚才创建的管理员的密码2ceb8b011b5d5b39b2722e11012f1672.png

配置后台地址、预警邮件地址、以及其他的一些功能86d168683e20538adf2f76615b3d5399.png

前端接入

创建项目
66746e70a7f414417657b75b62465f85.png

这里我们选 javascript 项目名叫 myapp

然后sentry后台多了个项目, 然后在我们的前端项目里面像下面这样引入

// 脚本引入
<script
  src="https://browser.sentry-cdn.com/5.22.3/bundle.tracing.min.js"
  integrity="sha384-HfEJlGrJtFM0B01Wt4sGzTbxWqLMcMeGAXCbyQyB+iK9BhnDmNAtIGovhekIQOa2"
  crossorigin="anonymous"
></script>
// npm 
import * as Sentry from '@sentry/browser';
import { Integrations } from '@sentry/tracing';

Sentry.init({
  dsn: 'xxxx',
  integrations: [
    new Integrations.BrowserTracing(),
  ],
  tracesSampleRate: 1.0,
});

这样整个流程就通了,可以用起来了

Sourcemap 上传

众所周知,我们的线上代码都是被压缩混淆过的。所以就算拿到了错误信息,只能靠猜了,所以要配合 souremap 精准定位错误信息

准备
  1. sentry 后台配置 authToken 用于上传sourcemap 使用,如下图注意勾选

9ca8bb5235452758017c0ed554b95079.png
  • 2.下载 webpack 插件

npm i @sentry/webpack-plugin -D

然后在根目录下新建 .sentryclirc

[defaults]
### 你的域名
defaults.url='http://localhost:9000'
### 组织团队名默认是 sentry
org=sentry
### 项目名称
project=myapp
### 步骤1创建的
[auth]
token=1234

配置插件

const SentryWebpackPlugin = require('@sentry/webpack-plugin');
if (process.env.NODE_ENV !== 'development') { // 注意只在生成环境开启,不然npm run dev也会上传
    new SentryWebpackPlugin({
      release: Date.now(), // 唯一标识,可以用其他的比如 hash
      include: './build', // 要上传的文件夹 有的叫 dist
      ignoreFile: '.sentrycliignore', // 可不要
      ignore: ['node_modules', 'config-overrides.js'], 
      configFile: '.sentryclirc' // 默认同级,如果不一样需要用node path模块处理一下
    });
  }

然后运行 npm run build

Creating an optimized production build...
> Found 10 release files
> Analyzing 10 sources
> Rewriting sources
> Adding source map references
> Bundled 10 files for upload
> Uploaded release files to Sentry
> File upload complete

恭喜你配置成功了

其他常用api

主动上报
Sentry.captureMessage('Hello, world!'); // 上报信息
Sentry.captureException(new Error('Good bye')); // 上报异常
Sentry.captureEvent({ // 上报事件
  message: 'Manual',
  stacktrace: [
    // ...
  ],
});
配置用户信息
Sentry.configureScope((scope) => {
        scope.setUser({
          ...data.userInfo,
          time: new Date().toLocaleString()
        });
      });

其他

  • 邮件

  • 钉钉机器 可以去自己下载一些插件配置

最后, 送人玫瑰,手留余香,觉得有收获的朋友可以点赞,关注一波 ,相关 文档资料 已上传至 React 中文社区交流群, 请关注公众号,点击菜单栏 入群学习,添加 入群小助手 后入群领取。陆续更新前端超硬核文章。

推荐阅读

(点击标题可跳转阅读)

[极客前沿]-你不知道的 React 18 新特性

[极客前沿]-写给前端的 K8s 上手指南

[极客前沿]-写给前端的Docker上手指南

[面试必问]-你不知道的 React Hooks 那些糟心事

[面试必问]-一文彻底搞懂 React 调度机制原理

[面试必问]-一文彻底搞懂 React 合成事件原理

[面试必问]-全网最简单的React Hooks源码解析

[面试必问]-一文掌握 Webpack 编译流程

[面试必问]-一文深度剖析 Axios 源码

[面试必问]-一文掌握JavaScript函数式编程重点

[面试必问]-阿里,网易,滴滴,头条等20家面试真题

[面试必问]-全网最全 React16.0-16.8 特性总结

[架构分享]- 微前端qiankun+docker+nginx自动化部署

[架构分享]-石墨文档 Websocket 百万长连接技术实践

[自我提升]-Javascript条件逻辑设计重构

[自我提升]-页面可视化工具的前世今生

[大前端之路]-连前端都看得懂的《Nginx 入门指南》

[软实力提升]-金三银四,如何写一份面试官心中的简历

觉得本文对你有帮助?请分享给更多人

关注「React中文社区」加星标,每天进步

bb0175a089f315984f7ee868529f12ba.png   点个👍🏻,顺便点个 在看 支持下我吧!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值