/ src / telemetry.ts
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  }