{"version":3,"file":"redis-instrumentation.js","sources":["../../../../../../src/integrations/tracing/redis/vendored/redis-instrumentation.ts"],"sourcesContent":["/*\n * Copyright The OpenTelemetry Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * NOTICE from the Sentry authors:\n * - Vendored from: https://github.com/open-telemetry/opentelemetry-js-contrib/tree/instrumentation-redis-v0.62.0/packages/instrumentation-redis\n * - Upstream version: @opentelemetry/instrumentation-redis@0.62.0\n * - Minor TypeScript adjustments for this repository's compiler settings\n */\n/* eslint-disable -- vendored @opentelemetry/instrumentation-redis */\n\nimport { context, SpanKind, SpanStatusCode, trace } from '@opentelemetry/api';\nimport type { DiagLogger, Span, TracerProvider } from '@opentelemetry/api';\nimport { SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN } from '@sentry/core';\nimport {\n  InstrumentationBase,\n  InstrumentationNodeModuleDefinition,\n  InstrumentationNodeModuleFile,\n  isWrapped,\n  safeExecuteInTheMiddle,\n  SemconvStability,\n  semconvStabilityFromStr,\n} from '@opentelemetry/instrumentation';\nimport {\n  ATTR_DB_OPERATION_NAME,\n  ATTR_DB_QUERY_TEXT,\n  ATTR_DB_SYSTEM_NAME,\n  ATTR_SERVER_ADDRESS,\n  ATTR_SERVER_PORT,\n} from '@opentelemetry/semantic-conventions';\n\nimport { defaultDbStatementSerializer } from './redis-common';\nimport {\n  ATTR_DB_CONNECTION_STRING,\n  ATTR_DB_STATEMENT,\n  ATTR_DB_SYSTEM,\n  ATTR_NET_PEER_NAME,\n  ATTR_NET_PEER_PORT,\n  DB_SYSTEM_NAME_VALUE_REDIS,\n  DB_SYSTEM_VALUE_REDIS,\n} from './semconv';\nimport type { RedisInstrumentationConfig } from './types';\n\nconst PACKAGE_NAME = '@opentelemetry/instrumentation-redis';\nconst PACKAGE_VERSION = '0.62.0';\n\n// ---- Internal types ----\n\ninterface RedisPluginClientTypes {\n  connection_options?: {\n    port?: string | number;\n    host?: string;\n  };\n  address?: string;\n}\n\ninterface RedisCommand {\n  command: string;\n  args: string[];\n  buffer_args: boolean;\n  callback: (err: Error | null, reply: unknown) => void;\n  call_on_write: boolean;\n}\n\ninterface MultiErrorReply extends Error {\n  replies: unknown[];\n  errorIndexes: Array<number>;\n}\n\ninterface OpenSpanInfo {\n  span: Span;\n  commandName: string;\n  commandArgs: Array<string | Buffer>;\n}\n\nconst OTEL_OPEN_SPANS = Symbol('opentelemetry.instrumentation.redis.open_spans');\nconst MULTI_COMMAND_OPTIONS = Symbol('opentelemetry.instrumentation.redis.multi_command_options');\n\n// ---- v4-v5 utils ----\n\nfunction removeCredentialsFromDBConnectionStringAttribute(\n  diagLogger: DiagLogger,\n  url: string | undefined,\n): string | undefined {\n  if (typeof url !== 'string' || !url) {\n    return undefined;\n  }\n  try {\n    const u = new URL(url);\n    u.searchParams.delete('user_pwd');\n    u.username = '';\n    u.password = '';\n    return u.href;\n  } catch (err) {\n    diagLogger.error('failed to sanitize redis connection url', err);\n  }\n  return undefined;\n}\n\nfunction getClientAttributes(\n  diagLogger: DiagLogger,\n  options: any,\n  semconvStability: SemconvStability,\n): Record<string, any> {\n  const attributes: Record<string, any> = {};\n  if (semconvStability & SemconvStability.OLD) {\n    Object.assign(attributes, {\n      [ATTR_DB_SYSTEM]: DB_SYSTEM_VALUE_REDIS,\n      [ATTR_NET_PEER_NAME]: options?.socket?.host,\n      [ATTR_NET_PEER_PORT]: options?.socket?.port,\n      [ATTR_DB_CONNECTION_STRING]: removeCredentialsFromDBConnectionStringAttribute(diagLogger, options?.url),\n    });\n  }\n  if (semconvStability & SemconvStability.STABLE) {\n    Object.assign(attributes, {\n      [ATTR_DB_SYSTEM_NAME]: DB_SYSTEM_NAME_VALUE_REDIS,\n      [ATTR_SERVER_ADDRESS]: options?.socket?.host,\n      [ATTR_SERVER_PORT]: options?.socket?.port,\n    });\n  }\n  return attributes;\n}\n\n// ---- v2-v3 utils ----\n\nfunction endSpanV2(span: Span, err: Error | null | undefined): void {\n  if (err) {\n    span.setStatus({\n      code: SpanStatusCode.ERROR,\n      message: err.message,\n    });\n  }\n  span.end();\n}\n\nfunction getTracedCreateClient(original: Function): Function {\n  return function createClientTrace(this: any) {\n    const client = original.apply(this, arguments);\n    return context.bind(context.active(), client);\n  };\n}\n\nfunction getTracedCreateStreamTrace(original: Function): Function {\n  return function create_stream_trace(this: any) {\n    if (!Object.prototype.hasOwnProperty.call(this, 'stream')) {\n      Object.defineProperty(this, 'stream', {\n        get() {\n          return this._patched_redis_stream;\n        },\n        set(val: any) {\n          context.bind(context.active(), val);\n          this._patched_redis_stream = val;\n        },\n      });\n    }\n    return original.apply(this, arguments);\n  };\n}\n\n// ---- RedisInstrumentationV2_V3 ----\n\nclass RedisInstrumentationV2_V3 extends InstrumentationBase<RedisInstrumentationConfig> {\n  static COMPONENT = 'redis';\n  _semconvStability: SemconvStability;\n\n  constructor(config: RedisInstrumentationConfig = {}) {\n    super(PACKAGE_NAME, PACKAGE_VERSION, config);\n    this._semconvStability = config.semconvStability\n      ? config.semconvStability\n      : semconvStabilityFromStr('database', process.env['OTEL_SEMCONV_STABILITY_OPT_IN']);\n  }\n\n  override setConfig(config: RedisInstrumentationConfig = {}): void {\n    super.setConfig(config);\n    this._semconvStability = config.semconvStability\n      ? config.semconvStability\n      : semconvStabilityFromStr('database', process.env['OTEL_SEMCONV_STABILITY_OPT_IN']);\n  }\n\n  init() {\n    return [\n      new InstrumentationNodeModuleDefinition(\n        'redis',\n        ['>=2.6.0 <4'],\n        (moduleExports: any) => {\n          if (isWrapped(moduleExports.RedisClient.prototype['internal_send_command'])) {\n            this._unwrap(moduleExports.RedisClient.prototype, 'internal_send_command');\n          }\n          this._wrap(moduleExports.RedisClient.prototype, 'internal_send_command', this._getPatchInternalSendCommand());\n          if (isWrapped(moduleExports.RedisClient.prototype['create_stream'])) {\n            this._unwrap(moduleExports.RedisClient.prototype, 'create_stream');\n          }\n          this._wrap(moduleExports.RedisClient.prototype, 'create_stream', this._getPatchCreateStream());\n          if (isWrapped(moduleExports.createClient)) {\n            this._unwrap(moduleExports, 'createClient');\n          }\n          this._wrap(moduleExports, 'createClient', this._getPatchCreateClient());\n          return moduleExports;\n        },\n        (moduleExports: any) => {\n          if (moduleExports === undefined) return;\n          this._unwrap(moduleExports.RedisClient.prototype, 'internal_send_command');\n          this._unwrap(moduleExports.RedisClient.prototype, 'create_stream');\n          this._unwrap(moduleExports, 'createClient');\n        },\n      ),\n    ];\n  }\n\n  private _getPatchInternalSendCommand() {\n    const instrumentation = this;\n    return function internal_send_command(original: Function) {\n      return function internal_send_command_trace(this: RedisPluginClientTypes, cmd: RedisCommand) {\n        if (arguments.length !== 1 || typeof cmd !== 'object') {\n          return original.apply(this, arguments);\n        }\n        const config = instrumentation.getConfig();\n        const hasNoParentSpan = trace.getSpan(context.active()) === undefined;\n        if (config.requireParentSpan === true && hasNoParentSpan) {\n          return original.apply(this, arguments);\n        }\n        const dbStatementSerializer = config?.dbStatementSerializer || defaultDbStatementSerializer;\n        const attributes: Record<string, any> = {};\n        if (instrumentation._semconvStability & SemconvStability.OLD) {\n          Object.assign(attributes, {\n            [ATTR_DB_SYSTEM]: DB_SYSTEM_VALUE_REDIS,\n            [ATTR_DB_STATEMENT]: dbStatementSerializer(cmd.command, cmd.args),\n          });\n        }\n        if (instrumentation._semconvStability & SemconvStability.STABLE) {\n          Object.assign(attributes, {\n            [ATTR_DB_SYSTEM_NAME]: DB_SYSTEM_NAME_VALUE_REDIS,\n            [ATTR_DB_OPERATION_NAME]: cmd.command,\n            [ATTR_DB_QUERY_TEXT]: dbStatementSerializer(cmd.command, cmd.args),\n          });\n        }\n        attributes[SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN] = 'auto.db.otel.redis';\n        const span = instrumentation.tracer.startSpan(`${RedisInstrumentationV2_V3.COMPONENT}-${cmd.command}`, {\n          kind: SpanKind.CLIENT,\n          attributes,\n        });\n        if (this.connection_options) {\n          const connectionAttributes: Record<string, any> = {};\n          if (instrumentation._semconvStability & SemconvStability.OLD) {\n            Object.assign(connectionAttributes, {\n              [ATTR_NET_PEER_NAME]: this.connection_options.host,\n              [ATTR_NET_PEER_PORT]: this.connection_options.port,\n            });\n          }\n          if (instrumentation._semconvStability & SemconvStability.STABLE) {\n            Object.assign(connectionAttributes, {\n              [ATTR_SERVER_ADDRESS]: this.connection_options.host,\n              [ATTR_SERVER_PORT]: this.connection_options.port,\n            });\n          }\n          span.setAttributes(connectionAttributes);\n        }\n        if (this.address && instrumentation._semconvStability & SemconvStability.OLD) {\n          span.setAttribute(ATTR_DB_CONNECTION_STRING, `redis://${this.address}`);\n        }\n        const originalCallback = arguments[0].callback;\n        if (originalCallback) {\n          const originalContext = context.active();\n          arguments[0].callback = function callback(this: any, err: Error | null, reply: unknown) {\n            if (config?.responseHook) {\n              const responseHook = config.responseHook;\n              safeExecuteInTheMiddle(\n                () => {\n                  responseHook(span, cmd.command, cmd.args, reply);\n                },\n                (e: Error | undefined) => {\n                  if (e) {\n                    instrumentation._diag.error('Error executing responseHook', e);\n                  }\n                },\n                true,\n              );\n            }\n            endSpanV2(span, err);\n            return context.with(originalContext, originalCallback, this, ...arguments);\n          };\n        }\n        try {\n          return original.apply(this, arguments);\n        } catch (rethrow) {\n          endSpanV2(span, rethrow as Error);\n          throw rethrow;\n        }\n      };\n    };\n  }\n\n  private _getPatchCreateClient() {\n    return function createClient(original: Function) {\n      return getTracedCreateClient(original);\n    };\n  }\n\n  private _getPatchCreateStream() {\n    return function createReadStream(original: Function) {\n      return getTracedCreateStreamTrace(original);\n    };\n  }\n}\n\n// ---- RedisInstrumentationV4_V5 ----\n\nclass RedisInstrumentationV4_V5 extends InstrumentationBase<RedisInstrumentationConfig> {\n  static COMPONENT = 'redis';\n  _semconvStability: SemconvStability;\n\n  constructor(config: RedisInstrumentationConfig = {}) {\n    super(PACKAGE_NAME, PACKAGE_VERSION, config);\n    this._semconvStability = config.semconvStability\n      ? config.semconvStability\n      : semconvStabilityFromStr('database', process.env['OTEL_SEMCONV_STABILITY_OPT_IN']);\n  }\n\n  override setConfig(config: RedisInstrumentationConfig = {}): void {\n    super.setConfig(config);\n    this._semconvStability = config.semconvStability\n      ? config.semconvStability\n      : semconvStabilityFromStr('database', process.env['OTEL_SEMCONV_STABILITY_OPT_IN']);\n  }\n\n  init() {\n    return [\n      this._getInstrumentationNodeModuleDefinition('@redis/client'),\n      this._getInstrumentationNodeModuleDefinition('@node-redis/client'),\n    ];\n  }\n\n  private _getInstrumentationNodeModuleDefinition(basePackageName: string) {\n    const commanderModuleFile = new InstrumentationNodeModuleFile(\n      `${basePackageName}/dist/lib/commander.js`,\n      ['^1.0.0'],\n      (moduleExports: any, moduleVersion?: string) => {\n        const transformCommandArguments = moduleExports.transformCommandArguments;\n        if (!transformCommandArguments) {\n          this._diag.error('internal instrumentation error, missing transformCommandArguments function');\n          return moduleExports;\n        }\n        const functionToPatch = moduleVersion?.startsWith('1.0.') ? 'extendWithCommands' : 'attachCommands';\n        if (isWrapped(moduleExports?.[functionToPatch])) {\n          this._unwrap(moduleExports, functionToPatch);\n        }\n        this._wrap(moduleExports, functionToPatch, this._getPatchExtendWithCommands(transformCommandArguments));\n        return moduleExports;\n      },\n      (moduleExports: any) => {\n        if (isWrapped(moduleExports?.extendWithCommands)) {\n          this._unwrap(moduleExports, 'extendWithCommands');\n        }\n        if (isWrapped(moduleExports?.attachCommands)) {\n          this._unwrap(moduleExports, 'attachCommands');\n        }\n      },\n    );\n\n    const multiCommanderModule = new InstrumentationNodeModuleFile(\n      `${basePackageName}/dist/lib/client/multi-command.js`,\n      ['^1.0.0', '>=5.0.0 <5.12.0'],\n      (moduleExports: any) => {\n        const redisClientMultiCommandPrototype = moduleExports?.default?.prototype;\n        if (isWrapped(redisClientMultiCommandPrototype?.exec)) {\n          this._unwrap(redisClientMultiCommandPrototype, 'exec');\n        }\n        this._wrap(redisClientMultiCommandPrototype, 'exec', this._getPatchMultiCommandsExec(false));\n        if (isWrapped(redisClientMultiCommandPrototype?.execAsPipeline)) {\n          this._unwrap(redisClientMultiCommandPrototype, 'execAsPipeline');\n        }\n        this._wrap(redisClientMultiCommandPrototype, 'execAsPipeline', this._getPatchMultiCommandsExec(true));\n        if (isWrapped(redisClientMultiCommandPrototype?.addCommand)) {\n          this._unwrap(redisClientMultiCommandPrototype, 'addCommand');\n        }\n        this._wrap(redisClientMultiCommandPrototype, 'addCommand', this._getPatchMultiCommandsAddCommand());\n        return moduleExports;\n      },\n      (moduleExports: any) => {\n        const redisClientMultiCommandPrototype = moduleExports?.default?.prototype;\n        if (isWrapped(redisClientMultiCommandPrototype?.exec)) {\n          this._unwrap(redisClientMultiCommandPrototype, 'exec');\n        }\n        if (isWrapped(redisClientMultiCommandPrototype?.execAsPipeline)) {\n          this._unwrap(redisClientMultiCommandPrototype, 'execAsPipeline');\n        }\n        if (isWrapped(redisClientMultiCommandPrototype?.addCommand)) {\n          this._unwrap(redisClientMultiCommandPrototype, 'addCommand');\n        }\n      },\n    );\n\n    const clientIndexModule = new InstrumentationNodeModuleFile(\n      `${basePackageName}/dist/lib/client/index.js`,\n      ['^1.0.0', '>=5.0.0 <5.12.0'],\n      (moduleExports: any) => {\n        const redisClientPrototype = moduleExports?.default?.prototype;\n        if (redisClientPrototype?.multi) {\n          if (isWrapped(redisClientPrototype?.multi)) {\n            this._unwrap(redisClientPrototype, 'multi');\n          }\n          this._wrap(redisClientPrototype, 'multi', this._getPatchRedisClientMulti());\n        }\n        if (redisClientPrototype?.MULTI) {\n          if (isWrapped(redisClientPrototype?.MULTI)) {\n            this._unwrap(redisClientPrototype, 'MULTI');\n          }\n          this._wrap(redisClientPrototype, 'MULTI', this._getPatchRedisClientMulti());\n        }\n        if (isWrapped(redisClientPrototype?.sendCommand)) {\n          this._unwrap(redisClientPrototype, 'sendCommand');\n        }\n        this._wrap(redisClientPrototype, 'sendCommand', this._getPatchRedisClientSendCommand());\n        if (isWrapped(redisClientPrototype?.connect)) {\n          this._unwrap(redisClientPrototype, 'connect');\n        }\n        this._wrap(redisClientPrototype, 'connect', this._getPatchedClientConnect());\n        return moduleExports;\n      },\n      (moduleExports: any) => {\n        const redisClientPrototype = moduleExports?.default?.prototype;\n        if (isWrapped(redisClientPrototype?.multi)) {\n          this._unwrap(redisClientPrototype, 'multi');\n        }\n        if (isWrapped(redisClientPrototype?.MULTI)) {\n          this._unwrap(redisClientPrototype, 'MULTI');\n        }\n        if (isWrapped(redisClientPrototype?.sendCommand)) {\n          this._unwrap(redisClientPrototype, 'sendCommand');\n        }\n        if (isWrapped(redisClientPrototype?.connect)) {\n          this._unwrap(redisClientPrototype, 'connect');\n        }\n      },\n    );\n\n    return new InstrumentationNodeModuleDefinition(\n      basePackageName,\n      ['^1.0.0', '>=5.0.0 <5.12.0'],\n      (moduleExports: any) => moduleExports,\n      () => {},\n      [commanderModuleFile, multiCommanderModule, clientIndexModule],\n    );\n  }\n\n  private _getPatchExtendWithCommands(transformCommandArguments: Function) {\n    const plugin = this;\n    return function extendWithCommandsPatchWrapper(original: Function) {\n      return function extendWithCommandsPatch(this: any, config: any) {\n        if (config?.BaseClass?.name !== 'RedisClient') {\n          return original.apply(this, arguments);\n        }\n        const origExecutor = config.executor;\n        config.executor = function (this: any, command: any, args: any) {\n          const redisCommandArguments = transformCommandArguments(command, args).args;\n          return plugin._traceClientCommand(origExecutor, this, arguments, redisCommandArguments);\n        };\n        return original.apply(this, arguments);\n      };\n    };\n  }\n\n  private _getPatchMultiCommandsExec(isPipeline: boolean) {\n    const plugin = this;\n    return function execPatchWrapper(original: Function) {\n      return function execPatch(this: any) {\n        const execRes = original.apply(this, arguments);\n        if (typeof execRes?.then !== 'function') {\n          plugin._diag.error('non-promise result when patching exec/execAsPipeline');\n          return execRes;\n        }\n        return execRes\n          .then((redisRes: unknown[]) => {\n            const openSpans: OpenSpanInfo[] = this[OTEL_OPEN_SPANS];\n            plugin._endSpansWithRedisReplies(openSpans, redisRes, isPipeline);\n            return redisRes;\n          })\n          .catch((err: any) => {\n            const openSpans: OpenSpanInfo[] = this[OTEL_OPEN_SPANS];\n            if (!openSpans) {\n              plugin._diag.error('cannot find open spans to end for multi/pipeline');\n            } else {\n              const replies =\n                err.constructor.name === 'MultiErrorReply'\n                  ? (err as MultiErrorReply).replies\n                  : new Array(openSpans.length).fill(err);\n              plugin._endSpansWithRedisReplies(openSpans, replies, isPipeline);\n            }\n            return Promise.reject(err);\n          });\n      };\n    };\n  }\n\n  private _getPatchMultiCommandsAddCommand() {\n    const plugin = this;\n    return function addCommandWrapper(original: Function) {\n      return function addCommandPatch(this: any, args: any) {\n        return plugin._traceClientCommand(original, this, arguments, args);\n      };\n    };\n  }\n\n  private _getPatchRedisClientMulti() {\n    return function multiPatchWrapper(original: Function) {\n      return function multiPatch(this: any) {\n        const multiRes: any = original.apply(this, arguments);\n        multiRes[MULTI_COMMAND_OPTIONS] = this.options;\n        return multiRes;\n      };\n    };\n  }\n\n  private _getPatchRedisClientSendCommand() {\n    const plugin = this;\n    return function sendCommandWrapper(original: Function) {\n      return function sendCommandPatch(this: any, args: any) {\n        return plugin._traceClientCommand(original, this, arguments, args);\n      };\n    };\n  }\n\n  private _getPatchedClientConnect() {\n    const plugin = this;\n    return function connectWrapper(original: Function) {\n      return function patchedConnect(this: any) {\n        const options = this.options;\n        const attributes = getClientAttributes(plugin._diag, options, plugin._semconvStability);\n        attributes[SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN] = 'auto.db.otel.redis';\n        const span = plugin.tracer.startSpan(`${RedisInstrumentationV4_V5.COMPONENT}-connect`, {\n          kind: SpanKind.CLIENT,\n          attributes,\n        });\n        const res = context.with(trace.setSpan(context.active(), span), () => {\n          return original.apply(this);\n        });\n        return res\n          .then((result: any) => {\n            span.end();\n            return result;\n          })\n          .catch((error: Error) => {\n            span.recordException(error);\n            span.setStatus({\n              code: SpanStatusCode.ERROR,\n              message: error.message,\n            });\n            span.end();\n            return Promise.reject(error);\n          });\n      };\n    };\n  }\n\n  _traceClientCommand(\n    origFunction: Function,\n    origThis: any,\n    origArguments: IArguments,\n    redisCommandArguments: Array<string | Buffer>,\n  ): any {\n    const hasNoParentSpan = trace.getSpan(context.active()) === undefined;\n    if (hasNoParentSpan && this.getConfig().requireParentSpan) {\n      return origFunction.apply(origThis, origArguments);\n    }\n    const clientOptions = origThis.options || origThis[MULTI_COMMAND_OPTIONS];\n    const commandName = redisCommandArguments[0] as string;\n    const commandArgs = redisCommandArguments.slice(1);\n    const dbStatementSerializer = this.getConfig().dbStatementSerializer || defaultDbStatementSerializer;\n    const attributes = getClientAttributes(this._diag, clientOptions, this._semconvStability);\n    if (this._semconvStability & SemconvStability.STABLE) {\n      attributes[ATTR_DB_OPERATION_NAME] = commandName;\n    }\n    try {\n      const dbStatement = dbStatementSerializer(commandName, commandArgs);\n      if (dbStatement != null) {\n        if (this._semconvStability & SemconvStability.OLD) {\n          attributes[ATTR_DB_STATEMENT] = dbStatement;\n        }\n        if (this._semconvStability & SemconvStability.STABLE) {\n          attributes[ATTR_DB_QUERY_TEXT] = dbStatement;\n        }\n      }\n    } catch (e) {\n      this._diag.error('dbStatementSerializer throw an exception', e, { commandName });\n    }\n    attributes[SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN] = 'auto.db.otel.redis';\n    const span = this.tracer.startSpan(`${RedisInstrumentationV4_V5.COMPONENT}-${commandName}`, {\n      kind: SpanKind.CLIENT,\n      attributes,\n    });\n    const res = context.with(trace.setSpan(context.active(), span), () => {\n      return origFunction.apply(origThis, origArguments);\n    });\n    if (typeof res?.then === 'function') {\n      res.then(\n        (redisRes: unknown) => {\n          this._endSpanWithResponse(span, commandName, commandArgs, redisRes, undefined);\n        },\n        (err: Error) => {\n          this._endSpanWithResponse(span, commandName, commandArgs, null, err);\n        },\n      );\n    } else {\n      const redisClientMultiCommand: any = res;\n      redisClientMultiCommand[OTEL_OPEN_SPANS] = redisClientMultiCommand[OTEL_OPEN_SPANS] || [];\n      redisClientMultiCommand[OTEL_OPEN_SPANS].push({\n        span,\n        commandName,\n        commandArgs,\n      });\n    }\n    return res;\n  }\n\n  _endSpansWithRedisReplies(openSpans: OpenSpanInfo[] | undefined, replies: unknown[], isPipeline = false): void {\n    if (!openSpans) {\n      return this._diag.error('cannot find open spans to end for redis multi/pipeline');\n    }\n    if (replies.length !== openSpans.length) {\n      return this._diag.error('number of multi command spans does not match response from redis');\n    }\n    const allCommands = openSpans.map(s => s.commandName);\n    const allSameCommand = allCommands.every(cmd => cmd === allCommands[0]);\n    const operationName = allSameCommand\n      ? (isPipeline ? 'PIPELINE ' : 'MULTI ') + allCommands[0]\n      : isPipeline\n        ? 'PIPELINE'\n        : 'MULTI';\n    for (let i = 0; i < openSpans.length; i++) {\n      const { span, commandArgs } = openSpans[i]!;\n      const currCommandRes = replies[i];\n      const [res, err] = currCommandRes instanceof Error ? [null, currCommandRes] : [currCommandRes, undefined];\n      if (this._semconvStability & SemconvStability.STABLE) {\n        span.setAttribute(ATTR_DB_OPERATION_NAME, operationName);\n      }\n      this._endSpanWithResponse(span, allCommands[i]!, commandArgs, res, err);\n    }\n  }\n\n  _endSpanWithResponse(\n    span: Span,\n    commandName: string,\n    commandArgs: Array<string | Buffer>,\n    response: unknown,\n    error: Error | null | undefined,\n  ): void {\n    const { responseHook } = this.getConfig();\n    if (!error && responseHook) {\n      try {\n        responseHook(span, commandName, commandArgs, response);\n      } catch (err) {\n        this._diag.error('responseHook throw an exception', err);\n      }\n    }\n    if (error) {\n      span.recordException(error);\n      span.setStatus({ code: SpanStatusCode.ERROR, message: error?.message });\n    }\n    span.end();\n  }\n}\n\n// ---- RedisInstrumentation (wrapper) ----\n\nconst DEFAULT_CONFIG: RedisInstrumentationConfig = {\n  requireParentSpan: false,\n};\n\nexport class RedisInstrumentation extends InstrumentationBase<RedisInstrumentationConfig> {\n  private instrumentationV2_V3: RedisInstrumentationV2_V3;\n  private instrumentationV4_V5: RedisInstrumentationV4_V5;\n  private initialized = false;\n\n  constructor(config: RedisInstrumentationConfig = {}) {\n    const resolvedConfig = { ...DEFAULT_CONFIG, ...config };\n    super(PACKAGE_NAME, PACKAGE_VERSION, resolvedConfig);\n    this.instrumentationV2_V3 = new RedisInstrumentationV2_V3(this.getConfig());\n    this.instrumentationV4_V5 = new RedisInstrumentationV4_V5(this.getConfig());\n    this.initialized = true;\n  }\n\n  override setConfig(config: RedisInstrumentationConfig = {}): void {\n    const newConfig = { ...DEFAULT_CONFIG, ...config };\n    super.setConfig(newConfig);\n    if (!this.initialized) {\n      return;\n    }\n    this.instrumentationV2_V3.setConfig(newConfig);\n    this.instrumentationV4_V5.setConfig(newConfig);\n  }\n\n  init() {}\n\n  override getModuleDefinitions() {\n    return [...this.instrumentationV2_V3.getModuleDefinitions(), ...this.instrumentationV4_V5.getModuleDefinitions()];\n  }\n\n  override setTracerProvider(tracerProvider: TracerProvider): void {\n    super.setTracerProvider(tracerProvider);\n    if (!this.initialized) {\n      return;\n    }\n    this.instrumentationV2_V3.setTracerProvider(tracerProvider);\n    this.instrumentationV4_V5.setTracerProvider(tracerProvider);\n  }\n\n  override enable(): void {\n    super.enable();\n    if (!this.initialized) {\n      return;\n    }\n    this.instrumentationV2_V3.enable();\n    this.instrumentationV4_V5.enable();\n  }\n\n  override disable(): void {\n    super.disable();\n    if (!this.initialized) {\n      return;\n    }\n    this.instrumentationV2_V3.disable();\n    this.instrumentationV4_V5.disable();\n  }\n}\n"],"names":[],"mappings":"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"}