tracebeam-sdk 0.1.1 → 0.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/config.ts","../src/transport.ts","../src/queue.ts","../src/client.ts"],"sourcesContent":["/**\n * TraceBeam SDK for Node.js\n * \n * A lightweight, non-blocking telemetry SDK for sending errors\n * and events to the TraceBeam API Observability Platform.\n * \n * @example\n * ```typescript\n * import { TraceBeamSDK } from 'tracebeam-sdk';\n * \n * // Initialize from environment variables\n * const sdk = TraceBeamSDK.fromEnv();\n * \n * // Capture an exception\n * try {\n * await doSomething();\n * } catch (error) {\n * sdk.captureException(error);\n * }\n * \n * // Capture a message\n * sdk.captureMessage('User signed up', { level: 'info' });\n * \n * // Graceful shutdown\n * await sdk.close();\n * ```\n * \n * @packageDocumentation\n */\n\n// Main client\nexport { TraceBeamSDK } from './client.js';\n\n// Types\nexport type {\n TraceBeamConfig,\n Event,\n EventLevel,\n CaptureOptions,\n Tags,\n Extra,\n EventBatch,\n TransportResponse,\n TransportSuccessResponse,\n TransportErrorResponse,\n} from './types.js';\n\n// Configuration\nexport { ConfigError, loadConfigFromEnv, DEFAULT_CONFIG } from './config.js';\n","import type { TraceBeamConfig } from './types.js';\n\n/**\n * Default configuration values\n */\nexport const DEFAULT_CONFIG = {\n environment: 'development',\n endpoint: 'https://ingest.tracebeam.io',\n batchSize: 100,\n flushInterval: 5000,\n timeout: 10000,\n maxQueueSize: 10000,\n sampleRate: 1.0,\n debug: false,\n} as const;\n\n/**\n * Environment variable names\n */\nconst ENV_VARS = {\n API_KEY: 'TRACEBEAM_API_KEY',\n PROJECT_ID: 'TRACEBEAM_PROJECT_ID',\n ENVIRONMENT: 'TRACEBEAM_ENVIRONMENT',\n ENDPOINT: 'TRACEBEAM_ENDPOINT',\n BATCH_SIZE: 'TRACEBEAM_BATCH_SIZE',\n FLUSH_INTERVAL: 'TRACEBEAM_FLUSH_INTERVAL',\n TIMEOUT: 'TRACEBEAM_HTTP_TIMEOUT',\n MAX_QUEUE_SIZE: 'TRACEBEAM_MAX_QUEUE_SIZE',\n SAMPLE_RATE: 'TRACEBEAM_SAMPLE_RATE',\n DEBUG: 'TRACEBEAM_DEBUG',\n} as const;\n\n/**\n * Configuration error thrown when required values are missing\n */\nexport class ConfigError extends Error {\n constructor(message: string) {\n super(message);\n this.name = 'ConfigError';\n }\n}\n\n/**\n * Load configuration from environment variables\n */\nexport function loadConfigFromEnv(): TraceBeamConfig {\n const apiKey = process.env[ENV_VARS.API_KEY];\n const projectId = process.env[ENV_VARS.PROJECT_ID];\n\n if (!apiKey) {\n throw new ConfigError(`Missing required environment variable: ${ENV_VARS.API_KEY}`);\n }\n\n if (!projectId) {\n throw new ConfigError(`Missing required environment variable: ${ENV_VARS.PROJECT_ID}`);\n }\n\n return {\n apiKey,\n projectId,\n environment: process.env[ENV_VARS.ENVIRONMENT] || DEFAULT_CONFIG.environment,\n endpoint: process.env[ENV_VARS.ENDPOINT] || DEFAULT_CONFIG.endpoint,\n batchSize: parseIntEnv(ENV_VARS.BATCH_SIZE, DEFAULT_CONFIG.batchSize),\n flushInterval: parseIntEnv(ENV_VARS.FLUSH_INTERVAL, DEFAULT_CONFIG.flushInterval),\n timeout: parseIntEnv(ENV_VARS.TIMEOUT, DEFAULT_CONFIG.timeout),\n maxQueueSize: parseIntEnv(ENV_VARS.MAX_QUEUE_SIZE, DEFAULT_CONFIG.maxQueueSize),\n sampleRate: parseFloatEnv(ENV_VARS.SAMPLE_RATE, DEFAULT_CONFIG.sampleRate),\n debug: parseBoolEnv(ENV_VARS.DEBUG, DEFAULT_CONFIG.debug),\n };\n}\n\n/**\n * Merge user config with defaults\n */\nexport function mergeConfig(config: TraceBeamConfig): Required<TraceBeamConfig> {\n return {\n apiKey: config.apiKey,\n projectId: config.projectId,\n environment: config.environment ?? DEFAULT_CONFIG.environment,\n endpoint: config.endpoint ?? DEFAULT_CONFIG.endpoint,\n batchSize: config.batchSize ?? DEFAULT_CONFIG.batchSize,\n flushInterval: config.flushInterval ?? DEFAULT_CONFIG.flushInterval,\n timeout: config.timeout ?? DEFAULT_CONFIG.timeout,\n maxQueueSize: config.maxQueueSize ?? DEFAULT_CONFIG.maxQueueSize,\n sampleRate: config.sampleRate ?? DEFAULT_CONFIG.sampleRate,\n debug: config.debug ?? DEFAULT_CONFIG.debug,\n };\n}\n\n/**\n * Validate configuration\n */\nexport function validateConfig(config: TraceBeamConfig): void {\n if (!config.apiKey || config.apiKey.trim() === '') {\n throw new ConfigError('apiKey is required');\n }\n\n if (!config.projectId || config.projectId.trim() === '') {\n throw new ConfigError('projectId is required');\n }\n\n if (config.environment !== undefined && config.environment.length > 64) {\n throw new ConfigError('environment must be at most 64 characters');\n }\n\n if (config.batchSize !== undefined && (config.batchSize < 1 || config.batchSize > 10000)) {\n throw new ConfigError('batchSize must be between 1 and 10000');\n }\n\n if (config.sampleRate !== undefined && (config.sampleRate < 0 || config.sampleRate > 1)) {\n throw new ConfigError('sampleRate must be between 0 and 1');\n }\n}\n\n// Helper functions for parsing environment variables\n\nfunction parseIntEnv(name: string, defaultValue: number): number {\n const value = process.env[name];\n if (!value) return defaultValue;\n const parsed = parseInt(value, 10);\n return isNaN(parsed) ? defaultValue : parsed;\n}\n\nfunction parseFloatEnv(name: string, defaultValue: number): number {\n const value = process.env[name];\n if (!value) return defaultValue;\n const parsed = parseFloat(value);\n return isNaN(parsed) ? defaultValue : parsed;\n}\n\nfunction parseBoolEnv(name: string, defaultValue: boolean): boolean {\n const value = process.env[name];\n if (!value) return defaultValue;\n return value.toLowerCase() === 'true' || value === '1';\n}\n","import type { Event, EventBatch, TransportResponse, TransportErrorResponse } from './types.js';\n\n/**\n * Transport state\n */\nexport type TransportState = 'active' | 'disabled' | 'quota_exceeded';\n\n/**\n * Logger interface for transport\n */\nexport interface TransportLogger {\n debug: (message: string, ...args: unknown[]) => void;\n warn: (message: string, ...args: unknown[]) => void;\n error: (message: string, ...args: unknown[]) => void;\n}\n\n/**\n * Transport options\n */\nexport interface TransportOptions {\n endpoint: string;\n apiKey: string;\n timeout: number;\n debug: boolean;\n logger?: TransportLogger;\n}\n\n/**\n * Default console logger\n */\nconst defaultLogger: TransportLogger = {\n debug: (msg, ...args) => console.debug(`[tracebeam] ${msg}`, ...args),\n warn: (msg, ...args) => console.warn(`[tracebeam] ${msg}`, ...args),\n error: (msg, ...args) => console.error(`[tracebeam] ${msg}`, ...args),\n};\n\n/**\n * HTTP transport for sending events to the Ingest API\n */\nexport class Transport {\n private readonly endpoint: string;\n private readonly apiKey: string;\n private readonly timeout: number;\n private readonly logger: TransportLogger;\n private readonly debug: boolean;\n\n private state: TransportState = 'active';\n\n constructor(options: TransportOptions) {\n this.endpoint = options.endpoint.replace(/\\/$/, ''); // Remove trailing slash\n this.apiKey = options.apiKey;\n this.timeout = options.timeout;\n this.debug = options.debug;\n this.logger = options.logger ?? defaultLogger;\n }\n\n /**\n * Get current transport state\n */\n getState(): TransportState {\n return this.state;\n }\n\n /**\n * Check if transport is active\n */\n isActive(): boolean {\n return this.state === 'active';\n }\n\n /**\n * Send a batch of events to the Ingest API\n * Implements retry with exponential backoff\n */\n async send(events: Event[]): Promise<TransportResponse> {\n if (!this.isActive()) {\n return {\n success: false,\n error: 'Transport disabled',\n message: `Transport is ${this.state}`,\n code: 0,\n };\n }\n\n const batch: EventBatch = { events };\n const url = `${this.endpoint}/api/v1/events`;\n\n let lastError: TransportErrorResponse | null = null;\n const maxRetries = 3;\n const baseDelay = 1000;\n\n for (let attempt = 0; attempt <= maxRetries; attempt++) {\n try {\n const response = await this.executeRequest(url, batch);\n\n if (response.success) {\n if (this.debug) {\n this.logger.debug(`Sent ${events.length} events successfully`);\n }\n return response;\n }\n\n // Handle specific error codes\n const errorResponse = response as TransportErrorResponse;\n lastError = errorResponse;\n\n switch (errorResponse.code) {\n case 401:\n // Invalid API key - disable SDK\n this.state = 'disabled';\n this.logger.error('Invalid API key. SDK disabled.');\n return errorResponse;\n\n case 402:\n // Quota exceeded - stop sending\n this.state = 'quota_exceeded';\n this.logger.warn('Event quota exceeded. SDK paused.');\n return errorResponse;\n\n case 429:\n // Rate limited - retry after delay\n const retryAfter = errorResponse.retry_after ?? 1;\n if (attempt < maxRetries) {\n await this.sleep(retryAfter * 1000);\n continue;\n }\n return errorResponse;\n\n case 400:\n // Bad request - don't retry\n this.logger.warn('Bad request:', errorResponse.message);\n return errorResponse;\n\n default:\n // 5xx errors - retry with backoff\n if (errorResponse.code >= 500 && attempt < maxRetries) {\n const delay = this.calculateBackoff(attempt, baseDelay);\n if (this.debug) {\n this.logger.debug(`Retry ${attempt + 1}/${maxRetries} after ${delay}ms`);\n }\n await this.sleep(delay);\n continue;\n }\n return errorResponse;\n }\n } catch (error) {\n // Network error - retry with backoff\n if (attempt < maxRetries) {\n const delay = this.calculateBackoff(attempt, baseDelay);\n if (this.debug) {\n this.logger.debug(`Network error, retry ${attempt + 1}/${maxRetries} after ${delay}ms`);\n }\n await this.sleep(delay);\n continue;\n }\n\n const networkError: TransportErrorResponse = {\n success: false,\n error: 'Network Error',\n message: error instanceof Error ? error.message : 'Unknown error',\n code: 0,\n };\n return networkError;\n }\n }\n\n return lastError ?? {\n success: false,\n error: 'Max retries exceeded',\n message: 'Failed after maximum retry attempts',\n code: 0,\n };\n }\n\n /**\n * Execute HTTP request\n */\n private async executeRequest(url: string, batch: EventBatch): Promise<TransportResponse> {\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this.timeout);\n\n try {\n const response = await fetch(url, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'Authorization': `Bearer ${this.apiKey}`,\n },\n body: JSON.stringify(batch),\n signal: controller.signal,\n });\n\n const data = await response.json() as TransportResponse;\n return data;\n } finally {\n clearTimeout(timeoutId);\n }\n }\n\n /**\n * Calculate backoff delay with jitter\n */\n private calculateBackoff(attempt: number, baseDelay: number): number {\n const exponentialDelay = baseDelay * Math.pow(2, attempt);\n const jitter = exponentialDelay * 0.1 * (Math.random() * 2 - 1); // ±10% jitter\n return Math.round(exponentialDelay + jitter);\n }\n\n /**\n * Sleep for specified milliseconds\n */\n private sleep(ms: number): Promise<void> {\n return new Promise(resolve => setTimeout(resolve, ms));\n }\n}\n","import type { Event, Tags, Extra, CaptureOptions, EventLevel } from './types.js';\nimport { ConfigError } from './config.js';\n\n/**\n * Queue flush callback\n */\nexport type FlushCallback = (events: Event[]) => Promise<void>;\n\n/**\n * Queue options\n */\nexport interface QueueOptions {\n /** Max events per batch before auto-flush */\n batchSize: number;\n /** Flush interval in milliseconds */\n flushInterval: number;\n /** Max events in queue */\n maxQueueSize: number;\n /** Debug logging */\n debug: boolean;\n}\n\n/**\n * Event queue with batching support\n * \n * Accumulates events and flushes them either when:\n * - Batch size is reached (default: 100)\n * - Flush interval elapsed (default: 5 seconds)\n * - Manual flush() is called\n */\nexport class EventQueue {\n private readonly queue: Event[] = [];\n private readonly options: QueueOptions;\n private readonly onFlush: FlushCallback;\n\n private flushTimer: ReturnType<typeof setInterval> | null = null;\n private isFlushing = false;\n\n constructor(options: QueueOptions, onFlush: FlushCallback) {\n this.options = options;\n this.onFlush = onFlush;\n }\n\n /**\n * Start the background flush timer\n */\n start(): void {\n if (this.flushTimer) return;\n\n this.flushTimer = setInterval(() => {\n this.flush().catch(() => {\n // Errors handled in flush()\n });\n }, this.options.flushInterval);\n\n // Don't block Node.js from exiting\n if (this.flushTimer.unref) {\n this.flushTimer.unref();\n }\n }\n\n /**\n * Stop the background flush timer\n */\n stop(): void {\n if (this.flushTimer) {\n clearInterval(this.flushTimer);\n this.flushTimer = null;\n }\n }\n\n /**\n * Add an event to the queue\n * Returns immediately (non-blocking)\n */\n add(event: Event): void {\n // Check if queue is full\n if (this.queue.length >= this.options.maxQueueSize) {\n // Drop oldest event\n this.queue.shift();\n if (this.options.debug) {\n console.warn('[tracebeam] Queue full, dropping oldest event');\n }\n }\n\n this.queue.push(event);\n\n // Auto-flush if batch size reached\n if (this.queue.length >= this.options.batchSize) {\n this.flush().catch(() => {\n // Errors handled in flush()\n });\n }\n }\n\n /**\n * Flush all queued events\n */\n async flush(): Promise<void> {\n // Prevent concurrent flushes\n if (this.isFlushing || this.queue.length === 0) {\n return;\n }\n\n this.isFlushing = true;\n\n try {\n // Extract events to flush (leave queue empty for new events)\n const events = this.queue.splice(0, this.queue.length);\n await this.onFlush(events);\n } finally {\n this.isFlushing = false;\n }\n }\n\n /**\n * Get current queue size\n */\n size(): number {\n return this.queue.length;\n }\n\n /**\n * Check if queue is empty\n */\n isEmpty(): boolean {\n return this.queue.length === 0;\n }\n}\n\n/**\n * Event builder utility\n */\nexport function createEvent(\n projectId: string,\n environment: string,\n error: string,\n options: CaptureOptions = {},\n globalTags: Tags = {},\n globalExtra: Extra = {}\n): Event {\n // Validate required parameters\n if (!projectId || projectId.trim() === '') {\n throw new ConfigError('createEvent: \"projectId\" must be a non-empty string.');\n }\n if (!environment || environment.trim() === '') {\n throw new ConfigError('createEvent: \"environment\" must be a non-empty string.');\n }\n\n const level: EventLevel = options.level ?? 'error';\n const timestamp = options.timestamp ?? new Date().toISOString();\n\n // Merge tags (options override globals)\n const tags: Tags = {\n ...globalTags,\n ...options.tags,\n };\n\n // Merge extra (options override globals)\n const extra: Extra = {\n ...globalExtra,\n ...options.extra,\n };\n\n // Truncate error message to 10,000 chars\n const truncatedError = error.length > 10000 ? error.slice(0, 10000) : error;\n\n return {\n project_id: projectId,\n error: truncatedError,\n level,\n environment,\n timestamp,\n tags,\n extra,\n };\n}\n","import type { TraceBeamConfig, CaptureOptions, Tags, Extra, Event } from './types.js';\nimport { loadConfigFromEnv, mergeConfig, validateConfig } from './config.js';\nimport { Transport } from './transport.js';\nimport { EventQueue, createEvent } from './queue.js';\n\n/**\n * TraceBeamSDK client for capturing and sending events\n * \n * @example\n * ```typescript\n * // Initialize from environment variables\n * const sdk = TraceBeamSDK.fromEnv();\n * \n * // Capture an exception\n * try {\n * doSomething();\n * } catch (error) {\n * sdk.captureException(error);\n * }\n * \n * // Capture a message\n * sdk.captureMessage('User signup completed', {\n * level: 'info',\n * tags: { feature: 'auth' }\n * });\n * \n * // Graceful shutdown\n * await sdk.close();\n * ```\n */\nexport class TraceBeamSDK {\n private readonly config: Required<TraceBeamConfig>;\n private readonly transport: Transport;\n private readonly queue: EventQueue;\n\n private globalTags: Tags = {};\n private globalExtra: Extra = {};\n private userId: string | null = null;\n\n private isInitialized = true;\n\n /**\n * Create SDK instance from configuration\n */\n constructor(config: TraceBeamConfig) {\n validateConfig(config);\n this.config = mergeConfig(config);\n\n this.transport = new Transport({\n endpoint: this.config.endpoint,\n apiKey: this.config.apiKey,\n timeout: this.config.timeout,\n debug: this.config.debug,\n });\n\n this.queue = new EventQueue(\n {\n batchSize: this.config.batchSize,\n flushInterval: this.config.flushInterval,\n maxQueueSize: this.config.maxQueueSize,\n debug: this.config.debug,\n },\n this.handleFlush.bind(this)\n );\n\n // Start background flush timer\n this.queue.start();\n\n if (this.config.debug) {\n console.debug('[tracebeam] Initialized', {\n projectId: this.config.projectId,\n environment: this.config.environment,\n endpoint: this.config.endpoint,\n });\n }\n }\n\n /**\n * Create SDK instance from environment variables\n * \n * Required env vars:\n * - TRACEBEAM_API_KEY\n * - TRACEBEAM_PROJECT_ID\n * \n * Optional env vars:\n * - TRACEBEAM_ENVIRONMENT (default: 'development')\n * - TRACEBEAM_ENDPOINT (default: 'https://ingest.tracebeam.io')\n * - TRACEBEAM_BATCH_SIZE (default: 100)\n * - TRACEBEAM_FLUSH_INTERVAL (default: 5000)\n * - TRACEBEAM_HTTP_TIMEOUT (default: 10000)\n * - TRACEBEAM_MAX_QUEUE_SIZE (default: 10000)\n * - TRACEBEAM_SAMPLE_RATE (default: 1.0)\n * - TRACEBEAM_DEBUG (default: false)\n */\n static fromEnv(): TraceBeamSDK {\n const config = loadConfigFromEnv();\n return new TraceBeamSDK(config);\n }\n\n /**\n * Capture an exception/error\n * Returns immediately (non-blocking)\n */\n captureException(error: Error | string, options: CaptureOptions = {}): void {\n if (!this.canCapture()) return;\n\n const errorMessage = error instanceof Error\n ? `${error.name}: ${error.message}\\n${error.stack ?? ''}`\n : String(error);\n\n const event = this.createEventWithContext(errorMessage, {\n level: 'error',\n ...options,\n });\n\n this.queue.add(event);\n }\n\n /**\n * Capture a message/event\n * Returns immediately (non-blocking)\n */\n captureMessage(message: string, options: CaptureOptions = {}): void {\n if (!this.canCapture()) return;\n\n const event = this.createEventWithContext(message, {\n level: 'info',\n ...options,\n });\n\n this.queue.add(event);\n }\n\n /**\n * Set the current user ID\n * Will be included in all subsequent events\n */\n setUser(userId: string | null): void {\n this.userId = userId;\n if (userId) {\n this.globalExtra['user_id'] = userId;\n } else {\n delete this.globalExtra['user_id'];\n }\n }\n\n /**\n * Set a global tag\n * Will be included in all subsequent events\n */\n setTag(key: string, value: string): void {\n this.globalTags[key] = value;\n }\n\n /**\n * Set multiple global tags\n * Will be included in all subsequent events\n */\n setTags(tags: Tags): void {\n Object.assign(this.globalTags, tags);\n }\n\n /**\n * Set global extra context\n * Will be included in all subsequent events\n */\n setExtra(key: string, value: unknown): void {\n this.globalExtra[key] = value;\n }\n\n /**\n * Set multiple global extra context values\n */\n setExtras(extras: Extra): void {\n Object.assign(this.globalExtra, extras);\n }\n\n /**\n * Manually flush queued events\n * Call this to ensure events are sent before process exit\n */\n async flush(): Promise<void> {\n await this.queue.flush();\n }\n\n /**\n * Graceful shutdown\n * Flushes remaining events and stops background workers\n */\n async close(): Promise<void> {\n this.isInitialized = false;\n this.queue.stop();\n await this.flush();\n\n if (this.config.debug) {\n console.debug('[tracebeam] Closed');\n }\n }\n\n /**\n * Check if SDK is active and can capture events\n */\n isActive(): boolean {\n return this.isInitialized && this.transport.isActive();\n }\n\n // Private methods\n\n private canCapture(): boolean {\n if (!this.isInitialized) return false;\n if (!this.transport.isActive()) return false;\n\n // Sample rate check\n if (this.config.sampleRate < 1.0) {\n if (Math.random() > this.config.sampleRate) {\n return false;\n }\n }\n\n return true;\n }\n\n private createEventWithContext(error: string, options: CaptureOptions): Event {\n return createEvent(\n this.config.projectId,\n this.config.environment,\n error,\n options,\n this.globalTags,\n this.globalExtra\n );\n }\n\n private async handleFlush(events: Event[]): Promise<void> {\n if (events.length === 0) return;\n\n try {\n await this.transport.send(events);\n } catch (error) {\n if (this.config.debug) {\n console.error('[tracebeam] Failed to flush events:', error);\n }\n // Events are lost, but we don't crash the app\n }\n }\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../src/index.ts","../src/sdk.ts","../node_modules/@opentelemetry/core/src/trace/suppress-tracing.ts","../node_modules/@opentelemetry/core/src/common/logging-error-handler.ts","../node_modules/@opentelemetry/core/src/common/global-error-handler.ts","../node_modules/@opentelemetry/core/src/platform/node/environment.ts","../node_modules/@opentelemetry/core/src/common/time.ts","../node_modules/@opentelemetry/core/src/ExportResult.ts","../node_modules/@opentelemetry/core/src/utils/promise.ts","../node_modules/@opentelemetry/core/src/utils/callback.ts","../node_modules/@opentelemetry/core/src/internal/exporter.ts","../node_modules/@opentelemetry/core/src/index.ts","../node_modules/@opentelemetry/sdk-trace-base/src/export/BatchSpanProcessorBase.ts","../node_modules/@opentelemetry/sdk-trace-base/src/platform/node/export/BatchSpanProcessor.ts","../node_modules/@opentelemetry/sdk-trace-base/src/export/ConsoleSpanExporter.ts","../node_modules/@opentelemetry/sdk-trace-base/src/export/SimpleSpanProcessor.ts","../node_modules/@opentelemetry/instrumentation/src/autoLoader.ts","../node_modules/@opentelemetry/api-logs/src/NoopLogger.ts","../node_modules/@opentelemetry/api-logs/src/NoopLoggerProvider.ts","../node_modules/@opentelemetry/api-logs/src/ProxyLogger.ts","../node_modules/@opentelemetry/api-logs/src/ProxyLoggerProvider.ts","../node_modules/@opentelemetry/api-logs/src/internal/global-utils.ts","../node_modules/@opentelemetry/api-logs/src/api/logs.ts","../node_modules/@opentelemetry/api-logs/src/index.ts","../node_modules/@opentelemetry/instrumentation/src/autoLoaderUtils.ts","../src/config.ts"],"sourcesContent":["/**\n * TraceBeam SDK for Node.js\n * \n * A lightweight, non-blocking telemetry SDK for sending errors\n * and events to the TraceBeam API Observability Platform.\n * \n * @example\n * ```typescript\n * import { TraceBeamSDK } from 'tracebeam-sdk';\n * \n * // Initialize from environment variables\n * const sdk = TraceBeamSDK.fromEnv();\n * \n * // Capture an exception\n * try {\n * await doSomething();\n * } catch (error) {\n * sdk.captureException(error);\n * }\n * \n * // Capture a message\n * sdk.captureMessage('User signed up', { level: 'info' });\n * \n * // Graceful shutdown\n * await sdk.close();\n * ```\n * \n * @packageDocumentation\n */\n\n// Export core SDK\nexport { TraceBeamSDK } from './sdk.js';\nexport * from './types.js';\nexport * from './config.js';\n\n// Integrations are available via their own subpaths\n","\nimport * as api from '@opentelemetry/api';\nimport { BasicTracerProvider, SimpleSpanProcessor, BatchSpanProcessor, ConsoleSpanExporter, SpanProcessor } from '@opentelemetry/sdk-trace-base';\nimport { NodeTracerProvider } from '@opentelemetry/sdk-trace-node';\nimport { OTLPTraceExporter } from '@opentelemetry/exporter-trace-otlp-http';\nimport { resourceFromAttributes } from '@opentelemetry/resources';\nimport { SemanticResourceAttributes } from '@opentelemetry/semantic-conventions';\nimport { registerInstrumentations } from '@opentelemetry/instrumentation';\nimport { getNodeAutoInstrumentations } from '@opentelemetry/auto-instrumentations-node';\nimport { TraceBeamConfig, CaptureOptions, Tags, Extra } from './types.js';\nimport { loadConfigFromEnv, mergeConfig, validateConfig } from './config.js';\n\n/**\n * TraceBeamSDK client for capturing and sending events via OTLP\n */\nexport class TraceBeamSDK {\n private readonly config: Required<TraceBeamConfig>;\n private provider: NodeTracerProvider;\n private tracer: api.Tracer;\n private isInitialized = true;\n\n private globalTags: Tags = {};\n private globalExtra: Extra = {};\n private userId: string | null = null;\n\n /**\n * Create SDK instance from configuration\n */\n constructor(config: TraceBeamConfig) {\n validateConfig(config);\n this.config = mergeConfig(config);\n\n // Remove trailing slash\n const baseUrl = this.config.endpoint.replace(/\\/$/, '');\n const exporterUrl = `${baseUrl}/v1/traces`;\n\n const exporter = new OTLPTraceExporter({\n url: exporterUrl,\n headers: {\n 'Authorization': `Bearer ${this.config.apiKey}`,\n },\n });\n\n // Prepare Span Processors\n const spanProcessors: SpanProcessor[] = [];\n\n // Use BatchSpanProcessor for production\n spanProcessors.push(new BatchSpanProcessor(exporter, {\n maxExportBatchSize: this.config.batchSize,\n scheduledDelayMillis: this.config.flushInterval,\n }));\n\n if (this.config.debug) {\n spanProcessors.push(new SimpleSpanProcessor(new ConsoleSpanExporter()));\n console.debug('[tracebeam] Initialized OTLP', {\n url: exporterUrl,\n projectId: this.config.projectId,\n });\n }\n\n // Initialize Provider\n this.provider = new NodeTracerProvider({\n resource: resourceFromAttributes({\n [SemanticResourceAttributes.SERVICE_NAME]: this.config.projectId,\n [SemanticResourceAttributes.SERVICE_VERSION]: this.config.environment,\n [SemanticResourceAttributes.DEPLOYMENT_ENVIRONMENT]: this.config.environment,\n 'telemetry.sdk.language': 'nodejs',\n 'telemetry.sdk.name': 'tracebeam-sdk',\n 'telemetry.sdk.version': '0.2.1',\n }),\n spanProcessors: spanProcessors,\n });\n\n this.provider.register();\n\n // Register auto-instrumentations for HTTP, Express, etc.\n registerInstrumentations({\n tracerProvider: this.provider,\n instrumentations: [\n getNodeAutoInstrumentations({\n // Disable some noisy instrumentations\n '@opentelemetry/instrumentation-fs': { enabled: false },\n '@opentelemetry/instrumentation-dns': { enabled: false },\n }),\n ],\n });\n\n this.tracer = api.trace.getTracer('tracebeam-sdk');\n }\n\n static fromEnv(): TraceBeamSDK {\n const config = loadConfigFromEnv();\n return new TraceBeamSDK(config);\n }\n\n /**\n * Capture an exception/error\n */\n captureException(error: Error | string | unknown, options: CaptureOptions = {}): void {\n if (!this.canCapture()) return;\n\n const timestamp = options.timestamp ? new Date(options.timestamp).getTime() : Date.now();\n\n let startTime = timestamp;\n if (options.latency) {\n startTime = timestamp - options.latency;\n }\n\n // Determine span name\n let spanName = 'exception';\n let spanStatus: api.SpanStatusCode = api.SpanStatusCode.ERROR;\n let errorMessage = '';\n\n if (error instanceof Error) {\n spanName = error.name || 'Error';\n errorMessage = error.message;\n } else if (typeof error === 'string') {\n if (error === \"\") {\n // Metric-only event (latency)\n spanName = options.tags?.['endpoint'] || 'request';\n spanStatus = api.SpanStatusCode.OK; // It's just a metric\n } else {\n spanName = 'Error';\n errorMessage = error;\n }\n } else {\n spanName = 'Error';\n errorMessage = String(error);\n }\n\n const span = this.tracer.startSpan(spanName, {\n startTime: startTime,\n kind: api.SpanKind.CLIENT,\n });\n\n // Set Attributes (Tags + Extra)\n const attributes: api.Attributes = {};\n\n // Merge Global Tags\n Object.entries(this.globalTags).forEach(([k, v]) => attributes[k] = v);\n // Merge Option Tags\n if (options.tags) {\n Object.entries(options.tags).forEach(([k, v]) => attributes[k] = v);\n }\n\n // Merge Global Extra\n Object.entries(this.globalExtra).forEach(([k, v]) => {\n if (typeof v === 'string' || typeof v === 'number' || typeof v === 'boolean') {\n attributes[k] = v;\n } else {\n attributes[k] = JSON.stringify(v);\n }\n });\n // Merge Option Extra\n if (options.extra) {\n Object.entries(options.extra).forEach(([k, v]) => {\n if (typeof v === 'string' || typeof v === 'number' || typeof v === 'boolean') {\n attributes[k] = v;\n } else {\n attributes[k] = JSON.stringify(v);\n }\n });\n }\n\n // Add explicit latency attribute if present, for backwards compat\n if (options.latency) {\n attributes['latency_ms'] = options.latency;\n attributes['latency'] = options.latency; // double alias for safety\n }\n\n span.setAttributes(attributes);\n span.setStatus({ code: spanStatus });\n\n // Record Exception if it's an error\n if (error && error !== \"\") {\n if (error instanceof Error) {\n span.recordException(error);\n } else {\n span.recordException(new Error(String(error)));\n }\n }\n\n // End Span\n // If we backed-dated start time, we should end it now (or at timestamp)\n span.end(timestamp);\n }\n\n /**\n * Capture a message\n */\n captureMessage(message: string, options: CaptureOptions = {}): void {\n // Treat as exception with string\n this.captureException(message, { ...options, level: options.level || 'info' });\n }\n\n setUser(userId: string | null): void {\n this.userId = userId;\n if (userId) {\n this.globalExtra['user_id'] = userId;\n } else {\n delete this.globalExtra['user_id'];\n }\n }\n\n setTag(key: string, value: string): void {\n this.globalTags[key] = value;\n }\n\n setTags(tags: Tags): void {\n Object.assign(this.globalTags, tags);\n }\n\n setExtra(key: string, value: unknown): void {\n this.globalExtra[key] = value;\n }\n\n setExtras(extras: Extra): void {\n Object.assign(this.globalExtra, extras);\n }\n\n async flush(): Promise<void> {\n await this.provider.forceFlush();\n }\n\n async close(): Promise<void> {\n this.isInitialized = false;\n await this.provider.shutdown();\n }\n\n isActive(): boolean {\n return this.isInitialized;\n }\n\n private canCapture(): boolean {\n if (!this.isInitialized) return false;\n if (this.config.sampleRate < 1.0) {\n if (Math.random() > this.config.sampleRate) {\n return false;\n }\n }\n return true;\n }\n}\n","/*\n * Copyright The OpenTelemetry Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { Context, createContextKey } from '@opentelemetry/api';\n\nconst SUPPRESS_TRACING_KEY = createContextKey(\n 'OpenTelemetry SDK Context Key SUPPRESS_TRACING'\n);\n\nexport function suppressTracing(context: Context): Context {\n return context.setValue(SUPPRESS_TRACING_KEY, true);\n}\n\nexport function unsuppressTracing(context: Context): Context {\n return context.deleteValue(SUPPRESS_TRACING_KEY);\n}\n\nexport function isTracingSuppressed(context: Context): boolean {\n return context.getValue(SUPPRESS_TRACING_KEY) === true;\n}\n","/*\n * Copyright The OpenTelemetry Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { diag, Exception } from '@opentelemetry/api';\nimport { ErrorHandler } from './types';\n\n/**\n * Returns a function that logs an error using the provided logger, or a\n * console logger if one was not provided.\n */\nexport function loggingErrorHandler(): ErrorHandler {\n return (ex: Exception) => {\n diag.error(stringifyException(ex));\n };\n}\n\n/**\n * Converts an exception into a string representation\n * @param {Exception} ex\n */\nfunction stringifyException(ex: Exception | string): string {\n if (typeof ex === 'string') {\n return ex;\n } else {\n return JSON.stringify(flattenException(ex));\n }\n}\n\n/**\n * Flattens an exception into key-value pairs by traversing the prototype chain\n * and coercing values to strings. Duplicate properties will not be overwritten;\n * the first insert wins.\n */\nfunction flattenException(ex: Exception): Record<string, string> {\n const result = {} as Record<string, string>;\n let current = ex;\n\n while (current !== null) {\n Object.getOwnPropertyNames(current).forEach(propertyName => {\n if (result[propertyName]) return;\n const value = current[propertyName as keyof typeof current];\n if (value) {\n result[propertyName] = String(value);\n }\n });\n current = Object.getPrototypeOf(current);\n }\n\n return result;\n}\n","/*\n * Copyright The OpenTelemetry Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { Exception } from '@opentelemetry/api';\nimport { loggingErrorHandler } from './logging-error-handler';\nimport { ErrorHandler } from './types';\n\n/** The global error handler delegate */\nlet delegateHandler = loggingErrorHandler();\n\n/**\n * Set the global error handler\n * @param {ErrorHandler} handler\n */\nexport function setGlobalErrorHandler(handler: ErrorHandler): void {\n delegateHandler = handler;\n}\n\n/**\n * Return the global error handler\n * @param {Exception} ex\n */\nexport function globalErrorHandler(ex: Exception): void {\n try {\n delegateHandler(ex);\n } catch {} // eslint-disable-line no-empty\n}\n","/*\n * Copyright The OpenTelemetry Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { diag } from '@opentelemetry/api';\nimport { inspect } from 'util';\n\n/**\n * Retrieves a number from an environment variable.\n * - Returns `undefined` if the environment variable is empty, unset, contains only whitespace, or is not a number.\n * - Returns a number in all other cases.\n *\n * @param {string} key - The name of the environment variable to retrieve.\n * @returns {number | undefined} - The number value or `undefined`.\n */\nexport function getNumberFromEnv(key: string): number | undefined {\n const raw = process.env[key];\n if (raw == null || raw.trim() === '') {\n return undefined;\n }\n\n const value = Number(raw);\n if (isNaN(value)) {\n diag.warn(\n `Unknown value ${inspect(raw)} for ${key}, expected a number, using defaults`\n );\n return undefined;\n }\n\n return value;\n}\n\n/**\n * Retrieves a string from an environment variable.\n * - Returns `undefined` if the environment variable is empty, unset, or contains only whitespace.\n *\n * @param {string} key - The name of the environment variable to retrieve.\n * @returns {string | undefined} - The string value or `undefined`.\n */\nexport function getStringFromEnv(key: string): string | undefined {\n const raw = process.env[key];\n if (raw == null || raw.trim() === '') {\n return undefined;\n }\n return raw;\n}\n\n/**\n * Retrieves a boolean value from an environment variable.\n * - Trims leading and trailing whitespace and ignores casing.\n * - Returns `false` if the environment variable is empty, unset, or contains only whitespace.\n * - Returns `false` for strings that cannot be mapped to a boolean.\n *\n * @param {string} key - The name of the environment variable to retrieve.\n * @returns {boolean} - The boolean value or `false` if the environment variable is unset empty, unset, or contains only whitespace.\n */\nexport function getBooleanFromEnv(key: string): boolean {\n const raw = process.env[key]?.trim().toLowerCase();\n if (raw == null || raw === '') {\n // NOTE: falling back to `false` instead of `undefined` as required by the specification.\n // If you have a use-case that requires `undefined`, consider using `getStringFromEnv()` and applying the necessary\n // normalizations in the consuming code.\n return false;\n }\n if (raw === 'true') {\n return true;\n } else if (raw === 'false') {\n return false;\n } else {\n diag.warn(\n `Unknown value ${inspect(raw)} for ${key}, expected 'true' or 'false', falling back to 'false' (default)`\n );\n return false;\n }\n}\n\n/**\n * Retrieves a list of strings from an environment variable.\n * - Uses ',' as the delimiter.\n * - Trims leading and trailing whitespace from each entry.\n * - Excludes empty entries.\n * - Returns `undefined` if the environment variable is empty or contains only whitespace.\n * - Returns an empty array if all entries are empty or whitespace.\n *\n * @param {string} key - The name of the environment variable to retrieve.\n * @returns {string[] | undefined} - The list of strings or `undefined`.\n */\nexport function getStringListFromEnv(key: string): string[] | undefined {\n return getStringFromEnv(key)\n ?.split(',')\n .map(v => v.trim())\n .filter(s => s !== '');\n}\n","/*\n * Copyright The OpenTelemetry Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport * as api from '@opentelemetry/api';\nimport { otperformance as performance } from '../platform';\n\nconst NANOSECOND_DIGITS = 9;\nconst NANOSECOND_DIGITS_IN_MILLIS = 6;\nconst MILLISECONDS_TO_NANOSECONDS = Math.pow(10, NANOSECOND_DIGITS_IN_MILLIS);\nconst SECOND_TO_NANOSECONDS = Math.pow(10, NANOSECOND_DIGITS);\n\n/**\n * Converts a number of milliseconds from epoch to HrTime([seconds, remainder in nanoseconds]).\n * @param epochMillis\n */\nexport function millisToHrTime(epochMillis: number): api.HrTime {\n const epochSeconds = epochMillis / 1000;\n // Decimals only.\n const seconds = Math.trunc(epochSeconds);\n // Round sub-nanosecond accuracy to nanosecond.\n const nanos = Math.round((epochMillis % 1000) * MILLISECONDS_TO_NANOSECONDS);\n return [seconds, nanos];\n}\n\n/**\n * @deprecated Use `performance.timeOrigin` directly.\n */\nexport function getTimeOrigin(): number {\n return performance.timeOrigin;\n}\n\n/**\n * Returns an hrtime calculated via performance component.\n * @param performanceNow\n */\nexport function hrTime(performanceNow?: number): api.HrTime {\n const timeOrigin = millisToHrTime(performance.timeOrigin);\n const now = millisToHrTime(\n typeof performanceNow === 'number' ? performanceNow : performance.now()\n );\n\n return addHrTimes(timeOrigin, now);\n}\n\n/**\n *\n * Converts a TimeInput to an HrTime, defaults to _hrtime().\n * @param time\n */\nexport function timeInputToHrTime(time: api.TimeInput): api.HrTime {\n // process.hrtime\n if (isTimeInputHrTime(time)) {\n return time as api.HrTime;\n } else if (typeof time === 'number') {\n // Must be a performance.now() if it's smaller than process start time.\n if (time < performance.timeOrigin) {\n return hrTime(time);\n } else {\n // epoch milliseconds or performance.timeOrigin\n return millisToHrTime(time);\n }\n } else if (time instanceof Date) {\n return millisToHrTime(time.getTime());\n } else {\n throw TypeError('Invalid input type');\n }\n}\n\n/**\n * Returns a duration of two hrTime.\n * @param startTime\n * @param endTime\n */\nexport function hrTimeDuration(\n startTime: api.HrTime,\n endTime: api.HrTime\n): api.HrTime {\n let seconds = endTime[0] - startTime[0];\n let nanos = endTime[1] - startTime[1];\n\n // overflow\n if (nanos < 0) {\n seconds -= 1;\n // negate\n nanos += SECOND_TO_NANOSECONDS;\n }\n\n return [seconds, nanos];\n}\n\n/**\n * Convert hrTime to timestamp, for example \"2019-05-14T17:00:00.000123456Z\"\n * @param time\n */\nexport function hrTimeToTimeStamp(time: api.HrTime): string {\n const precision = NANOSECOND_DIGITS;\n const tmp = `${'0'.repeat(precision)}${time[1]}Z`;\n const nanoString = tmp.substring(tmp.length - precision - 1);\n const date = new Date(time[0] * 1000).toISOString();\n return date.replace('000Z', nanoString);\n}\n\n/**\n * Convert hrTime to nanoseconds.\n * @param time\n */\nexport function hrTimeToNanoseconds(time: api.HrTime): number {\n return time[0] * SECOND_TO_NANOSECONDS + time[1];\n}\n\n/**\n * Convert hrTime to milliseconds.\n * @param time\n */\nexport function hrTimeToMilliseconds(time: api.HrTime): number {\n return time[0] * 1e3 + time[1] / 1e6;\n}\n\n/**\n * Convert hrTime to microseconds.\n * @param time\n */\nexport function hrTimeToMicroseconds(time: api.HrTime): number {\n return time[0] * 1e6 + time[1] / 1e3;\n}\n\n/**\n * check if time is HrTime\n * @param value\n */\nexport function isTimeInputHrTime(value: unknown): value is api.HrTime {\n return (\n Array.isArray(value) &&\n value.length === 2 &&\n typeof value[0] === 'number' &&\n typeof value[1] === 'number'\n );\n}\n\n/**\n * check if input value is a correct types.TimeInput\n * @param value\n */\nexport function isTimeInput(\n value: unknown\n): value is api.HrTime | number | Date {\n return (\n isTimeInputHrTime(value) ||\n typeof value === 'number' ||\n value instanceof Date\n );\n}\n\n/**\n * Given 2 HrTime formatted times, return their sum as an HrTime.\n */\nexport function addHrTimes(time1: api.HrTime, time2: api.HrTime): api.HrTime {\n const out = [time1[0] + time2[0], time1[1] + time2[1]] as api.HrTime;\n\n // Nanoseconds\n if (out[1] >= SECOND_TO_NANOSECONDS) {\n out[1] -= SECOND_TO_NANOSECONDS;\n out[0] += 1;\n }\n\n return out;\n}\n","/*\n * Copyright The OpenTelemetry Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nexport interface ExportResult {\n code: ExportResultCode;\n error?: Error;\n}\n\nexport enum ExportResultCode {\n SUCCESS,\n FAILED,\n}\n","/*\n * Copyright The OpenTelemetry Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nexport class Deferred<T> {\n private _promise: Promise<T>;\n private _resolve!: (val: T) => void;\n private _reject!: (error: unknown) => void;\n constructor() {\n this._promise = new Promise((resolve, reject) => {\n this._resolve = resolve;\n this._reject = reject;\n });\n }\n\n get promise() {\n return this._promise;\n }\n\n resolve(val: T) {\n this._resolve(val);\n }\n\n reject(err: unknown) {\n this._reject(err);\n }\n}\n","/*\n * Copyright The OpenTelemetry Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { Deferred } from './promise';\n\n/**\n * Bind the callback and only invoke the callback once regardless how many times `BindOnceFuture.call` is invoked.\n */\nexport class BindOnceFuture<\n R,\n This = unknown,\n T extends (this: This, ...args: unknown[]) => R = () => R,\n> {\n private _isCalled = false;\n private _deferred = new Deferred<R>();\n private _callback: T;\n private _that: This;\n\n constructor(callback: T, that: This) {\n this._callback = callback;\n this._that = that;\n }\n\n get isCalled() {\n return this._isCalled;\n }\n\n get promise() {\n return this._deferred.promise;\n }\n\n call(...args: Parameters<T>): Promise<R> {\n if (!this._isCalled) {\n this._isCalled = true;\n try {\n Promise.resolve(this._callback.call(this._that, ...args)).then(\n val => this._deferred.resolve(val),\n err => this._deferred.reject(err)\n );\n } catch (err) {\n this._deferred.reject(err);\n }\n }\n return this._deferred.promise;\n }\n}\n","/*\n * Copyright The OpenTelemetry Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { context } from '@opentelemetry/api';\nimport { ExportResult } from '../ExportResult';\nimport { suppressTracing } from '../trace/suppress-tracing';\n\nexport interface Exporter<T> {\n export(arg: T, resultCallback: (result: ExportResult) => void): void;\n}\n\n/**\n * @internal\n * Shared functionality used by Exporters while exporting data, including suppression of Traces.\n */\nexport function _export<T>(\n exporter: Exporter<T>,\n arg: T\n): Promise<ExportResult> {\n return new Promise(resolve => {\n // prevent downstream exporter calls from generating spans\n context.with(suppressTracing(context.active()), () => {\n exporter.export(arg, (result: ExportResult) => {\n resolve(result);\n });\n });\n });\n}\n","/*\n * Copyright The OpenTelemetry Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nexport { W3CBaggagePropagator } from './baggage/propagation/W3CBaggagePropagator';\nexport { AnchoredClock } from './common/anchored-clock';\nexport type { Clock } from './common/anchored-clock';\nexport { isAttributeValue, sanitizeAttributes } from './common/attributes';\nexport {\n globalErrorHandler,\n setGlobalErrorHandler,\n} from './common/global-error-handler';\nexport { loggingErrorHandler } from './common/logging-error-handler';\nexport {\n addHrTimes,\n getTimeOrigin,\n hrTime,\n hrTimeDuration,\n hrTimeToMicroseconds,\n hrTimeToMilliseconds,\n hrTimeToNanoseconds,\n hrTimeToTimeStamp,\n isTimeInput,\n isTimeInputHrTime,\n millisToHrTime,\n timeInputToHrTime,\n} from './common/time';\nexport { unrefTimer } from './common/timer-util';\nexport type { ErrorHandler, InstrumentationScope } from './common/types';\nexport { ExportResultCode } from './ExportResult';\nexport type { ExportResult } from './ExportResult';\nexport { parseKeyPairsIntoRecord } from './baggage/utils';\nexport {\n SDK_INFO,\n _globalThis,\n getStringFromEnv,\n getBooleanFromEnv,\n getNumberFromEnv,\n getStringListFromEnv,\n otperformance,\n} from './platform';\nexport { CompositePropagator } from './propagation/composite';\nexport type { CompositePropagatorConfig } from './propagation/composite';\nexport {\n TRACE_PARENT_HEADER,\n TRACE_STATE_HEADER,\n W3CTraceContextPropagator,\n parseTraceParent,\n} from './trace/W3CTraceContextPropagator';\nexport {\n RPCType,\n deleteRPCMetadata,\n getRPCMetadata,\n setRPCMetadata,\n} from './trace/rpc-metadata';\nexport type { RPCMetadata } from './trace/rpc-metadata';\nexport {\n isTracingSuppressed,\n suppressTracing,\n unsuppressTracing,\n} from './trace/suppress-tracing';\nexport { TraceState } from './trace/TraceState';\nexport { merge } from './utils/merge';\nexport { TimeoutError, callWithTimeout } from './utils/timeout';\nexport { isUrlIgnored, urlMatches } from './utils/url';\nexport { BindOnceFuture } from './utils/callback';\nexport { diagLogLevelFromString } from './utils/configuration';\nimport { _export } from './internal/exporter';\nexport const internal = {\n _export,\n};\n","/*\n * Copyright The OpenTelemetry Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { context, Context, diag, TraceFlags } from '@opentelemetry/api';\nimport {\n BindOnceFuture,\n ExportResultCode,\n getNumberFromEnv,\n globalErrorHandler,\n suppressTracing,\n} from '@opentelemetry/core';\nimport { Span } from '../Span';\nimport { SpanProcessor } from '../SpanProcessor';\nimport { BufferConfig } from '../types';\nimport { ReadableSpan } from './ReadableSpan';\nimport { SpanExporter } from './SpanExporter';\n\n/**\n * Implementation of the {@link SpanProcessor} that batches spans exported by\n * the SDK then pushes them to the exporter pipeline.\n */\nexport abstract class BatchSpanProcessorBase<T extends BufferConfig>\n implements SpanProcessor\n{\n private readonly _maxExportBatchSize: number;\n private readonly _maxQueueSize: number;\n private readonly _scheduledDelayMillis: number;\n private readonly _exportTimeoutMillis: number;\n private readonly _exporter: SpanExporter;\n\n private _isExporting = false;\n private _finishedSpans: ReadableSpan[] = [];\n private _timer: NodeJS.Timeout | number | undefined;\n private _shutdownOnce: BindOnceFuture<void>;\n private _droppedSpansCount: number = 0;\n\n constructor(exporter: SpanExporter, config?: T) {\n this._exporter = exporter;\n this._maxExportBatchSize =\n typeof config?.maxExportBatchSize === 'number'\n ? config.maxExportBatchSize\n : (getNumberFromEnv('OTEL_BSP_MAX_EXPORT_BATCH_SIZE') ?? 512);\n this._maxQueueSize =\n typeof config?.maxQueueSize === 'number'\n ? config.maxQueueSize\n : (getNumberFromEnv('OTEL_BSP_MAX_QUEUE_SIZE') ?? 2048);\n this._scheduledDelayMillis =\n typeof config?.scheduledDelayMillis === 'number'\n ? config.scheduledDelayMillis\n : (getNumberFromEnv('OTEL_BSP_SCHEDULE_DELAY') ?? 5000);\n this._exportTimeoutMillis =\n typeof config?.exportTimeoutMillis === 'number'\n ? config.exportTimeoutMillis\n : (getNumberFromEnv('OTEL_BSP_EXPORT_TIMEOUT') ?? 30000);\n\n this._shutdownOnce = new BindOnceFuture(this._shutdown, this);\n\n if (this._maxExportBatchSize > this._maxQueueSize) {\n diag.warn(\n 'BatchSpanProcessor: maxExportBatchSize must be smaller or equal to maxQueueSize, setting maxExportBatchSize to match maxQueueSize'\n );\n this._maxExportBatchSize = this._maxQueueSize;\n }\n }\n\n forceFlush(): Promise<void> {\n if (this._shutdownOnce.isCalled) {\n return this._shutdownOnce.promise;\n }\n return this._flushAll();\n }\n\n // does nothing.\n onStart(_span: Span, _parentContext: Context): void {}\n\n onEnd(span: ReadableSpan): void {\n if (this._shutdownOnce.isCalled) {\n return;\n }\n\n if ((span.spanContext().traceFlags & TraceFlags.SAMPLED) === 0) {\n return;\n }\n\n this._addToBuffer(span);\n }\n\n shutdown(): Promise<void> {\n return this._shutdownOnce.call();\n }\n\n private _shutdown() {\n return Promise.resolve()\n .then(() => {\n return this.onShutdown();\n })\n .then(() => {\n return this._flushAll();\n })\n .then(() => {\n return this._exporter.shutdown();\n });\n }\n\n /** Add a span in the buffer. */\n private _addToBuffer(span: ReadableSpan) {\n if (this._finishedSpans.length >= this._maxQueueSize) {\n // limit reached, drop span\n\n if (this._droppedSpansCount === 0) {\n diag.debug('maxQueueSize reached, dropping spans');\n }\n this._droppedSpansCount++;\n\n return;\n }\n\n if (this._droppedSpansCount > 0) {\n // some spans were dropped, log once with count of spans dropped\n diag.warn(\n `Dropped ${this._droppedSpansCount} spans because maxQueueSize reached`\n );\n this._droppedSpansCount = 0;\n }\n\n this._finishedSpans.push(span);\n this._maybeStartTimer();\n }\n\n /**\n * Send all spans to the exporter respecting the batch size limit\n * This function is used only on forceFlush or shutdown,\n * for all other cases _flush should be used\n * */\n private _flushAll(): Promise<void> {\n return new Promise((resolve, reject) => {\n const promises = [];\n // calculate number of batches\n const count = Math.ceil(\n this._finishedSpans.length / this._maxExportBatchSize\n );\n for (let i = 0, j = count; i < j; i++) {\n promises.push(this._flushOneBatch());\n }\n Promise.all(promises)\n .then(() => {\n resolve();\n })\n .catch(reject);\n });\n }\n\n private _flushOneBatch(): Promise<void> {\n this._clearTimer();\n if (this._finishedSpans.length === 0) {\n return Promise.resolve();\n }\n return new Promise((resolve, reject) => {\n const timer = setTimeout(() => {\n // don't wait anymore for export, this way the next batch can start\n reject(new Error('Timeout'));\n }, this._exportTimeoutMillis);\n // prevent downstream exporter calls from generating spans\n context.with(suppressTracing(context.active()), () => {\n // Reset the finished spans buffer here because the next invocations of the _flush method\n // could pass the same finished spans to the exporter if the buffer is cleared\n // outside the execution of this callback.\n let spans: ReadableSpan[];\n if (this._finishedSpans.length <= this._maxExportBatchSize) {\n spans = this._finishedSpans;\n this._finishedSpans = [];\n } else {\n spans = this._finishedSpans.splice(0, this._maxExportBatchSize);\n }\n\n const doExport = () =>\n this._exporter.export(spans, result => {\n clearTimeout(timer);\n if (result.code === ExportResultCode.SUCCESS) {\n resolve();\n } else {\n reject(\n result.error ??\n new Error('BatchSpanProcessor: span export failed')\n );\n }\n });\n\n let pendingResources: Array<Promise<void>> | null = null;\n for (let i = 0, len = spans.length; i < len; i++) {\n const span = spans[i];\n if (\n span.resource.asyncAttributesPending &&\n span.resource.waitForAsyncAttributes\n ) {\n pendingResources ??= [];\n pendingResources.push(span.resource.waitForAsyncAttributes());\n }\n }\n\n // Avoid scheduling a promise to make the behavior more predictable and easier to test\n if (pendingResources === null) {\n doExport();\n } else {\n Promise.all(pendingResources).then(doExport, err => {\n globalErrorHandler(err);\n reject(err);\n });\n }\n });\n });\n }\n\n private _maybeStartTimer() {\n if (this._isExporting) return;\n const flush = () => {\n this._isExporting = true;\n this._flushOneBatch()\n .finally(() => {\n this._isExporting = false;\n if (this._finishedSpans.length > 0) {\n this._clearTimer();\n this._maybeStartTimer();\n }\n })\n .catch(e => {\n this._isExporting = false;\n globalErrorHandler(e);\n });\n };\n // we only wait if the queue doesn't have enough elements yet\n if (this._finishedSpans.length >= this._maxExportBatchSize) {\n return flush();\n }\n if (this._timer !== undefined) return;\n this._timer = setTimeout(() => flush(), this._scheduledDelayMillis);\n\n // depending on runtime, this may be a 'number' or NodeJS.Timeout\n if (typeof this._timer !== 'number') {\n this._timer.unref();\n }\n }\n\n private _clearTimer() {\n if (this._timer !== undefined) {\n clearTimeout(this._timer);\n this._timer = undefined;\n }\n }\n\n protected abstract onShutdown(): void;\n}\n","/*\n * Copyright The OpenTelemetry Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { BatchSpanProcessorBase } from '../../../export/BatchSpanProcessorBase';\nimport { BufferConfig } from '../../../types';\n\nexport class BatchSpanProcessor extends BatchSpanProcessorBase<BufferConfig> {\n protected onShutdown(): void {}\n}\n","/*\n * Copyright The OpenTelemetry Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { SpanExporter } from './SpanExporter';\nimport { ReadableSpan } from './ReadableSpan';\nimport {\n ExportResult,\n ExportResultCode,\n hrTimeToMicroseconds,\n} from '@opentelemetry/core';\n\n/**\n * This is implementation of {@link SpanExporter} that prints spans to the\n * console. This class can be used for diagnostic purposes.\n *\n * NOTE: This {@link SpanExporter} is intended for diagnostics use only, output rendered to the console may change at any time.\n */\n\n/* eslint-disable no-console */\nexport class ConsoleSpanExporter implements SpanExporter {\n /**\n * Export spans.\n * @param spans\n * @param resultCallback\n */\n export(\n spans: ReadableSpan[],\n resultCallback: (result: ExportResult) => void\n ): void {\n return this._sendSpans(spans, resultCallback);\n }\n\n /**\n * Shutdown the exporter.\n */\n shutdown(): Promise<void> {\n this._sendSpans([]);\n return this.forceFlush();\n }\n\n /**\n * Exports any pending spans in exporter\n */\n forceFlush(): Promise<void> {\n return Promise.resolve();\n }\n\n /**\n * converts span info into more readable format\n * @param span\n */\n private _exportInfo(span: ReadableSpan) {\n return {\n resource: {\n attributes: span.resource.attributes,\n },\n instrumentationScope: span.instrumentationScope,\n traceId: span.spanContext().traceId,\n parentSpanContext: span.parentSpanContext,\n traceState: span.spanContext().traceState?.serialize(),\n name: span.name,\n id: span.spanContext().spanId,\n kind: span.kind,\n timestamp: hrTimeToMicroseconds(span.startTime),\n duration: hrTimeToMicroseconds(span.duration),\n attributes: span.attributes,\n status: span.status,\n events: span.events,\n links: span.links,\n };\n }\n\n /**\n * Showing spans in console\n * @param spans\n * @param done\n */\n private _sendSpans(\n spans: ReadableSpan[],\n done?: (result: ExportResult) => void\n ): void {\n for (const span of spans) {\n console.dir(this._exportInfo(span), { depth: 3 });\n }\n if (done) {\n return done({ code: ExportResultCode.SUCCESS });\n }\n }\n}\n","/*\n * Copyright The OpenTelemetry Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { Context, TraceFlags } from '@opentelemetry/api';\nimport {\n internal,\n ExportResultCode,\n globalErrorHandler,\n BindOnceFuture,\n} from '@opentelemetry/core';\nimport { Span } from '../Span';\nimport { SpanProcessor } from '../SpanProcessor';\nimport { ReadableSpan } from './ReadableSpan';\nimport { SpanExporter } from './SpanExporter';\n\n/**\n * An implementation of the {@link SpanProcessor} that converts the {@link Span}\n * to {@link ReadableSpan} and passes it to the configured exporter.\n *\n * Only spans that are sampled are converted.\n *\n * NOTE: This {@link SpanProcessor} exports every ended span individually instead of batching spans together, which causes significant performance overhead with most exporters. For production use, please consider using the {@link BatchSpanProcessor} instead.\n */\nexport class SimpleSpanProcessor implements SpanProcessor {\n private readonly _exporter: SpanExporter;\n private _shutdownOnce: BindOnceFuture<void>;\n private _pendingExports: Set<Promise<void>>;\n\n constructor(exporter: SpanExporter) {\n this._exporter = exporter;\n this._shutdownOnce = new BindOnceFuture(this._shutdown, this);\n this._pendingExports = new Set<Promise<void>>();\n }\n\n async forceFlush(): Promise<void> {\n await Promise.all(Array.from(this._pendingExports));\n if (this._exporter.forceFlush) {\n await this._exporter.forceFlush();\n }\n }\n\n onStart(_span: Span, _parentContext: Context): void {}\n\n onEnd(span: ReadableSpan): void {\n if (this._shutdownOnce.isCalled) {\n return;\n }\n\n if ((span.spanContext().traceFlags & TraceFlags.SAMPLED) === 0) {\n return;\n }\n\n const pendingExport = this._doExport(span).catch(err =>\n globalErrorHandler(err)\n );\n // Enqueue this export to the pending list so it can be flushed by the user.\n this._pendingExports.add(pendingExport);\n void pendingExport.finally(() =>\n this._pendingExports.delete(pendingExport)\n );\n }\n\n private async _doExport(span: ReadableSpan): Promise<void> {\n if (span.resource.asyncAttributesPending) {\n // Ensure resource is fully resolved before exporting.\n await span.resource.waitForAsyncAttributes?.();\n }\n\n const result = await internal._export(this._exporter, [span]);\n if (result.code !== ExportResultCode.SUCCESS) {\n throw (\n result.error ??\n new Error(`SimpleSpanProcessor: span export failed (status ${result})`)\n );\n }\n }\n\n shutdown(): Promise<void> {\n return this._shutdownOnce.call();\n }\n\n private _shutdown(): Promise<void> {\n return this._exporter.shutdown();\n }\n}\n","/*\n * Copyright The OpenTelemetry Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { trace, metrics } from '@opentelemetry/api';\nimport { logs } from '@opentelemetry/api-logs';\nimport {\n disableInstrumentations,\n enableInstrumentations,\n} from './autoLoaderUtils';\nimport { AutoLoaderOptions } from './types_internal';\n\n/**\n * It will register instrumentations and plugins\n * @param options\n * @return returns function to unload instrumentation and plugins that were\n * registered\n */\nexport function registerInstrumentations(\n options: AutoLoaderOptions\n): () => void {\n const tracerProvider = options.tracerProvider || trace.getTracerProvider();\n const meterProvider = options.meterProvider || metrics.getMeterProvider();\n const loggerProvider = options.loggerProvider || logs.getLoggerProvider();\n const instrumentations = options.instrumentations?.flat() ?? [];\n\n enableInstrumentations(\n instrumentations,\n tracerProvider,\n meterProvider,\n loggerProvider\n );\n\n return () => {\n disableInstrumentations(instrumentations);\n };\n}\n","/*\n * Copyright The OpenTelemetry Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { Logger } from './types/Logger';\nimport { LogRecord } from './types/LogRecord';\n\nexport class NoopLogger implements Logger {\n emit(_logRecord: LogRecord): void {}\n}\n\nexport const NOOP_LOGGER = new NoopLogger();\n","/*\n * Copyright The OpenTelemetry Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { LoggerProvider } from './types/LoggerProvider';\nimport { Logger } from './types/Logger';\nimport { LoggerOptions } from './types/LoggerOptions';\nimport { NoopLogger } from './NoopLogger';\n\nexport class NoopLoggerProvider implements LoggerProvider {\n getLogger(\n _name: string,\n _version?: string | undefined,\n _options?: LoggerOptions | undefined\n ): Logger {\n return new NoopLogger();\n }\n}\n\nexport const NOOP_LOGGER_PROVIDER = new NoopLoggerProvider();\n","/*\n * Copyright The OpenTelemetry Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { NOOP_LOGGER } from './NoopLogger';\nimport { Logger } from './types/Logger';\nimport { LoggerOptions } from './types/LoggerOptions';\nimport { LogRecord } from './types/LogRecord';\n\nexport class ProxyLogger implements Logger {\n // When a real implementation is provided, this will be it\n private _delegate?: Logger;\n private _provider: LoggerDelegator;\n public readonly name: string;\n public readonly version?: string | undefined;\n public readonly options?: LoggerOptions | undefined;\n\n constructor(\n provider: LoggerDelegator,\n name: string,\n version?: string | undefined,\n options?: LoggerOptions | undefined\n ) {\n this._provider = provider;\n this.name = name;\n this.version = version;\n this.options = options;\n }\n\n /**\n * Emit a log record. This method should only be used by log appenders.\n *\n * @param logRecord\n */\n emit(logRecord: LogRecord): void {\n this._getLogger().emit(logRecord);\n }\n\n /**\n * Try to get a logger from the proxy logger provider.\n * If the proxy logger provider has no delegate, return a noop logger.\n */\n private _getLogger() {\n if (this._delegate) {\n return this._delegate;\n }\n const logger = this._provider._getDelegateLogger(\n this.name,\n this.version,\n this.options\n );\n if (!logger) {\n return NOOP_LOGGER;\n }\n this._delegate = logger;\n return this._delegate;\n }\n}\n\nexport interface LoggerDelegator {\n _getDelegateLogger(\n name: string,\n version?: string,\n options?: LoggerOptions\n ): Logger | undefined;\n}\n","/*\n * Copyright The OpenTelemetry Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { LoggerProvider } from './types/LoggerProvider';\nimport { Logger } from './types/Logger';\nimport { LoggerOptions } from './types/LoggerOptions';\nimport { NOOP_LOGGER_PROVIDER } from './NoopLoggerProvider';\nimport { ProxyLogger } from './ProxyLogger';\n\nexport class ProxyLoggerProvider implements LoggerProvider {\n private _delegate?: LoggerProvider;\n\n getLogger(\n name: string,\n version?: string | undefined,\n options?: LoggerOptions | undefined\n ): Logger {\n return (\n this._getDelegateLogger(name, version, options) ??\n new ProxyLogger(this, name, version, options)\n );\n }\n\n /**\n * Get the delegate logger provider.\n * Used by tests only.\n * @internal\n */\n _getDelegate(): LoggerProvider {\n return this._delegate ?? NOOP_LOGGER_PROVIDER;\n }\n\n /**\n * Set the delegate logger provider\n * @internal\n */\n _setDelegate(delegate: LoggerProvider) {\n this._delegate = delegate;\n }\n\n /**\n * @internal\n */\n _getDelegateLogger(\n name: string,\n version?: string | undefined,\n options?: LoggerOptions | undefined\n ): Logger | undefined {\n return this._delegate?.getLogger(name, version, options);\n }\n}\n","/*\n * Copyright The OpenTelemetry Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { LoggerProvider } from '../types/LoggerProvider';\n\nexport const GLOBAL_LOGS_API_KEY = Symbol.for('io.opentelemetry.js.api.logs');\n\ntype Get<T> = (version: number) => T;\ntype OtelGlobal = Partial<{\n [GLOBAL_LOGS_API_KEY]: Get<LoggerProvider>;\n}>;\n\nexport const _global = globalThis as OtelGlobal;\n\n/**\n * Make a function which accepts a version integer and returns the instance of an API if the version\n * is compatible, or a fallback version (usually NOOP) if it is not.\n *\n * @param requiredVersion Backwards compatibility version which is required to return the instance\n * @param instance Instance which should be returned if the required version is compatible\n * @param fallback Fallback instance, usually NOOP, which will be returned if the required version is not compatible\n */\nexport function makeGetter<T>(\n requiredVersion: number,\n instance: T,\n fallback: T\n): Get<T> {\n return (version: number): T =>\n version === requiredVersion ? instance : fallback;\n}\n\n/**\n * A number which should be incremented each time a backwards incompatible\n * change is made to the API. This number is used when an API package\n * attempts to access the global API to ensure it is getting a compatible\n * version. If the global API is not compatible with the API package\n * attempting to get it, a NOOP API implementation will be returned.\n */\nexport const API_BACKWARDS_COMPATIBILITY_VERSION = 1;\n","/*\n * Copyright The OpenTelemetry Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n API_BACKWARDS_COMPATIBILITY_VERSION,\n GLOBAL_LOGS_API_KEY,\n _global,\n makeGetter,\n} from '../internal/global-utils';\nimport { LoggerProvider } from '../types/LoggerProvider';\nimport { NOOP_LOGGER_PROVIDER } from '../NoopLoggerProvider';\nimport { Logger } from '../types/Logger';\nimport { LoggerOptions } from '../types/LoggerOptions';\nimport { ProxyLoggerProvider } from '../ProxyLoggerProvider';\n\nexport class LogsAPI {\n private static _instance?: LogsAPI;\n\n private _proxyLoggerProvider = new ProxyLoggerProvider();\n\n private constructor() {}\n\n public static getInstance(): LogsAPI {\n if (!this._instance) {\n this._instance = new LogsAPI();\n }\n\n return this._instance;\n }\n\n public setGlobalLoggerProvider(provider: LoggerProvider): LoggerProvider {\n if (_global[GLOBAL_LOGS_API_KEY]) {\n return this.getLoggerProvider();\n }\n\n _global[GLOBAL_LOGS_API_KEY] = makeGetter<LoggerProvider>(\n API_BACKWARDS_COMPATIBILITY_VERSION,\n provider,\n NOOP_LOGGER_PROVIDER\n );\n this._proxyLoggerProvider._setDelegate(provider);\n\n return provider;\n }\n\n /**\n * Returns the global logger provider.\n *\n * @returns LoggerProvider\n */\n public getLoggerProvider(): LoggerProvider {\n return (\n _global[GLOBAL_LOGS_API_KEY]?.(API_BACKWARDS_COMPATIBILITY_VERSION) ??\n this._proxyLoggerProvider\n );\n }\n\n /**\n * Returns a logger from the global logger provider.\n *\n * @returns Logger\n */\n public getLogger(\n name: string,\n version?: string,\n options?: LoggerOptions\n ): Logger {\n return this.getLoggerProvider().getLogger(name, version, options);\n }\n\n /** Remove the global logger provider */\n public disable(): void {\n delete _global[GLOBAL_LOGS_API_KEY];\n this._proxyLoggerProvider = new ProxyLoggerProvider();\n }\n}\n","/*\n * Copyright The OpenTelemetry Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nexport type { Logger } from './types/Logger';\nexport type { LoggerProvider } from './types/LoggerProvider';\nexport { SeverityNumber } from './types/LogRecord';\nexport type { LogAttributes, LogBody, LogRecord } from './types/LogRecord';\nexport type { LoggerOptions } from './types/LoggerOptions';\nexport type { AnyValue, AnyValueMap } from './types/AnyValue';\nexport { NOOP_LOGGER, NoopLogger } from './NoopLogger';\nexport { ProxyLoggerProvider } from './ProxyLoggerProvider';\n\nimport { LogsAPI } from './api/logs';\nexport const logs = LogsAPI.getInstance();\n","/*\n * Copyright The OpenTelemetry Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { TracerProvider, MeterProvider } from '@opentelemetry/api';\nimport { Instrumentation } from './types';\nimport { LoggerProvider } from '@opentelemetry/api-logs';\n\n/**\n * Enable instrumentations\n * @param instrumentations\n * @param tracerProvider\n * @param meterProvider\n */\nexport function enableInstrumentations(\n instrumentations: Instrumentation[],\n tracerProvider?: TracerProvider,\n meterProvider?: MeterProvider,\n loggerProvider?: LoggerProvider\n): void {\n for (let i = 0, j = instrumentations.length; i < j; i++) {\n const instrumentation = instrumentations[i];\n if (tracerProvider) {\n instrumentation.setTracerProvider(tracerProvider);\n }\n if (meterProvider) {\n instrumentation.setMeterProvider(meterProvider);\n }\n if (loggerProvider && instrumentation.setLoggerProvider) {\n instrumentation.setLoggerProvider(loggerProvider);\n }\n // instrumentations have been already enabled during creation\n // so enable only if user prevented that by setting enabled to false\n // this is to prevent double enabling but when calling register all\n // instrumentations should be now enabled\n if (!instrumentation.getConfig().enabled) {\n instrumentation.enable();\n }\n }\n}\n\n/**\n * Disable instrumentations\n * @param instrumentations\n */\nexport function disableInstrumentations(\n instrumentations: Instrumentation[]\n): void {\n instrumentations.forEach(instrumentation => instrumentation.disable());\n}\n","import type { TraceBeamConfig } from './types.js';\n\n/**\n * Default configuration values\n */\nexport const DEFAULT_CONFIG = {\n environment: 'development',\n endpoint: 'https://ingest.tracebeam.io',\n batchSize: 100,\n flushInterval: 5000,\n timeout: 10000,\n maxQueueSize: 10000,\n sampleRate: 1.0,\n debug: false,\n} as const;\n\n/**\n * Environment variable names\n */\nconst ENV_VARS = {\n API_KEY: 'TRACEBEAM_API_KEY',\n PROJECT_ID: 'TRACEBEAM_PROJECT_ID',\n ENVIRONMENT: 'TRACEBEAM_ENVIRONMENT',\n ENDPOINT: 'TRACEBEAM_ENDPOINT',\n BATCH_SIZE: 'TRACEBEAM_BATCH_SIZE',\n FLUSH_INTERVAL: 'TRACEBEAM_FLUSH_INTERVAL',\n TIMEOUT: 'TRACEBEAM_HTTP_TIMEOUT',\n MAX_QUEUE_SIZE: 'TRACEBEAM_MAX_QUEUE_SIZE',\n SAMPLE_RATE: 'TRACEBEAM_SAMPLE_RATE',\n DEBUG: 'TRACEBEAM_DEBUG',\n} as const;\n\n/**\n * Configuration error thrown when required values are missing\n */\nexport class ConfigError extends Error {\n constructor(message: string) {\n super(message);\n this.name = 'ConfigError';\n }\n}\n\n/**\n * Load configuration from environment variables\n */\nexport function loadConfigFromEnv(): TraceBeamConfig {\n const apiKey = process.env[ENV_VARS.API_KEY];\n const projectId = process.env[ENV_VARS.PROJECT_ID];\n\n if (!apiKey) {\n throw new ConfigError(`Missing required environment variable: ${ENV_VARS.API_KEY}`);\n }\n\n if (!projectId) {\n throw new ConfigError(`Missing required environment variable: ${ENV_VARS.PROJECT_ID}`);\n }\n\n return {\n apiKey,\n projectId,\n environment: process.env[ENV_VARS.ENVIRONMENT] || DEFAULT_CONFIG.environment,\n endpoint: process.env[ENV_VARS.ENDPOINT] || DEFAULT_CONFIG.endpoint,\n batchSize: parseIntEnv(ENV_VARS.BATCH_SIZE, DEFAULT_CONFIG.batchSize),\n flushInterval: parseIntEnv(ENV_VARS.FLUSH_INTERVAL, DEFAULT_CONFIG.flushInterval),\n timeout: parseIntEnv(ENV_VARS.TIMEOUT, DEFAULT_CONFIG.timeout),\n maxQueueSize: parseIntEnv(ENV_VARS.MAX_QUEUE_SIZE, DEFAULT_CONFIG.maxQueueSize),\n sampleRate: parseFloatEnv(ENV_VARS.SAMPLE_RATE, DEFAULT_CONFIG.sampleRate),\n debug: parseBoolEnv(ENV_VARS.DEBUG, DEFAULT_CONFIG.debug),\n };\n}\n\n/**\n * Merge user config with defaults\n */\nexport function mergeConfig(config: TraceBeamConfig): Required<TraceBeamConfig> {\n return {\n apiKey: config.apiKey,\n projectId: config.projectId,\n environment: config.environment ?? DEFAULT_CONFIG.environment,\n endpoint: config.endpoint ?? DEFAULT_CONFIG.endpoint,\n batchSize: config.batchSize ?? DEFAULT_CONFIG.batchSize,\n flushInterval: config.flushInterval ?? DEFAULT_CONFIG.flushInterval,\n timeout: config.timeout ?? DEFAULT_CONFIG.timeout,\n maxQueueSize: config.maxQueueSize ?? DEFAULT_CONFIG.maxQueueSize,\n sampleRate: config.sampleRate ?? DEFAULT_CONFIG.sampleRate,\n debug: config.debug ?? DEFAULT_CONFIG.debug,\n };\n}\n\n/**\n * Validate configuration\n */\nexport function validateConfig(config: TraceBeamConfig): void {\n if (!config.apiKey || config.apiKey.trim() === '') {\n throw new ConfigError('apiKey is required');\n }\n\n if (!config.projectId || config.projectId.trim() === '') {\n throw new ConfigError('projectId is required');\n }\n\n if (config.environment !== undefined && config.environment.length > 64) {\n throw new ConfigError('environment must be at most 64 characters');\n }\n\n if (config.batchSize !== undefined && (config.batchSize < 1 || config.batchSize > 10000)) {\n throw new ConfigError('batchSize must be between 1 and 10000');\n }\n\n if (config.sampleRate !== undefined && (config.sampleRate < 0 || config.sampleRate > 1)) {\n throw new ConfigError('sampleRate must be between 0 and 1');\n }\n}\n\n// Helper functions for parsing environment variables\n\nfunction parseIntEnv(name: string, defaultValue: number): number {\n const value = process.env[name];\n if (!value) return defaultValue;\n const parsed = parseInt(value, 10);\n return isNaN(parsed) ? defaultValue : parsed;\n}\n\nfunction parseFloatEnv(name: string, defaultValue: number): number {\n const value = process.env[name];\n if (!value) return defaultValue;\n const parsed = parseFloat(value);\n return isNaN(parsed) ? defaultValue : parsed;\n}\n\nfunction parseBoolEnv(name: string, defaultValue: boolean): boolean {\n const value = process.env[name];\n if (!value) return defaultValue;\n return value.toLowerCase() === 'true' || value === '1';\n}\n"],"mappings":"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","names":["context","import_api","import_api","ExportResultCode","import_api","import_api","import_api","import_api"]}