Files
pwap/web/src/lib/sentry.ts
T

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 };