apps/web: fix sentry trpc capture exception
This commit is contained in:
parent
e258873976
commit
557053caa6
@ -104,6 +104,5 @@ module.exports = withSentryConfig(
|
|||||||
hideSourceMaps: true,
|
hideSourceMaps: true,
|
||||||
transpileClientSDK: false,
|
transpileClientSDK: false,
|
||||||
tunnelRoute: '/track-error',
|
tunnelRoute: '/track-error',
|
||||||
widenClientFileUpload: true,
|
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
/* eslint-disable canonical/filename-match-regex */
|
/* eslint-disable canonical/filename-match-regex */
|
||||||
import { Result } from 'ui/elements';
|
import { Result } from 'ui/elements';
|
||||||
|
|
||||||
export default function ServerError() {
|
export default function ServerError({ statusCode = '500' }) {
|
||||||
return <Result status="500" title="Ой" subTitle=" Что-то сломалось" />;
|
return <Result status={statusCode} title="Ой" subTitle=" Что-то сломалось" />;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1,9 +1,10 @@
|
|||||||
/* eslint-disable canonical/no-use-extend-native */
|
/* eslint-disable canonical/no-use-extend-native */
|
||||||
|
import ServerError from './500';
|
||||||
import { captureUnderscoreErrorException } from '@sentry/nextjs';
|
import { captureUnderscoreErrorException } from '@sentry/nextjs';
|
||||||
import Error from 'next/error';
|
import Error from 'next/error';
|
||||||
|
|
||||||
function CustomErrorComponent(props) {
|
function CustomErrorComponent(props) {
|
||||||
return <Error statusCode={props.statusCode} />;
|
return <ServerError statusCode={props.statusCode} />;
|
||||||
}
|
}
|
||||||
|
|
||||||
CustomErrorComponent.getInitialProps = async (contextData) => {
|
CustomErrorComponent.getInitialProps = async (contextData) => {
|
||||||
|
|||||||
@ -1,7 +1,6 @@
|
|||||||
/* eslint-disable canonical/filename-match-regex */
|
/* eslint-disable canonical/filename-match-regex */
|
||||||
import { createContext } from '@/server/context';
|
import { createContext } from '@/server/context';
|
||||||
import { appRouter } from '@/server/routers/_app';
|
import { appRouter } from '@/server/routers/_app';
|
||||||
import { captureException, withScope } from '@sentry/nextjs';
|
|
||||||
import * as trpcNext from '@trpc/server/adapters/next';
|
import * as trpcNext from '@trpc/server/adapters/next';
|
||||||
|
|
||||||
export default trpcNext.createNextApiHandler({
|
export default trpcNext.createNextApiHandler({
|
||||||
@ -23,17 +22,7 @@ export default trpcNext.createNextApiHandler({
|
|||||||
onError(opts) {
|
onError(opts) {
|
||||||
const { error } = opts;
|
const { error } = opts;
|
||||||
// send to bug reporting
|
// send to bug reporting
|
||||||
if (!['BAD_REQUEST', 'UNAUTHORIZED', 'FORBIDDEN'].includes(error.code))
|
|
||||||
withScope((scope) => {
|
|
||||||
(Object.keys(opts) as Array<keyof typeof opts>).forEach((key) => {
|
|
||||||
if (key !== 'req') {
|
|
||||||
let extra = opts[key];
|
|
||||||
if (key === 'input') extra = JSON.stringify(extra);
|
|
||||||
scope.setExtra(key, extra);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
captureException(error);
|
|
||||||
});
|
|
||||||
// eslint-disable-next-line no-console
|
// eslint-disable-next-line no-console
|
||||||
console.error('Something went wrong', error);
|
console.error('Something went wrong', error);
|
||||||
},
|
},
|
||||||
|
|||||||
@ -3,12 +3,18 @@
|
|||||||
// https://docs.sentry.io/platforms/javascript/guides/nextjs/
|
// https://docs.sentry.io/platforms/javascript/guides/nextjs/
|
||||||
|
|
||||||
import getUrls from './config/urls';
|
import getUrls from './config/urls';
|
||||||
|
import { publicRuntimeConfigSchema } from '@/config/schema/runtime-config';
|
||||||
import { init } from '@sentry/nextjs';
|
import { init } from '@sentry/nextjs';
|
||||||
|
import getConfig from 'next/config';
|
||||||
|
|
||||||
const { SENTRY_DSN } = getUrls();
|
const { SENTRY_DSN } = getUrls();
|
||||||
|
|
||||||
|
const { publicRuntimeConfig } = getConfig();
|
||||||
|
const { SENTRY_ENVIRONMENT } = publicRuntimeConfigSchema.parse(publicRuntimeConfig);
|
||||||
|
|
||||||
init({
|
init({
|
||||||
debug: false,
|
debug: false,
|
||||||
dsn: SENTRY_DSN,
|
dsn: SENTRY_DSN,
|
||||||
|
environment: SENTRY_ENVIRONMENT,
|
||||||
tracesSampleRate: 1,
|
tracesSampleRate: 1,
|
||||||
});
|
});
|
||||||
|
|||||||
@ -3,13 +3,18 @@
|
|||||||
// https://docs.sentry.io/platforms/javascript/guides/nextjs/
|
// https://docs.sentry.io/platforms/javascript/guides/nextjs/
|
||||||
|
|
||||||
import getUrls from './config/urls';
|
import getUrls from './config/urls';
|
||||||
|
import { publicRuntimeConfigSchema } from '@/config/schema/runtime-config';
|
||||||
import { init } from '@sentry/nextjs';
|
import { init } from '@sentry/nextjs';
|
||||||
|
import getConfig from 'next/config';
|
||||||
|
|
||||||
const { SENTRY_DSN } = getUrls();
|
const { SENTRY_DSN } = getUrls();
|
||||||
|
|
||||||
|
const { publicRuntimeConfig } = getConfig();
|
||||||
|
const { SENTRY_ENVIRONMENT } = publicRuntimeConfigSchema.parse(publicRuntimeConfig);
|
||||||
|
|
||||||
init({
|
init({
|
||||||
debug: false,
|
debug: false,
|
||||||
|
|
||||||
dsn: SENTRY_DSN,
|
dsn: SENTRY_DSN,
|
||||||
|
environment: SENTRY_ENVIRONMENT,
|
||||||
tracesSampleRate: 1,
|
tracesSampleRate: 1,
|
||||||
});
|
});
|
||||||
|
|||||||
@ -1,4 +1,5 @@
|
|||||||
import { getUser } from '@/api/user/query';
|
import { getUser } from '@/api/user/query';
|
||||||
|
import { getCurrentScope } from '@sentry/node';
|
||||||
import type { inferAsyncReturnType } from '@trpc/server';
|
import type { inferAsyncReturnType } from '@trpc/server';
|
||||||
import type { CreateNextContextOptions } from '@trpc/server/adapters/next';
|
import type { CreateNextContextOptions } from '@trpc/server/adapters/next';
|
||||||
|
|
||||||
@ -11,6 +12,9 @@ export async function createContext({ req }: CreateNextContextOptions) {
|
|||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
|
const scope = getCurrentScope();
|
||||||
|
scope.setUser(user);
|
||||||
|
|
||||||
return {
|
return {
|
||||||
user,
|
user,
|
||||||
};
|
};
|
||||||
|
|||||||
@ -1,5 +1,5 @@
|
|||||||
/* eslint-disable canonical/sort-keys */
|
/* eslint-disable canonical/sort-keys */
|
||||||
import { protectedProcedure, publicProcedure } from '../../procedure';
|
import { protectedProcedure } from '../../procedure';
|
||||||
import { router } from '../../trpc';
|
import { router } from '../../trpc';
|
||||||
import { createRequestData } from '../calculate/lib/request';
|
import { createRequestData } from '../calculate/lib/request';
|
||||||
import { transformCalculateResults } from '../calculate/lib/transform';
|
import { transformCalculateResults } from '../calculate/lib/transform';
|
||||||
@ -54,7 +54,7 @@ const defaultPayments = { values: [], sums: [] };
|
|||||||
const { URL_CRM_DOWNLOADKP } = getUrls();
|
const { URL_CRM_DOWNLOADKP } = getUrls();
|
||||||
|
|
||||||
export const quoteRouter = router({
|
export const quoteRouter = router({
|
||||||
getQuote: publicProcedure
|
getQuote: protectedProcedure
|
||||||
.input(GetQuoteInputDataSchema)
|
.input(GetQuoteInputDataSchema)
|
||||||
.output(GetQuoteOutputDataSchema)
|
.output(GetQuoteOutputDataSchema)
|
||||||
.query(async ({ input }) => {
|
.query(async ({ input }) => {
|
||||||
|
|||||||
@ -1,14 +1,19 @@
|
|||||||
import { publicProcedure } from '../../procedure';
|
import { protectedProcedure } from '../../procedure';
|
||||||
import { router } from '../../trpc';
|
import { router } from '../../trpc';
|
||||||
import { GetTarifInputSchema } from './types';
|
import { GetTarifInputSchema } from './types';
|
||||||
import initializeApollo from '@/apollo/client';
|
import initializeApollo from '@/apollo/client';
|
||||||
import configuratorHelper from '@/process/configurator/lib/helper';
|
import configuratorHelper from '@/process/configurator/lib/helper';
|
||||||
|
import { createTRPCError } from '@/utils/trpc';
|
||||||
|
|
||||||
export const tarifRouter = router({
|
export const tarifRouter = router({
|
||||||
getTarif: publicProcedure.input(GetTarifInputSchema).query(async ({ input }) => {
|
getTarif: protectedProcedure.input(GetTarifInputSchema).query(async ({ input }) => {
|
||||||
const apolloClient = initializeApollo();
|
try {
|
||||||
const { getTarifs } = configuratorHelper({ apolloClient });
|
const apolloClient = initializeApollo();
|
||||||
|
const { getTarifs } = configuratorHelper({ apolloClient });
|
||||||
|
|
||||||
return getTarifs(input);
|
return getTarifs(input);
|
||||||
|
} catch (error) {
|
||||||
|
throw createTRPCError(error);
|
||||||
|
}
|
||||||
}),
|
}),
|
||||||
});
|
});
|
||||||
|
|||||||
@ -11,7 +11,7 @@
|
|||||||
|
|
||||||
import type { Context } from './context';
|
import type { Context } from './context';
|
||||||
import { initTRPC } from '@trpc/server';
|
import { initTRPC } from '@trpc/server';
|
||||||
import SuperJSON from 'superjson';
|
import { SuperJSON } from 'superjson';
|
||||||
|
|
||||||
export const t = initTRPC.context<Context>().create({
|
export const t = initTRPC.context<Context>().create({
|
||||||
/**
|
/**
|
||||||
|
|||||||
@ -3,7 +3,7 @@ import type { AppRouter } from '@/server/routers/_app';
|
|||||||
import { createTRPCProxyClient, httpBatchLink, loggerLink } from '@trpc/client';
|
import { createTRPCProxyClient, httpBatchLink, loggerLink } from '@trpc/client';
|
||||||
import { createTRPCNext } from '@trpc/next';
|
import { createTRPCNext } from '@trpc/next';
|
||||||
import type { NextPageContext } from 'next';
|
import type { NextPageContext } from 'next';
|
||||||
import SuperJSON from 'superjson';
|
import { SuperJSON } from 'superjson';
|
||||||
import { isServer } from 'tools/common';
|
import { isServer } from 'tools/common';
|
||||||
|
|
||||||
export type SSRContext = NextPageContext & {
|
export type SSRContext = NextPageContext & {
|
||||||
@ -60,6 +60,7 @@ export const trpcClient = createTRPCNext<AppRouter>({
|
|||||||
|
|
||||||
const {
|
const {
|
||||||
// If you're using Node 18 before 18.15.0, omit the "connection" header
|
// If you're using Node 18 before 18.15.0, omit the "connection" header
|
||||||
|
// eslint-disable-next-line @typescript-eslint/naming-convention, @typescript-eslint/no-unused-vars
|
||||||
connection: _connection,
|
connection: _connection,
|
||||||
...headers
|
...headers
|
||||||
} = ctx.req.headers;
|
} = ctx.req.headers;
|
||||||
|
|||||||
@ -1,8 +1,7 @@
|
|||||||
import { HttpError } from './error';
|
import { HttpError } from './error';
|
||||||
import { captureException, withScope } from '@sentry/nextjs';
|
import { captureException } from '@sentry/nextjs';
|
||||||
import type { AxiosError } from 'axios';
|
import type { AxiosError } from 'axios';
|
||||||
import { isAxiosError } from 'axios';
|
import { isAxiosError } from 'axios';
|
||||||
import { pick } from 'radash';
|
|
||||||
|
|
||||||
function getErrorMessage<T extends { error?: string; errors?: string[]; message?: string }>(
|
function getErrorMessage<T extends { error?: string; errors?: string[]; message?: string }>(
|
||||||
error: AxiosError<T>
|
error: AxiosError<T>
|
||||||
@ -21,22 +20,9 @@ export async function withHandleError<T>(fn: Promise<T>) {
|
|||||||
const message = getErrorMessage(error_);
|
const message = getErrorMessage(error_);
|
||||||
|
|
||||||
if (error_.response?.status && error_.response?.status >= 500) {
|
if (error_.response?.status && error_.response?.status >= 500) {
|
||||||
const err = pick(error_, ['code', 'message', 'status', 'cause']);
|
|
||||||
const data = error_.config?.data;
|
|
||||||
const params = error_.config?.params;
|
|
||||||
|
|
||||||
const opts = { ...err, data, message, params };
|
|
||||||
|
|
||||||
error_.message += ` | ${message}`;
|
error_.message += ` | ${message}`;
|
||||||
|
|
||||||
withScope((scope) => {
|
captureException(error_);
|
||||||
(Object.keys(opts) as Array<keyof typeof opts>).forEach((key) => {
|
|
||||||
let extra = opts[key];
|
|
||||||
if (key === 'data') extra = JSON.stringify(extra);
|
|
||||||
scope.setExtra(key, extra);
|
|
||||||
});
|
|
||||||
captureException(error_);
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
throw new HttpError(message, error_.status || error_.response?.status);
|
throw new HttpError(message, error_.status || error_.response?.status);
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user