62 lines
1.7 KiB
TypeScript
62 lines
1.7 KiB
TypeScript
/**
|
||
* Sentry Client Configuration
|
||
* ===========================
|
||
* 前端錯誤追蹤與效能監控
|
||
*
|
||
* 部署: Self-Hosted 內部來源(僅 runtime)
|
||
* 整合策略: 補強 SignOz,專注 Error Tracking + Session Replay
|
||
*/
|
||
|
||
import * as Sentry from '@sentry/nextjs'
|
||
|
||
// 只在有 DSN 時初始化 (環境變數控制)
|
||
if (process.env.NEXT_PUBLIC_SENTRY_DSN) {
|
||
Sentry.init({
|
||
dsn: process.env.NEXT_PUBLIC_SENTRY_DSN,
|
||
|
||
// Sentry Tunnel: 避免區域網路權限對話框
|
||
// @see apps/web/src/app/api/sentry-tunnel/route.ts
|
||
// @see feedback_sentry_local_network.md
|
||
tunnel: '/api/sentry-tunnel',
|
||
|
||
// 環境標識
|
||
environment: process.env.NODE_ENV,
|
||
|
||
// 效能監控取樣率 (生產環境降低以節省資源)
|
||
tracesSampleRate: process.env.NODE_ENV === 'production' ? 0.2 : 1.0,
|
||
|
||
// Session Replay 設定 (Sentry 獨家功能)
|
||
replaysSessionSampleRate: 0.1, // 10% 隨機 session
|
||
replaysOnErrorSampleRate: 1.0, // 100% 錯誤 session
|
||
|
||
// 整合設定
|
||
integrations: [
|
||
Sentry.replayIntegration({
|
||
// 隱私保護: 遮蔽敏感資料
|
||
maskAllText: false,
|
||
maskAllInputs: true,
|
||
blockAllMedia: false,
|
||
}),
|
||
Sentry.browserTracingIntegration(),
|
||
],
|
||
|
||
// 忽略常見的非錯誤
|
||
ignoreErrors: [
|
||
// 網路錯誤 (使用者網路問題)
|
||
'Failed to fetch',
|
||
'NetworkError',
|
||
'Load failed',
|
||
// 瀏覽器擴充套件
|
||
'ResizeObserver loop limit exceeded',
|
||
// 第三方腳本
|
||
/^Script error\.?$/,
|
||
],
|
||
|
||
// 只在生產環境發送
|
||
enabled: process.env.NODE_ENV === 'production',
|
||
|
||
// Debug 模式 (開發時啟用)
|
||
debug: process.env.NODE_ENV === 'development',
|
||
})
|
||
}
|