{"version":3,"file":"pino.mjs","names":[],"sources":["../../src/logger/pino.ts"],"sourcesContent":["import {\n  Attributes,\n  context,\n  isSpanContextValid,\n  trace,\n} from '@opentelemetry/api';\nimport isString from 'lodash.isstring';\nimport build from 'pino-abstract-transport';\nimport { jsonToString } from '../utils/json.ts';\nimport { OTelLogger } from './otelLogger.ts';\nimport type { LoggerOptions } from './types.ts';\n\ntype PinoLogLine = {\n  level: number;\n  msg?: string;\n  message?: unknown;\n} & Attributes;\n\nconst PINO_LEVELS: Record<number, string> = {\n  10: 'trace',\n  20: 'debug',\n  30: 'info',\n  40: 'warn',\n  50: 'error',\n  60: 'fatal',\n};\n\nexport function parsePinoLog(log: PinoLogLine) {\n  const { level, msg, message, ...meta } = log;\n  const targetMessage = msg ?? message;\n  const body =\n    targetMessage == null\n      ? jsonToString(log)\n      : isString(targetMessage)\n      ? targetMessage\n      : jsonToString(targetMessage);\n\n  return {\n    level: PINO_LEVELS[level] ?? 'info',\n    message: body,\n    meta,\n  };\n}\n\nconst MIXIN_KEYS = {\n  traceId: 'trace_id',\n  spanId: 'span_id',\n  traceFlags: 'trace_flags',\n};\n\nexport function getPinoMixinFunction() {\n  const span = trace.getSpan(context.active());\n  if (!span) {\n    return {};\n  }\n  const spanContext = span.spanContext();\n  if (!isSpanContextValid(spanContext)) {\n    return {};\n  }\n  return {\n    [MIXIN_KEYS.traceId]: spanContext.traceId,\n    [MIXIN_KEYS.spanId]: spanContext.spanId,\n    [MIXIN_KEYS.traceFlags]: Number(spanContext.traceFlags),\n  };\n}\n\nexport type HyperDXPinoTransportOptions = LoggerOptions & {\n  getCustomMeta?: () => Attributes;\n};\n\nexport default async function createPinoTransport(\n  options: HyperDXPinoTransportOptions,\n) {\n  const logger = new OTelLogger({\n    config: options.config,\n    resourceAttributes: options.resourceAttributes,\n  });\n\n  return build(\n    async (source) => {\n      for await (const payload of source) {\n        const parsed = parsePinoLog(payload as PinoLogLine);\n        logger.postMessage(parsed.level, parsed.message, {\n          ...(options.getCustomMeta?.() ?? {}),\n          ...parsed.meta,\n        });\n      }\n    },\n    {\n      async close() {\n        await logger.shutdown();\n      },\n    },\n  );\n}\n"],"mappings":";;;;;;AAkBA,MAAM,cAAsC;CAC1C,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;AACN;AAEA,SAAgB,aAAa,KAAkB;CAC7C,MAAM,EAAE,OAAO,KAAK,SAAS,GAAG,SAAS;CACzC,MAAM,gBAAgB,OAAO;CAC7B,MAAM,OACJ,iBAAiB,OACb,aAAa,GAAG,IAChB,SAAS,aAAa,IACtB,gBACA,aAAa,aAAa;CAEhC,OAAO;EACL,OAAO,YAAY,UAAU;EAC7B,SAAS;EACT;CACF;AACF;AAEA,MAAM,aAAa;CACjB,SAAS;CACT,QAAQ;CACR,YAAY;AACd;AAEA,SAAgB,uBAAuB;CACrC,MAAM,OAAO,MAAM,QAAQ,QAAQ,OAAO,CAAC;CAC3C,IAAI,CAAC,MACH,OAAO,CAAC;CAEV,MAAM,cAAc,KAAK,YAAY;CACrC,IAAI,CAAC,mBAAmB,WAAW,GACjC,OAAO,CAAC;CAEV,OAAO;GACJ,WAAW,UAAU,YAAY;GACjC,WAAW,SAAS,YAAY;GAChC,WAAW,aAAa,OAAO,YAAY,UAAU;CACxD;AACF;AAMA,eAA8B,oBAC5B,SACA;CACA,MAAM,SAAS,IAAI,WAAW;EAC5B,QAAQ,QAAQ;EAChB,oBAAoB,QAAQ;CAC9B,CAAC;CAED,OAAO,MACL,OAAO,WAAW;EAChB,WAAW,MAAM,WAAW,QAAQ;GAClC,MAAM,SAAS,aAAa,OAAsB;GAClD,OAAO,YAAY,OAAO,OAAO,OAAO,SAAS;IAC/C,GAAI,QAAQ,gBAAgB,KAAK,CAAC;IAClC,GAAG,OAAO;GACZ,CAAC;EACH;CACF,GACA,EACE,MAAM,QAAQ;EACZ,MAAM,OAAO,SAAS;CACxB,EACF,CACF;AACF"}