Ghost/ghost/admin/app/utils/sentry.js

51 lines
2.0 KiB
JavaScript

import {
isAjaxError
} from 'ember-ajax/errors';
export function beforeSend(event, hint) {
try {
const exception = hint.originalException;
event.tags = event.tags || {};
event.tags.shown_to_user = event.tags.shown_to_user || false;
event.tags.grammarly = !!document.querySelector('[data-gr-ext-installed]');
// Do not report "handled" errors to Sentry
if (event.tags.shown_to_user === true) {
return null;
}
// if the error value includes a model id then overwrite it to improve grouping
if (event.exception && event.exception.values && event.exception.values.length > 0) {
const pattern = /<(post|page):[a-f0-9]+>/;
const replacement = '<$1:ID>';
event.exception.values[0].value = event.exception.values[0].value.replace(pattern, replacement);
}
// ajax errors — improve logging and add context for debugging
if (isAjaxError(exception) && exception.payload && exception.payload.errors && exception.payload.errors.length > 0) {
const error = exception.payload.errors[0];
event.exception.values[0].type = `${error.type}: ${error.context}`;
event.exception.values[0].value = error.message;
event.exception.values[0].context = error.context;
} else {
delete event.contexts.ajax;
delete event.tags.ajax_status;
delete event.tags.ajax_method;
delete event.tags.ajax_url;
}
// Do not report posthog-js errors to Sentry
if (hint && hint.originalException && hint.originalException.stack) {
if (hint.originalException.stack.includes('/posthog-js/')) {
return null;
}
}
return event;
} catch (error) {
// If any errors occur in beforeSend, send the original event to Sentry
// Better to have some information than no information
return event;
}
}