{"id":"66e59217ca42735d","repo":"redis/node-redis","slug":"opentelemetry-api-not-found","errorCode":null,"errorMessage":"@opentelemetry/api not found","messagePattern":"@opentelemetry/api not found","errorType":"exception","errorClass":"OpenTelemetryError","httpStatus":null,"severity":"error","filePath":"packages/client/lib/opentelemetry/index.ts","lineNumber":64,"sourceCode":"   *   metrics: {\n   *     enabled: true,\n   *     enabledMetricGroups: [\"pubsub\", \"connection-basic\", \"resiliency\"],\n   *     includeCommands: [\"GET\", \"SET\"],\n   *     hidePubSubChannelNames: true\n   *   }\n   * });\n   * ```\n   */\n  public static init(config: ObservabilityConfig) {\n    if (OpenTelemetry._instance) {\n      throw new OpenTelemetryError(\"OpenTelemetry already initialized\");\n    }\n\n    const api: OpenTelemetryApiModule = (() => {\n      try {\n        return require(\"@opentelemetry/api\");\n      } catch {\n        throw new OpenTelemetryError(\"@opentelemetry/api not found\");\n      }\n    })();\n\n    OpenTelemetry._instance = new OpenTelemetry();\n    ClientRegistry.init();\n    OTelMetrics.init({ api, config });\n  }\n}\n\nexport {\n  OTelClientAttributes,\n  OTEL_ATTRIBUTES,\n  CONNECTION_CLOSE_REASON,\n  CSC_RESULT,\n  CSC_EVICTION_REASON,\n} from \"./types\";\nexport { OTelMetrics } from \"./metrics\";\nexport {","sourceCodeStart":46,"sourceCodeEnd":82,"githubUrl":"https://github.com/redis/node-redis/blob/bb5beb56578573910e2ee8f39681edc214c41398/packages/client/lib/opentelemetry/index.ts#L46-L82","documentation":"OpenTelemetry.init() requires the @opentelemetry/api package; it attempts require('@opentelemetry/api') and throws OpenTelemetryError if the require fails. The metrics instrumentation depends on the OpenTelemetry API to obtain a meter and register instruments, so without it initialization cannot proceed.","triggerScenarios":"Calling OpenTelemetry.init({...}) in a project that has not installed @opentelemetry/api (and optionally @opentelemetry/sdk-metrics). The dependency is a peer/optional and is not bundled with redis.","commonSituations":"Enabling the new metrics config without adding the OTel dependencies to package.json; monorepo where the package with init() call lacks the dependency; tree-shaking/externalization that drops @opentelemetry/api from the bundle.","solutions":["Install the dependency: npm install @opentelemetry/api (and @opentelemetry/sdk-metrics for a MeterProvider).","Verify the package resolves from the same node_modules tree as the redis import.","If you did not mean to enable metrics, remove the OpenTelemetry.init call.","For bundlers, ensure @opentelemetry/api is not marked external-only without being installed."],"exampleFix":"// before\nOpenTelemetry.init({ metrics: { enabled: true } }); // throws, api missing\n\n// after\n// npm install @opentelemetry/api @opentelemetry/sdk-metrics\nimport { metrics } from '@opentelemetry/api';\nOpenTelemetry.init({ metrics: { enabled: true } });","handlingStrategy":"validation","validationCode":"import { existsSync } from 'node:module';\n// Pre-check resolution:\ntry { require.resolve('@opentelemetry/api'); } catch { throw new Error('install @opentelemetry/api first'); }","typeGuard":null,"tryCatchPattern":"try { OpenTelemetry.init(config); } catch (e) { if (/@opentelemetry\\/api not found/.test(e.message)) { console.error('Run: npm install @opentelemetry/api'); } throw e; }","preventionTips":["Add @opentelemetry/api (and sdk-metrics) to dependencies before enabling metrics.","Verify the package resolves from the redis import's node_modules tree.","In bundlers, do not externalize without installing."],"tags":["opentelemetry","missing-dependency","initialization","observability"],"analyzedSha":"bb5beb56578573910e2ee8f39681edc214c41398","analyzedAt":"2026-08-03T19:09:15.686Z","schemaVersion":2}