1- import { applySdkMetadata , getGlobalScope } from '@sentry/core' ;
2- import { init as initNode } from '@sentry/node' ;
3- import type { Client , EventProcessor } from '@sentry/types' ;
4- import { logger } from '@sentry/utils' ;
1+ import { applySdkMetadata , flush , getGlobalScope } from '@sentry/core' ;
2+ import {
3+ type NodeOptions ,
4+ getDefaultIntegrations as getDefaultNodeIntegrations ,
5+ httpIntegration ,
6+ init as initNode ,
7+ } from '@sentry/node' ;
8+ import type { Client , EventProcessor , Integration } from '@sentry/types' ;
9+ import { logger , vercelWaitUntil } from '@sentry/utils' ;
510import { DEBUG_BUILD } from '../common/debug-build' ;
611import type { SentryNuxtServerOptions } from '../common/types' ;
712
@@ -14,6 +19,7 @@ export function init(options: SentryNuxtServerOptions): Client | undefined {
1419 const sentryOptions = {
1520 ...options ,
1621 registerEsmLoaderHooks : mergeRegisterEsmLoaderHooks ( options ) ,
22+ defaultIntegrations : getNuxtDefaultIntegrations ( options ) ,
1723 } ;
1824
1925 applySdkMetadata ( sentryOptions , 'nuxt' , [ 'nuxt' , 'node' ] ) ;
@@ -46,6 +52,21 @@ export function init(options: SentryNuxtServerOptions): Client | undefined {
4652 return client ;
4753}
4854
55+ function getNuxtDefaultIntegrations ( options : NodeOptions ) : Integration [ ] {
56+ return [
57+ ...getDefaultNodeIntegrations ( options ) . filter ( integration => integration . name !== 'Http' ) ,
58+ // The httpIntegration is added as defaultIntegration, so users can still overwrite it
59+ httpIntegration ( {
60+ instrumentation : {
61+ responseHook : ( ) => {
62+ // Makes it possible to end the tracing span before closing the Vercel lambda (https://vercel.com/docs/functions/functions-api-reference#waituntil)
63+ vercelWaitUntil ( flushSafelyWithTimeout ( ) ) ;
64+ } ,
65+ } ,
66+ } ) ,
67+ ] ;
68+ }
69+
4970/**
5071 * Adds /vue/ to the registerEsmLoaderHooks options and merges it with the old values in the array if one is defined.
5172 * If the registerEsmLoaderHooks option is already a boolean, nothing is changed.
@@ -64,3 +85,16 @@ export function mergeRegisterEsmLoaderHooks(
6485 }
6586 return options . registerEsmLoaderHooks ?? { exclude : [ / v u e / ] } ;
6687}
88+
89+ /**
90+ * Flushes pending Sentry events with a 2-second timeout and in a way that cannot create unhandled promise rejections.
91+ */
92+ export async function flushSafelyWithTimeout ( ) : Promise < void > {
93+ try {
94+ DEBUG_BUILD && logger . log ( 'Flushing events...' ) ;
95+ await flush ( 2000 ) ;
96+ DEBUG_BUILD && logger . log ( 'Done flushing events' ) ;
97+ } catch ( e ) {
98+ DEBUG_BUILD && logger . log ( 'Error while flushing events:\n' , e ) ;
99+ }
100+ }
0 commit comments