mirror of
https://github.com/pezkuwichain/pwap.git
synced 2026-04-22 21:47:56 +00:00
92 lines
2.5 KiB
TypeScript
92 lines
2.5 KiB
TypeScript
import * as Sentry from '@sentry/react';
|
|
|
|
export const initSentry = () => {
|
|
const dsn = import.meta.env.VITE_SENTRY_DSN;
|
|
|
|
// Only initialize if DSN is provided and not in development
|
|
if (!dsn || import.meta.env.DEV) {
|
|
if (import.meta.env.DEV) {
|
|
console.log('📊 Sentry disabled in development');
|
|
}
|
|
return;
|
|
}
|
|
|
|
Sentry.init({
|
|
dsn,
|
|
environment: import.meta.env.VITE_SENTRY_ENVIRONMENT || 'production',
|
|
integrations: [
|
|
Sentry.browserTracingIntegration(),
|
|
Sentry.replayIntegration({
|
|
maskAllText: false,
|
|
blockAllMedia: false,
|
|
}),
|
|
],
|
|
|
|
// Performance Monitoring
|
|
tracesSampleRate: parseFloat(import.meta.env.VITE_SENTRY_TRACES_SAMPLE_RATE || '0.1'),
|
|
|
|
// Session Replay
|
|
replaysSessionSampleRate: 0.1, // 10% of sessions
|
|
replaysOnErrorSampleRate: 1.0, // 100% of sessions with errors
|
|
|
|
// Filter out sensitive data
|
|
beforeSend(event) {
|
|
// Don't send errors in development
|
|
if (import.meta.env.DEV) {
|
|
return null;
|
|
}
|
|
|
|
// Filter out wallet addresses and sensitive data
|
|
if (event.request?.url) {
|
|
event.request.url = event.request.url.replace(/5[A-HJ-NP-Za-km-z]{47}/g, '[REDACTED_WALLET]');
|
|
}
|
|
|
|
if (event.breadcrumbs) {
|
|
event.breadcrumbs = event.breadcrumbs.map(breadcrumb => {
|
|
if (breadcrumb.data) {
|
|
breadcrumb.data = JSON.parse(
|
|
JSON.stringify(breadcrumb.data).replace(/5[A-HJ-NP-Za-km-z]{47}/g, '[REDACTED_WALLET]')
|
|
);
|
|
}
|
|
return breadcrumb;
|
|
});
|
|
}
|
|
|
|
return event;
|
|
},
|
|
|
|
// Ignore common non-critical errors
|
|
ignoreErrors: [
|
|
// Browser extensions (MetaMask, etc.)
|
|
'top.GLOBALS',
|
|
'canvas.contentDocument',
|
|
'MyApp_RemoveAllHighlights',
|
|
'atomicFindClose',
|
|
'ObjectMultiplex',
|
|
'StreamMiddleware',
|
|
'malformed chunk',
|
|
'Unknown response id',
|
|
// Network errors that are expected
|
|
'NetworkError',
|
|
'Failed to fetch',
|
|
'Load failed',
|
|
// Polkadot.js expected disconnections
|
|
'WebSocket is not connected',
|
|
'RPC connection closed',
|
|
],
|
|
});
|
|
|
|
// Set user context when available
|
|
const selectedWallet = localStorage.getItem('selectedWallet');
|
|
if (selectedWallet) {
|
|
Sentry.setUser({
|
|
id: selectedWallet.slice(0, 8), // Only first 8 chars for privacy
|
|
});
|
|
}
|
|
|
|
console.log('📊 Sentry initialized');
|
|
};
|
|
|
|
// Export Sentry for use in error boundaries and manual reporting
|
|
export { Sentry };
|