
错误监控的目标不是“收集更多错误”,而是精准识别影响用户的关键问题,并在最短时间内把它交到合适的人手上解决。本文从接入 Sentry 的实践出发,覆盖初始化、上报策略与降噪、错误分组与上下文、Sourcemap、以及在 Sentry 中配置自定义告警规则的落地方法。
安装依赖
npm i @sentry/react @sentry/tracing初始化(入口文件)
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');错误边界(组件级捕获)
import { ErrorBoundary } from '@sentry/react';
function Fallback({ error }: { error: Error }) {
return <div>抱歉,页面出错:{error.message}</div>;
}
export function AppRoot() {
return (
<ErrorBoundary fallback={Fallback}>
<App />
</ErrorBoundary>
);
}业务上报(携带上下文)
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。示例:统一拦截未处理的 Promise 拒绝
window.addEventListener('unhandledrejection', (e) => {
Sentry.captureException(e.reason instanceof Error ? e.reason : new Error(String(e.reason)), {
tags: { type: 'unhandledrejection' },
});
});route/feature/severity/release 等维度打标,方便筛选与告警匹配。示例:自定义分组
Sentry.captureException(new Error('API /orders 500'), {
fingerprint: ['api-error', 'orders', '500'],
tags: { route: '/orders', feature: 'order-list' },
});sourceMap,并与 release 绑定上传至 Sentry。authToken 环境变量。Webpack 示例(按需调整)
// 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'],
}),
],
};告警类型
推荐规则(生产环境示例)
environment=production 且产生新 Issue 时,通知到值班频道(Slack/邮件)。release 的错误数较前一版本提升 > 30%。tags.feature=checkout 的错误频次超过阈值时告警。落地要点
environment/release/route/feature 精准筛选,避免告警洪水。tags/contexts/breadcrumbs 是否完整、有用。beforeSend 与规则阈值,持续降噪与提效。示例:触发一次测试错误
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 打标签,支撑细粒度告警。前端错误监控的价值在于“更快更准地修复影响用户的问题”。从接入到治理到告警闭环,形成一套可演进的工程体系,才能让监控真正产生业务影响。