diff --git a/dev-packages/node-integration-tests/suites/tracing-experimental/hapi/scenario.js b/dev-packages/node-integration-tests/suites/tracing-experimental/hapi/scenario.js index 9a00fa36957d..69443559e9a8 100644 --- a/dev-packages/node-integration-tests/suites/tracing-experimental/hapi/scenario.js +++ b/dev-packages/node-integration-tests/suites/tracing-experimental/hapi/scenario.js @@ -9,6 +9,7 @@ Sentry.init({ }); const Hapi = require('@hapi/hapi'); +const Boom = require('@hapi/boom'); const port = 5999; @@ -26,6 +27,30 @@ const init = async () => { }, }); + server.route({ + method: 'GET', + path: '/error', + handler: (_request, _h) => { + return new Error('Sentry Test Error'); + }, + }); + + server.route({ + method: 'GET', + path: '/boom-error', + handler: (_request, _h) => { + return new Boom.Boom('Sentry Test Error'); + }, + }); + + server.route({ + method: 'GET', + path: '/promise-error', + handler: async (_request, _h) => { + return Promise.reject(new Error('Sentry Test Error')); + }, + }); + await Sentry.setupHapiErrorHandler(server); await server.start(); diff --git a/dev-packages/node-integration-tests/suites/tracing-experimental/hapi/test.ts b/dev-packages/node-integration-tests/suites/tracing-experimental/hapi/test.ts index 93e3203f6470..da8a07c20cc1 100644 --- a/dev-packages/node-integration-tests/suites/tracing-experimental/hapi/test.ts +++ b/dev-packages/node-integration-tests/suites/tracing-experimental/hapi/test.ts @@ -25,10 +25,45 @@ describe('hapi auto-instrumentation', () => { ]), }; + const EXPECTED_ERROR_EVENT = { + exception: { + values: [ + { + type: 'Error', + value: 'Sentry Test Error', + }, + ], + }, + }; + test('CJS - should auto-instrument `@hapi/hapi` package.', done => { createRunner(__dirname, 'scenario.js') .expect({ transaction: EXPECTED_TRANSACTION }) .start(done) .makeRequest('get', '/'); }); + + test('CJS - should handle returned plain errors in routes.', done => { + createRunner(__dirname, 'scenario.js') + .expect({ event: EXPECTED_ERROR_EVENT }) + .expectError() + .start(done) + .makeRequest('get', '/error'); + }); + + test('CJS - should handle returned Boom errors in routes.', done => { + createRunner(__dirname, 'scenario.js') + .expect({ event: EXPECTED_ERROR_EVENT }) + .expectError() + .start(done) + .makeRequest('get', '/boom-error'); + }); + + test('CJS - should handle promise rejections in routes.', done => { + createRunner(__dirname, 'scenario.js') + .expect({ event: EXPECTED_ERROR_EVENT }) + .expectError() + .start(done) + .makeRequest('get', '/promise-error'); + }); }); diff --git a/dev-packages/node-integration-tests/utils/runner.ts b/dev-packages/node-integration-tests/utils/runner.ts index 515a2627acf8..5da33508bda0 100644 --- a/dev-packages/node-integration-tests/utils/runner.ts +++ b/dev-packages/node-integration-tests/utils/runner.ts @@ -126,6 +126,7 @@ export function createRunner(...paths: string[]) { let withSentryServer = false; let dockerOptions: DockerOptions | undefined; let ensureNoErrorOutput = false; + let expectError = false; if (testPath.endsWith('.ts')) { flags.push('-r', 'ts-node/register'); @@ -136,6 +137,10 @@ export function createRunner(...paths: string[]) { expectedEnvelopes.push(expected); return this; }, + expectError: function () { + expectError = true; + return this; + }, withFlags: function (...args: string[]) { flags.push(...args); return this; @@ -347,7 +352,18 @@ export function createRunner(...paths: string[]) { } const url = `http://localhost:${scenarioServerPort}${path}`; - if (method === 'get') { + if (expectError) { + try { + if (method === 'get') { + await axios.get(url, { headers }); + } else { + await axios.post(url, { headers }); + } + } catch (e) { + return; + } + return; + } else if (method === 'get') { return (await axios.get(url, { headers })).data; } else { return (await axios.post(url, { headers })).data; diff --git a/packages/node/src/integrations/hapi/index.ts b/packages/node/src/integrations/hapi/index.ts index 0c500fbd1ae1..58e329479f6a 100644 --- a/packages/node/src/integrations/hapi/index.ts +++ b/packages/node/src/integrations/hapi/index.ts @@ -23,10 +23,6 @@ function isResponseObject(response: ResponseObject | Boom): response is Response return response && (response as ResponseObject).statusCode !== undefined; } -function isBoomObject(response: ResponseObject | Boom): response is Boom { - return response && (response as Boom).isBoom !== undefined; -} - function isErrorEvent(event: RequestEvent): event is RequestEvent { return event && (event as RequestEvent).error !== undefined; } @@ -54,9 +50,7 @@ export const hapiErrorPlugin = { const activeSpan = getActiveSpan(); const rootSpan = activeSpan && getRootSpan(activeSpan); - if (request.response && isBoomObject(request.response)) { - sendErrorToSentry(request.response); - } else if (isErrorEvent(event)) { + if (isErrorEvent(event)) { sendErrorToSentry(event.error); }