redis/node-redis · error · OpenTelemetryError

OpenTelemetry already initialized

Error message

OpenTelemetry already initialized

What it means

OpenTelemetry.init() was called a second time. The OpenTelemetry class is a singleton — once initialized, calling init again throws to prevent duplicate metric registrations and conflicting configurations. The internal _instance field is already set.

Solutions

  1. Call OpenTelemetry.init() exactly once at application startup
  2. Wrap the init call in try-catch to gracefully handle double initialization
  3. In tests, guard with a module-level boolean flag to avoid re-initialization
  4. In HMR environments, skip init on hot reload by checking a global flag

Example fix

// before
OpenTelemetry.init(config);

// after
let otelInitialized = false;
if (!otelInitialized) {
  try {
    OpenTelemetry.init(config);
    otelInitialized = true;
  } catch (e) {
    // already initialized — safe to ignore
  }
}
Defensive patterns

Strategy: validation

Validate before calling

// Guard init with a module-level flag.
let otelInitialized = false;

export function initOtel(config: ObservabilityConfig): void {
  if (otelInitialized) return;
  try {
    OpenTelemetry.init(config);
    otelInitialized = true;
  } catch (e) {
    if (e instanceof OpenTelemetryError && e.message === 'OpenTelemetry already initialized') {
      otelInitialized = true;
      return;
    }
    throw e;
  }
}

Try / catch

try {
  OpenTelemetry.init(config);
} catch (e) {
  if (e instanceof OpenTelemetryError && e.message.includes('already initialized')) {
    // Safe to ignore — singleton is already set up
  } else {
    throw e;
  }
}

Prevention

When it happens

Trigger: Calling OpenTelemetry.init(config) twice in the same process — in tests that re-run setup, in HMR (hot module replacement) scenarios, or when multiple modules both call init.

Common situations: Test suites that call init per test without resetting state; Next.js or Vite HMR re-executing the init module; multiple entry points or microservices in the same process both initializing OTel.

Related errors


AI-assisted analysis of redis/node-redis@90fd0652bc (2026-08-11). Data as JSON: /api/errors/c0ed4e17ab3eca9e. Report an issue: GitHub.

Appendix: source

Thrown at packages/client/lib/opentelemetry/index.ts:57

   *   exporter: new ConsoleMetricExporter()
   * });
   *
   * const provider = new MeterProvider({ readers: [reader] });
   * metrics.setGlobalMeterProvider(provider);
   *
   * OpenTelemetry.init({
   *   metrics: {
   *     enabled: true,
   *     enabledMetricGroups: ["pubsub", "connection-basic", "resiliency"],
   *     includeCommands: ["GET", "SET"],
   *     hidePubSubChannelNames: true
   *   }
   * });
   * ```
   */
  public static init(config: ObservabilityConfig) {
    if (OpenTelemetry._instance) {
      throw new OpenTelemetryError("OpenTelemetry already initialized");
    }

    const api: OpenTelemetryApiModule = (() => {
      try {
        return require("@opentelemetry/api");
      } catch {
        throw new OpenTelemetryError("@opentelemetry/api not found");
      }
    })();

    OpenTelemetry._instance = new OpenTelemetry();
    ClientRegistry.init();
    OTelMetrics.init({ api, config });
  }
}

export {
  OTelClientAttributes,

View on GitHub (pinned to 90fd0652bc)