72 lines
2.4 KiB
JavaScript
72 lines
2.4 KiB
JavaScript
// 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 };
|