{"version":3,"sources":["../src/pretty-log-formatter.ts","../src/processors/canonical-log-line-processor.ts"],"names":["seconds","logs","SeverityNumber"],"mappings":"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","file":"chunk-6S5RUKU3.cjs","sourcesContent":["import type { CanonicalLogLineEvent } from './processors/canonical-log-line-processor';\n\nconst RESET = '\\x1b[0m';\nconst DIM = '\\x1b[2m';\nconst BOLD = '\\x1b[1m';\nconst RED = '\\x1b[31m';\nconst YELLOW = '\\x1b[33m';\nconst GREEN = '\\x1b[32m';\nconst CYAN = '\\x1b[36m';\nconst GRAY = '\\x1b[90m';\n\nconst LEVEL_COLORS: Record<string, string> = {\n  debug: GRAY,\n  info: GREEN,\n  warn: YELLOW,\n  error: RED,\n};\n\n/** Internal OTel attributes to skip in pretty output. */\nconst SKIP_PREFIXES = [\n  'telemetry.',\n  'otel.',\n  'process.',\n  'os.',\n  'host.',\n  'service.',\n  'autotel.',\n];\n\nconst SKIP_KEYS = new Set([\n  'operation',\n  'traceId',\n  'spanId',\n  'correlationId',\n  'duration_ms',\n  'duration',\n  'status_code',\n  'status_message',\n  'timestamp',\n  'http.request.method',\n  'url.path',\n  'http.route',\n  'http.response.status_code',\n]);\n\nfunction useColor(): boolean {\n  if (typeof process !== 'undefined') {\n    if (process.env.NO_COLOR) return false;\n    if (process.env.FORCE_COLOR) return true;\n    if (process.stdout?.isTTY) return true;\n  }\n  return false;\n}\n\nfunction c(color: string, text: string): string {\n  return useColor() ? `${color}${text}${RESET}` : text;\n}\n\n/**\n * Format milliseconds into a human-readable duration string.\n *\n * @example\n * formatDuration(45)     // \"45ms\"\n * formatDuration(1234)   // \"1.2s\"\n * formatDuration(65000)  // \"1m 5s\"\n */\nexport function formatDuration(ms: number): string {\n  if (ms < 1000) return `${Math.round(ms)}ms`;\n  if (ms < 60_000) {\n    const seconds = ms / 1000;\n    return seconds < 10 ? `${seconds.toFixed(1)}s` : `${Math.round(seconds)}s`;\n  }\n  const minutes = Math.floor(ms / 60_000);\n  const seconds = Math.round((ms % 60_000) / 1000);\n  return seconds > 0 ? `${minutes}m ${seconds}s` : `${minutes}m`;\n}\n\nfunction formatTime(iso: string): string {\n  try {\n    const d = new Date(iso);\n    return d.toLocaleTimeString('en-GB', { hour12: false });\n  } catch {\n    return iso.slice(11, 19);\n  }\n}\n\nfunction formatValue(value: unknown): string {\n  if (typeof value === 'string') return value;\n  if (typeof value === 'number' || typeof value === 'boolean')\n    return String(value);\n  if (value == null) return '';\n  try {\n    return JSON.stringify(value);\n  } catch {\n    return String(value);\n  }\n}\n\n/**\n * Group flat dot-notation attributes into a nested tree for pretty display.\n * e.g. { 'user.id': '1', 'user.plan': 'pro' } → { user: { id: '1', plan: 'pro' } }\n */\nfunction groupAttributes(\n  event: Record<string, unknown>,\n): Record<string, unknown> {\n  const tree: Record<string, unknown> = {};\n\n  for (const [key, value] of Object.entries(event)) {\n    if (SKIP_KEYS.has(key)) continue;\n    if (SKIP_PREFIXES.some((p) => key.startsWith(p))) continue;\n    if (value == null || value === '') continue;\n\n    const parts = key.split('.');\n    if (parts.length === 1) {\n      tree[key] = value;\n    } else {\n      let current = tree;\n      for (let i = 0; i < parts.length - 1; i++) {\n        const part = parts[i]!;\n        if (!(part in current) || typeof current[part] !== 'object') {\n          current[part] = {};\n        }\n        current = current[part] as Record<string, unknown>;\n      }\n      current[parts[parts.length - 1]!] = value;\n    }\n  }\n\n  return tree;\n}\n\nfunction renderTree(\n  obj: Record<string, unknown>,\n  indent: string,\n  isLast: boolean[],\n): string[] {\n  const lines: string[] = [];\n  const entries = Object.entries(obj);\n\n  entries.forEach(([key, value], idx) => {\n    const last = idx === entries.length - 1;\n    const connector = last ? '\\u2514\\u2500' : '\\u251c\\u2500';\n    const prefix = indent + connector + ' ';\n\n    if (value && typeof value === 'object' && !Array.isArray(value)) {\n      const nested = value as Record<string, unknown>;\n      const flatValues = Object.entries(nested).filter(\n        ([, v]) => typeof v !== 'object' || v === null,\n      );\n      const nestedObjs = Object.entries(nested).filter(\n        ([, v]) => typeof v === 'object' && v !== null && !Array.isArray(v),\n      );\n\n      if (nestedObjs.length === 0) {\n        const inline = flatValues\n          .map(([k, v]) => `${c(CYAN, k)}=${formatValue(v)}`)\n          .join(' ');\n        lines.push(`${prefix}${c(BOLD, key)}: ${inline}`);\n      } else {\n        lines.push(`${prefix}${c(BOLD, key)}:`);\n        const nextIndent = indent + (last ? '   ' : '\\u2502  ');\n        lines.push(...renderTree(nested, nextIndent, [...isLast, last]));\n      }\n    } else {\n      lines.push(`${prefix}${c(CYAN, key)}: ${c(DIM, formatValue(value))}`);\n    }\n  });\n\n  return lines;\n}\n\n/**\n * Format a canonical log line event as a pretty tree for development output.\n */\nexport function formatPrettyLogLine(ctx: CanonicalLogLineEvent): string {\n  const { event, level, message } = ctx;\n\n  const timestamp = formatTime(String(event.timestamp ?? ''));\n  const service = event['service.name'] || event.service || '';\n  const method = event['http.request.method'] || '';\n  const path = event['http.route'] || event['url.path'] || '';\n  const status = event['http.response.status_code'] || event.status_code || '';\n  const durationMs = Number(event.duration_ms ?? 0);\n  const duration = formatDuration(durationMs);\n\n  const levelColor = LEVEL_COLORS[level] ?? '';\n  const levelStr = c(levelColor, level.toUpperCase().padEnd(5));\n\n  const parts = [c(DIM, timestamp), levelStr];\n  if (service) parts.push(c(DIM, `[${service}]`));\n  if (method) parts.push(c(BOLD, String(method)));\n  if (path) parts.push(String(path));\n  if (status) {\n    const statusNum = Number(status);\n    const statusColor =\n      statusNum >= 500 ? RED : statusNum >= 400 ? YELLOW : GREEN;\n    parts.push(c(statusColor, String(status)));\n  }\n  parts.push(c(DIM, `in ${duration}`));\n\n  const header = parts.join(' ');\n\n  const tree = groupAttributes(event);\n  if (Object.keys(tree).length === 0) {\n    return header;\n  }\n\n  const treeLines = renderTree(tree, '  ', []);\n  return [header, ...treeLines].join('\\n');\n}\n","/**\n * Canonical Log Line Processor\n *\n * Automatically emits spans as canonical log lines (wide events) when they end.\n * Implements canonical log line\" pattern: one comprehensive\n * event per request with all context.\n *\n * When a span ends, this processor creates a log record with ALL span attributes,\n * making the span itself the canonical log line that can be queried like structured data.\n *\n * @example\n * ```typescript\n * import { init } from 'autotel';\n *\n * init({\n *   service: 'my-app',\n *   canonicalLogLines: {\n *     enabled: true,\n *     rootSpansOnly: true, // One canonical log line per request\n *   },\n * });\n * ```\n */\n\nimport type {\n  SpanProcessor,\n  ReadableSpan,\n} from '@opentelemetry/sdk-trace-base';\nimport type { Attributes, AttributeValue } from '@opentelemetry/api';\nimport { logs, SeverityNumber } from '@opentelemetry/api-logs';\nimport type { Logger } from '../logger';\nimport { formatPrettyLogLine, formatDuration } from '../pretty-log-formatter';\n\n/**\n * Function to redact sensitive attribute values\n */\nexport type AttributeRedactorFn = (\n  key: string,\n  value: AttributeValue,\n) => AttributeValue;\n\nexport interface CanonicalLogLineEvent {\n  span: ReadableSpan;\n  level: 'debug' | 'info' | 'warn' | 'error';\n  message: string;\n  event: Record<string, unknown>;\n}\n\nexport interface KeepCondition {\n  /** Keep events where HTTP status >= this value. */\n  status?: number;\n  /** Keep events where duration_ms >= this value. */\n  durationMs?: number;\n  /** Keep events matching this path pattern (simple prefix match). */\n  path?: string;\n}\n\nexport interface CanonicalLogLineOptions {\n  /** Logger to use for emitting canonical log lines (defaults to OTel Logs API) */\n  logger?: Logger;\n  /** Only emit canonical log lines for root spans (default: false) */\n  rootSpansOnly?: boolean;\n  /** Minimum log level for canonical log lines (default: 'info') */\n  minLevel?: 'debug' | 'info' | 'warn' | 'error';\n  /** Custom message format (default: uses span name) */\n  messageFormat?: (span: ReadableSpan) => string;\n  /** Whether to include resource attributes (default: true) */\n  includeResourceAttributes?: boolean;\n  /**\n   * Attribute redactor function to apply before logging.\n   * This ensures sensitive data is redacted in canonical log lines,\n   * matching the behavior of attributeRedactor in init().\n   */\n  attributeRedactor?: AttributeRedactorFn;\n  /** Predicate to decide whether to emit (runs after event is built). */\n  shouldEmit?: (ctx: CanonicalLogLineEvent) => boolean;\n  /**\n   * Declarative tail sampling conditions (OR logic). If any condition matches,\n   * the event is kept. Ignored when `shouldEmit` is provided.\n   *\n   * @example\n   * keep: [{ status: 500 }, { durationMs: 1000 }]\n   */\n  keep?: KeepCondition[];\n  /** Callback invoked after emit for custom fan-out. */\n  drain?: (ctx: CanonicalLogLineEvent) => void | Promise<void>;\n  /** Handler for drain failures. */\n  onDrainError?: (error: unknown, ctx: CanonicalLogLineEvent) => void;\n  /**\n   * Pretty-print canonical log lines to console in a tree format.\n   * Defaults to true when NODE_ENV is 'development'.\n   */\n  pretty?: boolean;\n}\n\n/**\n * Span processor that automatically emits spans as canonical log lines\n *\n * When a span ends, this processor creates a log record with ALL span attributes.\n * This implements the \"canonical log line\" pattern: one comprehensive event\n * per request with all context, queryable as structured data.\n *\n * **Key Benefits:**\n * - One log line per request with all context (wide event)\n * - High-cardinality, high-dimensionality data for powerful queries\n * - Automatic - no manual logging needed\n * - Works with any logger or OTel Logs API\n *\n * @example Basic usage\n * ```typescript\n * import { init } from 'autotel';\n *\n * init({\n *   service: 'checkout-api',\n *   canonicalLogLines: {\n *     enabled: true,\n *     rootSpansOnly: true, // One canonical log line per request\n *   },\n * });\n * ```\n *\n * @example With custom logger\n * ```typescript\n * import pino from 'pino';\n * import { init } from 'autotel';\n *\n * const logger = pino();\n * init({\n *   service: 'my-app',\n *   logger,\n *   canonicalLogLines: {\n *     enabled: true,\n *     logger, // Use Pino for canonical log lines\n *     rootSpansOnly: true,\n *   },\n * });\n * ```\n *\n * @example Custom message format\n * ```typescript\n * init({\n *   service: 'my-app',\n *   canonicalLogLines: {\n *     enabled: true,\n *     messageFormat: (span) => {\n *       const status = span.status.code === 2 ? 'ERROR' : 'SUCCESS';\n *       return `${span.name} [${status}]`;\n *     },\n *   },\n * });\n * ```\n */\nexport class CanonicalLogLineProcessor implements SpanProcessor {\n  private logger?: Logger;\n  private rootSpansOnly: boolean;\n  private minLevel: 'debug' | 'info' | 'warn' | 'error';\n  private messageFormat: (span: ReadableSpan) => string;\n  private includeResourceAttributes: boolean;\n  private attributeRedactor?: AttributeRedactorFn;\n  private shouldEmit?: (ctx: CanonicalLogLineEvent) => boolean;\n  private drain?: (ctx: CanonicalLogLineEvent) => void | Promise<void>;\n  private onDrainError?: (error: unknown, ctx: CanonicalLogLineEvent) => void;\n  private pretty: boolean;\n  private getOTelLogger: (() => ReturnType<typeof logs.getLogger>) | null =\n    null;\n\n  constructor(options: CanonicalLogLineOptions = {}) {\n    this.logger = options.logger;\n    this.rootSpansOnly = options.rootSpansOnly ?? false;\n    this.minLevel = options.minLevel ?? 'info';\n    this.messageFormat =\n      options.messageFormat ?? ((span) => `[${span.name}] Request completed`);\n    this.includeResourceAttributes = options.includeResourceAttributes ?? true;\n    this.attributeRedactor = options.attributeRedactor;\n    this.shouldEmit =\n      options.shouldEmit ?? this.buildKeepPredicate(options.keep);\n    this.drain = options.drain;\n    this.onDrainError = options.onDrainError;\n    this.pretty =\n      options.pretty ??\n      (typeof process !== 'undefined' &&\n        process.env.NODE_ENV === 'development');\n\n    if (!this.logger) {\n      this.getOTelLogger = () => logs.getLogger('autotel.canonical-log-line');\n    }\n  }\n\n  private buildKeepPredicate(\n    keep?: KeepCondition[],\n  ): ((ctx: CanonicalLogLineEvent) => boolean) | undefined {\n    if (!keep || keep.length === 0) return undefined;\n\n    return (ctx: CanonicalLogLineEvent) => {\n      return keep.some((condition) => {\n        if (condition.status !== undefined) {\n          const httpStatus = Number(\n            ctx.event['http.response.status_code'] ?? 0,\n          );\n          if (httpStatus >= condition.status) return true;\n        }\n        if (\n          condition.durationMs !== undefined &&\n          Number(ctx.event.duration_ms ?? 0) >= condition.durationMs\n        ) {\n          return true;\n        }\n        if (condition.path !== undefined) {\n          const route = String(\n            ctx.event['http.route'] ?? ctx.event['url.path'] ?? '',\n          );\n          if (route.startsWith(condition.path)) return true;\n        }\n        return false;\n      });\n    };\n  }\n\n  onStart(): void {\n    // No-op\n  }\n\n  onEnd(span: ReadableSpan): void {\n    if (\n      this.rootSpansOnly &&\n      span.parentSpanContext?.spanId &&\n      !span.parentSpanContext.isRemote\n    ) {\n      return;\n    }\n\n    const level = this.getLogLevel(span);\n    if (!this.shouldLog(level)) {\n      return;\n    }\n\n    const canonicalLogLine = this.buildCanonicalLogLine(span);\n    const message = this.messageFormat(span);\n    const eventContext: CanonicalLogLineEvent = {\n      span,\n      level,\n      message,\n      event: canonicalLogLine,\n    };\n\n    if (this.shouldEmit && !this.shouldEmit(eventContext)) return;\n\n    if (this.pretty) {\n      console.log(formatPrettyLogLine(eventContext));\n    }\n\n    if (this.logger) {\n      this.emitViaLogger(level, message, canonicalLogLine);\n    } else if (this.getOTelLogger) {\n      const otelLogger = this.getOTelLogger();\n      this.emitViaOTel(level, message, canonicalLogLine, otelLogger);\n    }\n\n    if (this.drain) {\n      Promise.resolve(this.drain(eventContext)).catch((error) => {\n        if (this.onDrainError) {\n          this.onDrainError(error, eventContext);\n          return;\n        }\n        this.reportInternalWarning('canonicalLogLines.drain failed', error);\n      });\n    }\n  }\n\n  private buildCanonicalLogLine(span: ReadableSpan): Record<string, unknown> {\n    const durationMs = span.duration[0] * 1000 + span.duration[1] / 1_000_000;\n    const timestamp = new Date(\n      span.startTime[0] * 1000 + span.startTime[1] / 1_000_000,\n    ).toISOString();\n\n    // Span attributes first so core metadata fields below take precedence\n    const canonicalLogLine: Record<string, unknown> = {};\n    const attributes = this.redactAttributes(span.attributes);\n    Object.assign(canonicalLogLine, attributes);\n\n    if (this.includeResourceAttributes) {\n      const resourceAttrs = this.redactAttributes(\n        span.resource.attributes as Attributes,\n      );\n      Object.assign(canonicalLogLine, resourceAttrs);\n    }\n\n    canonicalLogLine.operation = span.name;\n    canonicalLogLine.traceId = span.spanContext().traceId;\n    canonicalLogLine.spanId = span.spanContext().spanId;\n    canonicalLogLine.correlationId = span.spanContext().traceId.slice(0, 16);\n    canonicalLogLine.duration_ms = Math.round(durationMs * 100) / 100;\n    canonicalLogLine.duration = formatDuration(durationMs);\n    canonicalLogLine.status_code = span.status.code;\n    canonicalLogLine.status_message = span.status.message || undefined;\n    canonicalLogLine.timestamp = timestamp;\n\n    return canonicalLogLine;\n  }\n\n  private redactAttributes(attributes: Attributes): Record<string, unknown> {\n    if (!this.attributeRedactor) {\n      return { ...attributes };\n    }\n\n    const redacted: Record<string, unknown> = {};\n    for (const [key, value] of Object.entries(attributes)) {\n      if (value !== undefined) {\n        redacted[key] = this.attributeRedactor(key, value);\n      }\n    }\n    return redacted;\n  }\n\n  private emitViaLogger(\n    level: 'debug' | 'info' | 'warn' | 'error',\n    message: string,\n    canonicalLogLine: Record<string, unknown>,\n  ): void {\n    this.logger![level](canonicalLogLine, message);\n  }\n\n  private emitViaOTel(\n    level: 'debug' | 'info' | 'warn' | 'error',\n    message: string,\n    canonicalLogLine: Record<string, unknown>,\n    otelLogger: ReturnType<typeof logs.getLogger>,\n  ): void {\n    const otelAttributes: Record<string, string | number | boolean> = {};\n    for (const [key, value] of Object.entries(canonicalLogLine)) {\n      if (\n        typeof value === 'string' ||\n        typeof value === 'number' ||\n        typeof value === 'boolean'\n      ) {\n        otelAttributes[key] = value;\n      } else if (value !== null && value !== undefined) {\n        otelAttributes[key] = String(value);\n      }\n    }\n    otelLogger.emit({\n      severityNumber: this.getSeverityNumber(level),\n      severityText: level.toUpperCase(),\n      body: message,\n      attributes: otelAttributes,\n    });\n  }\n\n  private getLogLevel(span: ReadableSpan): 'debug' | 'info' | 'warn' | 'error' {\n    const explicitLevel = span.attributes['autotel.log.level'];\n    if (\n      explicitLevel === 'debug' ||\n      explicitLevel === 'info' ||\n      explicitLevel === 'warn' ||\n      explicitLevel === 'error'\n    ) {\n      return explicitLevel;\n    }\n\n    if (span.status.code === 2) return 'error';\n    return 'info';\n  }\n\n  private shouldLog(level: string): boolean {\n    const levels = ['debug', 'info', 'warn', 'error'];\n    return levels.indexOf(level) >= levels.indexOf(this.minLevel);\n  }\n\n  private getSeverityNumber(level: string): SeverityNumber {\n    const mapping: Record<string, SeverityNumber> = {\n      debug: SeverityNumber.DEBUG,\n      info: SeverityNumber.INFO,\n      warn: SeverityNumber.WARN,\n      error: SeverityNumber.ERROR,\n    };\n    return mapping[level] ?? SeverityNumber.INFO;\n  }\n\n  private reportInternalWarning(message: string, error: unknown): void {\n    const err =\n      error instanceof Error ? error.message : String(error ?? 'unknown error');\n    if (this.logger) {\n      this.logger.warn({ error: err }, `[autotel] ${message}`);\n      return;\n    }\n    console.warn(`[autotel] ${message}: ${err}`);\n  }\n\n  async forceFlush(): Promise<void> {\n    // No-op\n  }\n\n  async shutdown(): Promise<void> {\n    // No-op\n  }\n}\n"]}