-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathinstrumentation.ts
More file actions
59 lines (50 loc) · 2.57 KB
/
Copy pathinstrumentation.ts
File metadata and controls
59 lines (50 loc) · 2.57 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
/*
* OpenTelemetry instrumentation for Next.js frontend
* This file is automatically loaded by Next.js when the experimental.instrumentationHook is enabled
* Note: This only runs on the server side during SSR/API routes, not in the browser
*/
// Register the SDK - only runs on the server side
export async function register() {
// Only initialize on server side to avoid bundling issues with browser
if (typeof window !== 'undefined') {
return;
}
console.log('🔍 Registering OpenTelemetry instrumentation for frontend server...');
try {
// Use a minimal approach that avoids NodeSDK to prevent bundling issues
const { NodeTracerProvider } = await import('@opentelemetry/sdk-trace-node');
const { SimpleSpanProcessor, BatchSpanProcessor } = await import('@opentelemetry/sdk-trace-base');
const { OTLPTraceExporter } = await import('@opentelemetry/exporter-otlp-http');
const { Resource } = await import('@opentelemetry/resources');
const { SemanticResourceAttributes } = await import('@opentelemetry/semantic-conventions');
const { trace } = await import('@opentelemetry/api');
// Create a custom tracer provider for Next.js
const tracerProvider = new NodeTracerProvider({
resource: new Resource({
[SemanticResourceAttributes.SERVICE_NAME]: process.env.OTEL_SERVICE_NAME || 'frontend',
[SemanticResourceAttributes.SERVICE_VERSION]: '1.0.0',
[SemanticResourceAttributes.SERVICE_NAMESPACE]: process.env.OTEL_RESOURCE_ATTRIBUTES?.split('=')[1] || 'banking-app',
}),
});
// Configure OTLP exporter
const otlpExporter = new OTLPTraceExporter({
url: process.env.OTEL_EXPORTER_OTLP_ENDPOINT || 'http://localhost:4318/v1/traces',
});
// Add span processor
tracerProvider.addSpanProcessor(new BatchSpanProcessor(otlpExporter));
// Register the tracer provider
tracerProvider.register();
trace.setGlobalTracerProvider(tracerProvider);
console.log('✅ OpenTelemetry instrumentation registered successfully for frontend server');
// Gracefully shutdown the tracer provider on process exit
process.on('SIGTERM', () => {
console.log('🔄 Shutting down OpenTelemetry tracer provider...');
tracerProvider.shutdown()
.then(() => console.log('✅ OpenTelemetry tracer provider shutdown successfully'))
.catch((error) => console.error('❌ Error shutting down OpenTelemetry tracer provider:', error))
.finally(() => process.exit(0));
});
} catch (error) {
console.error('❌ Error registering OpenTelemetry instrumentation:', error);
}
}