68 lines
2.7 KiB
TypeScript
68 lines
2.7 KiB
TypeScript
import { useEffect } from 'react';
|
|
import { httpClientIntegration } from '@sentry/integrations';
|
|
import { init } from '@sentry/react';
|
|
import { beforeBreadcrumb, beforeSend, clientShutdown, customTransport, useToken, useSentryStore, sentryConfig } from '../model';
|
|
|
|
/**
|
|
* Инициализирует Sentry SDK и настраивает интеграции, transport и другие параметры.
|
|
*
|
|
* @param releaseVersion - Версия релиза приложения.
|
|
*/
|
|
const useSentry = (releaseVersion: string): void => {
|
|
const { token, attempts, isSendingAllowed, setState } = useSentryStore(state => ({
|
|
token: state.token,
|
|
attempts: state.attempts,
|
|
isSendingAllowed: state.isSendingAllowed,
|
|
setState: state.setState,
|
|
}));
|
|
|
|
const { dsn, enabledTokenGeneration, url } = sentryConfig;
|
|
|
|
// Признак активности механизма генерации токена для отправляемых данных
|
|
const isTokenGenerationAvailable = Boolean(enabledTokenGeneration && url);
|
|
|
|
// Включаем Sentry только в production среде и при доступности генерации токена.
|
|
const enabled = Boolean(process.env.NODE_ENV === 'production' && releaseVersion && isTokenGenerationAvailable);
|
|
|
|
const renewToken = useToken({ enabled, token, isSendingAllowed, attempts, setState });
|
|
|
|
useEffect(() => {
|
|
if (!enabled) return;
|
|
|
|
// Инициализация подключения к Sentry
|
|
init({
|
|
dsn,
|
|
integrations: [
|
|
httpClientIntegration({
|
|
// Логируем ошибки запросов с кодами ответов 400-599
|
|
failedRequestStatusCodes: [[400, 599]],
|
|
// Не логируем ошибки запросов к Sentry, если указан URL для генерации токена
|
|
failedRequestTargets: url ? [new RegExp(`^((?!${url}).)*$`)] : undefined,
|
|
}),
|
|
],
|
|
sendDefaultPii: true,
|
|
tracesSampleRate: 1.0,
|
|
release: releaseVersion,
|
|
environment: process.env.NODE_ENV,
|
|
ignoreErrors: [/ResizeObserver/],
|
|
transport: customTransport({
|
|
token,
|
|
attempts,
|
|
setState,
|
|
renewToken,
|
|
}),
|
|
// Коллбэк для обработки breadcrumbs перед отправкой в Sentry.
|
|
beforeBreadcrumb: (breadcrumb, hint) => beforeBreadcrumb(breadcrumb, hint, isSendingAllowed),
|
|
// Коллбэк для обработки событий перед отправкой в Sentry.
|
|
beforeSend: event => beforeSend(event, isSendingAllowed),
|
|
});
|
|
|
|
return () => {
|
|
// Завершение работы Sentry
|
|
clientShutdown();
|
|
};
|
|
}, [dsn, enabled, releaseVersion, renewToken, url]);
|
|
};
|
|
|
|
export { useSentry };
|