第八阶段:工程化、质量管控与高级拓展(136天),Vue项目监控:接入Sentry实现前端异常上报+错误定位+告警通知
Vue项目监控:接入Sentry实现前端异常上报+错误定位+告警通知
一、Sentry简介
Sentry是一个开源的实时错误监控平台,支持多语言、多框架。它能捕获前端运行时的异常(JavaScript错误、资源加载失败、API请求异常等),提供详细的堆栈信息、用户操作路径、环境信息等,并支持邮件、Slack等告警通知。
二、Vue项目接入Sentry步骤
1. 安装依赖
在Vue项目中安装Sentry的Vue SDK和浏览器SDK:
npm install @sentry/vue @sentry/browser # 或 yarn add @sentry/vue @sentry/browser2. 初始化Sentry
在main.js中初始化Sentry,替换YOUR_DSN为你的Sentry项目DSN(在Sentry控制台创建项目后获取):
import { createApp } from 'vue'; import * as Sentry from '@sentry/vue'; import { BrowserTracing } from '@sentry/tracing'; const app = createApp(...); Sentry.init({ app, dsn: 'YOUR_DSN', integrations: [ new BrowserTracing({ tracingOrigins: ['localhost', 'your-domain.com'], }), ], tracesSampleRate: 0.2, // 采样率,按需调整 release: 'your-project-name@1.0.0', // 版本号,用于定位问题 });3. 配置SourceMap上传
为精确定位错误到源码行,需上传SourceMap:
- 安装Sentry CLI:
npm install @sentry/cli -g - 创建
.sentryclirc配置文件:[default] url=https://sentry.your-domain.com/ org=your-org project=your-project auth_token=your-auth-token - 在
package.json中添加构建脚本:"scripts": { "build": "vue-cli-service build", "sentry-upload": "sentry-cli releases --org your-org new your-project-name@1.0.0 && sentry-cli releases --org your-org files your-project-name@1.0.0 upload-sourcemaps dist/js --url-prefix '~/js'" } - 构建后自动上传:
npm run build && npm run sentry-upload
三、核心功能实现
1. 异常上报
- 自动捕获:Sentry自动捕获Vue组件渲染错误、生命周期钩子错误、全局未处理Promise异常。
- 手动上报:通过
Sentry.captureException上报自定义错误:try { riskyOperation(); } catch (error) { Sentry.captureException(error); }
2. 错误定位
- SourceMap映射:上传后,Sentry将混淆后的错误堆栈映射到源码。
- 上下文信息:Sentry自动附加:
- 用户ID(需手动设置:
Sentry.setUser({ id: '123' })) - 环境信息(OS、浏览器、URL)
- 用户操作轨迹(通过
BrowserTracing集成)
- 用户ID(需手动设置:
3. 告警通知
- 配置告警规则:
- 在Sentry控制台进入项目 →Alerts→Create Alert Rule
- 按需设置条件(如:错误频率 > 5次/分钟、影响用户 > 10%)
- 通知渠道:
- 邮件:默认启用
- Slack/Teams:在Settings → Integrations中绑定
- Webhook:自定义通知到钉钉/企业微信
四、最佳实践
- 区分环境:通过
environment参数区分测试/生产环境:Sentry.init({ environment: process.env.NODE_ENV, }); - 按需采样:降低非关键错误的上报量:
Sentry.init({ beforeSend(event) { if (event.exception?.values?.[0]?.type === 'NetworkError') { return null; // 忽略网络错误 } return event; }, }); - 用户反馈:捕获错误时展示反馈表单:
import * as Sentry from '@sentry/vue'; Sentry.showReportDialog();
五、效果验证
- 主动触发一个测试错误:
setTimeout(() => { throw new Error('Sentry Test Error'); }, 1000); - 在Sentry控制台的Issues中查看错误详情,确认:
- 堆栈是否映射到源码
- 上下文信息是否完整
- 告警是否触发
