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
- Call OpenTelemetry.init() exactly once at application startup
- Wrap the init call in try-catch to gracefully handle double initialization
- In tests, guard with a module-level boolean flag to avoid re-initialization
- 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
- Call OpenTelemetry.init() exactly once at process startup
- Use a module-level boolean guard in test suites to prevent re-initialization
- In HMR environments, check a global flag before calling init
- Centralize OTel initialization in a single bootstrap module
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)