vikunja/frontend/src/sentry.ts

76 lines
1.9 KiB
TypeScript

import type {App} from 'vue'
import type {Router} from 'vue-router'
import {AxiosError} from 'axios'
import {VERSION} from './version.json'
export default async function setupSentry(app: App, router: Router) {
const Sentry = await import('@sentry/vue')
Sentry.init({
app,
dsn: window.SENTRY_DSN ?? '',
release: `vikunja-frontend@${VERSION}`,
// cache offline errors
transport: Sentry.makeBrowserOfflineTransport(Sentry.makeFetchTransport),
integrations: [
Sentry.browserTracingIntegration({ router }),
Sentry.replayIntegration(),
],
// vue
trackComponents: true,
// Set tracesSampleRate to 1.0 to capture 100%
// of transactions for tracing.
// We recommend adjusting this value in production
tracesSampleRate: 1.0,
// Set `tracePropagationTargets` to control for which URLs trace propagation should be enabled
tracePropagationTargets: [
'localhost',
/^\//,
// /^https:\/\/yourserver\.io\/api/,
],
// Capture Replay for 10% of all sessions,
// plus for 100% of sessions with an error
replaysSessionSampleRate: 0.1,
replaysOnErrorSampleRate: 1.0,
beforeSend(event, hint) {
if ((typeof hint.originalException?.code !== 'undefined' &&
typeof hint.originalException?.message !== 'undefined')
|| hint.originalException instanceof AxiosError) {
return null
}
return event
},
})
// from https://docs.sentry.io/platforms/javascript/guides/vue/troubleshooting/
// under "Capturing resource 404s"
document.body.addEventListener(
'error',
(event) => {
if (!event.target) return
if (event.target.tagName === 'IMG') {
Sentry.captureMessage(
`Failed to load image: ${event.target.src}`,
'warning',
)
} else if (event.target.tagName === 'LINK') {
Sentry.captureMessage(
`Failed to load css: ${event.target.href}`,
'warning',
)
}
},
true, // useCapture - necessary for resource loading errors
)
}