// OpenTelemetry tracing and logging initialization for gibbz backend 'use strict'; const process = require('process'); const { NodeSDK } = require('@opentelemetry/sdk-node'); const { getNodeAutoInstrumentations } = require('@opentelemetry/auto-instrumentations-node'); const { OTLPTraceExporter } = require('@opentelemetry/exporter-trace-otlp-http'); const { OTLPLogExporter } = require('@opentelemetry/exporter-logs-otlp-http'); const { BatchLogRecordProcessor } = require('@opentelemetry/sdk-logs'); const { resourceFromAttributes } = require('@opentelemetry/resources'); const { ATTR_SERVICE_NAME, ATTR_SERVICE_VERSION } = require('@opentelemetry/semantic-conventions'); const serviceName = process.env.OTEL_SERVICE_NAME || 'gibbz'; const serviceRelease = process.env.SERVICE_RELEASE || process.env.OTEL_SERVICE_RELEASE || process.env.APP_RELEASE || 'dev'; const environment = process.env.ENVIRONMENT || process.env.NODE_ENV || 'production'; const otelUrl = (process.env.OTEL_EXPORTER_OTLP_ENDPOINT || process.env.OTEL_URL || 'https://otel.k6n.net').replace(/\/+$/, ''); const ingestKey = process.env.OTEL_INGEST_KEY || ''; const headers = {}; if (ingestKey) { headers['X-Otel-Ingest-Key'] = ingestKey; } const resource = resourceFromAttributes({ [ATTR_SERVICE_NAME]: serviceName, [ATTR_SERVICE_VERSION]: serviceRelease, 'service.name': serviceName, 'service.release': serviceRelease, 'service.environment': environment, }); // Configure trace exporter const traceExporter = new OTLPTraceExporter({ url: `${otelUrl}/v1/traces`, headers, }); // Configure logs exporter const logExporter = new OTLPLogExporter({ url: `${otelUrl}/v1/logs`, headers, }); const logRecordProcessor = new BatchLogRecordProcessor(logExporter); const sdk = new NodeSDK({ resource, traceExporter, logRecordProcessor, instrumentations: [ getNodeAutoInstrumentations({ '@opentelemetry/instrumentation-fs': { enabled: false }, }), ], }); try { sdk.start(); console.log(`[otel] Initialized OpenTelemetry for ${serviceName} (release: ${serviceRelease}, env: ${environment}) -> ${otelUrl}`); } catch (err) { console.error('[otel] Failed to start OpenTelemetry SDK:', err); } process.on('SIGTERM', () => { sdk.shutdown() .then(() => console.log('[otel] SDK shut down successfully')) .catch((err) => console.error('[otel] Error shutting down SDK', err)) .finally(() => process.exit(0)); }); module.exports = { sdk };