@@ -5,70 +5,31 @@ import * as Sentry from "@sentry/nextjs";
55import { getEnvVariable , getNextRuntime , getNodeEnvironment } from "@stackframe/stack-shared/dist/utils/env" ;
66import { sentryBaseConfig } from "@stackframe/stack-shared/dist/utils/sentry" ;
77import { nicify } from "@stackframe/stack-shared/dist/utils/strings" ;
8+ import { registerOTel } from '@vercel/otel' ;
89import { initPerfStats } from "./lib/dev-perf-stats" ;
910import "./polyfills" ;
1011
1112// this is a hack for making prisma instrumentation work
1213// somehow prisma instrumentation accesses global and it makes edge instrumentation complain
1314globalThis . global = globalThis ;
1415
15- function getOTelInstrumentations ( ) {
16- return [
17- new PrismaInstrumentation ( ) ,
18- ...getNextRuntime ( ) === "nodejs" ? getNodeAutoInstrumentations ( {
19- '@opentelemetry/instrumentation-http' : {
20- enabled : false ,
21- } ,
22- } ) : [ ] ,
23- ] ;
24- }
25-
26- function getDevTraceExporter ( ) {
27- if ( getNodeEnvironment ( ) === "development" && getNextRuntime ( ) === "nodejs" ) {
28- return new OTLPTraceExporter ( {
29- url : `http://localhost:${ getEnvVariable ( "NEXT_PUBLIC_STACK_PORT_PREFIX" , "81" ) } 31/v1/traces` ,
30- } ) ;
31- }
32- return undefined ;
33- }
34-
35- let otelSdk : { shutdown ( ) : Promise < void > } | undefined ;
36-
37- export async function shutdownOTel ( ) {
38- await otelSdk ?. shutdown ( ) ;
39- }
40-
41- async function registerOTelProvider ( ) {
42- const instrumentations = getOTelInstrumentations ( ) ;
43- const devExporter = getDevTraceExporter ( ) ;
44-
45- if ( getEnvVariable ( "VERCEL" , "" ) ) {
46- // On Vercel: use @vercel /otel which wraps the standard OTEL SDK with Vercel-specific defaults
47- const { registerOTel } = await import ( "@vercel/otel" ) ;
48- registerOTel ( {
49- serviceName : 'stack-backend' ,
50- instrumentations,
51- ...devExporter ? { traceExporter : devExporter } : { } ,
52- } ) ;
53- } else if ( getNextRuntime ( ) === "nodejs" ) {
54- // On Cloud Run / self-hosted: use standard @opentelemetry/sdk-node (Node.js only)
55- const { NodeSDK } = await import ( "@opentelemetry/sdk-node" ) ;
56- const otelEndpoint = getEnvVariable ( "OTEL_EXPORTER_OTLP_ENDPOINT" , "" ) ;
57- const exporter = devExporter ?? ( otelEndpoint ? new OTLPTraceExporter ( { url : otelEndpoint } ) : undefined ) ;
58- const sdk = new NodeSDK ( {
59- serviceName : 'stack-backend' ,
60- instrumentations,
61- // Cast needed: @opentelemetry /exporter-trace-otlp-http may be a different major than sdk-node,
62- // but the runtime interface is compatible
63- ...( exporter ? { traceExporter : exporter as any } : { } ) ,
64- } ) ;
65- sdk . start ( ) ;
66- otelSdk = sdk ;
67- }
68- }
69-
7016export async function register ( ) {
71- await registerOTelProvider ( ) ;
17+ registerOTel ( {
18+ serviceName : 'stack-backend' ,
19+ instrumentations : [
20+ new PrismaInstrumentation ( ) ,
21+ ...getNextRuntime ( ) === "nodejs" ? getNodeAutoInstrumentations ( {
22+ '@opentelemetry/instrumentation-http' : {
23+ enabled : false ,
24+ } ,
25+ } ) : [ ] ,
26+ ] ,
27+ ...getNodeEnvironment ( ) === "development" && getNextRuntime ( ) === "nodejs" ? {
28+ traceExporter : new OTLPTraceExporter ( {
29+ url : `http://localhost:${ getEnvVariable ( "NEXT_PUBLIC_STACK_PORT_PREFIX" , "81" ) } 31/v1/traces` ,
30+ } ) ,
31+ } : { } ,
32+ } ) ;
7233
7334 if ( getNextRuntime ( ) === "nodejs" ) {
7435 ( globalThis as any ) . process . title = `stack-backend:${ getEnvVariable ( "NEXT_PUBLIC_STACK_PORT_PREFIX" , "81" ) } (node/nextjs)` ;
0 commit comments