telemetry.ts
1 /* eslint-disable no-console */ 2 3 import { NodeSDK } from '@opentelemetry/sdk-node'; 4 import { getNodeAutoInstrumentations } from '@opentelemetry/auto-instrumentations-node'; 5 import { PeriodicExportingMetricReader } from '@opentelemetry/sdk-metrics'; 6 import { OTLPTraceExporter } from '@opentelemetry/exporter-trace-otlp-proto'; 7 import { OTLPMetricExporter } from '@opentelemetry/exporter-metrics-otlp-proto'; 8 9 if (process.env.OTEL_EXPORTER_OTLP_ENDPOINT === undefined) { 10 console.warn('OTEL_EXPORTER_OTLP_ENDPOINT is not set. Skipping telemetry initialization.'); 11 } 12 if (process.env.OTEL_SERVICE_NAME === undefined) { 13 console.warn('OTEL_SERVICE_NAME is not set. Skipping telemetry initialization.'); 14 } 15 16 const requiredEnvVarsSet = 17 process.env.OTEL_EXPORTER_OTLP_ENDPOINT !== undefined && 18 process.env.OTEL_SERVICE_NAME !== undefined; 19 20 if (requiredEnvVarsSet) { 21 const TRACE_URL = process.env.OTEL_EXPORTER_OTLP_ENDPOINT + '/v1/traces'; 22 const METRICS_URL = process.env.OTEL_EXPORTER_OTLP_ENDPOINT + '/v1/metrics'; 23 const SERVICE_NAME = process.env.OTEL_SERVICE_NAME; 24 25 console.log('👀 Telemetry initialized with the following settings:'); 26 console.log(' OTEL_EXPORTER_OTLP_ENDPOINT:', TRACE_URL); 27 console.log(' OTEL_SERVICE_NAME:', SERVICE_NAME); 28 console.log(' OTEL_RESOURCE_ATTRIBUTES:', process.env.OTEL_RESOURCE_ATTRIBUTES); 29 30 const traceExporter = new OTLPTraceExporter({ 31 url: TRACE_URL, 32 headers: {}, 33 }); 34 35 const metricsExporter = new OTLPMetricExporter({ 36 url: METRICS_URL, 37 headers: {}, 38 }); 39 40 const sdk = new NodeSDK({ 41 autoDetectResources: true, 42 serviceName: SERVICE_NAME, 43 traceExporter: traceExporter, 44 metricReader: new PeriodicExportingMetricReader({ 45 exporter: metricsExporter, 46 }), 47 instrumentations: [ 48 getNodeAutoInstrumentations({ 49 '@opentelemetry/instrumentation-http': { 50 ignoreIncomingRequestHook: (request) => { 51 if ( 52 request.url?.endsWith('.svg') || 53 request.url?.endsWith('.js') || 54 request.url?.endsWith('.css') || 55 request.url?.endsWith('.png') || 56 request.url?.endsWith('.jpg') || 57 request.url?.endsWith('.jpeg') || 58 request.url?.endsWith('.gif') || 59 request.url?.endsWith('.ico') || 60 request.url?.endsWith('.woff') || 61 request.url?.endsWith('.woff2') || 62 request.url?.endsWith('.ttf') || 63 request.url?.endsWith('.eot') || 64 request.url?.endsWith('.otf') || 65 request.url?.endsWith('.webp') || 66 request.url?.endsWith('.mp4') || 67 request.url?.endsWith('.mp3') || 68 request.url?.endsWith('.wav') 69 ) { 70 return true; 71 } 72 return false; 73 }, 74 }, 75 }), 76 ], 77 }); 78 79 sdk.start(); 80 }