{"version":3,"sources":["../src/filtering-span-processor.ts"],"names":[],"mappings":";;;AAoEO,IAAM,yBAAN,MAAsD;AAAA,EAC1C,gBAAA;AAAA,EACA,MAAA;AAAA,EAEjB,WAAA,CACE,kBACA,OAAA,EACA;AACA,IAAA,IAAA,CAAK,gBAAA,GAAmB,gBAAA;AACxB,IAAA,IAAA,CAAK,SAAS,OAAA,CAAQ,MAAA;AAAA,EACxB;AAAA;AAAA;AAAA;AAAA,EAKA,OAAA,CAAQ,MAAY,aAAA,EAA8B;AAChD,IAAA,IAAA,CAAK,gBAAA,CAAiB,OAAA,CAAQ,IAAA,EAAM,aAAa,CAAA;AAAA,EACnD;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,IAAA,EAA0B;AAC9B,IAAA,IAAI;AACF,MAAA,IAAI,IAAA,CAAK,MAAA,CAAO,IAAI,CAAA,EAAG;AACrB,QAAA,IAAA,CAAK,gBAAA,CAAiB,MAAM,IAAI,CAAA;AAAA,MAClC;AAAA,IAEF,CAAA,CAAA,MAAQ;AAEN,MAAA,IAAA,CAAK,gBAAA,CAAiB,MAAM,IAAI,CAAA;AAAA,IAClC;AAAA,EACF;AAAA,EAEA,UAAA,GAA4B;AAC1B,IAAA,OAAO,IAAA,CAAK,iBAAiB,UAAA,EAAW;AAAA,EAC1C;AAAA,EAEA,QAAA,GAA0B;AACxB,IAAA,OAAO,IAAA,CAAK,iBAAiB,QAAA,EAAS;AAAA,EACxC;AACF","file":"chunk-ZNMBW67B.cjs","sourcesContent":["/**\n * Filtering Span Processor\n *\n * Filters spans based on a user-provided predicate function.\n * Runs filtering on onEnd() to have access to complete span data.\n *\n * @example Filter out Next.js instrumentation spans\n * ```typescript\n * init({\n *   service: 'my-app',\n *   spanFilter: (span) => span.instrumentationScope.name !== 'next.js'\n * })\n * ```\n *\n * @example Filter out health check endpoints\n * ```typescript\n * init({\n *   service: 'my-app',\n *   spanFilter: (span) => !span.name.includes('/health')\n * })\n * ```\n */\n\nimport type {\n  SpanProcessor,\n  ReadableSpan,\n} from '@opentelemetry/sdk-trace-base';\nimport type { Context } from '@opentelemetry/api';\nimport type { Span } from '@opentelemetry/sdk-trace-base';\n\n/**\n * Predicate function for filtering spans\n *\n * @param span - The completed span (ReadableSpan) with all attributes and metadata\n * @returns true to keep the span, false to drop it\n *\n * Available span properties for filtering:\n * - `span.name` - Span name\n * - `span.attributes` - All span attributes\n * - `span.instrumentationScope` - `{ name, version }` of the instrumentation\n * - `span.status` - Span status code and message\n * - `span.duration` - Span duration as `[seconds, nanoseconds]`\n * - `span.kind` - SpanKind (INTERNAL, SERVER, CLIENT, etc.)\n */\nexport type SpanFilterPredicate = (span: ReadableSpan) => boolean;\n\nexport interface FilteringSpanProcessorOptions {\n  /**\n   * Predicate function to determine if a span should be kept\n   * Return true to keep the span, false to drop it\n   */\n  filter: SpanFilterPredicate;\n}\n\n/**\n * Span processor that filters spans based on a predicate function.\n *\n * The filter is applied on onEnd() when the span has complete data including:\n * - All attributes\n * - Status code and message\n * - Duration\n * - Events and links\n * - Instrumentation scope (useful for filtering by library)\n *\n * onStart() passes through unchanged to ensure child spans can still be created.\n *\n * Error handling: If the filter predicate throws, the span is forwarded (fail-open).\n */\nexport class FilteringSpanProcessor implements SpanProcessor {\n  private readonly wrappedProcessor: SpanProcessor;\n  private readonly filter: SpanFilterPredicate;\n\n  constructor(\n    wrappedProcessor: SpanProcessor,\n    options: FilteringSpanProcessorOptions,\n  ) {\n    this.wrappedProcessor = wrappedProcessor;\n    this.filter = options.filter;\n  }\n\n  /**\n   * Pass through onStart - we need spans to start so child spans work\n   */\n  onStart(span: Span, parentContext: Context): void {\n    this.wrappedProcessor.onStart(span, parentContext);\n  }\n\n  /**\n   * Apply filter predicate on span end\n   * If filter returns false, span is dropped (not forwarded)\n   */\n  onEnd(span: ReadableSpan): void {\n    try {\n      if (this.filter(span)) {\n        this.wrappedProcessor.onEnd(span);\n      }\n      // If filter returns false, span is silently dropped\n    } catch {\n      // If filter throws, forward the span (fail-open behavior)\n      this.wrappedProcessor.onEnd(span);\n    }\n  }\n\n  forceFlush(): Promise<void> {\n    return this.wrappedProcessor.forceFlush();\n  }\n\n  shutdown(): Promise<void> {\n    return this.wrappedProcessor.shutdown();\n  }\n}\n"]}