@atrim/instrument-node 0.7.0-b9eaf74-20260108193056 → 0.7.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +1 -6
- package/target/dist/index.cjs +1 -66
- package/target/dist/index.cjs.map +1 -1
- package/target/dist/index.js +1 -66
- package/target/dist/index.js.map +1 -1
- package/target/dist/integrations/effect/index.cjs +1 -66
- package/target/dist/integrations/effect/index.cjs.map +1 -1
- package/target/dist/integrations/effect/index.js +1 -66
- package/target/dist/integrations/effect/index.js.map +1 -1
- package/target/dist/integrations/effect/auto/index.cjs +0 -915
- package/target/dist/integrations/effect/auto/index.cjs.map +0 -1
- package/target/dist/integrations/effect/auto/index.d.cts +0 -278
- package/target/dist/integrations/effect/auto/index.d.ts +0 -278
- package/target/dist/integrations/effect/auto/index.js +0 -875
- package/target/dist/integrations/effect/auto/index.js.map +0 -1
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../../../core/src/instrumentation-schema.ts","../../../../../../core/src/errors.ts","../../../../../../core/src/services/config-loader.ts","../../../../../../core/src/logger.ts","../../../../../src/integrations/effect/auto/naming.ts","../../../../../src/core/config-loader.ts","../../../../../src/integrations/effect/auto/config.ts","../../../../../src/integrations/effect/auto/supervisor.ts"],"names":["parseYaml","parseYAML","path","__publicField","basename","Context","Effect","Layer"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Configuration schema using Zod\n */\nimport { z } from 'zod'\nimport { parse as parseYaml } from 'yaml'\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 */\n/**\n * Span naming rule for auto-instrumentation\n *\n * Allows matching fibers based on file path, function name, etc.\n * and applying custom span names with template variables.\n */\nexport const SpanNamingRuleSchema = z.object({\n // Match criteria (all specified criteria must match)\n match: z.object({\n // Regex pattern to match file path\n file: z.string().optional(),\n // Regex pattern to match function name\n function: z.string().optional(),\n // Regex pattern to match module name\n module: z.string().optional()\n }),\n // Span name template with variables:\n // {fiber_id} - Fiber ID\n // {function} - Function name\n // {module} - Module name\n // {file} - File path\n // {line} - Line number\n // {operator} - Effect operator (gen, all, forEach, etc.)\n // {match:field:N} - Captured regex group from match\n name: z.string()\n})\n\n/**\n * Auto-instrumentation configuration for Effect operations\n *\n * Enables automatic tracing of all Effect fibers without manual\n * Effect.withSpan() calls. Configuration-driven via instrumentation.yaml.\n */\nexport const AutoInstrumentationConfigSchema = z.object({\n // Enable/disable auto-instrumentation\n enabled: z.boolean().default(false),\n\n // Tracing granularity\n // - 'fiber': Trace at fiber creation (recommended, lower overhead)\n // - 'operator': Trace each Effect operator (higher granularity, more overhead)\n granularity: z.enum(['fiber', 'operator']).default('fiber'),\n\n // Smart span naming configuration\n span_naming: z\n .object({\n // Default span name template when no rules match\n default: z.string().default('effect.fiber.{fiber_id}'),\n\n // Infer span names from source code (requires stack trace parsing)\n // Adds ~50-100μs overhead per fiber\n infer_from_source: z.boolean().default(true),\n\n // Naming rules (first match wins)\n rules: z.array(SpanNamingRuleSchema).default([])\n })\n .default({}),\n\n // Pattern-based filtering\n filter: z\n .object({\n // Only trace spans matching these patterns (empty = trace all)\n include: z.array(z.string()).default([]),\n\n // Never trace spans matching these patterns\n exclude: z.array(z.string()).default([])\n })\n .default({}),\n\n // Performance controls\n performance: z\n .object({\n // Sample rate (0.0 - 1.0)\n sampling_rate: z.number().min(0).max(1).default(1.0),\n\n // Skip fibers shorter than this duration (e.g., \"10ms\", \"100 millis\")\n min_duration: z.string().default('0ms'),\n\n // Maximum concurrent traced fibers (0 = unlimited)\n max_concurrent: z.number().default(0)\n })\n .default({}),\n\n // Automatic metadata extraction\n metadata: z\n .object({\n // Extract Effect fiber information\n fiber_info: z.boolean().default(true),\n\n // Extract source location (file:line)\n source_location: z.boolean().default(true),\n\n // Extract parent fiber information\n parent_fiber: z.boolean().default(true)\n })\n .default({})\n})\n\nexport type AutoInstrumentationConfig = z.infer<typeof AutoInstrumentationConfigSchema>\nexport type SpanNamingRule = z.infer<typeof SpanNamingRuleSchema>\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 // Enable/disable Effect tracing entirely\n // When false, EffectInstrumentationLive returns Layer.empty\n enabled: z.boolean().default(true),\n // Exporter mode:\n // - \"unified\": Use global TracerProvider from Node SDK (recommended, enables filtering)\n // - \"standalone\": Use Effect's own OTLP exporter (bypasses Node SDK filtering)\n exporter: z.enum(['unified', 'standalone']).default('unified'),\n auto_extract_metadata: z.boolean(),\n auto_isolation: AutoIsolationConfigSchema.optional(),\n // Auto-instrumentation: automatic tracing of all Effect fibers\n auto_instrumentation: AutoInstrumentationConfigSchema.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/**\n * Default configuration when no config file is found\n */\nexport const defaultConfig: InstrumentationConfig = {\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 enabled: true,\n exporter: 'unified' as const,\n auto_extract_metadata: true\n }\n}\n\n/**\n * Parse and validate configuration content (YAML string, JSON string, or object)\n *\n * @param content - YAML string, JSON string, or plain object\n * @returns Validated InstrumentationConfig\n * @throws Error if parsing or validation fails\n */\nexport function parseAndValidateConfig(content: string | unknown): InstrumentationConfig {\n let parsed: unknown\n\n // If string, parse as YAML (YAML is a superset of JSON)\n if (typeof content === 'string') {\n parsed = parseYaml(content)\n } else {\n parsed = content\n }\n\n // Validate with schema\n return InstrumentationConfigSchema.parse(parsed)\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 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 * 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 * Span Name Inference for Auto-Tracing\n *\n * Provides intelligent span naming based on source code information\n * and configuration rules from instrumentation.yaml.\n */\n\nimport type { AutoInstrumentationConfig, SpanNamingRule } from '@atrim/instrument-core'\nimport * as path from 'path'\n\n/**\n * Source code information extracted from stack traces\n */\nexport interface SourceInfo {\n /** Function name (or 'anonymous') */\n function: string\n /** Full file path */\n file: string\n /** Line number */\n line: number\n /** Column number */\n column: number\n}\n\n/**\n * Template variables available for span naming\n */\nexport interface TemplateVariables {\n fiber_id: string\n function: string\n module: string\n file: string\n line: string\n operator: string\n [key: string]: string\n}\n\n/**\n * Compiled naming rule with pre-compiled regex patterns\n */\ninterface CompiledNamingRule {\n original: SpanNamingRule\n filePattern: RegExp | undefined\n functionPattern: RegExp | undefined\n modulePattern: RegExp | undefined\n}\n\n// Cache for compiled naming rules\nconst compiledRulesCache = new WeakMap<SpanNamingRule[], CompiledNamingRule[]>()\n\n/**\n * Compile naming rules for efficient matching\n */\nfunction compileNamingRules(rules: SpanNamingRule[]): CompiledNamingRule[] {\n const cached = compiledRulesCache.get(rules)\n if (cached) return cached\n\n const compiled: CompiledNamingRule[] = rules.map((rule) => ({\n original: rule,\n filePattern: rule.match.file ? new RegExp(rule.match.file) : undefined,\n functionPattern: rule.match.function ? new RegExp(rule.match.function) : undefined,\n modulePattern: rule.match.module ? new RegExp(rule.match.module) : undefined\n }))\n\n compiledRulesCache.set(rules, compiled)\n return compiled\n}\n\n/**\n * Extract module name from file path\n */\nfunction extractModuleName(filePath: string): string {\n const basename = path.basename(filePath, path.extname(filePath))\n // Remove common suffixes (both dot-separated and PascalCase)\n // e.g., \"user.service\" -> \"user\", \"UserService\" -> \"User\"\n return basename\n .replace(/\\.(service|controller|handler|util|helper|model|repo|repository)$/i, '')\n .replace(/(Service|Controller|Handler|Util|Helper|Model|Repo|Repository)$/i, '')\n}\n\n/**\n * Apply template variables to a span name pattern\n *\n * Supports:\n * - {fiber_id} - Fiber ID\n * - {function} - Function name\n * - {module} - Module name (filename without extension)\n * - {file} - Full file path\n * - {line} - Line number\n * - {operator} - Effect operator (if known)\n * - {match:field:N} - Captured regex group from match\n */\nfunction applyTemplate(\n template: string,\n variables: TemplateVariables,\n matchGroups?: Map<string, string[]>\n): string {\n let result = template\n\n // Replace simple variables\n for (const [key, value] of Object.entries(variables)) {\n result = result.replace(new RegExp(`\\\\{${key}\\\\}`, 'g'), value)\n }\n\n // Replace match groups: {match:field:N} where field is 'file', 'function', 'module'\n // and N is the capture group index\n if (matchGroups) {\n result = result.replace(\n /\\{match:(\\w+):(\\d+)\\}/g,\n (_fullMatch, field: string, index: string): string => {\n const groups = matchGroups.get(field)\n const idx = parseInt(index, 10)\n if (groups && groups[idx]) {\n return groups[idx]\n }\n return ''\n }\n )\n }\n\n return result\n}\n\n/**\n * Find matching naming rule for the given source info\n */\nfunction findMatchingRule(\n sourceInfo: SourceInfo | undefined,\n config: AutoInstrumentationConfig\n): { rule: CompiledNamingRule; matchGroups: Map<string, string[]> } | undefined {\n const rules = config.span_naming?.rules\n if (!rules || rules.length === 0) return undefined\n\n const compiledRules = compileNamingRules(rules)\n\n for (const rule of compiledRules) {\n const matchGroups = new Map<string, string[]>()\n let allMatched = true\n\n // Check file pattern\n if (rule.filePattern) {\n if (sourceInfo?.file) {\n const match = sourceInfo.file.match(rule.filePattern)\n if (match) {\n matchGroups.set('file', match.slice(1))\n } else {\n allMatched = false\n }\n } else {\n allMatched = false\n }\n }\n\n // Check function pattern\n if (rule.functionPattern && allMatched) {\n if (sourceInfo?.function) {\n const match = sourceInfo.function.match(rule.functionPattern)\n if (match) {\n matchGroups.set('function', match.slice(1))\n } else {\n allMatched = false\n }\n } else {\n allMatched = false\n }\n }\n\n // Check module pattern\n if (rule.modulePattern && allMatched) {\n const moduleName = sourceInfo?.file ? extractModuleName(sourceInfo.file) : ''\n if (moduleName) {\n const match = moduleName.match(rule.modulePattern)\n if (match) {\n matchGroups.set('module', match.slice(1))\n } else {\n allMatched = false\n }\n } else {\n allMatched = false\n }\n }\n\n if (allMatched) {\n return { rule, matchGroups }\n }\n }\n\n return undefined\n}\n\n/**\n * Infer a span name based on fiber ID, source info, and configuration\n *\n * Priority:\n * 1. Match against naming rules (first match wins)\n * 2. Use default template with source info if available\n * 3. Fallback to default template with fiber ID only\n *\n * @param fiberId - The fiber's numeric ID\n * @param sourceInfo - Optional source code information from stack trace\n * @param config - Auto-instrumentation configuration\n * @returns The inferred span name\n */\nexport function inferSpanName(\n fiberId: number,\n sourceInfo: SourceInfo | undefined,\n config: AutoInstrumentationConfig\n): string {\n // Build template variables\n const variables: TemplateVariables = {\n fiber_id: String(fiberId),\n function: sourceInfo?.function || 'anonymous',\n module: sourceInfo?.file ? extractModuleName(sourceInfo.file) : 'unknown',\n file: sourceInfo?.file || 'unknown',\n line: sourceInfo?.line ? String(sourceInfo.line) : '0',\n operator: 'gen' // Default operator, could be enhanced with more context\n }\n\n // Try to match a naming rule\n const match = findMatchingRule(sourceInfo, config)\n if (match) {\n return applyTemplate(match.rule.original.name, variables, match.matchGroups)\n }\n\n // Use default template\n const defaultTemplate = config.span_naming?.default || 'effect.fiber.{fiber_id}'\n return applyTemplate(defaultTemplate, variables)\n}\n\n/**\n * Sanitize a span name to be OpenTelemetry compliant\n *\n * - Replaces invalid characters with underscores\n * - Ensures name is not empty\n * - Truncates to reasonable length\n */\nexport function sanitizeSpanName(name: string): string {\n if (!name) return 'effect.fiber.unknown'\n\n // Replace invalid characters (keep alphanumeric, dot, underscore, dash)\n let sanitized = name.replace(/[^a-zA-Z0-9._-]/g, '_')\n\n // Collapse multiple underscores\n sanitized = sanitized.replace(/_+/g, '_')\n\n // Remove leading/trailing underscores\n sanitized = sanitized.replace(/^_+|_+$/g, '')\n\n // Ensure not empty\n if (!sanitized) return 'effect.fiber.unknown'\n\n // Truncate to reasonable length (OTel has no strict limit, but 256 is reasonable)\n if (sanitized.length > 256) {\n sanitized = sanitized.substring(0, 256)\n }\n\n return sanitized\n}\n","/**\n * Node.js configuration loader\n *\n * Provides configuration loading using native Node.js APIs (fs, fetch)\n * This module doesn't require Effect Platform, making it work without Effect installed.\n */\n\nimport { Effect } from 'effect'\nimport {\n type InstrumentationConfig,\n parseAndValidateConfig,\n defaultConfig\n} from '@atrim/instrument-core'\n\n/**\n * Load configuration from a file path using native Node.js fs\n */\nasync function loadFromFile(filePath: string): Promise<InstrumentationConfig> {\n const { readFile } = await import('fs/promises')\n const content = await readFile(filePath, 'utf-8')\n return parseAndValidateConfig(content)\n}\n\n/**\n * Load configuration from a URL using native fetch\n */\nasync function loadFromUrl(url: string): Promise<InstrumentationConfig> {\n const response = await fetch(url)\n if (!response.ok) {\n throw new Error(`Failed to fetch config from ${url}: ${response.statusText}`)\n }\n const content = await response.text()\n return parseAndValidateConfig(content)\n}\n\n/**\n * Load configuration from URI (file path or URL)\n *\n * @param uri - Configuration URI (file://, http://, https://, or relative path)\n * @returns Promise that resolves to validated configuration\n */\nexport async function loadConfig(\n uri: string,\n _options?: { cacheTimeout?: number }\n): Promise<InstrumentationConfig> {\n // Handle URL protocols\n if (uri.startsWith('http://') || uri.startsWith('https://')) {\n return loadFromUrl(uri)\n }\n\n // Handle file:// protocol\n if (uri.startsWith('file://')) {\n const filePath = uri.slice(7) // Remove 'file://'\n return loadFromFile(filePath)\n }\n\n // Treat as file path\n return loadFromFile(uri)\n}\n\n/**\n * Load configuration from inline content\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 return parseAndValidateConfig(content)\n}\n\n/**\n * Reset the config loader cache (no-op for native implementation)\n * @internal\n */\nexport function _resetConfigLoaderCache(): void {\n // No cache in native implementation\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 * 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 // 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, options)\n }\n\n // Priority 3: Explicit options\n if (options.configUrl) {\n return loadConfig(options.configUrl, options)\n }\n if (options.configPath) {\n return loadConfig(options.configPath, options)\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, options)\n }\n\n // Priority 5: Default config\n return defaultConfig\n}\n\n// ============================================================================\n// Effect-Based API (for Effect users)\n// ============================================================================\n\n/**\n * Load configuration from URI (Effect version)\n */\nexport const loadConfigEffect = (\n uri: string,\n options?: { cacheTimeout?: number }\n): Effect.Effect<InstrumentationConfig, Error> =>\n Effect.tryPromise({\n try: () => loadConfig(uri, options),\n catch: (error) => (error instanceof Error ? error : new Error(String(error)))\n })\n\n/**\n * Load configuration from inline content (Effect version)\n */\nexport const loadConfigFromInlineEffect = (\n content: string | unknown\n): Effect.Effect<InstrumentationConfig, Error> =>\n Effect.tryPromise({\n try: () => loadConfigFromInline(content),\n catch: (error) => (error instanceof Error ? error : new Error(String(error)))\n })\n\n/**\n * Load configuration with priority order (Effect version)\n */\nexport const loadConfigWithOptionsEffect = (\n options: ConfigLoaderOptions = {}\n): Effect.Effect<InstrumentationConfig, Error> =>\n Effect.tryPromise({\n try: () => loadConfigWithOptions(options),\n catch: (error) => (error instanceof Error ? error : new Error(String(error)))\n })\n","/**\n * Auto-Tracing Configuration Loader\n *\n * Loads auto-tracing configuration from instrumentation.yaml\n * and provides a typed Effect service for accessing it.\n */\n\nimport { Effect, Context, Layer } from 'effect'\nimport {\n type AutoInstrumentationConfig,\n AutoInstrumentationConfigSchema,\n logger\n} from '@atrim/instrument-core'\nimport { loadConfigWithOptions, type ConfigLoaderOptions } from '../../../core/config-loader.js'\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/**\n * Re-export config type for convenience\n */\nexport type { AutoInstrumentationConfig }\n\n/**\n * Default auto-tracing configuration when not specified in instrumentation.yaml\n */\nexport const defaultAutoTracingConfig: AutoInstrumentationConfig = {\n enabled: false,\n granularity: 'fiber',\n span_naming: {\n default: 'effect.fiber.{fiber_id}',\n infer_from_source: true,\n rules: []\n },\n filter: {\n include: [],\n exclude: []\n },\n performance: {\n sampling_rate: 1.0,\n min_duration: '0ms',\n max_concurrent: 0\n },\n metadata: {\n fiber_info: true,\n source_location: true,\n parent_fiber: true\n }\n}\n\n// ============================================================================\n// Service Definition\n// ============================================================================\n\n/**\n * Service tag for auto-tracing configuration\n */\nexport class AutoTracingConfig extends Context.Tag('AutoTracingConfig')<\n AutoTracingConfig,\n AutoInstrumentationConfig\n>() {}\n\n// ============================================================================\n// Configuration Loading\n// ============================================================================\n\n/**\n * Load auto-tracing configuration from instrumentation.yaml\n *\n * Returns the config from effect.auto_instrumentation section,\n * or defaults if not specified.\n */\nexport const loadAutoTracingConfig = (\n options?: ConfigLoaderOptions\n): Effect.Effect<AutoInstrumentationConfig, never, never> =>\n Effect.gen(function* () {\n // Load full config\n const config = yield* Effect.tryPromise({\n try: () => loadConfigWithOptions(options),\n catch: (error) => {\n logger.log(`@atrim/auto-trace: Failed to load config: ${error}`)\n return error\n }\n }).pipe(Effect.catchAll(() => Effect.succeed(null)))\n\n if (!config) {\n logger.log('@atrim/auto-trace: No config found, using defaults')\n return defaultAutoTracingConfig\n }\n\n // Extract auto_instrumentation section\n const autoConfig = config.effect?.auto_instrumentation\n\n if (!autoConfig) {\n logger.log('@atrim/auto-trace: No auto_instrumentation config, using defaults')\n return defaultAutoTracingConfig\n }\n\n // Validate and merge with defaults\n const parsed = AutoInstrumentationConfigSchema.safeParse(autoConfig)\n if (!parsed.success) {\n logger.log(`@atrim/auto-trace: Invalid config, using defaults: ${parsed.error.message}`)\n return defaultAutoTracingConfig\n }\n\n logger.log('@atrim/auto-trace: Loaded config from instrumentation.yaml')\n return parsed.data\n })\n\n/**\n * Load auto-tracing configuration synchronously from cache or default\n *\n * Note: This is a synchronous fallback when Effect runtime isn't available.\n * Prefer loadAutoTracingConfig() when possible.\n */\nexport const loadAutoTracingConfigSync = (): AutoInstrumentationConfig => {\n // For synchronous loading, we can only return defaults\n // The async version should be used for actual config loading\n return defaultAutoTracingConfig\n}\n\n// ============================================================================\n// Layer\n// ============================================================================\n\n/**\n * Layer that provides auto-tracing configuration\n */\nexport const AutoTracingConfigLive = Layer.effect(AutoTracingConfig, loadAutoTracingConfig())\n\n/**\n * Layer that provides custom auto-tracing configuration\n */\nexport const AutoTracingConfigLayer = (\n config: AutoInstrumentationConfig\n): Layer.Layer<AutoTracingConfig> => Layer.succeed(AutoTracingConfig, config)\n","/**\n * Auto-Tracing Supervisor for Effect-TS\n *\n * Provides automatic tracing of all Effect fibers without manual Effect.withSpan() calls.\n * Uses Effect's Supervisor API to intercept fiber creation/termination and create\n * OpenTelemetry spans automatically.\n *\n * @example\n * ```typescript\n * import { AutoTracingLive } from '@atrim/instrument-node/effect/auto'\n *\n * const program = Effect.gen(function* () {\n * yield* doWork() // Automatically traced!\n * }).pipe(Effect.provide(AutoTracingLive))\n * ```\n */\n\nimport {\n Supervisor,\n Effect,\n Layer,\n FiberRef,\n FiberRefs,\n Context,\n Option,\n Exit,\n Fiber\n} from 'effect'\nimport * as OtelApi from '@opentelemetry/api'\nimport type { AutoInstrumentationConfig } from '@atrim/instrument-core'\nimport { logger } from '@atrim/instrument-core'\nimport { inferSpanName, type SourceInfo } from './naming.js'\nimport { loadAutoTracingConfig } from './config.js'\n\n// ============================================================================\n// FiberRefs for opt-out and name override\n// ============================================================================\n\n/**\n * FiberRef to enable/disable auto-tracing for specific fibers\n * Use withoutAutoTracing() to disable\n */\nexport const AutoTracingEnabled = FiberRef.unsafeMake<boolean>(true)\n\n/**\n * FiberRef to override auto-generated span name\n * Use setSpanName() to override\n */\nexport const AutoTracingSpanName = FiberRef.unsafeMake<Option.Option<string>>(Option.none())\n\n// ============================================================================\n// AutoTracingSupervisor\n// ============================================================================\n\n/**\n * Supervisor that automatically creates OpenTelemetry spans for all Effect fibers\n *\n * This supervisor intercepts fiber creation and termination, creating spans\n * based on configuration from instrumentation.yaml.\n */\nexport class AutoTracingSupervisor extends Supervisor.AbstractSupervisor<void> {\n // WeakMap to associate fibers with their OTel spans\n private readonly fiberSpans = new WeakMap<Fiber.RuntimeFiber<unknown, unknown>, OtelApi.Span>()\n\n // WeakMap for fiber start times (for min_duration filtering)\n private readonly fiberStartTimes = new WeakMap<Fiber.RuntimeFiber<unknown, unknown>, bigint>()\n\n // OpenTelemetry tracer\n private readonly tracer: OtelApi.Tracer\n\n // Compiled filter patterns\n private readonly includePatterns: RegExp[]\n private readonly excludePatterns: RegExp[]\n\n // Active fiber count (for max_concurrent limiting)\n private activeFiberCount = 0\n\n constructor(private readonly config: AutoInstrumentationConfig) {\n super()\n\n // Get tracer from global provider\n this.tracer = OtelApi.trace.getTracer('@atrim/auto-trace', '1.0.0')\n\n // Compile filter patterns\n this.includePatterns = (config.filter?.include || []).map((p) => new RegExp(p))\n this.excludePatterns = (config.filter?.exclude || []).map((p) => new RegExp(p))\n\n logger.log('@atrim/auto-trace: Supervisor initialized')\n logger.log(` Granularity: ${config.granularity || 'fiber'}`)\n logger.log(` Sampling rate: ${config.performance?.sampling_rate ?? 1.0}`)\n logger.log(` Infer from source: ${config.span_naming?.infer_from_source ?? true}`)\n }\n\n /**\n * Returns the current value (void for this supervisor)\n */\n override get value(): Effect.Effect<void> {\n return Effect.void\n }\n\n /**\n * Called when a fiber starts executing\n */\n override onStart<A, E, R>(\n _context: Context.Context<R>,\n _effect: Effect.Effect<A, E, R>,\n parent: Option.Option<Fiber.RuntimeFiber<unknown, unknown>>,\n fiber: Fiber.RuntimeFiber<A, E>\n ): void {\n // Check if auto-tracing is enabled for this fiber\n // Note: FiberRef access in supervisor hooks must be synchronous\n const fiberRefsValue = fiber.getFiberRefs()\n const enabled = FiberRefs.getOrDefault(fiberRefsValue, AutoTracingEnabled)\n if (!enabled) {\n return\n }\n\n // Check sampling\n const samplingRate = this.config.performance?.sampling_rate ?? 1.0\n if (samplingRate < 1.0 && Math.random() > samplingRate) {\n return\n }\n\n // Check max concurrent\n const maxConcurrent = this.config.performance?.max_concurrent ?? 0\n if (maxConcurrent > 0 && this.activeFiberCount >= maxConcurrent) {\n return\n }\n\n // Check for span name override\n const nameOverride = FiberRefs.getOrDefault(fiberRefsValue, AutoTracingSpanName)\n\n // Infer span name\n let spanName: string\n if (Option.isSome(nameOverride)) {\n spanName = nameOverride.value\n } else {\n const sourceInfo = this.config.span_naming?.infer_from_source\n ? this.parseStackTrace()\n : undefined\n spanName = inferSpanName(fiber.id().id, sourceInfo, this.config)\n }\n\n // Check filter patterns\n if (!this.shouldTrace(spanName)) {\n return\n }\n\n // Get parent span context if available\n let parentContext = OtelApi.context.active()\n if (Option.isSome(parent)) {\n const parentSpan = this.fiberSpans.get(parent.value)\n if (parentSpan) {\n parentContext = OtelApi.trace.setSpan(parentContext, parentSpan)\n }\n }\n\n // Create the span\n const span = this.tracer.startSpan(\n spanName,\n {\n kind: OtelApi.SpanKind.INTERNAL,\n attributes: this.getInitialAttributes(fiber)\n },\n parentContext\n )\n\n // Store span and start time\n this.fiberSpans.set(fiber as Fiber.RuntimeFiber<unknown, unknown>, span)\n this.fiberStartTimes.set(fiber as Fiber.RuntimeFiber<unknown, unknown>, process.hrtime.bigint())\n this.activeFiberCount++\n }\n\n /**\n * Called when a fiber completes (success or failure)\n */\n override onEnd<A, E>(exit: Exit.Exit<A, E>, fiber: Fiber.RuntimeFiber<A, E>): void {\n const span = this.fiberSpans.get(fiber as Fiber.RuntimeFiber<unknown, unknown>)\n if (!span) {\n return\n }\n\n // Check min_duration filtering\n const startTime = this.fiberStartTimes.get(fiber as Fiber.RuntimeFiber<unknown, unknown>)\n if (startTime) {\n const duration = process.hrtime.bigint() - startTime\n const minDuration = this.parseMinDuration(this.config.performance?.min_duration)\n if (minDuration > 0 && duration < minDuration) {\n // Drop span if too short\n // Note: We can't actually \"drop\" a started span, but we can avoid ending it properly\n // In practice, this means the span will have no end time which is not ideal\n // A better approach would be to delay span creation, but that's more complex\n this.fiberSpans.delete(fiber as Fiber.RuntimeFiber<unknown, unknown>)\n this.fiberStartTimes.delete(fiber as Fiber.RuntimeFiber<unknown, unknown>)\n this.activeFiberCount--\n return\n }\n }\n\n // Set span status based on exit\n if (Exit.isSuccess(exit)) {\n span.setStatus({ code: OtelApi.SpanStatusCode.OK })\n } else {\n // Set error status\n span.setStatus({\n code: OtelApi.SpanStatusCode.ERROR,\n message: 'Fiber failed'\n })\n span.setAttribute('effect.fiber.failed', true)\n }\n\n // End the span\n span.end()\n\n // Cleanup\n this.fiberSpans.delete(fiber as Fiber.RuntimeFiber<unknown, unknown>)\n this.fiberStartTimes.delete(fiber as Fiber.RuntimeFiber<unknown, unknown>)\n this.activeFiberCount--\n }\n\n /**\n * Check if a span name should be traced based on filter patterns\n */\n private shouldTrace(spanName: string): boolean {\n // Check exclude patterns first (they take precedence)\n for (const pattern of this.excludePatterns) {\n if (pattern.test(spanName)) {\n return false\n }\n }\n\n // If include patterns are specified, span must match at least one\n if (this.includePatterns.length > 0) {\n for (const pattern of this.includePatterns) {\n if (pattern.test(spanName)) {\n return true\n }\n }\n return false\n }\n\n // No include patterns = trace everything not excluded\n return true\n }\n\n /**\n * Get initial span attributes for a fiber\n */\n private getInitialAttributes(fiber: Fiber.RuntimeFiber<unknown, unknown>): OtelApi.Attributes {\n const attrs: OtelApi.Attributes = {\n 'effect.auto_traced': true\n }\n\n if (this.config.metadata?.fiber_info !== false) {\n attrs['effect.fiber.id'] = fiber.id().id\n }\n\n return attrs\n }\n\n /**\n * Parse stack trace to get source info\n */\n private parseStackTrace(): SourceInfo | undefined {\n const stack = new Error().stack\n if (!stack) return undefined\n\n const lines = stack.split('\\n')\n // Skip Error, parseStackTrace, onStart, Effect internals\n // Look for first line that's not from effect or this module\n for (let i = 3; i < lines.length; i++) {\n const line = lines[i]\n if (line === undefined) continue\n\n if (\n !line.includes('node_modules/effect') &&\n !line.includes('@atrim/instrument') &&\n !line.includes('auto/supervisor')\n ) {\n // Parse line like \" at functionName (file:line:col)\"\n const match = line.match(/at\\s+(?:(.+?)\\s+)?\\(?(.+?):(\\d+):(\\d+)\\)?/)\n if (match) {\n const [, funcName, filePath, lineNum, colNum] = match\n return {\n function: funcName ?? 'anonymous',\n file: filePath ?? 'unknown',\n line: parseInt(lineNum ?? '0', 10),\n column: parseInt(colNum ?? '0', 10)\n }\n }\n }\n }\n\n return undefined\n }\n\n /**\n * Parse min_duration string to nanoseconds\n */\n private parseMinDuration(duration: string | undefined): bigint {\n if (!duration || duration === '0ms') return BigInt(0)\n\n const match = duration.match(/^(\\d+)\\s*(ms|millis|s|sec|seconds|us|micros)?$/i)\n if (!match) return BigInt(0)\n\n const value = parseInt(match[1] ?? '0', 10)\n const unit = (match[2] ?? 'ms').toLowerCase()\n\n switch (unit) {\n case 'us':\n case 'micros':\n return BigInt(value) * BigInt(1000)\n case 'ms':\n case 'millis':\n return BigInt(value) * BigInt(1000000)\n case 's':\n case 'sec':\n case 'seconds':\n return BigInt(value) * BigInt(1000000000)\n default:\n return BigInt(value) * BigInt(1000000) // Default to ms\n }\n }\n}\n\n// ============================================================================\n// Layers and factory functions\n// ============================================================================\n\n/**\n * Create a custom AutoTracingSupervisor with the given config\n */\nexport const createAutoTracingSupervisor = (\n config: AutoInstrumentationConfig\n): AutoTracingSupervisor => {\n return new AutoTracingSupervisor(config)\n}\n\n/**\n * Layer that provides auto-tracing with custom configuration\n *\n * @example\n * ```typescript\n * const CustomAutoTracing = createAutoTracingLayer({\n * enabled: true,\n * span_naming: {\n * default: 'app.{function}',\n * rules: [{ match: { file: 'src/services/.*' }, name: 'service.{function}' }]\n * }\n * })\n * ```\n */\nexport const createAutoTracingLayer = (options?: {\n config?: AutoInstrumentationConfig\n}): Layer.Layer<never> => {\n return Layer.unwrapEffect(\n Effect.gen(function* () {\n // Load config from options or instrumentation.yaml\n const config = options?.config ?? (yield* loadAutoTracingConfig())\n\n if (!config.enabled) {\n logger.log('@atrim/auto-trace: Auto-tracing disabled via config')\n return Layer.empty\n }\n\n // Create supervisor\n const supervisor = createAutoTracingSupervisor(config)\n\n // Return layer that adds the supervisor\n return Supervisor.addSupervisor(supervisor)\n })\n )\n}\n\n/**\n * Zero-config auto-tracing layer\n *\n * Loads configuration from instrumentation.yaml and automatically traces\n * all Effect fibers based on the configuration.\n *\n * @example\n * ```typescript\n * import { AutoTracingLive } from '@atrim/instrument-node/effect/auto'\n *\n * const program = Effect.gen(function* () {\n * yield* doWork() // Automatically traced!\n * }).pipe(Effect.provide(AutoTracingLive))\n * ```\n */\nexport const AutoTracingLive: Layer.Layer<never> = createAutoTracingLayer()\n\n// ============================================================================\n// Opt-out utilities\n// ============================================================================\n\n/**\n * Disable auto-tracing for a specific Effect\n *\n * @example\n * ```typescript\n * const program = Effect.gen(function* () {\n * yield* publicWork() // Traced\n * yield* withoutAutoTracing(internalWork()) // NOT traced\n * })\n * ```\n */\nexport const withoutAutoTracing = <A, E, R>(\n effect: Effect.Effect<A, E, R>\n): Effect.Effect<A, E, R> => effect.pipe(Effect.locally(AutoTracingEnabled, false))\n\n/**\n * Override the auto-generated span name for a specific Effect\n *\n * @example\n * ```typescript\n * const program = Effect.gen(function* () {\n * yield* setSpanName('custom.operation.name')(myEffect)\n * })\n * ```\n */\nexport const setSpanName =\n (name: string) =>\n <A, E, R>(effect: Effect.Effect<A, E, R>): Effect.Effect<A, E, R> =>\n effect.pipe(Effect.locally(AutoTracingSpanName, Option.some(name)))\n"]}
|