前端错误监控与上报:Sentry 接入与自定义告警规则
错误监控的目标不是"收集更多错误",而是精准识别影响用户的关键问题,并在最短时间内把它交到合适的人手上解决。本文从接入 Sentry 的实践出发,覆盖初始化、上报策略与降噪、错误分组与上下文、Sourcemap、以及在 Sentry 中配置自定义告警规则的落地方法。
为什么需要前端错误监控
- 快速定位:将用户环境、路由、版本与堆栈统一上报,可直接指向代码位置。
- 实时告警:以频次、用户影响度或特定标签触发告警,减少"问题被动发现"。
- 可度量:按版本/渠道统计错误率,支持回归检测与放量监控。
- 可治理:统一过滤三方噪音、隐私脱敏、错误分组归档,降低维护成本。
快速接入 Sentry(React 示例)
安装依赖
bash
npm i @sentry/react @sentry/tracing
初始化(入口文件)
ts
import * as Sentry from '@sentry/react';
import { BrowserTracing } from '@sentry/tracing';
Sentry.init({
dsn: process.env.SENTRY_DSN,
environment: process.env.NODE_ENV,
release: process.env.APP_VERSION, // 与构建版本对应,便于回溯
integrations: [new BrowserTracing()],
tracesSampleRate: 0.1, // 前端性能采样比例,按需调整
allowUrls: [/yourdomain\.com/], // 仅采集一方域名,减少噪音
denyUrls: [/extensions\//, /^chrome:\/\//], // 屏蔽浏览器扩展错误
beforeSend(event, hint) {
// 脱敏:移除可能的敏感信息
if (event.request?.headers) {
delete (event.request.headers as any).Authorization;
}
// 过滤低价值或已知噪音错误
const msg = (hint?.originalException as any)?.message || event.message || '';
if (typeof msg === 'string' && /ResizeObserver loop limit exceeded/i.test(msg)) {
return null; // 丢弃常见噪音
}
return event;
},
});
// 统一设置用户与通用标签(示例)
Sentry.setUser({ id: 'anonymous' });
Sentry.setTag('channel', 'web');
错误边界(组件级捕获)
tsx
import { ErrorBoundary } from '@sentry/react';
function Fallback({ error }: { error: Error }) {
return <div>抱歉,页面出错:{error.message}</div>;
}
export function AppRoot() {
return (
<ErrorBoundary fallback={Fallback}>
<App />
</ErrorBoundary>
);
}
业务上报(携带上下文)
ts
try {
// ...业务逻辑
} catch (error) {
Sentry.captureException(error as Error, {
tags: { feature: 'checkout', severity: 'high' },
extra: { cartSize: 3, coupon: 'SPRING' },
});
}
上报策略与降噪
- 统一入口:尽量通过
ErrorBoundary与window.onunhandledrejection接管异常,减少漏报。 - 过滤三方噪音:使用
allowUrls/denyUrls与beforeSend丢弃扩展、广告脚本错误。 - 降采样:对"高频但低价值"的错误降低采样或直接过滤,保留关键事件。
- 隐私脱敏:在
beforeSend中清理Authorization、邮箱/手机号等 PII。 - 离线队列:网络不可用时先缓存,恢复后批量上报(可自实现或借助 SDK 能力)。
示例:统一拦截未处理的 Promise 拒绝
ts
window.addEventListener('unhandledrejection', (e) => {
Sentry.captureException(e.reason instanceof Error ? e.reason : new Error(String(e.reason)), {
tags: { type: 'unhandledrejection' },
});
});
错误分组与上下文(便于告警与追踪)
- 指定 fingerprint:将同类错误按业务维度分组,提升可读性与治理效率。
- 标签(tags):为
route/feature/severity/release等维度打标,方便筛选与告警匹配。 - 面包屑(breadcrumbs):记录用户操作与重要事件,便于复现路径。
示例:自定义分组
ts
Sentry.captureException(new Error('API /orders 500'), {
fingerprint: ['api-error', 'orders', '500'],
tags: { route: '/orders', feature: 'order-list' },
});
Sourcemap 与版本回溯
- 打包产物需生成
sourceMap,并与release绑定上传至 Sentry。 - 仅上传构建目录的 map 文件,不包含源代码;注意使用
authToken环境变量。
Webpack 示例(按需调整)
js
// webpack.config.js
const SentryWebpackPlugin = require('@sentry/webpack-plugin');
module.exports = {
// ...其他配置
devtool: 'source-map',
plugins: [
new SentryWebpackPlugin({
authToken: process.env.SENTRY_AUTH_TOKEN,
org: 'your-org',
project: 'your-project',
release: process.env.APP_VERSION,
include: './dist',
ignore: ['node_modules'],
}),
],
};
自定义告警规则(Sentry UI 配置建议)
告警类型
- Issue Alert:基于错误事件触发(新问题、频次、特定标签)。
- Metric Alert:基于性能/错误率指标触发(如某路由 p95、会话错误率)。
推荐规则(生产环境示例)
- 新问题告警:当
environment=production且产生新 Issue 时,通知到值班频道(Slack/邮件)。 - 高频错误:5 分钟内事件数 > 50,或错误率 > 0.5%(需接入会话数据)。
- 回归检测:同一
release的错误数较前一版本提升 > 30%。 - 业务维度:当
tags.feature=checkout的错误频次超过阈值时告警。
落地要点
- 条件过滤:按
environment/release/route/feature精准筛选,避免告警洪水。 - 告警收敛:设置"触发频率与静默期",减少重复通知。
- 责任闭环:直接指派到团队/负责人,结合 Sentry Ownership 规则实现自动归属。
验证与演练
- 演练:在非生产环境主动抛出测试异常,验证上报、分组、Sourcemap 解析与告警触发。
- 回放:核对事件的
tags/contexts/breadcrumbs是否完整、有用。 - 调整:根据告警质量迭代
beforeSend与规则阈值,持续降噪与提效。
示例:触发一次测试错误
ts
Sentry.captureMessage('Sentry 接入演练:test-message', { level: 'info' });
Sentry.captureException(new Error('Sentry 接入演练:test-error'), {
tags: { environment: 'staging' },
});
最佳实践清单
- 只采集一方错误:
allowUrls限定域名,避免三方脚本噪音。 - 严格脱敏:
beforeSend统一清理敏感信息。 - 版本一致:
release与构建版本严格对应,Sourcemap 可正确解析堆栈。 - 维度完备:按
route/feature/severity/user.segment打标签,支撑细粒度告警。 - 告警闭环:告警直达可行动的群组/负责人,并建立处理时限。
前端错误监控的价值在于"更快更准地修复影响用户的问题"。从接入到治理到告警闭环,形成一套可演进的工程体系,才能让监控真正产生业务影响。