前端错误监控实践:Sentry 在 Vite + Vue 项目中的配置与原理详解
一、Sentry 的工作原理
Sentry 是一套用于错误监控与性能分析的系统。前端接入 Sentry 后,核心流程可以抽象为三步:
-
捕获:SDK 在运行时通过挂载全局监听(如
window.onerror
、window.onunhandledrejection
、框架层面的错误钩子)或手动调用Sentry.captureException
、Sentry.captureMessage
等 API 收集异常信息、上下文(URL、用户、环境、breadcrumbs 等)。 -
上报:SDK 将错误事件(包含压缩后的位置:文件名、行号、列号、stacktrace)以及上下文通过 HTTP 请求发送到 Sentry 服务端(由 DSN 标识)。
-
还原与展示:Sentry 服务端(或在 UI 上)借助 Source Map,将压缩后的位置信息还原为原始源码位置,展示文件名、函数、源代码行,便于开发定位与排查。
另外,Sentry 支持 Release、环境(environment)、Tag、User 等维度,用于聚合、筛选与告警触发。
本篇文章使用的 sentry 版本如下
"@sentry/vite-plugin": "4.2.0",
"@sentry/vue": "10.7.0",
二、在 Vite + Vue 中配置 sentry 的最佳实践
2.1 打包并上传 sourmap
-
生成 Source Map(打包时):
在vite.config.ts
中开启:import { sentryVitePlugin } from '@sentry/vite-plugin' import { defineConfig, loadEnv } from 'vite'// https://vitejs.dev/config/ export default defineConfig(({ mode }) => {// 获取各个环境的配置const env = loadEnv(mode, process.cwd())return {plugins: [sentryVitePlugin({debug: true, // 开启打印 sentry 上传日志,调试用org: 'your org',project: 'your project',url: 'your url',authToken: env.VITE_SENTRY_AUTH_TOKEN, //必须sourcemaps: {ignore: './node_modules/**/*',filesToDeleteAfterUpload: './dist/**/*.map' //打包上传map后,删除所有map文件}})],build: {// 注意生成后要删除,不要上传到公网sourcemap: true}} })
-
切勿将 Source Map 上传到公开的 OSS/CDN:
-
Source Map 含有源码映射,会暴露源码或内部实现细节;
-
正确做法是把 Source Map 上传到 Sentry 并在部署产物中移除或不上传到公共文件服务器。
-
所以这里是用了 filesToDeleteAfterUpload 字段,在 vite 打包生成map并上传之后之后就删除源map文,如果 authToken 失效,导致的上传失败,也可以正常删除map文件【至少我用的版本可以,具体可以自己开启 debug: true, 看打包过程中生成的日志】
-
不同版本的
@sentry/vite-plugin
配置项可能略有差异,建议查阅对应插件版本的 README 做最终确认。
2.3 在 mian.ts 中初始化 sentry
import { createApp } from 'vue'
import App from './App.vue'
import * as Sentry from '@sentry/vue'const app = createApp(App)
Sentry.init({app,dsn: 'your dsn', // 每个项目都有一个对应的 dsn, 在 sentry 后台可以找到integrations: [Sentry.browserTracingIntegration(), Sentry.replayIntegration()],environment: import.meta.env.VITE_NODE_ENV
})
app.mount('#app')
三、重要的 sentry 插件配置项
3.1 使用 debug: true 调试
在 sentryVitePlugin 插件中配置 debug: true 可以查看在vite build 过程中 sentry 插件的执行日志。
map文件生成日志
map 文件上传日志
map 文件删除日志
这里我们可以测试一下,随便写一个 authToken ,再打包,会在 map 上传 sentry 阶段报错,如下图
但是我们会发现后面依旧有删除 map 文件的日志,所以可以确认即便是上传 sentry失败了,也会执行 filesToDeleteAfterUpload: true 的配置。即便是没有删除 map 文件的日志,dist文件夹中的map 文件也没有了。【当然了,具体是否会删除还是取决于你使用的插件的版本的,可以自己实践一下,或者看一下版本对应的readme 说明】
3.2 上传 sourcemap 使用的 authToken
3.2.1 authToken 的作用
-
作用:
authToken
用于通过 Sentry 的 API 进行授权操作(比如创建 release、上传 Source Map、设置 commit 信息等)。构建/CI 在上传 artifacts(sourcemap)时需要该 token。 -
获取步骤:
-
登录 Sentry;
-
进入账户设置(User Settings)→ Auth Tokens;
-
新建 Token,勾选合适的权限(常用
project:releases
、org:read
等,按最小权限原则授权)。
-
-
是否会失效:Token 在创建后不会自动过期,但可以手动撤销或删除。若 Token 被撤销或权限变更,CI 上传将失败并返回相应错误。
-
安全性建议:
-
把 token 放在 CI 的 Secret 或项目根的
.env
(但.env
不应提交到仓库); -
在本地开发环境尽量使用只读或最小权限 token;
-
在 CI 中使用环境变量
SENTRY_AUTH_TOKEN
,避免明文出现在仓库或日志中。
-
3.3.2 如何判断 authToken 是否有效
可以使用命令行工具执行下面命令,前面 <your demain url> 写你配置中的 url,<your token> 写你的 authToken.
api/0/
→ 这是 Sentry 官方 API 的 版本号和前缀,对于 Sentry 版本 0 API 来说是固定的(即api/0/
是固定的,后面跟具体资源路径)。
curl <your demain url>api/0 \-H "Authorization: Bearer <your token>"
如果 token 无效会返回 {"detail":"Invalid org token"}
3.3.3 如果 authToken
无效或丢失,会发生什么?
-
如果
authToken
错误、过期或无效(比如权限不足、token 配置错误等),
上传 sourcemap 会失败; -
Sentry CLI 会在上传阶段报错(例如
error: API request failed (401 Unauthorized)
); -
但打包过程本身不会中断,也就是说:
-
Vite 打包结果(JS/CSS/HTML)仍会正常生成;
-
会删除
.map
文件;【具体取决于你用的sentry插件的版本号】 -
控制台会打印上传失败的错误日志;
-
3.3 release 版本号/版本标识
只有在上传到 Sentry 的 Source Map 与上报事件的 release
匹配时,才会能把报错精确到源码的某个行数。
在默认的情况下 release 一般是最后一个代码提交的 commit 的哈希值,如下图,我们可以发现这个 release 和 git log 打印出来的最新的一个提交相同。
3.3.1 自定义 release
import { sentryVitePlugin } from '@sentry/vite-plugin'
import { defineConfig, loadEnv } from 'vite'// https://vitejs.dev/config/
export default defineConfig(({ mode }) => {// 获取各个环境的配置const env = loadEnv(mode, process.cwd())return {plugins: [sentryVitePlugin({debug: true, // 开启打印 sentry 上传日志,调试用org: 'your org',project: 'your project',url: 'your url',authToken: env.VITE_SENTRY_AUTH_TOKEN, //必须release: {name: 'my_release' // 自定义版本号 release},sourcemaps: {ignore: './node_modules/**/*',filesToDeleteAfterUpload: './dist/**/*.map' //打包上传map后,删除所有map文件}})],build: {// 注意生成后要删除,不要上传到公网sourcemap: true}}
})
在 sentry 插件中配置之后,打包出来的 release 那么就成我们配置的了。
四、sentry.init 的原理
在 Vue 3 + Vite 项目中,推荐在入口文件 main.ts 里初始化 Sentry SDK,让 SDK 在应用整个生命周期内生效。
示例:
import { createApp } from 'vue'
import App from './App.vue'
import * as Sentry from '@sentry/vue'const app = createApp(App)
Sentry.init({app,dsn: 'your dsn', // 每个项目都有一个对应的 dsn, 在 sentry 后台可以找到integrations: [Sentry.browserTracingIntegration(), Sentry.replayIntegration()],environment: import.meta.env.VITE_NODE_ENV
})
app.mount('#app')
Sentry.init
的关键工作:
-
注册全局错误捕获:将 Vue 的 error handler、
window.onerror
、unhandledrejection
等挂接到 Sentry 的捕获链路; -
配置上下文与默认信息:environment、release、tags、breadcrumbs 等会随事件上报;
-
初始化集成(integrations):例如
BrowserTracing
(性能追踪)、Replay
(会话回放)等,集成会在浏览器中额外收集导航性能、路由变更、用户会话等; -
暴露 API:如
Sentry.captureException
,Sentry.setUser
,Sentry.setTag
,供代码其他位置手动上报或补充上下文。
-
release
要与打包时上传 sourcemap 的release
完全一致,否则 Sentry 无法正确匹配并还原源码行号; -
如果你不上传 map 文件到 sentry 服务器,那么 sentry 捕获的错误智能展示压缩后行号。
五、将 sentry 捕获的错误推送到钉钉报警群
我们可以通过配置告警规则来把 sentry 捕获的错误推送到钉钉报警群。
但是 Sentry 上能看到事件,不代表一定会触发告警推送到第三方(如钉钉)。原因在于 Sentry 的事件上报和告警规则(Alert Rules)是两套机制:
-
事件上报:任何被 SDK 捕获并上报的异常都会在 Sentry 项目中产生 event/issue。
-
告警推送:需要在 Sentry 项目中单独配置 Alert Rules,指定何种条件下触发(例如新建 Issue、Issue 回归、事件速率阈值等),并指定通知渠道(邮箱、Slack、Webhook、DingTalk 等)。
要把错误推送到钉钉,需要:
-
在钉钉群里创建自定义机器人并获取 Webhook;
-
在 Sentry 中配置一个通知集成(Webhook / DingTalk 插件或使用通用 webhook);
-
在项目的 Alerts → Alert Rules 中创建规则并指定该通知渠道。
六、总结
建议把 Sentry 集成流程纳入 CI/CD 的固定步骤,示例顺序如下:
-
CI 拉取代码,生成
RELEASE_VERSION
(用 commit hash); -
安装依赖并执行
vite build
(sourcemap: true
); -
使用
@sentry/vite-plugin
(debug: true
临时启用以便观察)上传 Source Map 并用filesToDeleteAfterUpload
删除.map
; -
验证上传日志无误后,将产物(不含
.map
)发布到 OSS/CDN; -
运行时在
main.ts
中Sentry.init({ release: RELEASE_VERSION })
,确保上报事件能被还原; -
在 Sentry 中配置 Alert Rules 与钉钉 Webhook,搭建告警闭环。