{"version":3,"file":"otelLogger-DcLZFC1y.mjs","names":["apiContext","OTLPLogExporterGRPC","OTLPLogExporterHTTP"],"sources":["../src/constants/index.ts","../src/utils/env.ts","../src/exporters/urls.ts","../src/logger/otelLogger.ts"],"sourcesContent":["export const NODE_SDK_VERSION = '0.0.18';\nexport const NODE_SDK_NAME = '@safaricom-mxl/node-sdk';\nexport const NODE_SDK_SERVICE_NAME = 'mxl-node-sdk';\n\nexport const DEFAULT_SERVICE_NAME = 'app';\nexport const DEFAULT_TRACE_SAMPLER = 'parentbased_always_on';\nexport const DEFAULT_TRACE_SAMPLER_ARG = '1';\n\nexport const DEFAULT_OTLP_PROTOCOL = 'http/protobuf';\nexport const DEFAULT_TRACE_EXPORTER_PATH = '/v1/traces';\nexport const DEFAULT_LOG_EXPORTER_PATH = '/v1/logs';\nexport const DEFAULT_METRIC_EXPORTER_PATH = '/v1/metrics';\n\nexport const DEFAULT_TRACE_EXPORTER_URL = 'http://localhost:4318/v1/traces';\nexport const DEFAULT_LOG_EXPORTER_URL = 'http://localhost:4318/v1/logs';\nexport const DEFAULT_METRIC_EXPORTER_URL = 'http://localhost:4318/v1/metrics';\n\nexport const DEFAULT_TRACE_TIMEOUT_MS = 60000;\nexport const DEFAULT_LOG_TIMEOUT_MS = 30000;\nexport const DEFAULT_LOG_QUEUE_SIZE = 2048;\nexport const DEFAULT_LOG_EXPORT_BATCH_SIZE = 512;\nexport const DEFAULT_LOG_SCHEDULE_DELAY_MS = 2000;\nexport const DEFAULT_METRIC_EXPORT_INTERVAL_MS = 60000;\nexport const DEFAULT_METRIC_EXPORT_TIMEOUT_MS = 30000;\n\nexport const DEFAULT_CONSOLE_CAPTURE = true;\nexport const DEFAULT_ADVANCED_NETWORK_CAPTURE = false;\nexport const DEFAULT_BETA_MODE = false;\nexport const DEFAULT_STOP_ON_TERMINATION_SIGNALS = true;\nexport const DEFAULT_SENTRY_INTEGRATION_ENABLED = false;\nexport const DEFAULT_EXCEPTION_CAPTURE_ENABLED = true;\nexport const DEFAULT_STARTUP_LOGS_ENABLED = true;\n\nexport const DEFAULT_CAPTURE_HEADERS_CLIENT_REQUEST = '';\nexport const DEFAULT_CAPTURE_HEADERS_CLIENT_RESPONSE = '';\nexport const DEFAULT_CAPTURE_HEADERS_SERVER_REQUEST = '';\nexport const DEFAULT_CAPTURE_HEADERS_SERVER_RESPONSE = '';\nexport const DEFAULT_CAPTURE_BODY_KEYWORDS_FILTER = '';\n","export function getStringFromEnv(key: string): string | undefined {\n  const raw = process.env[key];\n  if (!raw || raw.trim() === '') {\n    return undefined;\n  }\n  return raw;\n}\n\nexport function getStringListFromEnv(key: string): string[] | undefined {\n  return getStringFromEnv(key)\n    ?.split(',')\n    .map((item) => item.trim())\n    .filter(Boolean);\n}\n\nexport function getBooleanFromEnv(key: string): boolean | undefined {\n  const value = getStringFromEnv(key)?.toLowerCase();\n  switch (value) {\n    case '1':\n    case 'true':\n    case 'yes':\n      return true;\n    case '0':\n    case 'false':\n    case 'no':\n      return false;\n    default:\n      return undefined;\n  }\n}\n\nexport function getNumberFromEnv(key: string): number | undefined {\n  const value = getStringFromEnv(key);\n  if (!value) {\n    return undefined;\n  }\n  const parsed = Number(value);\n  return Number.isFinite(parsed) ? parsed : undefined;\n}\n\nexport function parseOtlpHeaders(headersString?: string): Record<string, string> {\n  if (!headersString) {\n    return {};\n  }\n  const result: Record<string, string> = {};\n  for (const pair of headersString.split(',')) {\n    const trimmedPair = pair.trim();\n    if (!trimmedPair) {\n      continue;\n    }\n    const equalIndex = trimmedPair.indexOf('=');\n    if (equalIndex === -1) {\n      continue;\n    }\n    const key = trimmedPair.slice(0, equalIndex).trim();\n    const value = trimmedPair.slice(equalIndex + 1).trim();\n    if (key) {\n      result[key] = value;\n    }\n  }\n  return result;\n}\n\nexport function parseHeaderAttributeMap(\n  mapString?: string,\n): Record<string, string> {\n  if (!mapString) {\n    return {};\n  }\n  const result: Record<string, string> = {};\n  for (const pair of mapString.split(',')) {\n    const trimmed = pair.trim();\n    if (!trimmed) {\n      continue;\n    }\n    const separator = trimmed.indexOf('=');\n    if (separator === -1) {\n      continue;\n    }\n    const header = trimmed.slice(0, separator).trim().toLowerCase();\n    const attribute = trimmed.slice(separator + 1).trim();\n    if (header && attribute) {\n      result[header] = attribute;\n    }\n  }\n  return result;\n}\n","import {\n  DEFAULT_LOG_EXPORTER_PATH,\n  DEFAULT_LOG_EXPORTER_URL,\n  DEFAULT_METRIC_EXPORTER_PATH,\n  DEFAULT_METRIC_EXPORTER_URL,\n  DEFAULT_TRACE_EXPORTER_PATH,\n  DEFAULT_TRACE_EXPORTER_URL,\n} from '../constants/index.ts';\n\ntype ExporterKind = 'trace' | 'log' | 'metric';\n\nexport function resolveOtlpExporterUrl({\n  kind,\n  endpoint,\n  explicitUrl,\n}: {\n  kind: ExporterKind;\n  endpoint?: string;\n  explicitUrl?: string;\n}) {\n  if (explicitUrl) {\n    return explicitUrl;\n  }\n\n  if (endpoint) {\n    const normalized = endpoint.replace(/\\/$/, '');\n    if (kind === 'trace') {\n      return `${normalized}${DEFAULT_TRACE_EXPORTER_PATH}`;\n    }\n    if (kind === 'log') {\n      return `${normalized}${DEFAULT_LOG_EXPORTER_PATH}`;\n    }\n    return `${normalized}${DEFAULT_METRIC_EXPORTER_PATH}`;\n  }\n\n  if (kind === 'trace') {\n    return DEFAULT_TRACE_EXPORTER_URL;\n  }\n  if (kind === 'log') {\n    return DEFAULT_LOG_EXPORTER_URL;\n  }\n  return DEFAULT_METRIC_EXPORTER_URL;\n}\n","import { Attributes, context as apiContext, trace } from '@opentelemetry/api';\nimport { Logger as OTelLoggerAPI, LogRecord, logs } from '@opentelemetry/api-logs';\nimport { OTLPLogExporter as OTLPLogExporterGRPC } from '@opentelemetry/exporter-logs-otlp-grpc';\nimport { OTLPLogExporter as OTLPLogExporterHTTP } from '@opentelemetry/exporter-logs-otlp-http';\nimport { resourceFromAttributes } from '@opentelemetry/resources';\nimport {\n  LoggerProvider,\n  BatchLogRecordProcessor,\n  type LogRecordProcessor,\n} from '@opentelemetry/sdk-logs';\nimport { ATTR_SERVICE_NAME } from '@opentelemetry/semantic-conventions';\nimport {\n  DEFAULT_LOG_EXPORT_BATCH_SIZE,\n  DEFAULT_LOG_QUEUE_SIZE,\n  DEFAULT_LOG_SCHEDULE_DELAY_MS,\n  DEFAULT_LOG_TIMEOUT_MS,\n  NODE_SDK_VERSION,\n} from '../constants/index.ts';\nimport type { ResolvedSDKConfig } from '../sdk/types.ts';\nimport { parseOtlpHeaders } from '../utils/env.ts';\nimport { resolveOtlpExporterUrl } from '../exporters/urls.ts';\n\nfunction loadContext(logRecord: LogRecord): LogRecord {\n  let recordContext = apiContext.active();\n  let attributes = logRecord.attributes;\n\n  if (attributes) {\n    const { trace_id, span_id, trace_flags, ...other } = attributes as Attributes & {\n      trace_id?: string;\n      span_id?: string;\n      trace_flags?: number;\n    };\n\n    if (trace_id && span_id) {\n      recordContext = trace.setSpanContext(recordContext, {\n        traceId: trace_id,\n        spanId: span_id,\n        traceFlags: trace_flags ?? 1,\n        isRemote: true,\n      });\n    }\n    attributes = other;\n  }\n\n  return { ...logRecord, attributes, context: recordContext };\n}\n\nexport type LoggerOptions = {\n  config: ResolvedSDKConfig;\n  resourceAttributes?: Attributes;\n};\n\nexport type OTelLogEmitOptions = {\n  scope?: string;\n  severityNumber?: number;\n  severityText?: string;\n};\n\nexport class OTelLogger {\n  private readonly url: string;\n  private readonly logger: OTelLoggerAPI;\n  private readonly processor: BatchLogRecordProcessor | LogRecordProcessor;\n  private readonly provider: LoggerProvider;\n\n  constructor({ config, resourceAttributes }: LoggerOptions) {\n    this.url = resolveOtlpExporterUrl({\n      kind: 'log',\n      endpoint: config.otlpEndpoint,\n    });\n\n    const exporterHeaders = parseOtlpHeaders(config.otlpHeaders);\n    if (config.apiKey) {\n      exporterHeaders.Authorization = config.apiKey;\n    }\n\n    const exporter =\n      config.otlpProtocol === 'grpc'\n        ? new OTLPLogExporterGRPC({\n            url: this.url,\n            headers: exporterHeaders,\n          } as ConstructorParameters<typeof OTLPLogExporterGRPC>[0])\n        : new OTLPLogExporterHTTP({ url: this.url, headers: exporterHeaders });\n\n    const noopLogRecordProcessor: LogRecordProcessor = {\n      forceFlush() {\n        return Promise.resolve();\n      },\n      onEmit() {},\n      shutdown() {\n        return Promise.resolve();\n      },\n    };\n\n    this.processor = config.disableLogs\n      ? noopLogRecordProcessor\n      : new BatchLogRecordProcessor({\n          exporter,\n          maxExportBatchSize: DEFAULT_LOG_EXPORT_BATCH_SIZE,\n          maxQueueSize: DEFAULT_LOG_QUEUE_SIZE,\n          scheduledDelayMillis: DEFAULT_LOG_SCHEDULE_DELAY_MS,\n          exportTimeoutMillis: DEFAULT_LOG_TIMEOUT_MS,\n        });\n\n    this.provider = new LoggerProvider({\n      resource: resourceFromAttributes({\n          [ATTR_SERVICE_NAME]: config.serviceName,\n          'telemetry.distro.name': 'mxl-node-sdk',\n          'telemetry.distro.version': NODE_SDK_VERSION,\n          ...resourceAttributes,\n      }),\n      processors: [this.processor],\n    });\n\n    this.logger = this.provider.getLogger('node-sdk');\n  }\n\n  setGlobalProvider() {\n    logs.setGlobalLoggerProvider(this.provider);\n  }\n\n  getProcessor() {\n    return this.processor;\n  }\n\n  getProvider() {\n    return this.provider;\n  }\n\n  getLoggerByName(name: string): OTelLoggerAPI {\n    return this.provider.getLogger(name);\n  }\n\n  getExporterUrl() {\n    return this.url;\n  }\n\n  shutdown() {\n    return this.processor.shutdown();\n  }\n\n  forceFlush() {\n    return this.processor.forceFlush();\n  }\n\n  postMessage(\n    level: string,\n    message: string,\n    attributes: Attributes = {},\n    opts?: OTelLogEmitOptions,\n  ) {\n    const targetLogger = opts?.scope ? this.getLoggerByName(opts.scope) : this.logger;\n    targetLogger.emit(\n      loadContext({\n        severityNumber: opts?.severityNumber ?? 0,\n        severityText: opts?.severityText ?? level,\n        body: message,\n        attributes,\n        timestamp: new Date(),\n      }),\n    );\n  }\n}\n"],"mappings":"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"}