From 8d8d2b592cf38beaaa06333c72973f3f98db7979 Mon Sep 17 00:00:00 2001 From: Hongbo Wu Date: Tue, 25 Jul 2023 18:18:40 +0800 Subject: [PATCH 1/9] move sentry error handler after apollo middleware --- packages/api/src/server.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/api/src/server.ts b/packages/api/src/server.ts index 3a936c60a..fcb009174 100755 --- a/packages/api/src/server.ts +++ b/packages/api/src/server.ts @@ -170,9 +170,6 @@ export const createApp = (): { throw new Error('Sentry TEST error!') }) - // The error handler must be before any other error middleware and after all routes - app.use(Sentry.Handlers.errorHandler()) - const apollo = makeApolloServer() const httpServer = createServer(app) @@ -193,6 +190,9 @@ const main = async (): Promise => { await apollo.start() apollo.applyMiddleware({ app, path: '/api/graphql', cors: corsConfig }) + // The error handler must be before any other error middleware and after all routes + app.use(Sentry.Handlers.errorHandler()) + if (!env.dev.isLocal) { const mwLogger = loggers.get('express', { levels: config.syslog.levels }) const transport = buildLoggerTransport('express') From de647e44bdc5d50a48f0b6e26b026e23d73f527b Mon Sep 17 00:00:00 2001 From: Hongbo Wu Date: Tue, 25 Jul 2023 19:10:12 +0800 Subject: [PATCH 2/9] Revert "move sentry error handler after apollo middleware" This reverts commit 8d8d2b592cf38beaaa06333c72973f3f98db7979. --- packages/api/src/server.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/api/src/server.ts b/packages/api/src/server.ts index fcb009174..3a936c60a 100755 --- a/packages/api/src/server.ts +++ b/packages/api/src/server.ts @@ -170,6 +170,9 @@ export const createApp = (): { throw new Error('Sentry TEST error!') }) + // The error handler must be before any other error middleware and after all routes + app.use(Sentry.Handlers.errorHandler()) + const apollo = makeApolloServer() const httpServer = createServer(app) @@ -190,9 +193,6 @@ const main = async (): Promise => { await apollo.start() apollo.applyMiddleware({ app, path: '/api/graphql', cors: corsConfig }) - // The error handler must be before any other error middleware and after all routes - app.use(Sentry.Handlers.errorHandler()) - if (!env.dev.isLocal) { const mwLogger = loggers.get('express', { levels: config.syslog.levels }) const transport = buildLoggerTransport('express') From 1006cdad3658d62f245b60af466f616341a6ade7 Mon Sep 17 00:00:00 2001 From: Hongbo Wu Date: Tue, 25 Jul 2023 19:11:08 +0800 Subject: [PATCH 3/9] reduce error log size --- packages/api/src/apollo.ts | 2 +- packages/api/src/routers/svc/webhooks.ts | 2 +- packages/api/src/services/create_page_save_request.ts | 2 +- packages/api/src/utils/parser.ts | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/api/src/apollo.ts b/packages/api/src/apollo.ts index 0a8f49fb8..e115e5858 100644 --- a/packages/api/src/apollo.ts +++ b/packages/api/src/apollo.ts @@ -104,7 +104,7 @@ export function makeApolloServer(): ApolloServer { schema: schema, context: contextFunc, formatError: (err) => { - console.log('server error', err) + // console.log('server error', err) Sentry.captureException(err) // hide error messages from frontend on prod return new Error('Unexpected server error') diff --git a/packages/api/src/routers/svc/webhooks.ts b/packages/api/src/routers/svc/webhooks.ts index eaa351be9..cc6c689f0 100644 --- a/packages/api/src/routers/svc/webhooks.ts +++ b/packages/api/src/routers/svc/webhooks.ts @@ -64,7 +64,7 @@ export function webhooksServiceRouter() { [type]: data, }) - console.log('triggering webhook', url, method, body) + console.log('triggering webhook', url) await axios.request({ url, method, diff --git a/packages/api/src/services/create_page_save_request.ts b/packages/api/src/services/create_page_save_request.ts index 8e0678d74..5aa92f719 100644 --- a/packages/api/src/services/create_page_save_request.ts +++ b/packages/api/src/services/create_page_save_request.ts @@ -145,7 +145,7 @@ export const createPageSaveRequest = async ({ // create processing page const pageId = await createPage(page, ctx) if (!pageId) { - console.log('Failed to create page', page) + console.log('Failed to create page', url) return Promise.reject({ errorCode: CreateArticleSavingRequestErrorCode.BadData, }) diff --git a/packages/api/src/utils/parser.ts b/packages/api/src/utils/parser.ts index 4347e9448..d3e4abe8d 100644 --- a/packages/api/src/utils/parser.ts +++ b/packages/api/src/utils/parser.ts @@ -443,7 +443,7 @@ export const parsePageMetadata = (html: string): Metadata | undefined => { return { title, author, description, previewImage } } catch (e) { - console.log('failed to parse page:', html, e) + console.log('failed to parse page:', e) return undefined } } From 0e38060b0c85e048f14490e0a18288ba3e2a04c7 Mon Sep 17 00:00:00 2001 From: Hongbo Wu Date: Tue, 25 Jul 2023 20:07:02 +0800 Subject: [PATCH 4/9] set maxEntrySize for logger to 256KB --- packages/api/src/apollo.ts | 2 +- packages/api/src/utils/logger.ts | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/api/src/apollo.ts b/packages/api/src/apollo.ts index e115e5858..a1ddf2093 100644 --- a/packages/api/src/apollo.ts +++ b/packages/api/src/apollo.ts @@ -104,7 +104,7 @@ export function makeApolloServer(): ApolloServer { schema: schema, context: contextFunc, formatError: (err) => { - // console.log('server error', err) + logger.error('server error', err) Sentry.captureException(err) // hide error messages from frontend on prod return new Error('Unexpected server error') diff --git a/packages/api/src/utils/logger.ts b/packages/api/src/utils/logger.ts index fe6eb3e53..0e89cb97f 100644 --- a/packages/api/src/utils/logger.ts +++ b/packages/api/src/utils/logger.ts @@ -29,6 +29,7 @@ const googleConfigs = { level: 'info', logName: 'logger', levels: config.syslog.levels, + maxEntrySize: 256000, // 256KB } function localConfig(id: string): ConsoleTransportOptions { From a3e86a9bc1942136f3c2ddf8bde95694d67b0222 Mon Sep 17 00:00:00 2001 From: Hongbo Wu Date: Tue, 25 Jul 2023 20:52:15 +0800 Subject: [PATCH 5/9] only log error.message --- packages/api/src/apollo.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/api/src/apollo.ts b/packages/api/src/apollo.ts index a1ddf2093..1fbf1090e 100644 --- a/packages/api/src/apollo.ts +++ b/packages/api/src/apollo.ts @@ -104,7 +104,7 @@ export function makeApolloServer(): ApolloServer { schema: schema, context: contextFunc, formatError: (err) => { - logger.error('server error', err) + logger.error('server error', err.message) Sentry.captureException(err) // hide error messages from frontend on prod return new Error('Unexpected server error') From fd6223ee93ae310238be3ae578c6b05bc08a40e3 Mon Sep 17 00:00:00 2001 From: Hongbo Wu Date: Tue, 25 Jul 2023 21:20:26 +0800 Subject: [PATCH 6/9] revert changes --- packages/api/src/apollo.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/api/src/apollo.ts b/packages/api/src/apollo.ts index 1fbf1090e..1527fa9ce 100644 --- a/packages/api/src/apollo.ts +++ b/packages/api/src/apollo.ts @@ -104,7 +104,7 @@ export function makeApolloServer(): ApolloServer { schema: schema, context: contextFunc, formatError: (err) => { - logger.error('server error', err.message) + logger.info('server error', err) Sentry.captureException(err) // hide error messages from frontend on prod return new Error('Unexpected server error') From ecd6a2922f68f8b3167f825ab862b12efef5b557 Mon Sep 17 00:00:00 2001 From: Hongbo Wu Date: Tue, 25 Jul 2023 22:32:00 +0800 Subject: [PATCH 7/9] disable sentry error handler --- packages/api/src/apollo.ts | 2 +- packages/api/src/server.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/api/src/apollo.ts b/packages/api/src/apollo.ts index 1527fa9ce..dd7f7b32f 100644 --- a/packages/api/src/apollo.ts +++ b/packages/api/src/apollo.ts @@ -105,7 +105,7 @@ export function makeApolloServer(): ApolloServer { context: contextFunc, formatError: (err) => { logger.info('server error', err) - Sentry.captureException(err) + // Sentry.captureException(err) // hide error messages from frontend on prod return new Error('Unexpected server error') }, diff --git a/packages/api/src/server.ts b/packages/api/src/server.ts index 3a936c60a..1290373df 100755 --- a/packages/api/src/server.ts +++ b/packages/api/src/server.ts @@ -171,7 +171,7 @@ export const createApp = (): { }) // The error handler must be before any other error middleware and after all routes - app.use(Sentry.Handlers.errorHandler()) + // app.use(Sentry.Handlers.errorHandler()) const apollo = makeApolloServer() const httpServer = createServer(app) From f5ae16a9042788a1527ce560e9f8cecaca414db8 Mon Sep 17 00:00:00 2001 From: Hongbo Wu Date: Tue, 25 Jul 2023 23:03:57 +0800 Subject: [PATCH 8/9] disable gql request log --- packages/api/src/apollo.ts | 10 +++++----- packages/api/src/server.ts | 2 +- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/packages/api/src/apollo.ts b/packages/api/src/apollo.ts index dd7f7b32f..e286b09a9 100644 --- a/packages/api/src/apollo.ts +++ b/packages/api/src/apollo.ts @@ -39,10 +39,10 @@ const contextFunc: ContextFunction = async ({ req, res, }) => { - logger.info(`handling gql request`, { - query: req.body.query, - variables: req.body.variables, - }) + // logger.info(`handling gql request`, { + // query: req.body.query, + // variables: req.body.variables, + // }) const token = req?.cookies?.auth || req?.headers?.authorization const claims = await getClaimsByToken(token) @@ -105,7 +105,7 @@ export function makeApolloServer(): ApolloServer { context: contextFunc, formatError: (err) => { logger.info('server error', err) - // Sentry.captureException(err) + Sentry.captureException(err) // hide error messages from frontend on prod return new Error('Unexpected server error') }, diff --git a/packages/api/src/server.ts b/packages/api/src/server.ts index 1290373df..3a936c60a 100755 --- a/packages/api/src/server.ts +++ b/packages/api/src/server.ts @@ -171,7 +171,7 @@ export const createApp = (): { }) // The error handler must be before any other error middleware and after all routes - // app.use(Sentry.Handlers.errorHandler()) + app.use(Sentry.Handlers.errorHandler()) const apollo = makeApolloServer() const httpServer = createServer(app) From 284178350490ecdb5d0360c5c0f9be7d0378928d Mon Sep 17 00:00:00 2001 From: Hongbo Wu Date: Tue, 25 Jul 2023 23:39:03 +0800 Subject: [PATCH 9/9] limit max log entry size to 256kb --- packages/api/src/apollo.ts | 8 ++++---- packages/api/src/utils/logger.ts | 14 ++++++++++++-- 2 files changed, 16 insertions(+), 6 deletions(-) diff --git a/packages/api/src/apollo.ts b/packages/api/src/apollo.ts index e286b09a9..1527fa9ce 100644 --- a/packages/api/src/apollo.ts +++ b/packages/api/src/apollo.ts @@ -39,10 +39,10 @@ const contextFunc: ContextFunction = async ({ req, res, }) => { - // logger.info(`handling gql request`, { - // query: req.body.query, - // variables: req.body.variables, - // }) + logger.info(`handling gql request`, { + query: req.body.query, + variables: req.body.variables, + }) const token = req?.cookies?.auth || req?.headers?.authorization const claims = await getClaimsByToken(token) diff --git a/packages/api/src/utils/logger.ts b/packages/api/src/utils/logger.ts index 0e89cb97f..0feb934c4 100644 --- a/packages/api/src/utils/logger.ts +++ b/packages/api/src/utils/logger.ts @@ -29,7 +29,6 @@ const googleConfigs = { level: 'info', logName: 'logger', levels: config.syslog.levels, - maxEntrySize: 256000, // 256KB } function localConfig(id: string): ConsoleTransportOptions { @@ -56,6 +55,17 @@ function localConfig(id: string): ConsoleTransportOptions { } } +class GcpLoggingTransport extends LoggingWinston { + log(info: any, callback: (err: Error | null, apiResponse?: any) => void) { + const infoString = JSON.stringify(info) + if (infoString.length > 250000) { + // max size for a log entry is 256KB + info = infoString.substring(0, 256000) + } + super.log(info, callback) + } +} + /** * Builds a logger with common options, including a transport for GCP when running in the cloud. * @param id Name of the log stream. @@ -73,7 +83,7 @@ export function buildLogger(id: string, options?: LoggerOptions): Logger { export function buildLoggerTransport(id: string): TransportStream { return env.dev.isLocal ? new transports.Console(localConfig(id)) - : new LoggingWinston({ ...googleConfigs, ...{ logName: id } }) + : new GcpLoggingTransport({ ...googleConfigs, ...{ logName: id } }) } /**