{"version":3,"sources":["jsdelivr-header.js","/npm/@fastify/otel@0.16.0/index.js"],"names":[],"mappings":"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","file":"/npm/@fastify/otel@0.16.0/index.js","sourceRoot":"","sourcesContent":["/**\n * Minified by jsDelivr using Terser v5.39.0.\n * Original file: /npm/@fastify/otel@0.16.0/index.js\n *\n * Do NOT use SRI with dynamically generated files! More information: https://www.jsdelivr.com/using-sri-with-dynamic-files\n */\n","'use strict'\nconst dc = require('node:diagnostics_channel')\nconst { context, trace, SpanStatusCode, propagation, diag } = require('@opentelemetry/api')\nconst { getRPCMetadata, RPCType } = require('@opentelemetry/core')\nconst {\n  ATTR_HTTP_ROUTE,\n  ATTR_HTTP_RESPONSE_STATUS_CODE,\n  ATTR_HTTP_REQUEST_METHOD,\n  ATTR_URL_PATH\n} = require('@opentelemetry/semantic-conventions')\nconst { InstrumentationBase } = require('@opentelemetry/instrumentation')\n\nconst {\n  version: PACKAGE_VERSION,\n  name: PACKAGE_NAME\n} = require('./package.json')\n\n// Constants\nconst SUPPORTED_VERSIONS = '>=4.0.0 <6'\nconst FASTIFY_HOOKS = [\n  'onRequest',\n  'preParsing',\n  'preValidation',\n  'preHandler',\n  'preSerialization',\n  'onSend',\n  'onResponse',\n  'onError'\n]\nconst ATTRIBUTE_NAMES = {\n  HOOK_NAME: 'hook.name',\n  FASTIFY_TYPE: 'fastify.type',\n  HOOK_CALLBACK_NAME: 'hook.callback.name',\n  ROOT: 'fastify.root'\n}\nconst HOOK_TYPES = {\n  ROUTE: 'route-hook',\n  INSTANCE: 'hook',\n  HANDLER: 'request-handler'\n}\nconst ANONYMOUS_FUNCTION_NAME = 'anonymous'\n\n// Symbols\nconst kInstrumentation = Symbol('fastify otel instance')\nconst kRequestSpan = Symbol('fastify otel request spans')\nconst kRequestContext = Symbol('fastify otel request context')\nconst kAddHookOriginal = Symbol('fastify otel addhook original')\nconst kSetNotFoundOriginal = Symbol('fastify otel setnotfound original')\nconst kIgnorePaths = Symbol('fastify otel ignore path')\nconst kRecordExceptions = Symbol('fastify otel record exceptions')\n\nclass FastifyOtelInstrumentation extends InstrumentationBase {\n  logger = null\n  _requestHook = null\n  _lifecycleHook = null\n\n  constructor (config) {\n    super(PACKAGE_NAME, PACKAGE_VERSION, config)\n    this.logger = diag.createComponentLogger({ namespace: PACKAGE_NAME })\n    this[kIgnorePaths] = null\n    this[kRecordExceptions] = true\n\n    if (config?.recordExceptions != null) {\n      if (typeof config.recordExceptions !== 'boolean') {\n        throw new TypeError('recordExceptions must be a boolean')\n      }\n\n      this[kRecordExceptions] = config.recordExceptions\n    }\n    if (typeof config?.requestHook === 'function') {\n      this._requestHook = config.requestHook\n    }\n    if (typeof config?.lifecycleHook === 'function') {\n      this._lifecycleHook = config.lifecycleHook\n    }\n\n    if (config?.ignorePaths != null || process.env.OTEL_FASTIFY_IGNORE_PATHS != null) {\n      const ignorePaths = config?.ignorePaths ?? process.env.OTEL_FASTIFY_IGNORE_PATHS\n\n      if ((typeof ignorePaths !== 'string' || ignorePaths.length === 0) && typeof ignorePaths !== 'function') {\n        throw new TypeError(\n          'ignorePaths must be a string or a function'\n        )\n      }\n\n      let globMatcher = null\n\n      this[kIgnorePaths] = (routeOptions) => {\n        if (typeof ignorePaths === 'function') {\n          return ignorePaths(routeOptions)\n        } else {\n          // Using minimatch to match the path until path.matchesGlob is out of experimental\n          // path.matchesGlob uses minimatch internally\n          if (globMatcher == null) {\n            globMatcher = require('minimatch').minimatch\n          }\n\n          return globMatcher(routeOptions.url, ignorePaths)\n        }\n      }\n    }\n  }\n\n  enable () {\n    if (this._handleInitialization === undefined && this.getConfig().registerOnInitialization) {\n      this._handleInitialization = (message) => {\n        // Cannot use `fastify.register(plugin)` because it is lazily executed and\n        // thus requires user code to await fastify instance first.\n        this.plugin()(message.fastify, undefined, () => {})\n\n        // Add an empty plugin to keep `app.hasPlugin('@fastify/otel')` invariant\n        const emptyPlugin = (_, __, done) => {\n          done()\n        }\n        emptyPlugin[Symbol.for('skip-override')] = true\n        emptyPlugin[Symbol.for('fastify.display-name')] = '@fastify/otel'\n        message.fastify.register(emptyPlugin)\n      }\n      dc.subscribe('fastify.initialization', this._handleInitialization)\n    }\n    return super.enable()\n  }\n\n  disable () {\n    if (this._handleInitialization) {\n      dc.unsubscribe('fastify.initialization', this._handleInitialization)\n      this._handleInitialization = undefined\n    }\n    return super.disable()\n  }\n\n  // We do not do patching in this instrumentation\n  init () {\n    return []\n  }\n\n  plugin () {\n    const instrumentation = this\n\n    FastifyInstrumentationPlugin[Symbol.for('skip-override')] = true\n    FastifyInstrumentationPlugin[Symbol.for('fastify.display-name')] = '@fastify/otel'\n    FastifyInstrumentationPlugin[Symbol.for('plugin-meta')] = {\n      fastify: SUPPORTED_VERSIONS,\n      name: '@fastify/otel',\n    }\n\n    return FastifyInstrumentationPlugin\n\n    function FastifyInstrumentationPlugin (instance, opts, done) {\n      instance.decorate(kInstrumentation, instrumentation)\n      // addHook and notfoundHandler are essentially inherited from the prototype\n      // what is important is to bound it to the right instance\n      instance.decorate(kAddHookOriginal, instance.addHook)\n      instance.decorate(kSetNotFoundOriginal, instance.setNotFoundHandler)\n      instance.decorateRequest('opentelemetry', function openetelemetry () {\n        const ctx = this[kRequestContext]\n        const span = this[kRequestSpan]\n\n        return {\n          enabled: this.routeOptions.config?.otel !== false,\n          span,\n          tracer: instrumentation.tracer,\n          context: ctx,\n          inject: (carrier, setter) => {\n            return propagation.inject(ctx, carrier, setter)\n          },\n          extract: (carrier, getter) => {\n            return propagation.extract(ctx, carrier, getter)\n          }\n        }\n      })\n      instance.decorateRequest(kRequestSpan, null)\n      instance.decorateRequest(kRequestContext, null)\n\n      instance.addHook('onRoute', function otelWireRoute (routeOptions) {\n        if (instrumentation[kIgnorePaths]?.(routeOptions) === true) {\n          instrumentation.logger.debug(\n            `Ignoring route instrumentation ${routeOptions.method} ${routeOptions.url} because it matches the ignore path`\n          )\n          return\n        }\n\n        if (routeOptions.config?.otel === false) {\n          instrumentation.logger.debug(\n            `Ignoring route instrumentation ${routeOptions.method} ${routeOptions.url} because it is disabled`\n          )\n\n          return\n        }\n\n        for (const hook of FASTIFY_HOOKS) {\n          if (routeOptions[hook] != null) {\n            const handlerLike = routeOptions[hook]\n\n            if (typeof handlerLike === 'function') {\n              routeOptions[hook] = handlerWrapper(handlerLike, hook, {\n                [ATTRIBUTE_NAMES.HOOK_NAME]: `${this.pluginName} - route -> ${hook}`,\n                [ATTRIBUTE_NAMES.FASTIFY_TYPE]: HOOK_TYPES.ROUTE,\n                [ATTR_HTTP_ROUTE]: routeOptions.url,\n                [ATTRIBUTE_NAMES.HOOK_CALLBACK_NAME]:\n                  handlerLike.name?.length > 0\n                    ? handlerLike.name\n                    : ANONYMOUS_FUNCTION_NAME /* c8 ignore next */\n              })\n            } else if (Array.isArray(handlerLike)) {\n              const wrappedHandlers = []\n\n              for (const handler of handlerLike) {\n                wrappedHandlers.push(\n                  handlerWrapper(handler, hook, {\n                    [ATTRIBUTE_NAMES.HOOK_NAME]: `${this.pluginName} - route -> ${hook}`,\n                    [ATTRIBUTE_NAMES.FASTIFY_TYPE]: HOOK_TYPES.ROUTE,\n                    [ATTR_HTTP_ROUTE]: routeOptions.url,\n                    [ATTRIBUTE_NAMES.HOOK_CALLBACK_NAME]:\n                      handler.name?.length > 0\n                        ? handler.name\n                        : ANONYMOUS_FUNCTION_NAME\n                  })\n                )\n              }\n\n              routeOptions[hook] = wrappedHandlers\n            }\n          }\n        }\n\n        // We always want to add the onSend hook to the route to be executed last\n        if (routeOptions.onSend != null) {\n          routeOptions.onSend = Array.isArray(routeOptions.onSend)\n            ? [...routeOptions.onSend, finalizeResponseSpanHook]\n            : [routeOptions.onSend, finalizeResponseSpanHook]\n        } else {\n          routeOptions.onSend = finalizeResponseSpanHook\n        }\n\n        // We always want to add the onError hook to the route to be executed last\n        if (routeOptions.onError != null) {\n          routeOptions.onError = Array.isArray(routeOptions.onError)\n            ? [...routeOptions.onError, recordErrorInSpanHook]\n            : [routeOptions.onError, recordErrorInSpanHook]\n        } else {\n          routeOptions.onError = recordErrorInSpanHook\n        }\n\n        routeOptions.handler = handlerWrapper(routeOptions.handler, 'handler', {\n          [ATTRIBUTE_NAMES.HOOK_NAME]: `${this.pluginName} - route-handler`,\n          [ATTRIBUTE_NAMES.FASTIFY_TYPE]: HOOK_TYPES.HANDLER,\n          [ATTR_HTTP_ROUTE]: routeOptions.url,\n          [ATTRIBUTE_NAMES.HOOK_CALLBACK_NAME]:\n            routeOptions.handler.name.length > 0\n              ? routeOptions.handler.name\n              : ANONYMOUS_FUNCTION_NAME\n        })\n      })\n\n      instance.addHook('onRequest', function startRequestSpanHook (request, _reply, hookDone) {\n        if (\n          this[kInstrumentation].isEnabled() === false ||\n          request.routeOptions.config?.otel === false\n        ) {\n          return hookDone()\n        }\n\n        if (this[kInstrumentation][kIgnorePaths]?.({\n          url: request.url,\n          method: request.method,\n        }) === true) {\n          this[kInstrumentation].logger.debug(\n            `Ignoring request ${request.method} ${request.url} because it matches the ignore path`\n          )\n          return hookDone()\n        }\n\n        let ctx = context.active()\n\n        if (trace.getSpan(ctx) == null) {\n          ctx = propagation.extract(ctx, request.headers)\n        }\n\n        const rpcMetadata = getRPCMetadata(ctx)\n\n        if (\n          request.routeOptions.url != null &&\n          rpcMetadata?.type === RPCType.HTTP\n        ) {\n          rpcMetadata.route = request.routeOptions.url\n        }\n\n        const attributes = {\n          [ATTRIBUTE_NAMES.ROOT]: '@fastify/otel',\n          [ATTR_HTTP_REQUEST_METHOD]: request.method,\n          [ATTR_URL_PATH]: request.url\n        }\n\n        if (request.routeOptions.url != null) {\n          attributes[ATTR_HTTP_ROUTE] = request.routeOptions.url\n        }\n\n        /** @type {import('@opentelemetry/api').Span} */\n        const span = this[kInstrumentation].tracer.startSpan('request', {\n          attributes\n        }, ctx)\n\n        try {\n          this[kInstrumentation]._requestHook?.(span, request)\n        } catch (err) {\n          this[kInstrumentation].logger.error({ err }, 'requestHook threw')\n        }\n\n        request[kRequestContext] = trace.setSpan(ctx, span)\n        request[kRequestSpan] = span\n\n        context.with(request[kRequestContext], () => {\n          hookDone()\n        })\n      })\n\n      // onResponse is the last hook to be executed, only added for 404 handlers\n      instance.addHook('onResponse', function finalizeNotFoundSpanHook (request, reply, hookDone) {\n        const span = request[kRequestSpan]\n\n        if (span != null) {\n          span.setStatus({\n            code: SpanStatusCode.OK,\n            message: 'OK'\n          })\n          span.setAttributes({\n            [ATTR_HTTP_RESPONSE_STATUS_CODE]: 404\n          })\n          span.end()\n        }\n\n        request[kRequestSpan] = null\n\n        hookDone()\n      })\n\n      instance.addHook = addHookPatched\n      instance.setNotFoundHandler = setNotFoundHandlerPatched\n\n      done()\n\n      function finalizeResponseSpanHook (request, reply, payload, hookDone) {\n        /** @type {import('@opentelemetry/api').Span} */\n        const span = request[kRequestSpan]\n\n        if (span != null) {\n          if (reply.statusCode < 500) {\n            span.setStatus({\n              code: SpanStatusCode.OK,\n              message: 'OK'\n            })\n          }\n\n          span.setAttributes({\n            [ATTR_HTTP_RESPONSE_STATUS_CODE]: reply.statusCode\n          })\n          span.end()\n        }\n\n        request[kRequestSpan] = null\n\n        hookDone(null, payload)\n      }\n\n      function recordErrorInSpanHook (request, reply, error, hookDone) {\n        /** @type {Span} */\n        const span = request[kRequestSpan]\n\n        if (span != null) {\n          span.setStatus({\n            code: SpanStatusCode.ERROR,\n            message: error.message\n          })\n          if (instrumentation[kRecordExceptions] !== false) {\n            span.recordException(error)\n          }\n        }\n\n        hookDone()\n      }\n\n      function addHookPatched (name, hook) {\n        const addHookOriginal = this[kAddHookOriginal]\n\n        if (FASTIFY_HOOKS.includes(name)) {\n          return addHookOriginal.call(\n            this,\n            name,\n            handlerWrapper(hook, name, {\n              [ATTRIBUTE_NAMES.HOOK_NAME]: `${this.pluginName} - ${name}`,\n              [ATTRIBUTE_NAMES.FASTIFY_TYPE]: HOOK_TYPES.INSTANCE,\n              [ATTRIBUTE_NAMES.HOOK_CALLBACK_NAME]:\n                hook.name?.length > 0\n                  ? hook.name\n                  : ANONYMOUS_FUNCTION_NAME /* c8 ignore next */\n            })\n          )\n        } else {\n          return addHookOriginal.call(this, name, hook)\n        }\n      }\n\n      function setNotFoundHandlerPatched (hooks, handler) {\n        const setNotFoundHandlerOriginal = this[kSetNotFoundOriginal]\n        if (typeof hooks === 'function') {\n          handler = handlerWrapper(hooks, 'notFoundHandler', {\n            [ATTRIBUTE_NAMES.HOOK_NAME]: `${this.pluginName} - not-found-handler`,\n            [ATTRIBUTE_NAMES.FASTIFY_TYPE]: HOOK_TYPES.INSTANCE,\n            [ATTRIBUTE_NAMES.HOOK_CALLBACK_NAME]:\n              hooks.name?.length > 0\n                ? hooks.name\n                : ANONYMOUS_FUNCTION_NAME /* c8 ignore next */\n          })\n          setNotFoundHandlerOriginal.call(this, handler)\n        } else {\n          if (hooks.preValidation != null) {\n            hooks.preValidation = handlerWrapper(hooks.preValidation, 'notFoundHandler - preValidation', {\n              [ATTRIBUTE_NAMES.HOOK_NAME]: `${this.pluginName} - not-found-handler - preValidation`,\n              [ATTRIBUTE_NAMES.FASTIFY_TYPE]: HOOK_TYPES.INSTANCE,\n              [ATTRIBUTE_NAMES.HOOK_CALLBACK_NAME]:\n                hooks.preValidation.name?.length > 0\n                  ? hooks.preValidation.name\n                  : ANONYMOUS_FUNCTION_NAME /* c8 ignore next */\n            })\n          }\n\n          if (hooks.preHandler != null) {\n            hooks.preHandler = handlerWrapper(hooks.preHandler, 'notFoundHandler - preHandler', {\n              [ATTRIBUTE_NAMES.HOOK_NAME]: `${this.pluginName} - not-found-handler - preHandler`,\n              [ATTRIBUTE_NAMES.FASTIFY_TYPE]: HOOK_TYPES.INSTANCE,\n              [ATTRIBUTE_NAMES.HOOK_CALLBACK_NAME]:\n                hooks.preHandler.name?.length > 0\n                  ? hooks.preHandler.name\n                  : ANONYMOUS_FUNCTION_NAME /* c8 ignore next */\n            })\n          }\n\n          handler = handlerWrapper(handler, 'notFoundHandler', {\n            [ATTRIBUTE_NAMES.HOOK_NAME]: `${this.pluginName} - not-found-handler`,\n            [ATTRIBUTE_NAMES.FASTIFY_TYPE]: HOOK_TYPES.INSTANCE,\n            [ATTRIBUTE_NAMES.HOOK_CALLBACK_NAME]:\n              handler.name?.length > 0\n                ? handler.name\n                : ANONYMOUS_FUNCTION_NAME /* c8 ignore next */\n          })\n          setNotFoundHandlerOriginal.call(this, hooks, handler)\n        }\n      }\n\n      function handlerWrapper (handler, hookName, spanAttributes = {}) {\n        return function handlerWrapped (...args) {\n          /** @type {FastifyOtelInstrumentation} */\n          const instrumentation = this[kInstrumentation]\n          const [request] = args\n\n          if (instrumentation.isEnabled() === false || request.routeOptions.config?.otel === false) {\n            instrumentation.logger.debug(\n              `Ignoring route instrumentation ${request.routeOptions.method} ${request.routeOptions.url} because it is disabled`\n            )\n            return handler.call(this, ...args)\n          }\n\n          if (instrumentation[kIgnorePaths]?.({\n            url: request.url,\n            method: request.method,\n          }) === true) {\n            instrumentation.logger.debug(\n              `Ignoring route instrumentation ${request.routeOptions.method} ${request.routeOptions.url} because it matches the ignore path`\n            )\n            return handler.call(this, ...args)\n          }\n\n          /* c8 ignore next */\n          const ctx = request[kRequestContext] ?? context.active()\n          const handlerName = handler.name?.length > 0\n            ? handler.name\n            : this.pluginName /* c8 ignore next */ ?? ANONYMOUS_FUNCTION_NAME /* c8 ignore next */\n\n          const span = instrumentation.tracer.startSpan(\n            `${hookName} - ${handlerName}`,\n            {\n              attributes: spanAttributes\n            },\n            ctx\n          )\n\n          if (instrumentation._lifecycleHook != null) {\n            try {\n              instrumentation._lifecycleHook(span, {\n                hookName,\n                request,\n                handler: handlerName\n              })\n            } catch (err) {\n              instrumentation.logger.error({ err }, 'Execution of lifecycleHook failed')\n            }\n          }\n\n          return context.with(\n            trace.setSpan(ctx, span),\n            function () {\n              try {\n                const res = handler.call(this, ...args)\n\n                if (typeof res?.then === 'function') {\n                  return res.then(\n                    result => {\n                      span.end()\n                      return result\n                    },\n                    error => {\n                      span.setStatus({\n                        code: SpanStatusCode.ERROR,\n                        message: error.message\n                      })\n                      if (instrumentation[kRecordExceptions] !== false) {\n                        span.recordException(error)\n                      }\n                      span.end()\n                      return Promise.reject(error)\n                    }\n                  )\n                }\n\n                span.end()\n                return res\n              } catch (error) {\n                span.setStatus({\n                  code: SpanStatusCode.ERROR,\n                  message: error.message\n                })\n                if (instrumentation[kRecordExceptions] !== false) {\n                  span.recordException(error)\n                }\n                span.end()\n                throw error\n              }\n            },\n            this\n          )\n        }\n      }\n    }\n  }\n}\n\nmodule.exports = FastifyOtelInstrumentation\nmodule.exports.FastifyOtelInstrumentation = FastifyOtelInstrumentation\n"]}