// ─── OpenTelemetry SDK Setup for Node.js/TypeScript ───
// Import this file BEFORE your application code (e.g., at the top of your entry point).
//
// Usage in your main file:
//   import './tracing';  // MUST be first import
//   import express from 'express';
//   // ... rest of app

import { NodeSDK } from '@opentelemetry/sdk-node';
import { getNodeAutoInstrumentations } from '@opentelemetry/auto-instrumentations-node';
import { OTLPTraceExporter } from '@opentelemetry/exporter-trace-otlp-http';
import { resourceFromAttributes } from '@opentelemetry/resources';
import { ATTR_SERVICE_NAME } from '@opentelemetry/semantic-conventions';

const sdk = new NodeSDK({
  // Declare conformance to OTel Semantic Conventions v1.40.0 via schemaUrl.
  // Downstream collectors (e.g., the Schema Translate Processor) can apply
  // migration tables to rewrite attribute names across semconv versions —
  // so even if upstream semconv drifts, emitted telemetry remains translatable.
  // NOTE: @opentelemetry/resources 2.x removed the Resource class in favor of
  // the `resourceFromAttributes` factory function.
  resource: resourceFromAttributes(
    {
      [ATTR_SERVICE_NAME]: process.env.OTEL_SERVICE_NAME || '__SERVICE_NAME__',
    },
    { schemaUrl: 'https://opentelemetry.io/schemas/1.40.0' },
  ),
  traceExporter: new OTLPTraceExporter({
    url: process.env.OTEL_EXPORTER_OTLP_ENDPOINT || 'http://localhost:4318/v1/traces',
  }),
  instrumentations: [
    getNodeAutoInstrumentations({
      // Disable fs instrumentation to reduce noise
      '@opentelemetry/instrumentation-fs': { enabled: false },
    }),
  ],
});

sdk.start();
console.log('OpenTelemetry tracing initialized');

// Graceful shutdown
process.on('SIGTERM', () => {
  sdk.shutdown()
    .then(() => console.log('OpenTelemetry shut down'))
    .catch((err) => console.error('OpenTelemetry shutdown error', err))
    .finally(() => process.exit(0));
});

process.on('SIGINT', () => {
  sdk.shutdown()
    .then(() => process.exit(0))
    .catch(() => process.exit(1));
});
