@atrim/instrument-node 1.0.0
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/README.md +30 -0
- package/package.json +130 -0
- package/target/dist/index.cjs +1133 -0
- package/target/dist/index.cjs.map +1 -0
- package/target/dist/index.d.cts +548 -0
- package/target/dist/index.d.ts +548 -0
- package/target/dist/index.js +1095 -0
- package/target/dist/index.js.map +1 -0
- package/target/dist/integrations/effect/index.cjs +705 -0
- package/target/dist/integrations/effect/index.cjs.map +1 -0
- package/target/dist/integrations/effect/index.js +669 -0
- package/target/dist/integrations/effect/index.js.map +1 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../core/src/instrumentation-schema.ts","../../../core/src/errors.ts","../../../core/src/config-loader.ts","../../../core/src/pattern-matcher.ts","../../../core/src/logger.ts","../../src/core/span-processor.ts","../../src/core/exporter-factory.ts","../../src/core/safe-exporter.ts","../../src/core/errors.ts","../../src/core/service-detector.ts","../../src/core/sdk-initializer.ts","../../src/api.ts","../../src/integrations/standard/span-helpers.ts","../../src/core/test-utils.ts"],"names":["z","Data","Effect","readFileSync","parseYAML","Duration","Schedule","Cache","join","existsSync","__publicField","OTLPTraceExporter","ConfigError","ConfigUrlError","ConfigValidationError","ConfigFileError","ServiceDetectionError","InitializationError","ExportError","ShutdownError","readFile","trace","SimpleSpanProcessor","BatchSpanProcessor","getNodeAutoInstrumentations","NodeSDK"],"mappings":"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","file":"index.cjs","sourcesContent":["/**\n * Configuration schema using Zod\n */\nimport { z } from 'zod'\n\nexport const PatternConfigSchema = z.object({\n pattern: z.string(),\n enabled: z.boolean().optional(),\n description: z.string().optional()\n})\n\n/**\n * Configuration for automatic span isolation in Effect operations\n *\n * This prevents context leakage when using FiberSet.run, Effect.fork, etc.\n * while maintaining logical parent relationships via span links.\n */\nexport const AutoIsolationConfigSchema = z.object({\n // Global enable/disable for auto-isolation\n enabled: z.boolean().default(false),\n\n // Which operators to auto-isolate\n operators: z\n .object({\n fiberset_run: z.boolean().default(true),\n effect_fork: z.boolean().default(true),\n effect_fork_daemon: z.boolean().default(true),\n effect_fork_in: z.boolean().default(false)\n })\n .default({}),\n\n // Virtual parent tracking configuration\n tracking: z\n .object({\n use_span_links: z.boolean().default(true),\n use_attributes: z.boolean().default(true),\n capture_logical_parent: z.boolean().default(true)\n })\n .default({}),\n\n // Span categorization\n attributes: z\n .object({\n category: z.string().default('background_task'),\n add_metadata: z.boolean().default(true)\n })\n .default({})\n})\n\nexport const InstrumentationConfigSchema = z.object({\n version: z.string(),\n instrumentation: z.object({\n enabled: z.boolean(),\n description: z.string().optional(),\n logging: z.enum(['on', 'off', 'minimal']).optional().default('on'),\n instrument_patterns: z.array(PatternConfigSchema),\n ignore_patterns: z.array(PatternConfigSchema)\n }),\n effect: z\n .object({\n auto_extract_metadata: z.boolean(),\n auto_isolation: AutoIsolationConfigSchema.optional()\n })\n .optional()\n})\n\nexport type InstrumentationConfig = z.infer<typeof InstrumentationConfigSchema>\nexport type PatternConfig = z.infer<typeof PatternConfigSchema>\nexport type AutoIsolationConfig = z.infer<typeof AutoIsolationConfigSchema>\n","/**\n * Typed error hierarchy for @atrim/instrumentation\n *\n * These errors use Effect's Data.TaggedError for typed error handling\n * with proper discriminated unions.\n */\n\nimport { Data } from 'effect'\n\n/**\n * Base error for configuration-related failures\n */\nexport class ConfigError extends Data.TaggedError('ConfigError')<{\n reason: string\n cause?: unknown\n}> {}\n\n/**\n * Error when fetching configuration from a URL fails\n */\nexport class ConfigUrlError extends Data.TaggedError('ConfigUrlError')<{\n reason: string\n cause?: unknown\n}> {}\n\n/**\n * Error when configuration validation fails (invalid YAML, schema mismatch)\n */\nexport class ConfigValidationError extends Data.TaggedError('ConfigValidationError')<{\n reason: string\n cause?: unknown\n}> {}\n\n/**\n * Error when reading configuration from a file fails\n */\nexport class ConfigFileError extends Data.TaggedError('ConfigFileError')<{\n reason: string\n cause?: unknown\n}> {}\n\n/**\n * Error when service detection fails (package.json not found, invalid format)\n */\nexport class ServiceDetectionError extends Data.TaggedError('ServiceDetectionError')<{\n reason: string\n cause?: unknown\n}> {}\n\n/**\n * Error when OpenTelemetry SDK initialization fails\n */\nexport class InitializationError extends Data.TaggedError('InitializationError')<{\n reason: string\n cause?: unknown\n}> {}\n\n/**\n * Error when span export fails (e.g., ECONNREFUSED to collector)\n */\nexport class ExportError extends Data.TaggedError('ExportError')<{\n reason: string\n cause?: unknown\n}> {}\n\n/**\n * Error when shutting down the SDK fails\n */\nexport class ShutdownError extends Data.TaggedError('ShutdownError')<{\n reason: string\n cause?: unknown\n}> {}\n","/**\n * Configuration loading from file, URL, or environment\n *\n * Priority order (highest to lowest):\n * 1. Explicit config object (passed programmatically)\n * 2. Environment variable (ATRIM_INSTRUMENTATION_CONFIG)\n * 3. Project root file (./instrumentation.yaml)\n * 4. Default config (built-in defaults)\n *\n * Uses Effect for typed error handling, automatic caching, retry logic, and timeouts.\n */\n\nimport { Effect, Duration, Schedule, Cache } from 'effect'\nimport { readFileSync, existsSync } from 'fs'\nimport { join } from 'path'\nimport { parse as parseYAML } from 'yaml'\nimport {\n InstrumentationConfigSchema,\n type InstrumentationConfig\n} from './instrumentation-schema.js'\nimport { ConfigError, ConfigFileError, ConfigUrlError, ConfigValidationError } from './errors.js'\n\nexport interface ConfigLoaderOptions {\n configPath?: string\n configUrl?: string\n config?: InstrumentationConfig\n cacheTimeout?: number\n}\n\n// Security constraints\nconst SECURITY_DEFAULTS = {\n maxConfigSize: 1_000_000, // 1MB\n requestTimeout: 5_000, // 5 seconds\n maxRedirects: 3,\n allowedProtocols: ['https:'], // Only HTTPS for remote configs\n cacheTimeout: 300_000 // 5 minutes\n} as const\n\n/**\n * Get default configuration\n */\nfunction getDefaultConfig(): InstrumentationConfig {\n return {\n version: '1.0',\n instrumentation: {\n enabled: true,\n logging: 'on',\n description: 'Default instrumentation configuration',\n instrument_patterns: [\n { pattern: '^app\\\\.', enabled: true, description: 'Application operations' },\n { pattern: '^http\\\\.server\\\\.', enabled: true, description: 'HTTP server operations' },\n { pattern: '^http\\\\.client\\\\.', enabled: true, description: 'HTTP client operations' }\n ],\n ignore_patterns: [\n { pattern: '^test\\\\.', description: 'Test utilities' },\n { pattern: '^internal\\\\.', description: 'Internal operations' },\n { pattern: '^health\\\\.', description: 'Health checks' }\n ]\n },\n effect: {\n auto_extract_metadata: true\n }\n }\n}\n\n/**\n * Validate configuration against schema (Effect version)\n */\nconst validateConfigEffect = (\n rawConfig: unknown\n): Effect.Effect<InstrumentationConfig, ConfigValidationError> =>\n Effect.try({\n try: () => InstrumentationConfigSchema.parse(rawConfig),\n catch: (error) =>\n new ConfigValidationError({\n reason: 'Invalid configuration schema',\n cause: error\n })\n })\n\n/**\n * Load configuration from local file (Effect version)\n */\nconst loadConfigFromFileEffect = (\n filePath: string\n): Effect.Effect<InstrumentationConfig, ConfigFileError | ConfigValidationError> =>\n Effect.gen(function* () {\n // Read file\n const fileContents = yield* Effect.try({\n try: () => readFileSync(filePath, 'utf8'),\n catch: (error) =>\n new ConfigFileError({\n reason: `Failed to read config file at ${filePath}`,\n cause: error\n })\n })\n\n // Security: Check file size\n if (fileContents.length > SECURITY_DEFAULTS.maxConfigSize) {\n return yield* Effect.fail(\n new ConfigFileError({\n reason: `Config file exceeds maximum size of ${SECURITY_DEFAULTS.maxConfigSize} bytes`\n })\n )\n }\n\n // Parse YAML\n let rawConfig: unknown\n try {\n rawConfig = parseYAML(fileContents)\n } catch (error) {\n return yield* Effect.fail(\n new ConfigValidationError({\n reason: 'Invalid YAML syntax',\n cause: error\n })\n )\n }\n\n // Validate schema\n return yield* validateConfigEffect(rawConfig)\n })\n\n/**\n * Fetch and parse config from URL (Effect version)\n */\nconst fetchAndParseConfig = (\n url: string\n): Effect.Effect<InstrumentationConfig, ConfigUrlError | ConfigValidationError> =>\n Effect.gen(function* () {\n // Security: Validate protocol\n let urlObj: URL\n try {\n urlObj = new URL(url)\n } catch (error) {\n return yield* Effect.fail(\n new ConfigUrlError({\n reason: `Invalid URL: ${url}`,\n cause: error\n })\n )\n }\n\n if (!SECURITY_DEFAULTS.allowedProtocols.includes(urlObj.protocol as 'https:')) {\n return yield* Effect.fail(\n new ConfigUrlError({\n reason: `Insecure protocol ${urlObj.protocol}. Only ${SECURITY_DEFAULTS.allowedProtocols.join(', ')} are allowed`\n })\n )\n }\n\n // Fetch with timeout and retry\n const response = yield* Effect.tryPromise({\n try: () =>\n fetch(url, {\n redirect: 'follow',\n headers: {\n Accept: 'application/yaml, text/yaml, text/x-yaml'\n }\n }),\n catch: (error) =>\n new ConfigUrlError({\n reason: `Failed to load config from URL ${url}`,\n cause: error\n })\n }).pipe(\n Effect.timeout(Duration.millis(SECURITY_DEFAULTS.requestTimeout)),\n Effect.retry({\n times: 3,\n schedule: Schedule.exponential(Duration.millis(100))\n }),\n Effect.catchAll((error) => {\n // Handle timeout separately\n if (error._tag === 'TimeoutException') {\n return Effect.fail(\n new ConfigUrlError({\n reason: `Config fetch timeout after ${SECURITY_DEFAULTS.requestTimeout}ms`\n })\n )\n }\n return Effect.fail(error as ConfigUrlError)\n })\n )\n\n // Validate response\n if (!response.ok) {\n return yield* Effect.fail(\n new ConfigUrlError({\n reason: `HTTP ${response.status}: ${response.statusText}`\n })\n )\n }\n\n // Security: Check content length\n const contentLength = response.headers.get('content-length')\n if (contentLength && parseInt(contentLength) > SECURITY_DEFAULTS.maxConfigSize) {\n return yield* Effect.fail(\n new ConfigUrlError({\n reason: `Config exceeds maximum size of ${SECURITY_DEFAULTS.maxConfigSize} bytes`\n })\n )\n }\n\n // Read response text\n const text = yield* Effect.tryPromise({\n try: () => response.text(),\n catch: (error) =>\n new ConfigUrlError({\n reason: 'Failed to read response body',\n cause: error\n })\n })\n\n // Security: Double-check actual size\n if (text.length > SECURITY_DEFAULTS.maxConfigSize) {\n return yield* Effect.fail(\n new ConfigUrlError({\n reason: `Config exceeds maximum size of ${SECURITY_DEFAULTS.maxConfigSize} bytes`\n })\n )\n }\n\n // Parse YAML\n let rawConfig: unknown\n try {\n rawConfig = parseYAML(text)\n } catch (error) {\n return yield* Effect.fail(\n new ConfigValidationError({\n reason: 'Invalid YAML syntax',\n cause: error\n })\n )\n }\n\n // Validate schema\n return yield* validateConfigEffect(rawConfig)\n })\n\n/**\n * Create cached config loader with Effect.cached\n */\nconst makeConfigCache = () =>\n Cache.make({\n capacity: 100,\n timeToLive: Duration.minutes(5),\n lookup: (url: string) => fetchAndParseConfig(url)\n })\n\n// Global cache instance\nlet cacheInstance: Cache.Cache<\n string,\n InstrumentationConfig,\n ConfigUrlError | ConfigValidationError\n> | null = null\n\n/**\n * Get or create cache instance\n */\nconst getCache = Effect.gen(function* () {\n if (!cacheInstance) {\n cacheInstance = yield* makeConfigCache()\n }\n return cacheInstance\n})\n\n/**\n * Load configuration from URL with caching (Effect version)\n */\nconst loadConfigFromUrlEffect = (\n url: string,\n cacheTimeout: number = SECURITY_DEFAULTS.cacheTimeout\n): Effect.Effect<InstrumentationConfig, ConfigUrlError | ConfigValidationError> =>\n Effect.gen(function* () {\n // Bypass cache if timeout is 0\n if (cacheTimeout === 0) {\n return yield* fetchAndParseConfig(url)\n }\n\n // Use cache\n const cache = yield* getCache\n return yield* cache.get(url)\n })\n\n/**\n * Load configuration with priority order (Effect version)\n */\nexport const loadConfigEffect = (\n options: ConfigLoaderOptions = {}\n): Effect.Effect<\n InstrumentationConfig,\n ConfigError | ConfigFileError | ConfigUrlError | ConfigValidationError\n> =>\n Effect.gen(function* () {\n // Priority 1: Explicit config object\n if (options.config) {\n return yield* validateConfigEffect(options.config)\n }\n\n // Priority 2: Environment variable\n const envConfigPath = process.env.ATRIM_INSTRUMENTATION_CONFIG\n if (envConfigPath) {\n if (envConfigPath.startsWith('http://') || envConfigPath.startsWith('https://')) {\n return yield* loadConfigFromUrlEffect(envConfigPath, options.cacheTimeout)\n }\n return yield* loadConfigFromFileEffect(envConfigPath)\n }\n\n // Priority 3: Explicit options\n if (options.configUrl) {\n return yield* loadConfigFromUrlEffect(options.configUrl, options.cacheTimeout)\n }\n if (options.configPath) {\n return yield* loadConfigFromFileEffect(options.configPath)\n }\n\n // Priority 4: Project root file\n const defaultPath = join(process.cwd(), 'instrumentation.yaml')\n const exists = yield* Effect.sync(() => existsSync(defaultPath))\n\n if (exists) {\n return yield* loadConfigFromFileEffect(defaultPath)\n }\n\n // Priority 5: Default config\n return getDefaultConfig()\n })\n\n// ============================================================================\n// Promise API (Backward Compatible)\n// ============================================================================\n\n/**\n * Load configuration with priority order (Promise version)\n *\n * Throws errors for backward compatibility with existing behavior.\n * Use `loadConfigEffect` for typed error handling in error channel.\n */\nexport async function loadConfig(\n options: ConfigLoaderOptions = {}\n): Promise<InstrumentationConfig> {\n return Effect.runPromise(\n loadConfigEffect(options).pipe(\n // Convert typed errors to regular Error with reason message for backward compatibility\n Effect.mapError((error) => {\n const message = error.reason\n const newError = new Error(message)\n newError.cause = error.cause\n return newError\n })\n )\n )\n}\n\n/**\n * Clear the config cache (useful for testing)\n */\nexport function clearConfigCache(): void {\n cacheInstance = null\n}\n","/**\n * Pattern matching utilities\n *\n * Implements efficient pattern-based span filtering with caching.\n *\n * Matching rules:\n * 1. Check ignore patterns first (takes precedence)\n * 2. Check instrument patterns second\n * 3. Default behavior: If no patterns match, span is created (fail-open)\n */\n\nimport type { InstrumentationConfig, PatternConfig } from './instrumentation-schema.js'\n\n/**\n * Compiled pattern with metadata\n */\ninterface CompiledPattern {\n regex: RegExp\n enabled: boolean\n description?: string\n}\n\n/**\n * Pattern matcher with compiled regex cache\n */\nexport class PatternMatcher {\n private ignorePatterns: CompiledPattern[] = []\n private instrumentPatterns: CompiledPattern[] = []\n private enabled: boolean = true\n\n constructor(config: InstrumentationConfig) {\n this.enabled = config.instrumentation.enabled\n\n // Compile ignore patterns (highest priority)\n this.ignorePatterns = config.instrumentation.ignore_patterns.map((p) => this.compilePattern(p))\n\n // Compile instrument patterns\n this.instrumentPatterns = config.instrumentation.instrument_patterns\n .filter((p) => p.enabled !== false) // Filter out disabled patterns\n .map((p) => this.compilePattern(p))\n }\n\n /**\n * Compile a pattern configuration into a RegExp\n */\n private compilePattern(pattern: PatternConfig): CompiledPattern {\n try {\n const compiled: CompiledPattern = {\n regex: new RegExp(pattern.pattern),\n enabled: pattern.enabled !== false\n }\n if (pattern.description !== undefined) {\n compiled.description = pattern.description\n }\n return compiled\n } catch (error) {\n throw new Error(\n `Failed to compile pattern \"${pattern.pattern}\": ${error instanceof Error ? error.message : String(error)}`\n )\n }\n }\n\n /**\n * Check if a span should be instrumented\n *\n * Returns true if the span should be created, false otherwise.\n *\n * Logic:\n * 1. If instrumentation disabled globally, return false\n * 2. Check ignore patterns - if any match, return false\n * 3. Check instrument patterns - if any match, return true\n * 4. Default: return true (fail-open - create span if no patterns match)\n */\n shouldInstrument(spanName: string): boolean {\n // Global disable\n if (!this.enabled) {\n return false\n }\n\n // Check ignore patterns first (highest priority)\n for (const pattern of this.ignorePatterns) {\n if (pattern.regex.test(spanName)) {\n return false\n }\n }\n\n // Check instrument patterns\n for (const pattern of this.instrumentPatterns) {\n if (pattern.enabled && pattern.regex.test(spanName)) {\n return true\n }\n }\n\n // Default: fail-open (create span if no patterns match)\n // This ensures backward compatibility and doesn't break existing instrumentation\n return true\n }\n\n /**\n * Get statistics about pattern matching (for debugging/monitoring)\n */\n getStats(): {\n enabled: boolean\n ignorePatternCount: number\n instrumentPatternCount: number\n } {\n return {\n enabled: this.enabled,\n ignorePatternCount: this.ignorePatterns.length,\n instrumentPatternCount: this.instrumentPatterns.filter((p) => p.enabled).length\n }\n }\n}\n\n// Global pattern matcher instance\nlet globalMatcher: PatternMatcher | null = null\n\n/**\n * Initialize the global pattern matcher\n */\nexport function initializePatternMatcher(config: InstrumentationConfig): void {\n globalMatcher = new PatternMatcher(config)\n}\n\n/**\n * Check if a span should be instrumented (uses global matcher)\n *\n * This is a convenience function for use without direct access to the matcher instance.\n * If no matcher is initialized, defaults to true (fail-open).\n */\nexport function shouldInstrumentSpan(spanName: string): boolean {\n if (!globalMatcher) {\n // No matcher initialized - fail open\n return true\n }\n return globalMatcher.shouldInstrument(spanName)\n}\n\n/**\n * Get the global pattern matcher (for advanced use cases)\n */\nexport function getPatternMatcher(): PatternMatcher | null {\n return globalMatcher\n}\n\n/**\n * Clear the global pattern matcher (useful for testing)\n */\nexport function clearPatternMatcher(): void {\n globalMatcher = null\n}\n","/**\n * Centralized logging utility for @atrim/instrumentation\n *\n * Supports three levels:\n * - 'on' (default): All logging enabled\n * - 'minimal': Only a single initialization message + errors/warnings\n * - 'off': No logging at all\n */\n\nexport type LogLevel = 'on' | 'off' | 'minimal'\n\nclass Logger {\n private level: LogLevel = 'on'\n private hasLoggedMinimal = false\n\n /**\n * Set the logging level\n */\n setLevel(level: LogLevel): void {\n this.level = level\n this.hasLoggedMinimal = false\n }\n\n /**\n * Get the current logging level\n */\n getLevel(): LogLevel {\n return this.level\n }\n\n /**\n * Log a minimal initialization message (only shown once in minimal mode)\n */\n minimal(message: string): void {\n if (this.level === 'off') {\n return\n }\n\n if (this.level === 'minimal' && !this.hasLoggedMinimal) {\n console.log(message)\n this.hasLoggedMinimal = true\n return\n }\n\n if (this.level === 'on') {\n console.log(message)\n }\n }\n\n /**\n * Log an informational message\n */\n log(...args: unknown[]): void {\n if (this.level === 'on') {\n console.log(...args)\n }\n }\n\n /**\n * Log a warning message (shown in minimal mode)\n */\n warn(...args: unknown[]): void {\n if (this.level !== 'off') {\n console.warn(...args)\n }\n }\n\n /**\n * Log an error message (shown in minimal mode)\n */\n error(...args: unknown[]): void {\n if (this.level !== 'off') {\n console.error(...args)\n }\n }\n\n /**\n * Check if full logging is enabled\n */\n isEnabled(): boolean {\n return this.level === 'on'\n }\n\n /**\n * Check if minimal logging is enabled\n */\n isMinimal(): boolean {\n return this.level === 'minimal'\n }\n\n /**\n * Check if logging is completely disabled\n */\n isDisabled(): boolean {\n return this.level === 'off'\n }\n}\n\n// Singleton instance\nexport const logger = new Logger()\n","/**\n * OpenTelemetry SpanProcessor for pattern-based filtering\n *\n * This processor filters spans based on configured patterns before they are exported.\n * It wraps another processor (typically BatchSpanProcessor) and only forwards spans\n * that match the instrumentation patterns.\n */\n\nimport type { Span, SpanProcessor, ReadableSpan } from '@opentelemetry/sdk-trace-base'\nimport type { Context } from '@opentelemetry/api'\nimport { PatternMatcher, type InstrumentationConfig } from '@atrim/instrument-core'\n\n/**\n * SpanProcessor that filters spans based on pattern configuration\n *\n * This processor sits in the processing pipeline and decides whether a span\n * should be forwarded to the next processor (for export) or dropped.\n *\n * Usage:\n * ```typescript\n * const exporter = new OTLPTraceExporter()\n * const batchProcessor = new BatchSpanProcessor(exporter)\n * const patternProcessor = new PatternSpanProcessor(config, batchProcessor)\n *\n * const sdk = new NodeSDK({\n * spanProcessor: patternProcessor\n * })\n * ```\n */\nexport class PatternSpanProcessor implements SpanProcessor {\n private matcher: PatternMatcher\n private wrappedProcessor: SpanProcessor\n\n constructor(config: InstrumentationConfig, wrappedProcessor: SpanProcessor) {\n this.matcher = new PatternMatcher(config)\n this.wrappedProcessor = wrappedProcessor\n }\n\n /**\n * Called when a span is started\n *\n * We check if the span should be instrumented here. If not, we can mark it\n * to be dropped later in onEnd().\n */\n onStart(span: Span, parentContext: Context): void {\n const spanName = span.name\n\n if (this.matcher.shouldInstrument(spanName)) {\n // Forward to wrapped processor\n this.wrappedProcessor.onStart(span, parentContext)\n }\n // If should not instrument, we simply don't forward to the wrapped processor\n // The span will still be created (for correct parent-child relationships)\n // but won't be exported\n }\n\n /**\n * Called when a span is ended\n *\n * This is where we make the final decision on whether to export the span.\n */\n onEnd(span: ReadableSpan): void {\n const spanName = span.name\n\n if (this.matcher.shouldInstrument(spanName)) {\n // Forward to wrapped processor for export\n this.wrappedProcessor.onEnd(span)\n }\n // Otherwise, drop the span (don't export)\n }\n\n /**\n * Shutdown the processor\n */\n async shutdown(): Promise<void> {\n return this.wrappedProcessor.shutdown()\n }\n\n /**\n * Force flush any pending spans\n */\n async forceFlush(): Promise<void> {\n return this.wrappedProcessor.forceFlush()\n }\n\n /**\n * Get the pattern matcher (for debugging/testing)\n */\n getPatternMatcher(): PatternMatcher {\n return this.matcher\n }\n}\n","/**\n * OTLP Exporter Factory\n *\n * Creates and configures OTLP trace exporters with smart defaults\n */\n\nimport { OTLPTraceExporter } from '@opentelemetry/exporter-trace-otlp-http'\n\nexport interface OtlpExporterOptions {\n /**\n * OTLP endpoint URL\n * Defaults to OTEL_EXPORTER_OTLP_ENDPOINT or http://localhost:4318/v1/traces\n */\n endpoint?: string\n\n /**\n * Custom headers to send with requests\n * Useful for authentication, custom routing, etc.\n */\n headers?: Record<string, string>\n}\n\n/**\n * Default OTLP endpoint\n */\nconst DEFAULT_OTLP_ENDPOINT = 'http://localhost:4318/v1/traces'\n\n/**\n * Create an OTLP trace exporter with smart defaults\n *\n * Priority for endpoint:\n * 1. Explicit endpoint option\n * 2. OTEL_EXPORTER_OTLP_TRACES_ENDPOINT environment variable\n * 3. OTEL_EXPORTER_OTLP_ENDPOINT environment variable\n * 4. Default: http://localhost:4318/v1/traces\n */\nexport function createOtlpExporter(options: OtlpExporterOptions = {}): OTLPTraceExporter {\n const endpoint =\n options.endpoint ||\n process.env.OTEL_EXPORTER_OTLP_TRACES_ENDPOINT ||\n process.env.OTEL_EXPORTER_OTLP_ENDPOINT ||\n DEFAULT_OTLP_ENDPOINT\n\n // Ensure endpoint has /v1/traces path if not already present\n const normalizedEndpoint = normalizeEndpoint(endpoint)\n\n const config: { url: string; headers?: Record<string, string>; timeoutMillis?: number } = {\n url: normalizedEndpoint\n }\n\n if (options.headers) {\n config.headers = options.headers\n }\n\n return new OTLPTraceExporter(config)\n}\n\n/**\n * Normalize OTLP endpoint URL\n *\n * If the endpoint doesn't include a path, append /v1/traces\n */\nfunction normalizeEndpoint(endpoint: string): string {\n try {\n const url = new URL(endpoint)\n\n // If path is empty or just /, append /v1/traces\n if (!url.pathname || url.pathname === '/') {\n url.pathname = '/v1/traces'\n return url.toString()\n }\n\n // Otherwise, use as-is\n return endpoint\n } catch {\n // Invalid URL, return as-is and let OTLPTraceExporter handle the error\n return endpoint\n }\n}\n\n/**\n * Get the OTLP endpoint that would be used with current configuration\n *\n * Useful for debugging and logging\n */\nexport function getOtlpEndpoint(options: OtlpExporterOptions = {}): string {\n const endpoint =\n options.endpoint ||\n process.env.OTEL_EXPORTER_OTLP_TRACES_ENDPOINT ||\n process.env.OTEL_EXPORTER_OTLP_ENDPOINT ||\n DEFAULT_OTLP_ENDPOINT\n\n return normalizeEndpoint(endpoint)\n}\n","/**\n * Safe OTLP Exporter Wrapper\n *\n * Wraps the standard OTLP exporter to catch and handle errors gracefully\n * instead of letting them become uncaught exceptions.\n *\n * This addresses the ECONNREFUSED errors that occur when:\n * 1. BatchSpanProcessor tries to export spans in the background\n * 2. The collector is not available\n * 3. The connection error escapes as an uncaught exception\n */\n\nimport type { ReadableSpan } from '@opentelemetry/sdk-trace-base'\nimport { logger } from '@atrim/instrument-core'\n\n/**\n * Export result from span exporter\n */\nexport interface ExportResult {\n code: number // 0 = SUCCESS, 2 = FAILED\n error?: Error\n}\n\n/**\n * Generic span exporter interface\n */\nexport interface SpanExporter {\n export(spans: ReadableSpan[], resultCallback: (result: ExportResult) => void): void\n shutdown(): Promise<void>\n forceFlush?(): Promise<void>\n}\n\n/**\n * Safe exporter that wraps any span exporter and catches errors\n */\nexport class SafeSpanExporter implements SpanExporter {\n private readonly exporter: SpanExporter\n private errorCount = 0\n private lastErrorTime = 0\n private readonly errorThrottleMs = 60000 // Log errors max once per minute\n\n constructor(exporter: SpanExporter) {\n this.exporter = exporter\n }\n\n /**\n * Export spans with error handling\n */\n export(spans: ReadableSpan[], resultCallback: (result: ExportResult) => void): void {\n try {\n // Wrap the exporter's export method\n this.exporter.export(spans, (result) => {\n // Handle both success and failure results\n if (result.code !== 0 /* SUCCESS */) {\n this.handleExportError(result.error)\n }\n resultCallback(result)\n })\n } catch (error) {\n // Catch synchronous errors from the export call itself\n this.handleExportError(error)\n\n // Return failure result\n resultCallback({\n code: 2, // FAILED\n error: error instanceof Error ? error : new Error(String(error))\n })\n }\n }\n\n /**\n * Shutdown with error handling\n */\n async shutdown(): Promise<void> {\n try {\n await this.exporter.shutdown()\n } catch (error) {\n // Log but don't throw - shutdown errors are not critical\n logger.error(\n '@atrim/instrumentation: Error during exporter shutdown (non-critical):',\n error instanceof Error ? error.message : String(error)\n )\n }\n }\n\n /**\n * Force flush with error handling\n */\n async forceFlush(): Promise<void> {\n if (!this.exporter.forceFlush) {\n return\n }\n\n try {\n await this.exporter.forceFlush()\n } catch (error) {\n this.handleExportError(error)\n }\n }\n\n /**\n * Handle export errors with throttling\n */\n private handleExportError(error: unknown): void {\n this.errorCount++\n\n const now = Date.now()\n const shouldLog = now - this.lastErrorTime > this.errorThrottleMs\n\n if (shouldLog) {\n const errorMessage = error instanceof Error ? error.message : String(error)\n\n // Check if this is a connection error\n if (this.isConnectionError(error)) {\n logger.warn(`@atrim/instrumentation: Unable to export spans - collector not available`)\n logger.warn(` Error: ${errorMessage}`)\n logger.warn(` Spans will be dropped. Ensure OTEL collector is running.`)\n } else {\n logger.error('@atrim/instrumentation: Span export failed:', errorMessage)\n }\n\n if (this.errorCount > 1) {\n logger.warn(` (${this.errorCount} errors total, throttled to 1/min)`)\n }\n\n this.lastErrorTime = now\n this.errorCount = 0 // Reset count after logging\n }\n }\n\n /**\n * Check if error is a connection error (ECONNREFUSED, ENOTFOUND, etc.)\n */\n private isConnectionError(error: unknown): boolean {\n if (!error || typeof error !== 'object') {\n return false\n }\n\n const err = error as { code?: string; message?: string; errors?: unknown[] }\n\n // Direct error code check\n if (err.code === 'ECONNREFUSED' || err.code === 'ENOTFOUND' || err.code === 'ETIMEDOUT') {\n return true\n }\n\n // AggregateError check (multiple connection attempts)\n if (Array.isArray(err.errors)) {\n return err.errors.every((e) => this.isConnectionError(e))\n }\n\n // Message-based check\n if (err.message) {\n const msg = err.message.toLowerCase()\n return (\n msg.includes('econnrefused') ||\n msg.includes('enotfound') ||\n msg.includes('etimedout') ||\n msg.includes('connection refused')\n )\n }\n\n return false\n }\n}\n","/**\n * Typed error hierarchy for @atrim/instrumentation\n *\n * These errors use Effect's Data.TaggedError for typed error handling\n * with proper discriminated unions.\n */\n\nimport { Data } from 'effect'\n\n/**\n * Base error for configuration-related failures\n */\nexport class ConfigError extends Data.TaggedError('ConfigError')<{\n reason: string\n cause?: unknown\n}> {}\n\n/**\n * Error when fetching configuration from a URL fails\n */\nexport class ConfigUrlError extends Data.TaggedError('ConfigUrlError')<{\n reason: string\n cause?: unknown\n}> {}\n\n/**\n * Error when configuration validation fails (invalid YAML, schema mismatch)\n */\nexport class ConfigValidationError extends Data.TaggedError('ConfigValidationError')<{\n reason: string\n cause?: unknown\n}> {}\n\n/**\n * Error when reading configuration from a file fails\n */\nexport class ConfigFileError extends Data.TaggedError('ConfigFileError')<{\n reason: string\n cause?: unknown\n}> {}\n\n/**\n * Error when service detection fails (package.json not found, invalid format)\n */\nexport class ServiceDetectionError extends Data.TaggedError('ServiceDetectionError')<{\n reason: string\n cause?: unknown\n}> {}\n\n/**\n * Error when OpenTelemetry SDK initialization fails\n */\nexport class InitializationError extends Data.TaggedError('InitializationError')<{\n reason: string\n cause?: unknown\n}> {}\n\n/**\n * Error when span export fails (e.g., ECONNREFUSED to collector)\n */\nexport class ExportError extends Data.TaggedError('ExportError')<{\n reason: string\n cause?: unknown\n}> {}\n\n/**\n * Error when shutting down the SDK fails\n */\nexport class ShutdownError extends Data.TaggedError('ShutdownError')<{\n reason: string\n cause?: unknown\n}> {}\n","/**\n * Service Detection Utilities\n *\n * Auto-detects service name and version from environment variables and package.json\n * Uses Effect for typed error handling and composability\n */\n\nimport { Effect } from 'effect'\nimport { readFile } from 'fs/promises'\nimport { join } from 'path'\nimport { ServiceDetectionError } from './errors.js'\n\nexport interface ServiceInfo {\n name: string\n version?: string | undefined\n}\n\n/**\n * Detect service name and version (Effect version)\n *\n * Priority order:\n * 1. OTEL_SERVICE_NAME environment variable\n * 2. package.json name field\n * 3. Fallback to 'unknown-service'\n *\n * Version:\n * 1. OTEL_SERVICE_VERSION environment variable\n * 2. package.json version field\n * 3. undefined (not set)\n *\n * @returns Effect that yields ServiceInfo or ServiceDetectionError\n */\nexport const detectServiceInfo: Effect.Effect<ServiceInfo, ServiceDetectionError> = Effect.gen(\n function* () {\n // Try environment variables first\n const envServiceName = process.env.OTEL_SERVICE_NAME\n const envServiceVersion = process.env.OTEL_SERVICE_VERSION\n\n if (envServiceName) {\n return {\n name: envServiceName,\n version: envServiceVersion\n }\n }\n\n // Try package.json\n const packageJsonPath = join(process.cwd(), 'package.json')\n\n const packageJsonContent = yield* Effect.tryPromise({\n try: () => readFile(packageJsonPath, 'utf-8'),\n catch: (error) =>\n new ServiceDetectionError({\n reason: `Failed to read package.json at ${packageJsonPath}`,\n cause: error\n })\n })\n\n // Parse JSON\n let parsed: unknown\n try {\n parsed = JSON.parse(packageJsonContent)\n } catch (error) {\n yield* Effect.fail(\n new ServiceDetectionError({\n reason: 'Invalid JSON in package.json',\n cause: error\n })\n )\n }\n\n // Extract name and version\n if (typeof parsed === 'object' && parsed !== null) {\n const packageJson = parsed as {\n name?: string\n version?: string\n }\n\n if (packageJson.name) {\n return {\n name: packageJson.name,\n version: envServiceVersion || packageJson.version\n }\n }\n }\n\n // If package.json exists but has no name, fail with error\n return yield* Effect.fail(\n new ServiceDetectionError({\n reason: 'package.json exists but has no \"name\" field'\n })\n )\n }\n)\n\n/**\n * Get service name with fallback (Effect version)\n *\n * Never fails - returns 'unknown-service' if detection fails\n */\nexport const getServiceName: Effect.Effect<string, never> = detectServiceInfo.pipe(\n Effect.map((info) => info.name),\n Effect.catchAll(() => Effect.succeed('unknown-service'))\n)\n\n/**\n * Get service version with fallback (Effect version)\n *\n * Never fails - returns undefined if detection fails\n */\nexport const getServiceVersion: Effect.Effect<string | undefined, never> = detectServiceInfo.pipe(\n Effect.map((info) => info.version),\n Effect.catchAll(() => Effect.succeed(undefined))\n)\n\n/**\n * Get service info with fallback (Effect version)\n *\n * Never fails - returns default ServiceInfo if detection fails\n */\nexport const getServiceInfoWithFallback: Effect.Effect<ServiceInfo, never> = detectServiceInfo.pipe(\n Effect.catchAll(() =>\n Effect.succeed({\n name: 'unknown-service',\n version: process.env.OTEL_SERVICE_VERSION\n })\n )\n)\n\n// ============================================================================\n// Promise API (Backward Compatible)\n// ============================================================================\n\n/**\n * Detect service name and version (Promise version)\n *\n * @deprecated Use `detectServiceInfo` Effect API for better error handling\n * @returns Promise that resolves to ServiceInfo with fallback\n */\nexport async function detectServiceInfoAsync(): Promise<ServiceInfo> {\n return Effect.runPromise(getServiceInfoWithFallback)\n}\n\n/**\n * Get service name with fallback (Promise version)\n *\n * @deprecated Use `getServiceName` Effect API\n */\nexport async function getServiceNameAsync(): Promise<string> {\n return Effect.runPromise(getServiceName)\n}\n\n/**\n * Get service version if available (Promise version)\n *\n * @deprecated Use `getServiceVersion` Effect API\n */\nexport async function getServiceVersionAsync(): Promise<string | undefined> {\n return Effect.runPromise(getServiceVersion)\n}\n","/**\n * NodeSDK Initialization\n *\n * Provides comprehensive OpenTelemetry SDK initialization with smart defaults\n */\n\nimport { NodeSDK, NodeSDKConfiguration } from '@opentelemetry/sdk-node'\nimport { BatchSpanProcessor, SimpleSpanProcessor } from '@opentelemetry/sdk-trace-base'\nimport { getNodeAutoInstrumentations } from '@opentelemetry/auto-instrumentations-node'\nimport type { Instrumentation } from '@opentelemetry/instrumentation'\nimport { trace } from '@opentelemetry/api'\nimport { PatternSpanProcessor } from './span-processor.js'\nimport { createOtlpExporter, type OtlpExporterOptions } from './exporter-factory.js'\nimport { SafeSpanExporter } from './safe-exporter.js'\nimport { detectServiceInfoAsync } from './service-detector.js'\nimport {\n loadConfig,\n type ConfigLoaderOptions,\n type InstrumentationConfig,\n type PatternConfig,\n initializePatternMatcher,\n logger\n} from '@atrim/instrument-core'\n\nexport interface SdkInitializationOptions extends ConfigLoaderOptions {\n /**\n * OTLP exporter configuration\n */\n otlp?: OtlpExporterOptions\n\n /**\n * Service name\n * If not provided, auto-detects from OTEL_SERVICE_NAME or package.json\n */\n serviceName?: string\n\n /**\n * Service version\n * If not provided, auto-detects from OTEL_SERVICE_VERSION or package.json\n */\n serviceVersion?: string\n\n /**\n * Enable auto-instrumentation\n * Default: auto-detected based on your runtime and framework\n * - true: Enables Express, HTTP, and other common instrumentations\n * - false: Disables all auto-instrumentation (manual spans only)\n * - undefined: Smart detection (checks for Effect-TS usage)\n */\n autoInstrument?: boolean\n\n /**\n * Custom instrumentations to add\n * These are added in addition to auto-instrumentations (if enabled)\n */\n instrumentations?: Instrumentation[]\n\n /**\n * Advanced: Full NodeSDK configuration override\n * Provides complete control over SDK initialization\n */\n sdk?: Partial<NodeSDKConfiguration>\n\n /**\n * Disable automatic shutdown handler registration\n * Default: false (automatic shutdown is enabled)\n */\n disableAutoShutdown?: boolean\n}\n\n/**\n * Global SDK instance\n */\nlet sdkInstance: NodeSDK | null = null\n\n/**\n * Ongoing initialization promise (prevents race conditions)\n */\nlet initializationPromise: Promise<NodeSDK | null> | null = null\n\n/**\n * Detect if Effect-TS is being used in the project\n *\n * Checks if the 'effect' package is installed\n */\nfunction isEffectProject(): boolean {\n try {\n // Try to resolve the effect package\n require.resolve('effect')\n return true\n } catch {\n return false\n }\n}\n\n/**\n * Determine if auto-instrumentation should be enabled\n *\n * Smart defaults:\n * - If explicitly set, use that value\n * - If Effect-TS is detected AND no web framework detected, default to false\n * - Otherwise, default to true\n */\nfunction shouldEnableAutoInstrumentation(\n explicitValue: boolean | undefined,\n hasWebFramework: boolean\n): boolean {\n // If explicitly set, honor that\n if (explicitValue !== undefined) {\n return explicitValue\n }\n\n // Smart detection: Effect-only projects (no web framework) don't need auto-instrumentation\n // Effect with Express/Fastify/etc DOES benefit from auto-instrumentation\n const isEffect = isEffectProject()\n\n if (isEffect && !hasWebFramework) {\n logger.log('@atrim/instrumentation: Detected Effect-TS without web framework')\n logger.log(' - Auto-instrumentation disabled by default')\n logger.log(' - Effect.withSpan() will create spans')\n return false\n }\n\n // Default: enable auto-instrumentation\n return true\n}\n\n/**\n * Detect if a web framework is likely being used\n *\n * Checks for common web framework packages\n */\nfunction hasWebFrameworkInstalled(): boolean {\n const frameworks = ['express', 'fastify', 'koa', '@hono/node-server', 'restify']\n\n for (const framework of frameworks) {\n try {\n require.resolve(framework)\n return true\n } catch {\n // Framework not found, continue\n }\n }\n\n return false\n}\n\n/**\n * Check if OpenTelemetry tracing is already initialized\n *\n * Detects if a TracerProvider has already been registered globally\n */\nfunction isTracingAlreadyInitialized(): boolean {\n try {\n const provider = trace.getTracerProvider()\n\n // The default uninitialized state is a ProxyTracerProvider that wraps NoopTracerProvider\n // After NodeSDK.start(), it becomes a ProxyTracerProvider that wraps a real provider\n // We can detect this by checking for the _delegate property\n const providerWithDelegate = provider as unknown as {\n _delegate?: unknown\n getDelegate?: () => unknown\n }\n const delegate = providerWithDelegate._delegate || providerWithDelegate.getDelegate?.()\n\n if (delegate) {\n // Check if the delegate is not a NoopTracerProvider\n const delegateName = (delegate as { constructor: { name: string } }).constructor.name\n if (!delegateName.includes('Noop')) {\n return true\n }\n }\n\n // Also check for direct TracerProvider properties (resource, activeSpanProcessor, etc.)\n // These exist on real providers but not on NoopTracerProvider\n const providerWithProps = provider as unknown as {\n resource?: unknown\n activeSpanProcessor?: unknown\n _tracers?: unknown\n }\n const hasResource = providerWithProps.resource !== undefined\n const hasActiveSpanProcessor = providerWithProps.activeSpanProcessor !== undefined\n const hasTracers = providerWithProps._tracers !== undefined\n\n return hasResource || hasActiveSpanProcessor || hasTracers\n } catch {\n return false\n }\n}\n\n/**\n * Initialize OpenTelemetry NodeSDK with pattern-based span filtering\n *\n * This function:\n * 1. Detects if OpenTelemetry is already initialized (skips SDK setup if so)\n * 2. Loads instrumentation configuration (patterns, etc.)\n * 3. Creates OTLP exporter with smart defaults\n * 4. Sets up BatchSpanProcessor → PatternSpanProcessor chain\n * 5. Initializes NodeSDK with auto-instrumentations\n * 6. Registers graceful shutdown handlers\n *\n * If tracing is already initialized, this function will only set up pattern\n * matching and skip NodeSDK initialization.\n *\n * @returns The initialized NodeSDK instance, or null if skipped\n */\nexport async function initializeSdk(\n options: SdkInitializationOptions = {}\n): Promise<NodeSDK | null> {\n // Check if we already initialized via this library\n if (sdkInstance) {\n logger.warn('@atrim/instrumentation: SDK already initialized. Returning existing instance.')\n return sdkInstance\n }\n\n // Check if initialization is already in progress (prevents race conditions)\n if (initializationPromise) {\n logger.log(\n '@atrim/instrumentation: SDK already initialized, waiting for initialization to complete...'\n )\n return initializationPromise\n }\n\n // Start initialization and track the promise\n initializationPromise = performInitialization(options)\n\n try {\n const result = await initializationPromise\n return result\n } finally {\n // Clear the promise once initialization is complete\n initializationPromise = null\n }\n}\n\n/**\n * Internal initialization implementation\n */\nasync function performInitialization(options: SdkInitializationOptions): Promise<NodeSDK | null> {\n // 1. Load configuration first (including logging level)\n const config = await loadConfig(options)\n\n // 2. Configure logger based on config\n const loggingLevel = config.instrumentation.logging || 'on'\n logger.setLevel(loggingLevel)\n\n // Check if OpenTelemetry is already initialized elsewhere\n const alreadyInitialized = isTracingAlreadyInitialized()\n\n if (alreadyInitialized) {\n logger.log('@atrim/instrumentation: Detected existing OpenTelemetry initialization.')\n logger.log(' - Skipping NodeSDK setup')\n logger.log(' - Setting up pattern-based filtering only')\n logger.log('')\n\n // Initialize pattern matcher for filtering\n initializePatternMatcher(config)\n\n logger.log('@atrim/instrumentation: Pattern filtering initialized')\n logger.log(' ⚠️ Note: Pattern filtering will only work with manual spans')\n logger.log(' ⚠️ Auto-instrumentation must be configured separately')\n logger.log('')\n\n return null\n }\n\n // 3. Detect service info\n const serviceInfo = await detectServiceInfoAsync()\n const serviceName = options.serviceName || serviceInfo.name\n const serviceVersion = options.serviceVersion || serviceInfo.version\n\n // 4. Create OTLP exporter wrapped in SafeSpanExporter\n // The safe exporter catches and handles connection errors gracefully\n // instead of letting them escape as uncaught exceptions\n const rawExporter = createOtlpExporter(options.otlp)\n const exporter = new SafeSpanExporter(rawExporter)\n\n // 5. Create span processor chain\n // Use SimpleSpanProcessor in test mode to avoid shutdown race conditions\n // with BatchSpanProcessor's background export timer\n const useSimpleProcessor =\n process.env.NODE_ENV === 'test' || process.env.OTEL_USE_SIMPLE_PROCESSOR === 'true'\n const baseProcessor = useSimpleProcessor\n ? new SimpleSpanProcessor(exporter)\n : new BatchSpanProcessor(exporter)\n const patternProcessor = new PatternSpanProcessor(config, baseProcessor)\n\n // 6. Prepare instrumentations\n const instrumentations: Instrumentation[] = []\n\n // Determine if auto-instrumentation should be enabled\n const hasWebFramework = hasWebFrameworkInstalled()\n const enableAutoInstrumentation = shouldEnableAutoInstrumentation(\n options.autoInstrument,\n hasWebFramework\n )\n\n // Add auto-instrumentations if enabled\n if (enableAutoInstrumentation) {\n instrumentations.push(\n ...getNodeAutoInstrumentations({\n // Enable common instrumentations\n '@opentelemetry/instrumentation-http': { enabled: true },\n '@opentelemetry/instrumentation-express': { enabled: true },\n '@opentelemetry/instrumentation-fastify': { enabled: true },\n '@opentelemetry/instrumentation-koa': { enabled: true },\n\n // Disable noisy instrumentations by default\n '@opentelemetry/instrumentation-fs': { enabled: false },\n '@opentelemetry/instrumentation-dns': { enabled: false }\n })\n )\n }\n\n // Add custom instrumentations\n if (options.instrumentations) {\n instrumentations.push(...options.instrumentations)\n }\n\n // For pure Effect apps (no auto-instrumentation), skip NodeSDK entirely\n // This prevents any default instrumentations (like undici) from interfering with Effect layer\n if (!enableAutoInstrumentation && instrumentations.length === 0) {\n const wasExplicit = options.autoInstrument === false\n const detectionMessage = wasExplicit\n ? '@atrim/instrumentation: Auto-instrumentation: disabled'\n : '@atrim/instrumentation: Pure Effect-TS app detected (auto-detected)'\n\n logger.log(detectionMessage)\n logger.log(' - Skipping NodeSDK setup')\n logger.log(' - Pattern matching configured from instrumentation.yaml')\n if (!wasExplicit) {\n logger.log(' - Use EffectInstrumentationLive for tracing')\n }\n logger.log('')\n\n // Initialize pattern matcher so filtering works with Effect spans\n initializePatternMatcher(config)\n\n return null\n }\n\n // 7. Create NodeSDK configuration\n // Type cast to handle OpenTelemetry version mismatches\n const sdkConfig = {\n spanProcessor: patternProcessor,\n serviceName,\n ...(serviceVersion && { serviceVersion }),\n instrumentations,\n // Allow advanced overrides\n ...options.sdk\n } as NodeSDKConfiguration\n\n // 8. Initialize SDK\n const sdk = new NodeSDK(sdkConfig)\n sdk.start()\n sdkInstance = sdk\n\n // 9. Register shutdown handlers (unless disabled)\n if (!options.disableAutoShutdown) {\n registerShutdownHandlers(sdk)\n }\n\n // 10. Log initialization details\n logInitialization(config, serviceName, serviceVersion, options, enableAutoInstrumentation)\n\n return sdk\n}\n\n/**\n * Get the current SDK instance\n */\nexport function getSdkInstance(): NodeSDK | null {\n return sdkInstance\n}\n\n/**\n * Shutdown the SDK\n */\nexport async function shutdownSdk(): Promise<void> {\n if (!sdkInstance) {\n return\n }\n\n await sdkInstance.shutdown()\n sdkInstance = null\n}\n\n/**\n * Reset SDK instance (useful for testing)\n */\nexport function resetSdk(): void {\n sdkInstance = null\n initializationPromise = null\n}\n\n/**\n * Register graceful shutdown handlers\n */\nfunction registerShutdownHandlers(sdk: NodeSDK): void {\n const shutdown = async (signal: string) => {\n logger.log(`\\n@atrim/instrumentation: Received ${signal}, shutting down gracefully...`)\n try {\n await sdk.shutdown()\n logger.log('@atrim/instrumentation: Shutdown complete')\n process.exit(0)\n } catch (error) {\n logger.error(\n '@atrim/instrumentation: Error during shutdown:',\n error instanceof Error ? error.message : String(error)\n )\n process.exit(1)\n }\n }\n\n // Handle various shutdown signals\n process.on('SIGTERM', () => shutdown('SIGTERM'))\n process.on('SIGINT', () => shutdown('SIGINT'))\n\n // Handle uncaught errors\n process.on('uncaughtException', async (error) => {\n logger.error('@atrim/instrumentation: Uncaught exception:', error)\n await sdk.shutdown()\n process.exit(1)\n })\n\n process.on('unhandledRejection', async (reason) => {\n logger.error('@atrim/instrumentation: Unhandled rejection:', reason)\n await sdk.shutdown()\n process.exit(1)\n })\n}\n\n/**\n * Log initialization details\n */\nfunction logInitialization(\n config: InstrumentationConfig,\n serviceName: string,\n serviceVersion: string | undefined,\n options: SdkInitializationOptions,\n autoInstrumentEnabled: boolean\n): void {\n // Use minimal() for the main initialization message (shown in minimal mode)\n logger.minimal('@atrim/instrumentation: SDK initialized successfully')\n\n // All other details are only shown in full logging mode\n logger.log(` - Service: ${serviceName}${serviceVersion ? ` v${serviceVersion}` : ''}`)\n\n if (config.instrumentation.enabled) {\n const instrumentCount = config.instrumentation.instrument_patterns.filter(\n (p: PatternConfig) => p.enabled !== false\n ).length\n const ignoreCount = config.instrumentation.ignore_patterns.length\n\n logger.log(` - Pattern filtering: enabled`)\n logger.log(` - Instrument patterns: ${instrumentCount}`)\n logger.log(` - Ignore patterns: ${ignoreCount}`)\n } else {\n logger.log(` - Pattern filtering: disabled`)\n }\n\n // Show auto-instrumentation status\n const autoInstrumentLabel = autoInstrumentEnabled ? 'enabled' : 'disabled'\n const autoDetected = options.autoInstrument === undefined ? ' (auto-detected)' : ''\n logger.log(` - Auto-instrumentation: ${autoInstrumentLabel}${autoDetected}`)\n\n if (options.instrumentations && options.instrumentations.length > 0) {\n logger.log(` - Custom instrumentations: ${options.instrumentations.length}`)\n }\n\n // Log OTLP endpoint (helpful for debugging)\n const endpoint =\n options.otlp?.endpoint ||\n process.env.OTEL_EXPORTER_OTLP_TRACES_ENDPOINT ||\n process.env.OTEL_EXPORTER_OTLP_ENDPOINT ||\n 'http://localhost:4318/v1/traces'\n logger.log(` - OTLP endpoint: ${endpoint}`)\n\n logger.log('')\n}\n","/**\n * Public API for standard OpenTelemetry usage\n *\n * This module provides the main entry point for complete OpenTelemetry\n * initialization including NodeSDK, OTLP export, and pattern-based filtering.\n *\n * Available in two flavors:\n * - Effect API (primary): For typed error handling and composability\n * - Promise API (backward compatible): For traditional async/await usage\n */\n\nimport { Effect } from 'effect'\nimport type { NodeSDK } from '@opentelemetry/sdk-node'\nimport { initializeSdk, type SdkInitializationOptions } from './core/sdk-initializer.js'\nimport { initializePatternMatcher, loadConfig, logger } from '@atrim/instrument-core'\nimport { InitializationError, ConfigError } from './core/errors.js'\n\n/**\n * Initialize OpenTelemetry instrumentation with complete SDK setup\n *\n * This function provides a single-line initialization for OpenTelemetry:\n * - Loads instrumentation.yaml configuration\n * - Creates and configures OTLP exporter\n * - Sets up pattern-based span filtering\n * - Initializes NodeSDK with auto-instrumentations\n * - Registers graceful shutdown handlers\n *\n * Configuration priority (highest to lowest):\n * 1. Explicit config object (options.config)\n * 2. Environment variable (ATRIM_INSTRUMENTATION_CONFIG)\n * 3. Explicit path/URL (options.configPath or options.configUrl)\n * 4. Project root file (./instrumentation.yaml)\n * 5. Default config (built-in defaults)\n *\n * OTLP endpoint priority:\n * 1. options.otlp.endpoint\n * 2. OTEL_EXPORTER_OTLP_TRACES_ENDPOINT environment variable\n * 3. OTEL_EXPORTER_OTLP_ENDPOINT environment variable\n * 4. Default: http://localhost:4318/v1/traces\n *\n * Service name priority:\n * 1. options.serviceName\n * 2. OTEL_SERVICE_NAME environment variable\n * 3. package.json name field\n * 4. Default: 'unknown-service'\n *\n * @param options - Initialization options\n * @returns The initialized NodeSDK instance\n *\n * @example\n * ```typescript\n * // Zero-config initialization (recommended)\n * await initializeInstrumentation()\n * // Auto-detects everything from env vars and package.json\n *\n * // With custom OTLP endpoint\n * await initializeInstrumentation({\n * otlp: {\n * endpoint: 'https://otel-collector.company.com:4318'\n * }\n * })\n *\n * // With custom service name\n * await initializeInstrumentation({\n * serviceName: 'my-api-service',\n * serviceVersion: '2.0.0'\n * })\n *\n * // Disable auto-instrumentation (manual spans only)\n * await initializeInstrumentation({\n * autoInstrument: false\n * })\n *\n * // With custom config file\n * await initializeInstrumentation({\n * configPath: './config/custom-instrumentation.yaml'\n * })\n *\n * // With remote config URL\n * await initializeInstrumentation({\n * configUrl: 'https://config.company.com/instrumentation.yaml',\n * cacheTimeout: 300_000 // 5 minutes\n * })\n *\n * // Advanced: Full control\n * await initializeInstrumentation({\n * otlp: {\n * endpoint: process.env.CUSTOM_ENDPOINT,\n * headers: { 'x-api-key': 'secret' }\n * },\n * serviceName: 'my-service',\n * autoInstrument: true,\n * instrumentations: [], // custom instrumentations\n * sdk: {\n * // Additional NodeSDK configuration\n * }\n * })\n * ```\n */\nexport async function initializeInstrumentation(\n options: SdkInitializationOptions = {}\n): Promise<NodeSDK | null> {\n // Initialize the complete SDK with all features\n // Returns null if OpenTelemetry is already initialized elsewhere\n const sdk = await initializeSdk(options)\n\n // If SDK was initialized, also set up pattern matcher for backwards compatibility\n // (in case users are using shouldInstrumentSpan directly)\n // Note: If SDK was skipped, initializeSdk already initialized the pattern matcher\n if (sdk) {\n const config = await loadConfig(options)\n initializePatternMatcher(config)\n }\n\n return sdk\n}\n\n/**\n * Legacy initialization function for pattern-only mode\n *\n * This function only initializes pattern matching without setting up the NodeSDK.\n * Use this if you want to manually configure OpenTelemetry while still using\n * pattern-based filtering.\n *\n * @deprecated Use initializeInstrumentation() instead for complete setup\n */\nexport async function initializePatternMatchingOnly(\n options: SdkInitializationOptions = {}\n): Promise<void> {\n const config = await loadConfig(options)\n initializePatternMatcher(config)\n\n logger.log('@atrim/instrumentation: Pattern matching initialized (legacy mode)')\n logger.log(\n ' Note: NodeSDK is not initialized. Use initializeInstrumentation() for complete setup.'\n )\n}\n\n// ============================================================================\n// Effect-Based API (Primary)\n// ============================================================================\n\n/**\n * Initialize OpenTelemetry instrumentation (Effect version)\n *\n * Provides typed error handling and composability with Effect ecosystem.\n * All errors are returned in the error channel, not thrown.\n *\n * @param options - Initialization options\n * @returns Effect that yields the initialized NodeSDK or null\n *\n * @example\n * ```typescript\n * import { Effect } from 'effect'\n * import { initializeInstrumentationEffect } from '@atrim/instrumentation'\n *\n * // Basic usage\n * const program = initializeInstrumentationEffect()\n *\n * await Effect.runPromise(program)\n *\n * // With error handling\n * const program = initializeInstrumentationEffect().pipe(\n * Effect.catchTag('ConfigError', (error) => {\n * console.error('Config error:', error.reason)\n * return Effect.succeed(null)\n * }),\n * Effect.catchTag('InitializationError', (error) => {\n * console.error('Init error:', error.reason)\n * return Effect.succeed(null)\n * })\n * )\n *\n * await Effect.runPromise(program)\n *\n * // With custom options\n * const program = initializeInstrumentationEffect({\n * otlp: { endpoint: 'https://otel.company.com:4318' },\n * serviceName: 'my-service'\n * })\n * ```\n */\nexport const initializeInstrumentationEffect = (\n options: SdkInitializationOptions = {}\n): Effect.Effect<NodeSDK | null, InitializationError | ConfigError> =>\n Effect.gen(function* () {\n // Initialize SDK with error handling\n const sdk = yield* Effect.tryPromise({\n try: () => initializeSdk(options),\n catch: (error) =>\n new InitializationError({\n reason: 'SDK initialization failed',\n cause: error\n })\n })\n\n // If SDK was initialized, set up pattern matcher\n if (sdk) {\n yield* Effect.tryPromise({\n try: () => loadConfig(options),\n catch: (error) =>\n new ConfigError({\n reason: 'Failed to load config for pattern matcher',\n cause: error\n })\n }).pipe(\n Effect.tap((config) =>\n Effect.sync(() => {\n initializePatternMatcher(config)\n })\n )\n )\n }\n\n return sdk\n })\n\n/**\n * Initialize pattern matching only (Effect version)\n *\n * Use this if you want manual OpenTelemetry setup with pattern filtering.\n *\n * @param options - Configuration options\n * @returns Effect that yields void\n *\n * @example\n * ```typescript\n * import { Effect } from 'effect'\n * import { initializePatternMatchingOnlyEffect } from '@atrim/instrumentation'\n *\n * const program = initializePatternMatchingOnlyEffect({\n * configPath: './instrumentation.yaml'\n * }).pipe(\n * Effect.catchAll((error) => {\n * console.error('Pattern matching setup failed:', error.reason)\n * return Effect.succeed(undefined)\n * })\n * )\n *\n * await Effect.runPromise(program)\n * ```\n */\nexport const initializePatternMatchingOnlyEffect = (\n options: SdkInitializationOptions = {}\n): Effect.Effect<void, ConfigError> =>\n Effect.gen(function* () {\n const config = yield* Effect.tryPromise({\n try: () => loadConfig(options),\n catch: (error) =>\n new ConfigError({\n reason: 'Failed to load configuration',\n cause: error\n })\n })\n\n yield* Effect.sync(() => {\n initializePatternMatcher(config)\n logger.log('@atrim/instrumentation: Pattern matching initialized (legacy mode)')\n logger.log(\n ' Note: NodeSDK is not initialized. Use initializeInstrumentation() for complete setup.'\n )\n })\n })\n","/**\n * Standard OpenTelemetry span helpers (no Effect dependency)\n *\n * These helpers work with any OpenTelemetry span and don't require Effect-TS.\n */\nimport type { Span, SpanStatusCode } from '@opentelemetry/api'\n\n/**\n * Set multiple attributes on a span at once\n */\nexport function setSpanAttributes(\n span: Span,\n attributes: Record<string, string | number | boolean>\n): void {\n for (const [key, value] of Object.entries(attributes)) {\n span.setAttribute(key, value)\n }\n}\n\n/**\n * Record an exception on a span with optional context\n */\nexport function recordException(\n span: Span,\n error: Error,\n context?: Record<string, string | number | boolean>\n): void {\n span.recordException(error)\n if (context) {\n for (const [key, value] of Object.entries(context)) {\n span.setAttribute(`error.${key}`, value)\n }\n }\n}\n\n/**\n * Mark a span as successful (OK status)\n */\nexport function markSpanSuccess(span: Span): void {\n span.setStatus({ code: 1 as SpanStatusCode }) // SpanStatusCode.OK = 1\n}\n\n/**\n * Mark a span as failed with an error message\n */\nexport function markSpanError(span: Span, message?: string): void {\n if (message !== undefined) {\n span.setStatus({\n code: 2 as SpanStatusCode, // SpanStatusCode.ERROR = 2\n message\n })\n } else {\n span.setStatus({\n code: 2 as SpanStatusCode // SpanStatusCode.ERROR = 2\n })\n }\n}\n\n/**\n * Helper for HTTP request spans\n */\nexport function annotateHttpRequest(\n span: Span,\n method: string,\n url: string,\n statusCode?: number\n): void {\n span.setAttribute('http.method', method)\n span.setAttribute('http.url', url)\n if (statusCode !== undefined) {\n span.setAttribute('http.status_code', statusCode)\n // Mark as error if status code >= 400\n if (statusCode >= 400) {\n markSpanError(span, `HTTP ${statusCode}`)\n } else {\n markSpanSuccess(span)\n }\n }\n}\n\n/**\n * Helper for database query spans\n */\nexport function annotateDbQuery(\n span: Span,\n system: string,\n statement: string,\n table?: string\n): void {\n span.setAttribute('db.system', system)\n span.setAttribute('db.statement', statement)\n if (table) {\n span.setAttribute('db.table', table)\n }\n}\n\n/**\n * Helper for cache operation spans\n */\nexport function annotateCacheOperation(\n span: Span,\n operation: 'get' | 'set' | 'delete' | 'clear',\n key: string,\n hit?: boolean\n): void {\n span.setAttribute('cache.operation', operation)\n span.setAttribute('cache.key', key)\n if (hit !== undefined) {\n span.setAttribute('cache.hit', hit)\n }\n}\n","/**\n * Test utilities for handling shutdown errors during testing\n */\n\ninterface NodeJSError extends Error {\n code?: string\n errno?: number\n syscall?: string\n address?: string\n port?: number\n errors?: NodeJSError[]\n}\n\n/**\n * Suppress ECONNREFUSED errors during shutdown in test environments\n *\n * This function installs error handlers that ignore connection refused errors\n * when the OpenTelemetry SDK tries to export spans during shutdown. This is\n * expected behavior when collectors are stopped before child processes finish.\n *\n * @example\n * ```typescript\n * import { suppressShutdownErrors } from '@atrim/instrumentation/test-utils'\n *\n * // Call at the start of your main function\n * suppressShutdownErrors()\n * ```\n */\nexport function suppressShutdownErrors(): void {\n // Only install handlers in CI or test environments\n if (!process.env.CI && process.env.NODE_ENV !== 'test') {\n return\n }\n\n const isHarmlessConnectionError = (error: unknown): boolean => {\n // Type guard to check if error is an object with the expected properties\n if (!error || typeof error !== 'object') {\n return false\n }\n\n const nodeError = error as NodeJSError\n\n // Check for direct ECONNREFUSED error\n if (nodeError.code === 'ECONNREFUSED') {\n return true\n }\n\n // Check for AggregateError with all ECONNREFUSED errors\n if (\n nodeError.errors &&\n Array.isArray(nodeError.errors) &&\n nodeError.errors.length > 0 &&\n nodeError.errors.every((e) => e?.code === 'ECONNREFUSED')\n ) {\n return true\n }\n\n return false\n }\n\n // Handle uncaught exceptions\n process.on('uncaughtException', (error: Error) => {\n if (isHarmlessConnectionError(error)) {\n console.log('📤 Export failed (collector stopped) - this is expected in tests')\n return\n }\n // Re-throw other errors\n console.error('Uncaught exception:', error)\n process.exit(1)\n })\n\n // Handle unhandled promise rejections\n process.on('unhandledRejection', (reason: unknown) => {\n if (isHarmlessConnectionError(reason)) {\n console.log('📤 Export failed (collector stopped) - this is expected in tests')\n return\n }\n // Re-throw other errors\n console.error('Unhandled rejection:', reason)\n process.exit(1)\n })\n}\n"]}
|