{"version":3,"file":"middleware.cjs","names":["debugPrefix","#logger","DiagLogLevel","processor: InngestSpanProcessor | undefined","processorReady: Promise<void> | undefined","extendProvider","createProvider","Middleware","diag","trace","version"],"sources":["../../../../src/components/execution/otel/middleware.ts"],"sourcesContent":["import { type DiagLogger, DiagLogLevel, diag, trace } from \"@opentelemetry/api\";\nimport Debug from \"debug\";\nimport { version } from \"../../../version.ts\";\nimport { Middleware } from \"../../middleware/middleware.ts\";\nimport { clientProcessorMap } from \"./access.ts\";\nimport { debugPrefix } from \"./consts.ts\";\nimport type { InngestSpanProcessor } from \"./processor.ts\";\nimport {\n  type Behaviour,\n  createProvider,\n  extendProvider,\n  type Instrumentations,\n} from \"./util.ts\";\n\nconst devDebug = Debug(`${debugPrefix}:middleware`);\n\nclass InngestTracesLogger implements DiagLogger {\n  #logger = Debug(`${debugPrefix}:diag`);\n\n  debug = this.#logger;\n  error = this.#logger;\n  info = this.#logger;\n  verbose = this.#logger;\n  warn = this.#logger;\n}\n\n/**\n * A set of options for the Extended Traces middleware.\n */\nexport interface ExtendedTracesMiddlewareOptions {\n  /**\n   * The behaviour of the Extended Traces middleware. This controls whether the\n   * middleware will create a new OpenTelemetry provider, extend an existing one, or\n   * do nothing. The default is \"auto\", which will attempt to extend an\n   * existing provider, and if that fails, create a new one.\n   *\n   * - `\"auto\"`: Attempt to extend an existing provider, and if that fails,\n   *   create a new one.\n   * - `\"createProvider\"`: Create a new OpenTelemetry provider.\n   * - `\"extendProvider\"`: Attempt to extend an existing provider.\n   * - `\"off\"`: Do nothing.\n   */\n  behaviour?: Behaviour;\n\n  /**\n   * Add additional instrumentations to the OpenTelemetry provider.\n   *\n   * Note that these only apply if the provider is created by the middleware;\n   * extending an existing provider cannot add instrumentations and it instead\n   * must be done wherever the provider is created.\n   */\n  instrumentations?: Instrumentations;\n\n  /**\n   * The log level for the Extended Traces middleware, specifically a diagnostic logger\n   * attached to the global OpenTelemetry provider.\n   *\n   * Defaults to `DiagLogLevel.ERROR`.\n   */\n  logLevel?: DiagLogLevel;\n}\n\n/**\n * Middleware the captures and exports spans relevant to Inngest runs using\n * OTel.\n *\n * This can be used to attach additional spans and data to the existing traces\n * in your Inngest dashboard (or Dev Server).\n */\nexport const extendedTracesMiddleware = ({\n  behaviour = \"auto\",\n  instrumentations,\n  logLevel = DiagLogLevel.ERROR,\n}: ExtendedTracesMiddlewareOptions = {}) => {\n  devDebug(\"behaviour:\", behaviour);\n\n  let processor: InngestSpanProcessor | undefined;\n  let processorReady: Promise<void> | undefined;\n\n  switch (behaviour) {\n    case \"auto\": {\n      const extended = extendProvider(behaviour);\n      if (extended.success) {\n        devDebug(\"extended existing provider\");\n        processor = extended.processor;\n        break;\n      }\n\n      processorReady = createProvider(behaviour, instrumentations).then(\n        (created) => {\n          if (created.success) {\n            devDebug(\"created new provider\");\n            processor = created.processor;\n          } else {\n            console.warn(\n              \"no provider found to extend and unable to create one\",\n              created.error ?? \"\",\n            );\n          }\n        },\n      );\n\n      break;\n    }\n    case \"createProvider\": {\n      processorReady = createProvider(behaviour, instrumentations).then(\n        (created) => {\n          if (created.success) {\n            devDebug(\"created new provider\");\n            processor = created.processor;\n          } else {\n            console.warn(\n              \"unable to create provider, Extended Traces middleware will not work\",\n              created.error ?? \"\",\n            );\n          }\n        },\n      );\n\n      break;\n    }\n    case \"extendProvider\": {\n      const extended = extendProvider(behaviour);\n      if (extended.success) {\n        devDebug(\"extended existing provider\");\n        processor = extended.processor;\n        break;\n      }\n\n      console.warn(\n        'unable to extend provider, Extended Traces middleware will not work. Either allow the middleware to create a provider by setting `behaviour: \"createProvider\"` or `behaviour: \"auto\"`, or make sure that the provider is created and imported before the middleware is used.',\n      );\n\n      break;\n    }\n    case \"off\": {\n      break;\n    }\n    default: {\n      // unknown\n      console.warn(\n        `unknown behaviour ${JSON.stringify(behaviour)}, defaulting to \"off\"`,\n      );\n    }\n  }\n\n  class ExtendedTracesMiddleware extends Middleware.BaseMiddleware {\n    readonly id = \"inngest:extended-traces\";\n\n    /**\n     * Called by the Inngest constructor to associate the processor with the\n     * client.\n     */\n    static override onRegister({ client }: Middleware.OnRegisterArgs) {\n      // Set the logger for our otel processors and exporters.\n      // If this is called multiple times, only the first call is set.\n      devDebug(\n        \"set otel diagLogger:\",\n        diag.setLogger(new InngestTracesLogger(), logLevel),\n      );\n\n      if (processor) {\n        clientProcessorMap.set(client, processor);\n      } else if (processorReady) {\n        // createProvider is async; register the processor once it resolves.\n        processorReady\n          .then(() => {\n            if (processor) {\n              clientProcessorMap.set(client, processor);\n            }\n          })\n          .catch((err) => {\n            devDebug(\"failed to register processor for client:\", err);\n          });\n      }\n    }\n\n    override transformFunctionInput(\n      arg: Middleware.TransformFunctionInputArgs,\n    ) {\n      return {\n        ...arg,\n        ctx: {\n          ...arg.ctx,\n          tracer: trace.getTracer(\"inngest\", version),\n        },\n      };\n    }\n\n    override async wrapRequest({ next }: Middleware.WrapRequestArgs) {\n      return next().finally(() => processor?.forceFlush());\n    }\n  }\n\n  return ExtendedTracesMiddleware;\n};\n"],"mappings":";;;;;;;;;;;AAcA,MAAM,8BAAiB,GAAGA,2BAAY,aAAa;AAEnD,IAAM,sBAAN,MAAgD;CAC9C,6BAAgB,GAAGA,2BAAY,OAAO;CAEtC,QAAQ,MAAKC;CACb,QAAQ,MAAKA;CACb,OAAO,MAAKA;CACZ,UAAU,MAAKA;CACf,OAAO,MAAKA;;;;;;;;;AA8Cd,MAAa,4BAA4B,EACvC,YAAY,QACZ,kBACA,WAAWC,iCAAa,UACW,EAAE,KAAK;AAC1C,UAAS,cAAc,UAAU;CAEjC,IAAIC;CACJ,IAAIC;AAEJ,SAAQ,WAAR;EACE,KAAK,QAAQ;GACX,MAAM,WAAWC,4BAAe,UAAU;AAC1C,OAAI,SAAS,SAAS;AACpB,aAAS,6BAA6B;AACtC,gBAAY,SAAS;AACrB;;AAGF,oBAAiBC,4BAAe,WAAW,iBAAiB,CAAC,MAC1D,YAAY;AACX,QAAI,QAAQ,SAAS;AACnB,cAAS,uBAAuB;AAChC,iBAAY,QAAQ;UAEpB,SAAQ,KACN,wDACA,QAAQ,SAAS,GAClB;KAGN;AAED;;EAEF,KAAK;AACH,oBAAiBA,4BAAe,WAAW,iBAAiB,CAAC,MAC1D,YAAY;AACX,QAAI,QAAQ,SAAS;AACnB,cAAS,uBAAuB;AAChC,iBAAY,QAAQ;UAEpB,SAAQ,KACN,uEACA,QAAQ,SAAS,GAClB;KAGN;AAED;EAEF,KAAK,kBAAkB;GACrB,MAAM,WAAWD,4BAAe,UAAU;AAC1C,OAAI,SAAS,SAAS;AACpB,aAAS,6BAA6B;AACtC,gBAAY,SAAS;AACrB;;AAGF,WAAQ,KACN,mRACD;AAED;;EAEF,KAAK,MACH;EAEF,QAEE,SAAQ,KACN,qBAAqB,KAAK,UAAU,UAAU,CAAC,uBAChD;;CAIL,MAAM,iCAAiCE,8BAAW,eAAe;EAC/D,AAAS,KAAK;;;;;EAMd,OAAgB,WAAW,EAAE,UAAqC;AAGhE,YACE,wBACAC,yBAAK,UAAU,IAAI,qBAAqB,EAAE,SAAS,CACpD;AAED,OAAI,UACF,mCAAmB,IAAI,QAAQ,UAAU;YAChC,eAET,gBACG,WAAW;AACV,QAAI,UACF,mCAAmB,IAAI,QAAQ,UAAU;KAE3C,CACD,OAAO,QAAQ;AACd,aAAS,4CAA4C,IAAI;KACzD;;EAIR,AAAS,uBACP,KACA;AACA,UAAO;IACL,GAAG;IACH,KAAK;KACH,GAAG,IAAI;KACP,QAAQC,0BAAM,UAAU,WAAWC,wBAAQ;KAC5C;IACF;;EAGH,MAAe,YAAY,EAAE,QAAoC;AAC/D,UAAO,MAAM,CAAC,cAAc,WAAW,YAAY,CAAC;;;AAIxD,QAAO"}