@atrim/instrument-node 0.5.0 → 0.5.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/README.md +66 -0
- package/package.json +8 -8
- package/target/dist/index.cjs +14 -1
- package/target/dist/index.cjs.map +1 -1
- package/target/dist/index.js +14 -1
- package/target/dist/index.js.map +1 -1
- package/target/dist/integrations/effect/index.cjs +159 -14
- package/target/dist/integrations/effect/index.cjs.map +1 -1
- package/target/dist/integrations/effect/index.d.cts +187 -12
- package/target/dist/integrations/effect/index.d.ts +187 -12
- package/target/dist/integrations/effect/index.js +158 -16
- package/target/dist/integrations/effect/index.js.map +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../core/src/instrumentation-schema.ts","../../../core/src/errors.ts","../../../core/src/services/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/config-loader.ts","../../src/core/sdk-initializer.ts","../../src/api.ts","../../src/integrations/standard/span-helpers.ts","../../src/core/test-utils.ts"],"names":["z","Data","Context","Effect","parseYAML","HttpClientRequest","FileSystem","HttpClient","Layer","__publicField","OTLPTraceExporter","ConfigError","ConfigUrlError","ConfigValidationError","ConfigFileError","ServiceDetectionError","InitializationError","ExportError","ShutdownError","join","readFile","NodeContext","FetchHttpClient","loader","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\n/**\n * HTTP instrumentation filtering configuration\n *\n * Allows filtering of HTTP requests to prevent noisy traces\n * (e.g., health checks, OTLP exports, internal endpoints)\n */\nexport const HttpFilteringConfigSchema = z.object({\n // Patterns to ignore for outgoing HTTP requests (string patterns only in YAML)\n ignore_outgoing_urls: z.array(z.string()).optional(),\n\n // Patterns to ignore for incoming HTTP requests (string patterns only in YAML)\n ignore_incoming_paths: z.array(z.string()).optional(),\n\n // Require parent span for outgoing requests (prevents root spans for HTTP calls)\n require_parent_for_outgoing_spans: z.boolean().optional()\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 http: HttpFilteringConfigSchema.optional()\n})\n\nexport type InstrumentationConfig = z.infer<typeof InstrumentationConfigSchema>\nexport type PatternConfig = z.infer<typeof PatternConfigSchema>\nexport type AutoIsolationConfig = z.infer<typeof AutoIsolationConfigSchema>\nexport type HttpFilteringConfig = z.infer<typeof HttpFilteringConfigSchema>\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 override get message() {\n return this.reason\n }\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 override get message() {\n return this.reason\n }\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 override get message() {\n return this.reason\n }\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 override get message() {\n return this.reason\n }\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 override get message() {\n return this.reason\n }\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 override get message() {\n return this.reason\n }\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 override get message() {\n return this.reason\n }\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 override get message() {\n return this.reason\n }\n}\n","/**\n * ConfigLoader service using Effect Platform\n *\n * Provides URI-based configuration loading with pluggable platform services:\n * - FileSystem for file:// URIs (Node.js/Bun/Deno)\n * - HttpClient for http:// and https:// URIs (universal)\n *\n * This service has NO Node.js-specific dependencies - it depends only on\n * abstract Effect Platform services that are provided by environment-specific layers.\n */\n\nimport { Effect, Context, Layer } from 'effect'\nimport { FileSystem } from '@effect/platform/FileSystem'\nimport * as HttpClient from '@effect/platform/HttpClient'\nimport * as HttpClientRequest from '@effect/platform/HttpClientRequest'\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\n// Security constraints\nconst SECURITY_DEFAULTS = {\n maxConfigSize: 1_000_000, // 1MB\n requestTimeout: 5_000 // 5 seconds\n} as const\n\n/**\n * ConfigLoader service interface\n */\nexport interface ConfigLoaderService {\n /**\n * Load configuration from a URI\n *\n * Supports:\n * - file:// URIs (uses FileSystem if available)\n * - http:// and https:// URIs (uses HttpClient)\n * - Relative paths (treated as file:// in Node, http:// in browser)\n *\n * @param uri - Configuration URI\n * @returns Effect that resolves to validated configuration (NO requirements)\n */\n readonly loadFromUri: (\n uri: string\n ) => Effect.Effect<\n InstrumentationConfig,\n ConfigError | ConfigFileError | ConfigUrlError | ConfigValidationError\n >\n\n /**\n * Load configuration from inline content (YAML, JSON, or object)\n *\n * @param content - YAML string, JSON string, or plain object\n * @returns Effect that resolves to validated configuration\n */\n readonly loadFromInline: (\n content: string | unknown\n ) => Effect.Effect<InstrumentationConfig, ConfigError | ConfigValidationError>\n}\n\n/**\n * ConfigLoader service tag\n */\nexport class ConfigLoader extends Context.Tag('ConfigLoader')<\n ConfigLoader,\n ConfigLoaderService\n>() {}\n\n/**\n * Parse and validate YAML content\n */\nconst parseYamlContent = (\n content: string,\n uri?: string\n): Effect.Effect<InstrumentationConfig, ConfigValidationError> =>\n Effect.gen(function* () {\n // Parse YAML\n const parsed = yield* Effect.try({\n try: () => parseYAML(content),\n catch: (error) =>\n new ConfigValidationError({\n reason: uri ? `Failed to parse YAML from ${uri}` : 'Failed to parse YAML',\n cause: error\n })\n })\n\n // Validate schema\n return yield* Effect.try({\n try: () => InstrumentationConfigSchema.parse(parsed),\n catch: (error) =>\n new ConfigValidationError({\n reason: uri ? `Invalid configuration schema from ${uri}` : 'Invalid configuration schema',\n cause: error\n })\n })\n })\n\n/**\n * Load configuration from file using captured FileSystem service\n */\nconst loadFromFileWithFs = (\n fs: FileSystem,\n path: string,\n uri: string\n): Effect.Effect<InstrumentationConfig, ConfigFileError | ConfigValidationError> =>\n Effect.gen(function* () {\n // Read file\n const content = yield* fs.readFileString(path).pipe(\n Effect.mapError(\n (error) =>\n new ConfigFileError({\n reason: `Failed to read config file at ${uri}`,\n cause: error\n })\n )\n )\n\n // Security: Check file size\n if (content.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 and validate\n return yield* parseYamlContent(content, uri)\n })\n\n/**\n * Load configuration from http using captured HttpClient service\n */\nconst loadFromHttpWithClient = (\n client: HttpClient.HttpClient,\n url: string\n): Effect.Effect<InstrumentationConfig, ConfigUrlError | ConfigValidationError> =>\n Effect.scoped(\n Effect.gen(function* () {\n // Security: Reject non-HTTPS URLs\n if (url.startsWith('http://')) {\n return yield* Effect.fail(\n new ConfigUrlError({\n reason: 'Insecure protocol: only HTTPS URLs are allowed'\n })\n )\n }\n\n // Create request\n const request = HttpClientRequest.get(url).pipe(\n HttpClientRequest.setHeaders({\n Accept: 'application/yaml, text/yaml, application/x-yaml'\n })\n )\n\n // Execute request with timeout\n const response = yield* client.execute(request).pipe(\n Effect.timeout(`${SECURITY_DEFAULTS.requestTimeout} millis`),\n Effect.mapError((error) => {\n if (error._tag === 'TimeoutException') {\n return new ConfigUrlError({\n reason: `Config fetch timeout after ${SECURITY_DEFAULTS.requestTimeout}ms from ${url}`\n })\n }\n return new ConfigUrlError({\n reason: `Failed to load config from URL: ${url}`,\n cause: error\n })\n })\n )\n\n // Check HTTP status\n if (response.status >= 400) {\n return yield* Effect.fail(\n new ConfigUrlError({\n reason: `HTTP ${response.status} from ${url}`\n })\n )\n }\n\n // Get response text\n const text = yield* response.text.pipe(\n Effect.mapError(\n (error) =>\n new ConfigUrlError({\n reason: `Failed to read response body from ${url}`,\n cause: error\n })\n )\n )\n\n // Security: Check 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 and validate\n return yield* parseYamlContent(text, url)\n })\n )\n\n/**\n * ConfigLoader service implementation\n *\n * Captures FileSystem and HttpClient dependencies at construction time\n */\nconst makeConfigLoader = Effect.gen(function* () {\n // Capture dependencies at construction time\n const fs = yield* Effect.serviceOption(FileSystem)\n const http = yield* HttpClient.HttpClient\n\n // Create the loadFromUri function\n const loadFromUriUncached = (uri: string) =>\n Effect.gen(function* () {\n // file:// protocol\n if (uri.startsWith('file://')) {\n const path = uri.slice(7) // Remove \"file://\"\n\n if (fs._tag === 'None') {\n return yield* Effect.fail(\n new ConfigFileError({\n reason: 'FileSystem not available (browser environment?)',\n cause: { uri }\n })\n )\n }\n\n return yield* loadFromFileWithFs(fs.value, path, uri)\n }\n\n // http:// or https:// protocol\n if (uri.startsWith('http://') || uri.startsWith('https://')) {\n return yield* loadFromHttpWithClient(http, uri)\n }\n\n // Relative path - try FileSystem first, fallback to HTTP\n if (fs._tag === 'Some') {\n // FileSystem available (Node.js environment)\n return yield* loadFromFileWithFs(fs.value, uri, uri)\n } else {\n // No FileSystem (browser environment) - treat as HTTP\n // Relative URLs will be resolved by browser fetch to current origin\n return yield* loadFromHttpWithClient(http, uri)\n }\n })\n\n // Cache the loadFromUri function with 5 minute TTL (default cache timeout)\n const loadFromUriCached = yield* Effect.cachedFunction(loadFromUriUncached)\n\n return ConfigLoader.of({\n loadFromUri: loadFromUriCached,\n\n loadFromInline: (content: string | unknown) =>\n Effect.gen(function* () {\n // If string, parse as YAML\n if (typeof content === 'string') {\n return yield* parseYamlContent(content)\n }\n\n // Already an object - just validate schema\n return yield* Effect.try({\n try: () => InstrumentationConfigSchema.parse(content),\n catch: (error) =>\n new ConfigValidationError({\n reason: 'Invalid configuration schema',\n cause: error\n })\n })\n })\n })\n})\n\n/**\n * ConfigLoader Live layer\n *\n * Provides ConfigLoader service implementation.\n * Requires HttpClient to be provided by platform-specific layers.\n * FileSystem is optional (for browser compatibility).\n */\nexport const ConfigLoaderLive = Layer.effect(ConfigLoader, makeConfigLoader)\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 * Node.js configuration loader using Effect Platform\n *\n * Provides FileSystem and HttpClient layers for the core ConfigLoader service\n */\n\nimport { Effect, Layer } from 'effect'\nimport { NodeContext } from '@effect/platform-node'\nimport { FetchHttpClient } from '@effect/platform'\nimport {\n ConfigLoader,\n ConfigLoaderLive,\n type InstrumentationConfig,\n type ConfigLoaderService\n} from '@atrim/instrument-core'\n\n/**\n * Complete ConfigLoader layer with all Node.js platform dependencies\n *\n * Provides:\n * - ConfigLoader service\n * - FileSystem (from NodeContext)\n * - HttpClient (from FetchHttpClient)\n */\nexport const NodeConfigLoaderLive = ConfigLoaderLive.pipe(\n Layer.provide(Layer.mergeAll(NodeContext.layer, FetchHttpClient.layer))\n)\n\n/**\n * Singleton cached config loader for sharing cache across calls\n */\nlet cachedLoaderPromise: Promise<ConfigLoaderService> | null = null\n\nfunction getCachedLoader(): Promise<ConfigLoaderService> {\n if (!cachedLoaderPromise) {\n cachedLoaderPromise = Effect.runPromise(\n Effect.gen(function* () {\n return yield* ConfigLoader\n }).pipe(Effect.provide(NodeConfigLoaderLive))\n )\n }\n return cachedLoaderPromise\n}\n\n/**\n * Reset the cached loader (for testing purposes)\n * @internal\n */\nexport function _resetConfigLoaderCache(): void {\n cachedLoaderPromise = null\n}\n\n/**\n * Load configuration from URI (Promise-based convenience API)\n *\n * Automatically provides Node.js platform layers (FileSystem + HttpClient)\n *\n * @param uri - Configuration URI (file://, http://, https://, or relative path)\n * @param options - Optional loading options (e.g., to disable caching)\n * @returns Promise that resolves to validated configuration\n */\nexport async function loadConfig(\n uri: string,\n options?: { cacheTimeout?: number }\n): Promise<InstrumentationConfig> {\n // If cacheTimeout is 0, bypass cache\n if (options?.cacheTimeout === 0) {\n const program = Effect.gen(function* () {\n const loader = yield* ConfigLoader\n return yield* loader.loadFromUri(uri)\n })\n return Effect.runPromise(program.pipe(Effect.provide(NodeConfigLoaderLive)))\n }\n\n const loader = await getCachedLoader()\n return Effect.runPromise(loader.loadFromUri(uri))\n}\n\n/**\n * Load configuration from inline content (Promise-based convenience API)\n *\n * @param content - YAML string, JSON string, or plain object\n * @returns Promise that resolves to validated configuration\n */\nexport async function loadConfigFromInline(\n content: string | unknown\n): Promise<InstrumentationConfig> {\n const loader = await getCachedLoader()\n return Effect.runPromise(loader.loadFromInline(content))\n}\n\n/**\n * Legacy options interface for backward compatibility\n */\nexport interface ConfigLoaderOptions {\n configPath?: string\n configUrl?: string\n config?: InstrumentationConfig\n cacheTimeout?: number\n}\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 * Load configuration with priority order (backward compatible API)\n *\n * Priority order (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 * @param options - Configuration options\n * @returns Promise that resolves to validated configuration\n */\nexport async function loadConfigWithOptions(\n options: ConfigLoaderOptions = {}\n): Promise<InstrumentationConfig> {\n // Extract cacheTimeout option\n const loadOptions =\n options.cacheTimeout !== undefined ? { cacheTimeout: options.cacheTimeout } : undefined\n\n // Priority 1: Explicit config object\n if (options.config) {\n return loadConfigFromInline(options.config)\n }\n\n // Priority 2: Environment variable\n const envConfigPath = process.env.ATRIM_INSTRUMENTATION_CONFIG\n if (envConfigPath) {\n return loadConfig(envConfigPath, loadOptions)\n }\n\n // Priority 3: Explicit options\n if (options.configUrl) {\n return loadConfig(options.configUrl, loadOptions)\n }\n if (options.configPath) {\n return loadConfig(options.configPath, loadOptions)\n }\n\n // Priority 4: Project root file\n const { existsSync } = await import('fs')\n const { join } = await import('path')\n\n const defaultPath = join(process.cwd(), 'instrumentation.yaml')\n if (existsSync(defaultPath)) {\n return loadConfig(defaultPath, loadOptions)\n }\n\n // Priority 5: Default config\n return getDefaultConfig()\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 type { RequestOptions, IncomingMessage } from 'node:http'\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 type InstrumentationConfig,\n type PatternConfig,\n initializePatternMatcher,\n logger\n} from '@atrim/instrument-core'\nimport { loadConfigWithOptions, type ConfigLoaderOptions } from './config-loader.js'\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 * HTTP instrumentation filtering configuration\n *\n * Allows filtering of HTTP requests to prevent noisy traces\n * (e.g., health checks, OTLP exports, internal endpoints)\n *\n * @example\n * ```typescript\n * // Pattern-based filtering\n * http: {\n * ignoreOutgoingUrls: [/\\/health$/, /\\/v1\\/traces$/],\n * ignoreIncomingPaths: [/^\\/health$/]\n * }\n *\n * // Custom hook for advanced filtering\n * http: {\n * ignoreOutgoingRequestHook: (req) => {\n * const path = req.path || ''\n * return path.includes('otel-collector')\n * }\n * }\n * ```\n */\n http?: {\n /**\n * URL patterns to ignore for outgoing HTTP requests\n * Can be strings or RegExp patterns\n */\n ignoreOutgoingUrls?: (string | RegExp)[]\n\n /**\n * Path patterns to ignore for incoming HTTP requests\n * Can be strings or RegExp patterns\n */\n ignoreIncomingPaths?: (string | RegExp)[]\n\n /**\n * Custom hook for filtering outgoing HTTP requests\n * Return true to ignore the request (no span created)\n *\n * Note: The request parameter is RequestOptions (from http.request()),\n * not the ClientRequest object\n */\n ignoreOutgoingRequestHook?: (req: RequestOptions) => boolean\n\n /**\n * Custom hook for filtering incoming HTTP requests\n * Return true to ignore the request (no span created)\n */\n ignoreIncomingRequestHook?: (req: IncomingMessage) => boolean\n\n /**\n * Require parent span for outgoing requests\n * Prevents root spans for HTTP calls (useful for avoiding noise)\n */\n requireParentForOutgoingSpans?: boolean\n }\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 * HTTP instrumentation config that matches @opentelemetry/instrumentation-http\n * We define this inline to avoid importing from the package (which is a transitive dependency)\n */\ninterface HttpInstrumentationConfigBuilder {\n enabled: boolean\n ignoreOutgoingRequestHook?: (req: RequestOptions) => boolean\n ignoreIncomingRequestHook?: (req: IncomingMessage) => boolean\n requireParentforOutgoingSpans?: boolean\n}\n\n/**\n * Build HTTP instrumentation configuration from options and config\n *\n * Merges YAML config, programmatic options, and smart defaults\n */\nfunction buildHttpInstrumentationConfig(\n options: SdkInitializationOptions,\n config: InstrumentationConfig,\n _otlpEndpoint: string\n): HttpInstrumentationConfigBuilder {\n const httpConfig: HttpInstrumentationConfigBuilder = { enabled: true }\n\n // Build outgoing request filter from YAML config and programmatic options ONLY\n // No hardcoded defaults - everything must be explicit in instrumentation.yaml\n const programmaticPatterns = options.http?.ignoreOutgoingUrls || []\n const yamlPatterns = config.http?.ignore_outgoing_urls || []\n\n // Combine all patterns (NO defaults)\n const allOutgoingPatterns = [\n ...programmaticPatterns.map((p) => (typeof p === 'string' ? new RegExp(p) : p)),\n ...yamlPatterns.map((p) => new RegExp(p))\n ]\n\n logger.log(`HTTP filtering: ${allOutgoingPatterns.length} outgoing patterns configured`)\n\n // Build the hook (always create it if we have any patterns)\n if (options.http?.ignoreOutgoingRequestHook) {\n // Use custom hook if provided\n httpConfig.ignoreOutgoingRequestHook = options.http.ignoreOutgoingRequestHook\n } else if (allOutgoingPatterns.length > 0) {\n // Build hook from YAML/programmatic patterns ONLY\n httpConfig.ignoreOutgoingRequestHook = (req: RequestOptions) => {\n // RequestOptions has: hostname, host, port, path, protocol, etc.\n const hostname = req.hostname || req.host || ''\n const port = req.port || ''\n const protocol = req.protocol || 'http:'\n const path = req.path || ''\n\n // Build full URL for pattern matching\n const portStr = port ? `:${port}` : ''\n const url = `${protocol}//${hostname}${portStr}${path}`\n\n // Check patterns against both URL and path\n const matchesPattern = allOutgoingPatterns.some(\n (pattern) => pattern.test(url) || pattern.test(path)\n )\n\n return matchesPattern\n }\n }\n\n // Step 3: Build incoming request filter\n const programmaticIncomingPatterns = options.http?.ignoreIncomingPaths || []\n const yamlIncomingPatterns = config.http?.ignore_incoming_paths || []\n\n const allIncomingPatterns = [\n ...programmaticIncomingPatterns.map((p) => (typeof p === 'string' ? new RegExp(p) : p)),\n ...yamlIncomingPatterns.map((p) => new RegExp(p))\n ]\n\n if (options.http?.ignoreIncomingRequestHook) {\n // Use custom hook if provided\n httpConfig.ignoreIncomingRequestHook = options.http.ignoreIncomingRequestHook\n } else if (allIncomingPatterns.length > 0) {\n // Build hook from patterns\n httpConfig.ignoreIncomingRequestHook = (req: IncomingMessage) => {\n const path = req.url || ''\n return allIncomingPatterns.some((pattern) => pattern.test(path))\n }\n }\n\n // Step 4: Apply requireParentForOutgoingSpans setting\n if (\n options.http?.requireParentForOutgoingSpans !== undefined ||\n config.http?.require_parent_for_outgoing_spans !== undefined\n ) {\n httpConfig.requireParentforOutgoingSpans =\n options.http?.requireParentForOutgoingSpans ??\n config.http?.require_parent_for_outgoing_spans ??\n false\n }\n\n return httpConfig\n}\n\n/**\n * Build undici instrumentation configuration from options and config\n *\n * Undici powers the fetch API in Node.js 18+ and is used by the OTLP HTTP exporter\n * We must filter OTLP requests here to prevent trace loops\n */\nfunction buildUndiciInstrumentationConfig(\n options: SdkInitializationOptions,\n config: InstrumentationConfig,\n _otlpEndpoint: string\n) {\n const undiciConfig = { enabled: true } as Record<string, unknown>\n\n // Get programmatic and YAML patterns ONLY (NO hardcoded defaults)\n const programmaticPatterns = options.http?.ignoreOutgoingUrls || []\n const yamlPatterns = config.http?.ignore_outgoing_urls || []\n\n // Combine all patterns (NO defaults)\n const allPatterns = [\n ...programmaticPatterns.map((p) => (typeof p === 'string' ? new RegExp(p) : p)),\n ...yamlPatterns.map((p) => new RegExp(p))\n ]\n\n // Only create ignoreRequestHook if we have patterns to check\n if (allPatterns.length > 0) {\n // Build ignoreRequestHook for undici\n // Note: undici's hook receives a UndiciRequest object with origin, path, method\n undiciConfig.ignoreRequestHook = (request: {\n origin: string\n path: string\n method: string\n }) => {\n const origin = request.origin\n const path = request.path\n const url = `${origin}${path}`\n\n // ALWAYS log to verify hook is being called\n // Check patterns from YAML/programmatic config ONLY\n const matchesPattern = allPatterns.some((pattern) => pattern.test(url) || pattern.test(path))\n return matchesPattern\n }\n }\n\n return undiciConfig\n}\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 loadConfigWithOptions(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 // Get OTLP endpoint for HTTP filtering\n const otlpEndpoint =\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\n // Build HTTP instrumentation config with filtering\n const httpConfig = buildHttpInstrumentationConfig(options, config, otlpEndpoint)\n\n // Build undici instrumentation config (for fetch/undici in Node.js 18+)\n // The OTLP HTTP exporter uses fetch, which uses undici\n const undiciConfig = buildUndiciInstrumentationConfig(options, config, otlpEndpoint)\n\n instrumentations.push(\n ...getNodeAutoInstrumentations({\n // Enable HTTP instrumentation with filtering (for http/https modules)\n '@opentelemetry/instrumentation-http': httpConfig,\n\n // Enable undici instrumentation with filtering (for fetch API)\n '@opentelemetry/instrumentation-undici': undiciConfig,\n\n // Enable web framework instrumentations\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 logger.log(`Auto-instrumentation: ${instrumentations.length} instrumentations enabled`)\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, logger } from '@atrim/instrument-core'\nimport { loadConfigWithOptions } from './core/config-loader.js'\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 loadConfigWithOptions(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 loadConfigWithOptions(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: () => loadConfigWithOptions(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: () => loadConfigWithOptions(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"]}
|
|
1
|
+
{"version":3,"sources":["../../../core/src/instrumentation-schema.ts","../../../core/src/errors.ts","../../../core/src/services/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/config-loader.ts","../../src/core/sdk-initializer.ts","../../src/api.ts","../../src/integrations/standard/span-helpers.ts","../../src/core/test-utils.ts"],"names":["z","Data","Context","Effect","parseYAML","HttpClientRequest","FileSystem","HttpClient","Layer","__publicField","OTLPTraceExporter","ConfigError","ConfigUrlError","ConfigValidationError","ConfigFileError","ServiceDetectionError","InitializationError","ExportError","ShutdownError","join","readFile","NodeContext","FetchHttpClient","loader","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\n/**\n * HTTP instrumentation filtering configuration\n *\n * Allows filtering of HTTP requests to prevent noisy traces\n * (e.g., health checks, OTLP exports, internal endpoints)\n */\nexport const HttpFilteringConfigSchema = z.object({\n // Patterns to ignore for outgoing HTTP requests (string patterns only in YAML)\n ignore_outgoing_urls: z.array(z.string()).optional(),\n\n // Patterns to ignore for incoming HTTP requests (string patterns only in YAML)\n ignore_incoming_paths: z.array(z.string()).optional(),\n\n // Require parent span for outgoing requests (prevents root spans for HTTP calls)\n require_parent_for_outgoing_spans: z.boolean().optional(),\n\n // Trace context propagation configuration\n // Controls which cross-origin requests receive W3C Trace Context headers (traceparent, tracestate)\n propagate_trace_context: z\n .object({\n // Strategy for trace propagation\n // - \"all\": Propagate to all cross-origin requests (may cause CORS errors)\n // - \"none\": Never propagate trace headers\n // - \"same-origin\": Only propagate to same-origin requests (default, safe)\n // - \"patterns\": Propagate based on include_urls patterns\n strategy: z.enum(['all', 'none', 'same-origin', 'patterns']).default('same-origin'),\n\n // URL patterns to include when strategy is \"patterns\"\n // Supports regex patterns (e.g., \"^https://api\\\\.myapp\\\\.com\")\n include_urls: z.array(z.string()).optional()\n })\n .optional()\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 http: HttpFilteringConfigSchema.optional()\n})\n\nexport type InstrumentationConfig = z.infer<typeof InstrumentationConfigSchema>\nexport type PatternConfig = z.infer<typeof PatternConfigSchema>\nexport type AutoIsolationConfig = z.infer<typeof AutoIsolationConfigSchema>\nexport type HttpFilteringConfig = z.infer<typeof HttpFilteringConfigSchema>\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 override get message() {\n return this.reason\n }\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 override get message() {\n return this.reason\n }\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 override get message() {\n return this.reason\n }\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 override get message() {\n return this.reason\n }\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 override get message() {\n return this.reason\n }\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 override get message() {\n return this.reason\n }\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 override get message() {\n return this.reason\n }\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 override get message() {\n return this.reason\n }\n}\n","/**\n * ConfigLoader service using Effect Platform\n *\n * Provides URI-based configuration loading with pluggable platform services:\n * - FileSystem for file:// URIs (Node.js/Bun/Deno)\n * - HttpClient for http:// and https:// URIs (universal)\n *\n * This service has NO Node.js-specific dependencies - it depends only on\n * abstract Effect Platform services that are provided by environment-specific layers.\n */\n\nimport { Effect, Context, Layer } from 'effect'\nimport { FileSystem } from '@effect/platform/FileSystem'\nimport * as HttpClient from '@effect/platform/HttpClient'\nimport * as HttpClientRequest from '@effect/platform/HttpClientRequest'\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\n// Security constraints\nconst SECURITY_DEFAULTS = {\n maxConfigSize: 1_000_000, // 1MB\n requestTimeout: 5_000 // 5 seconds\n} as const\n\n/**\n * ConfigLoader service interface\n */\nexport interface ConfigLoaderService {\n /**\n * Load configuration from a URI\n *\n * Supports:\n * - file:// URIs (uses FileSystem if available)\n * - http:// and https:// URIs (uses HttpClient)\n * - Relative paths (treated as file:// in Node, http:// in browser)\n *\n * @param uri - Configuration URI\n * @returns Effect that resolves to validated configuration (NO requirements)\n */\n readonly loadFromUri: (\n uri: string\n ) => Effect.Effect<\n InstrumentationConfig,\n ConfigError | ConfigFileError | ConfigUrlError | ConfigValidationError\n >\n\n /**\n * Load configuration from inline content (YAML, JSON, or object)\n *\n * @param content - YAML string, JSON string, or plain object\n * @returns Effect that resolves to validated configuration\n */\n readonly loadFromInline: (\n content: string | unknown\n ) => Effect.Effect<InstrumentationConfig, ConfigError | ConfigValidationError>\n}\n\n/**\n * ConfigLoader service tag\n */\nexport class ConfigLoader extends Context.Tag('ConfigLoader')<\n ConfigLoader,\n ConfigLoaderService\n>() {}\n\n/**\n * Parse and validate YAML content\n */\nconst parseYamlContent = (\n content: string,\n uri?: string\n): Effect.Effect<InstrumentationConfig, ConfigValidationError> =>\n Effect.gen(function* () {\n // Parse YAML\n const parsed = yield* Effect.try({\n try: () => parseYAML(content),\n catch: (error) =>\n new ConfigValidationError({\n reason: uri ? `Failed to parse YAML from ${uri}` : 'Failed to parse YAML',\n cause: error\n })\n })\n\n // Validate schema\n return yield* Effect.try({\n try: () => InstrumentationConfigSchema.parse(parsed),\n catch: (error) =>\n new ConfigValidationError({\n reason: uri ? `Invalid configuration schema from ${uri}` : 'Invalid configuration schema',\n cause: error\n })\n })\n })\n\n/**\n * Load configuration from file using captured FileSystem service\n */\nconst loadFromFileWithFs = (\n fs: FileSystem,\n path: string,\n uri: string\n): Effect.Effect<InstrumentationConfig, ConfigFileError | ConfigValidationError> =>\n Effect.gen(function* () {\n // Read file\n const content = yield* fs.readFileString(path).pipe(\n Effect.mapError(\n (error) =>\n new ConfigFileError({\n reason: `Failed to read config file at ${uri}`,\n cause: error\n })\n )\n )\n\n // Security: Check file size\n if (content.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 and validate\n return yield* parseYamlContent(content, uri)\n })\n\n/**\n * Load configuration from http using captured HttpClient service\n */\nconst loadFromHttpWithClient = (\n client: HttpClient.HttpClient,\n url: string\n): Effect.Effect<InstrumentationConfig, ConfigUrlError | ConfigValidationError> =>\n Effect.scoped(\n Effect.gen(function* () {\n // Security: Reject non-HTTPS URLs\n if (url.startsWith('http://')) {\n return yield* Effect.fail(\n new ConfigUrlError({\n reason: 'Insecure protocol: only HTTPS URLs are allowed'\n })\n )\n }\n\n // Create request\n const request = HttpClientRequest.get(url).pipe(\n HttpClientRequest.setHeaders({\n Accept: 'application/yaml, text/yaml, application/x-yaml'\n })\n )\n\n // Execute request with timeout\n const response = yield* client.execute(request).pipe(\n Effect.timeout(`${SECURITY_DEFAULTS.requestTimeout} millis`),\n Effect.mapError((error) => {\n if (error._tag === 'TimeoutException') {\n return new ConfigUrlError({\n reason: `Config fetch timeout after ${SECURITY_DEFAULTS.requestTimeout}ms from ${url}`\n })\n }\n return new ConfigUrlError({\n reason: `Failed to load config from URL: ${url}`,\n cause: error\n })\n })\n )\n\n // Check HTTP status\n if (response.status >= 400) {\n return yield* Effect.fail(\n new ConfigUrlError({\n reason: `HTTP ${response.status} from ${url}`\n })\n )\n }\n\n // Get response text\n const text = yield* response.text.pipe(\n Effect.mapError(\n (error) =>\n new ConfigUrlError({\n reason: `Failed to read response body from ${url}`,\n cause: error\n })\n )\n )\n\n // Security: Check 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 and validate\n return yield* parseYamlContent(text, url)\n })\n )\n\n/**\n * ConfigLoader service implementation\n *\n * Captures FileSystem and HttpClient dependencies at construction time\n */\nconst makeConfigLoader = Effect.gen(function* () {\n // Capture dependencies at construction time\n const fs = yield* Effect.serviceOption(FileSystem)\n const http = yield* HttpClient.HttpClient\n\n // Create the loadFromUri function\n const loadFromUriUncached = (uri: string) =>\n Effect.gen(function* () {\n // file:// protocol\n if (uri.startsWith('file://')) {\n const path = uri.slice(7) // Remove \"file://\"\n\n if (fs._tag === 'None') {\n return yield* Effect.fail(\n new ConfigFileError({\n reason: 'FileSystem not available (browser environment?)',\n cause: { uri }\n })\n )\n }\n\n return yield* loadFromFileWithFs(fs.value, path, uri)\n }\n\n // http:// or https:// protocol\n if (uri.startsWith('http://') || uri.startsWith('https://')) {\n return yield* loadFromHttpWithClient(http, uri)\n }\n\n // Relative path - try FileSystem first, fallback to HTTP\n if (fs._tag === 'Some') {\n // FileSystem available (Node.js environment)\n return yield* loadFromFileWithFs(fs.value, uri, uri)\n } else {\n // No FileSystem (browser environment) - treat as HTTP\n // Relative URLs will be resolved by browser fetch to current origin\n return yield* loadFromHttpWithClient(http, uri)\n }\n })\n\n // Cache the loadFromUri function with 5 minute TTL (default cache timeout)\n const loadFromUriCached = yield* Effect.cachedFunction(loadFromUriUncached)\n\n return ConfigLoader.of({\n loadFromUri: loadFromUriCached,\n\n loadFromInline: (content: string | unknown) =>\n Effect.gen(function* () {\n // If string, parse as YAML\n if (typeof content === 'string') {\n return yield* parseYamlContent(content)\n }\n\n // Already an object - just validate schema\n return yield* Effect.try({\n try: () => InstrumentationConfigSchema.parse(content),\n catch: (error) =>\n new ConfigValidationError({\n reason: 'Invalid configuration schema',\n cause: error\n })\n })\n })\n })\n})\n\n/**\n * ConfigLoader Live layer\n *\n * Provides ConfigLoader service implementation.\n * Requires HttpClient to be provided by platform-specific layers.\n * FileSystem is optional (for browser compatibility).\n */\nexport const ConfigLoaderLive = Layer.effect(ConfigLoader, makeConfigLoader)\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 * Node.js configuration loader using Effect Platform\n *\n * Provides FileSystem and HttpClient layers for the core ConfigLoader service\n */\n\nimport { Effect, Layer } from 'effect'\nimport { NodeContext } from '@effect/platform-node'\nimport { FetchHttpClient } from '@effect/platform'\nimport {\n ConfigLoader,\n ConfigLoaderLive,\n type InstrumentationConfig,\n type ConfigLoaderService\n} from '@atrim/instrument-core'\n\n/**\n * Complete ConfigLoader layer with all Node.js platform dependencies\n *\n * Provides:\n * - ConfigLoader service\n * - FileSystem (from NodeContext)\n * - HttpClient (from FetchHttpClient)\n */\nexport const NodeConfigLoaderLive = ConfigLoaderLive.pipe(\n Layer.provide(Layer.mergeAll(NodeContext.layer, FetchHttpClient.layer))\n)\n\n/**\n * Singleton cached config loader for sharing cache across calls\n */\nlet cachedLoaderPromise: Promise<ConfigLoaderService> | null = null\n\nfunction getCachedLoader(): Promise<ConfigLoaderService> {\n if (!cachedLoaderPromise) {\n cachedLoaderPromise = Effect.runPromise(\n Effect.gen(function* () {\n return yield* ConfigLoader\n }).pipe(Effect.provide(NodeConfigLoaderLive))\n )\n }\n return cachedLoaderPromise\n}\n\n/**\n * Reset the cached loader (for testing purposes)\n * @internal\n */\nexport function _resetConfigLoaderCache(): void {\n cachedLoaderPromise = null\n}\n\n/**\n * Load configuration from URI (Promise-based convenience API)\n *\n * Automatically provides Node.js platform layers (FileSystem + HttpClient)\n *\n * @param uri - Configuration URI (file://, http://, https://, or relative path)\n * @param options - Optional loading options (e.g., to disable caching)\n * @returns Promise that resolves to validated configuration\n */\nexport async function loadConfig(\n uri: string,\n options?: { cacheTimeout?: number }\n): Promise<InstrumentationConfig> {\n // If cacheTimeout is 0, bypass cache\n if (options?.cacheTimeout === 0) {\n const program = Effect.gen(function* () {\n const loader = yield* ConfigLoader\n return yield* loader.loadFromUri(uri)\n })\n return Effect.runPromise(program.pipe(Effect.provide(NodeConfigLoaderLive)))\n }\n\n const loader = await getCachedLoader()\n return Effect.runPromise(loader.loadFromUri(uri))\n}\n\n/**\n * Load configuration from inline content (Promise-based convenience API)\n *\n * @param content - YAML string, JSON string, or plain object\n * @returns Promise that resolves to validated configuration\n */\nexport async function loadConfigFromInline(\n content: string | unknown\n): Promise<InstrumentationConfig> {\n const loader = await getCachedLoader()\n return Effect.runPromise(loader.loadFromInline(content))\n}\n\n/**\n * Legacy options interface for backward compatibility\n */\nexport interface ConfigLoaderOptions {\n configPath?: string\n configUrl?: string\n config?: InstrumentationConfig\n cacheTimeout?: number\n}\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 * Load configuration with priority order (backward compatible API)\n *\n * Priority order (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 * @param options - Configuration options\n * @returns Promise that resolves to validated configuration\n */\nexport async function loadConfigWithOptions(\n options: ConfigLoaderOptions = {}\n): Promise<InstrumentationConfig> {\n // Extract cacheTimeout option\n const loadOptions =\n options.cacheTimeout !== undefined ? { cacheTimeout: options.cacheTimeout } : undefined\n\n // Priority 1: Explicit config object\n if (options.config) {\n return loadConfigFromInline(options.config)\n }\n\n // Priority 2: Environment variable\n const envConfigPath = process.env.ATRIM_INSTRUMENTATION_CONFIG\n if (envConfigPath) {\n return loadConfig(envConfigPath, loadOptions)\n }\n\n // Priority 3: Explicit options\n if (options.configUrl) {\n return loadConfig(options.configUrl, loadOptions)\n }\n if (options.configPath) {\n return loadConfig(options.configPath, loadOptions)\n }\n\n // Priority 4: Project root file\n const { existsSync } = await import('fs')\n const { join } = await import('path')\n\n const defaultPath = join(process.cwd(), 'instrumentation.yaml')\n if (existsSync(defaultPath)) {\n return loadConfig(defaultPath, loadOptions)\n }\n\n // Priority 5: Default config\n return getDefaultConfig()\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 type { RequestOptions, IncomingMessage } from 'node:http'\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 type InstrumentationConfig,\n type PatternConfig,\n initializePatternMatcher,\n logger\n} from '@atrim/instrument-core'\nimport { loadConfigWithOptions, type ConfigLoaderOptions } from './config-loader.js'\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 * HTTP instrumentation filtering configuration\n *\n * Allows filtering of HTTP requests to prevent noisy traces\n * (e.g., health checks, OTLP exports, internal endpoints)\n *\n * @example\n * ```typescript\n * // Pattern-based filtering\n * http: {\n * ignoreOutgoingUrls: [/\\/health$/, /\\/v1\\/traces$/],\n * ignoreIncomingPaths: [/^\\/health$/]\n * }\n *\n * // Custom hook for advanced filtering\n * http: {\n * ignoreOutgoingRequestHook: (req) => {\n * const path = req.path || ''\n * return path.includes('otel-collector')\n * }\n * }\n * ```\n */\n http?: {\n /**\n * URL patterns to ignore for outgoing HTTP requests\n * Can be strings or RegExp patterns\n */\n ignoreOutgoingUrls?: (string | RegExp)[]\n\n /**\n * Path patterns to ignore for incoming HTTP requests\n * Can be strings or RegExp patterns\n */\n ignoreIncomingPaths?: (string | RegExp)[]\n\n /**\n * Custom hook for filtering outgoing HTTP requests\n * Return true to ignore the request (no span created)\n *\n * Note: The request parameter is RequestOptions (from http.request()),\n * not the ClientRequest object\n */\n ignoreOutgoingRequestHook?: (req: RequestOptions) => boolean\n\n /**\n * Custom hook for filtering incoming HTTP requests\n * Return true to ignore the request (no span created)\n */\n ignoreIncomingRequestHook?: (req: IncomingMessage) => boolean\n\n /**\n * Require parent span for outgoing requests\n * Prevents root spans for HTTP calls (useful for avoiding noise)\n */\n requireParentForOutgoingSpans?: boolean\n }\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 * HTTP instrumentation config that matches @opentelemetry/instrumentation-http\n * We define this inline to avoid importing from the package (which is a transitive dependency)\n */\ninterface HttpInstrumentationConfigBuilder {\n enabled: boolean\n ignoreOutgoingRequestHook?: (req: RequestOptions) => boolean\n ignoreIncomingRequestHook?: (req: IncomingMessage) => boolean\n requireParentforOutgoingSpans?: boolean\n}\n\n/**\n * Build HTTP instrumentation configuration from options and config\n *\n * Merges YAML config, programmatic options, and smart defaults\n */\nfunction buildHttpInstrumentationConfig(\n options: SdkInitializationOptions,\n config: InstrumentationConfig,\n _otlpEndpoint: string\n): HttpInstrumentationConfigBuilder {\n const httpConfig: HttpInstrumentationConfigBuilder = { enabled: true }\n\n // Build outgoing request filter from YAML config and programmatic options ONLY\n // No hardcoded defaults - everything must be explicit in instrumentation.yaml\n const programmaticPatterns = options.http?.ignoreOutgoingUrls || []\n const yamlPatterns = config.http?.ignore_outgoing_urls || []\n\n // Combine all patterns (NO defaults)\n const allOutgoingPatterns = [\n ...programmaticPatterns.map((p) => (typeof p === 'string' ? new RegExp(p) : p)),\n ...yamlPatterns.map((p) => new RegExp(p))\n ]\n\n logger.log(`HTTP filtering: ${allOutgoingPatterns.length} outgoing patterns configured`)\n\n // Build the hook (always create it if we have any patterns)\n if (options.http?.ignoreOutgoingRequestHook) {\n // Use custom hook if provided\n httpConfig.ignoreOutgoingRequestHook = options.http.ignoreOutgoingRequestHook\n } else if (allOutgoingPatterns.length > 0) {\n // Build hook from YAML/programmatic patterns ONLY\n httpConfig.ignoreOutgoingRequestHook = (req: RequestOptions) => {\n // RequestOptions has: hostname, host, port, path, protocol, etc.\n const hostname = req.hostname || req.host || ''\n const port = req.port || ''\n const protocol = req.protocol || 'http:'\n const path = req.path || ''\n\n // Build full URL for pattern matching\n const portStr = port ? `:${port}` : ''\n const url = `${protocol}//${hostname}${portStr}${path}`\n\n // Check patterns against both URL and path\n const matchesPattern = allOutgoingPatterns.some(\n (pattern) => pattern.test(url) || pattern.test(path)\n )\n\n return matchesPattern\n }\n }\n\n // Step 3: Build incoming request filter\n const programmaticIncomingPatterns = options.http?.ignoreIncomingPaths || []\n const yamlIncomingPatterns = config.http?.ignore_incoming_paths || []\n\n const allIncomingPatterns = [\n ...programmaticIncomingPatterns.map((p) => (typeof p === 'string' ? new RegExp(p) : p)),\n ...yamlIncomingPatterns.map((p) => new RegExp(p))\n ]\n\n if (options.http?.ignoreIncomingRequestHook) {\n // Use custom hook if provided\n httpConfig.ignoreIncomingRequestHook = options.http.ignoreIncomingRequestHook\n } else if (allIncomingPatterns.length > 0) {\n // Build hook from patterns\n httpConfig.ignoreIncomingRequestHook = (req: IncomingMessage) => {\n const path = req.url || ''\n return allIncomingPatterns.some((pattern) => pattern.test(path))\n }\n }\n\n // Step 4: Apply requireParentForOutgoingSpans setting\n if (\n options.http?.requireParentForOutgoingSpans !== undefined ||\n config.http?.require_parent_for_outgoing_spans !== undefined\n ) {\n httpConfig.requireParentforOutgoingSpans =\n options.http?.requireParentForOutgoingSpans ??\n config.http?.require_parent_for_outgoing_spans ??\n false\n }\n\n return httpConfig\n}\n\n/**\n * Build undici instrumentation configuration from options and config\n *\n * Undici powers the fetch API in Node.js 18+ and is used by the OTLP HTTP exporter\n * We must filter OTLP requests here to prevent trace loops\n */\nfunction buildUndiciInstrumentationConfig(\n options: SdkInitializationOptions,\n config: InstrumentationConfig,\n _otlpEndpoint: string\n) {\n const undiciConfig = { enabled: true } as Record<string, unknown>\n\n // Get programmatic and YAML patterns ONLY (NO hardcoded defaults)\n const programmaticPatterns = options.http?.ignoreOutgoingUrls || []\n const yamlPatterns = config.http?.ignore_outgoing_urls || []\n\n // Combine all patterns (NO defaults)\n const allPatterns = [\n ...programmaticPatterns.map((p) => (typeof p === 'string' ? new RegExp(p) : p)),\n ...yamlPatterns.map((p) => new RegExp(p))\n ]\n\n // Only create ignoreRequestHook if we have patterns to check\n if (allPatterns.length > 0) {\n // Build ignoreRequestHook for undici\n // Note: undici's hook receives a UndiciRequest object with origin, path, method\n undiciConfig.ignoreRequestHook = (request: {\n origin: string\n path: string\n method: string\n }) => {\n const origin = request.origin\n const path = request.path\n const url = `${origin}${path}`\n\n // ALWAYS log to verify hook is being called\n // Check patterns from YAML/programmatic config ONLY\n const matchesPattern = allPatterns.some((pattern) => pattern.test(url) || pattern.test(path))\n return matchesPattern\n }\n }\n\n return undiciConfig\n}\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 loadConfigWithOptions(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 // Get OTLP endpoint for HTTP filtering\n const otlpEndpoint =\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\n // Build HTTP instrumentation config with filtering\n const httpConfig = buildHttpInstrumentationConfig(options, config, otlpEndpoint)\n\n // Build undici instrumentation config (for fetch/undici in Node.js 18+)\n // The OTLP HTTP exporter uses fetch, which uses undici\n const undiciConfig = buildUndiciInstrumentationConfig(options, config, otlpEndpoint)\n\n instrumentations.push(\n ...getNodeAutoInstrumentations({\n // Enable HTTP instrumentation with filtering (for http/https modules)\n '@opentelemetry/instrumentation-http': httpConfig,\n\n // Enable undici instrumentation with filtering (for fetch API)\n '@opentelemetry/instrumentation-undici': undiciConfig,\n\n // Enable web framework instrumentations\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 logger.log(`Auto-instrumentation: ${instrumentations.length} instrumentations enabled`)\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, logger } from '@atrim/instrument-core'\nimport { loadConfigWithOptions } from './core/config-loader.js'\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 loadConfigWithOptions(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 loadConfigWithOptions(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: () => loadConfigWithOptions(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: () => loadConfigWithOptions(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"]}
|