@atrim/instrument-node 0.5.2-dev.ac2fbfe.20251221205322 → 0.7.0-b9eaf74-20260108193056

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.
@@ -0,0 +1 @@
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"]}
@@ -1,15 +1,17 @@
1
1
  'use strict';
2
2
 
3
3
  var effect = require('effect');
4
+ var Tracer = require('@effect/opentelemetry/Tracer');
5
+ var Resource = require('@effect/opentelemetry/Resource');
4
6
  var Otlp = require('@effect/opentelemetry/Otlp');
5
7
  var platform = require('@effect/platform');
6
8
  var api = require('@opentelemetry/api');
9
+ var semanticConventions = require('@opentelemetry/semantic-conventions');
7
10
  var FileSystem = require('@effect/platform/FileSystem');
8
11
  var HttpClient = require('@effect/platform/HttpClient');
9
12
  var HttpClientRequest = require('@effect/platform/HttpClientRequest');
10
13
  var yaml = require('yaml');
11
14
  var zod = require('zod');
12
- var platformNode = require('@effect/platform-node');
13
15
 
14
16
  function _interopNamespace(e) {
15
17
  if (e && e.__esModule) return e;
@@ -29,16 +31,13 @@ function _interopNamespace(e) {
29
31
  return Object.freeze(n);
30
32
  }
31
33
 
34
+ var Tracer__namespace = /*#__PURE__*/_interopNamespace(Tracer);
35
+ var Resource__namespace = /*#__PURE__*/_interopNamespace(Resource);
32
36
  var Otlp__namespace = /*#__PURE__*/_interopNamespace(Otlp);
33
37
  var HttpClient__namespace = /*#__PURE__*/_interopNamespace(HttpClient);
34
38
  var HttpClientRequest__namespace = /*#__PURE__*/_interopNamespace(HttpClientRequest);
35
39
 
36
40
  // src/integrations/effect/effect-tracer.ts
37
-
38
- // ../../node_modules/.pnpm/@opentelemetry+semantic-conventions@1.38.0/node_modules/@opentelemetry/semantic-conventions/build/esm/stable_attributes.js
39
- var ATTR_TELEMETRY_SDK_LANGUAGE = "telemetry.sdk.language";
40
- var TELEMETRY_SDK_LANGUAGE_VALUE_NODEJS = "nodejs";
41
- var ATTR_TELEMETRY_SDK_NAME = "telemetry.sdk.name";
42
41
  var __defProp = Object.defineProperty;
43
42
  var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
44
43
  var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
@@ -69,6 +68,69 @@ var AutoIsolationConfigSchema = zod.z.object({
69
68
  add_metadata: zod.z.boolean().default(true)
70
69
  }).default({})
71
70
  });
71
+ var SpanNamingRuleSchema = zod.z.object({
72
+ // Match criteria (all specified criteria must match)
73
+ match: zod.z.object({
74
+ // Regex pattern to match file path
75
+ file: zod.z.string().optional(),
76
+ // Regex pattern to match function name
77
+ function: zod.z.string().optional(),
78
+ // Regex pattern to match module name
79
+ module: zod.z.string().optional()
80
+ }),
81
+ // Span name template with variables:
82
+ // {fiber_id} - Fiber ID
83
+ // {function} - Function name
84
+ // {module} - Module name
85
+ // {file} - File path
86
+ // {line} - Line number
87
+ // {operator} - Effect operator (gen, all, forEach, etc.)
88
+ // {match:field:N} - Captured regex group from match
89
+ name: zod.z.string()
90
+ });
91
+ var AutoInstrumentationConfigSchema = zod.z.object({
92
+ // Enable/disable auto-instrumentation
93
+ enabled: zod.z.boolean().default(false),
94
+ // Tracing granularity
95
+ // - 'fiber': Trace at fiber creation (recommended, lower overhead)
96
+ // - 'operator': Trace each Effect operator (higher granularity, more overhead)
97
+ granularity: zod.z.enum(["fiber", "operator"]).default("fiber"),
98
+ // Smart span naming configuration
99
+ span_naming: zod.z.object({
100
+ // Default span name template when no rules match
101
+ default: zod.z.string().default("effect.fiber.{fiber_id}"),
102
+ // Infer span names from source code (requires stack trace parsing)
103
+ // Adds ~50-100μs overhead per fiber
104
+ infer_from_source: zod.z.boolean().default(true),
105
+ // Naming rules (first match wins)
106
+ rules: zod.z.array(SpanNamingRuleSchema).default([])
107
+ }).default({}),
108
+ // Pattern-based filtering
109
+ filter: zod.z.object({
110
+ // Only trace spans matching these patterns (empty = trace all)
111
+ include: zod.z.array(zod.z.string()).default([]),
112
+ // Never trace spans matching these patterns
113
+ exclude: zod.z.array(zod.z.string()).default([])
114
+ }).default({}),
115
+ // Performance controls
116
+ performance: zod.z.object({
117
+ // Sample rate (0.0 - 1.0)
118
+ sampling_rate: zod.z.number().min(0).max(1).default(1),
119
+ // Skip fibers shorter than this duration (e.g., "10ms", "100 millis")
120
+ min_duration: zod.z.string().default("0ms"),
121
+ // Maximum concurrent traced fibers (0 = unlimited)
122
+ max_concurrent: zod.z.number().default(0)
123
+ }).default({}),
124
+ // Automatic metadata extraction
125
+ metadata: zod.z.object({
126
+ // Extract Effect fiber information
127
+ fiber_info: zod.z.boolean().default(true),
128
+ // Extract source location (file:line)
129
+ source_location: zod.z.boolean().default(true),
130
+ // Extract parent fiber information
131
+ parent_fiber: zod.z.boolean().default(true)
132
+ }).default({})
133
+ });
72
134
  var HttpFilteringConfigSchema = zod.z.object({
73
135
  // Patterns to ignore for outgoing HTTP requests (string patterns only in YAML)
74
136
  ignore_outgoing_urls: zod.z.array(zod.z.string()).optional(),
@@ -100,11 +162,52 @@ var InstrumentationConfigSchema = zod.z.object({
100
162
  ignore_patterns: zod.z.array(PatternConfigSchema)
101
163
  }),
102
164
  effect: zod.z.object({
165
+ // Enable/disable Effect tracing entirely
166
+ // When false, EffectInstrumentationLive returns Layer.empty
167
+ enabled: zod.z.boolean().default(true),
168
+ // Exporter mode:
169
+ // - "unified": Use global TracerProvider from Node SDK (recommended, enables filtering)
170
+ // - "standalone": Use Effect's own OTLP exporter (bypasses Node SDK filtering)
171
+ exporter: zod.z.enum(["unified", "standalone"]).default("unified"),
103
172
  auto_extract_metadata: zod.z.boolean(),
104
- auto_isolation: AutoIsolationConfigSchema.optional()
173
+ auto_isolation: AutoIsolationConfigSchema.optional(),
174
+ // Auto-instrumentation: automatic tracing of all Effect fibers
175
+ auto_instrumentation: AutoInstrumentationConfigSchema.optional()
105
176
  }).optional(),
106
177
  http: HttpFilteringConfigSchema.optional()
107
178
  });
179
+ var defaultConfig = {
180
+ version: "1.0",
181
+ instrumentation: {
182
+ enabled: true,
183
+ logging: "on",
184
+ description: "Default instrumentation configuration",
185
+ instrument_patterns: [
186
+ { pattern: "^app\\.", enabled: true, description: "Application operations" },
187
+ { pattern: "^http\\.server\\.", enabled: true, description: "HTTP server operations" },
188
+ { pattern: "^http\\.client\\.", enabled: true, description: "HTTP client operations" }
189
+ ],
190
+ ignore_patterns: [
191
+ { pattern: "^test\\.", description: "Test utilities" },
192
+ { pattern: "^internal\\.", description: "Internal operations" },
193
+ { pattern: "^health\\.", description: "Health checks" }
194
+ ]
195
+ },
196
+ effect: {
197
+ enabled: true,
198
+ exporter: "unified",
199
+ auto_extract_metadata: true
200
+ }
201
+ };
202
+ function parseAndValidateConfig(content) {
203
+ let parsed;
204
+ if (typeof content === "string") {
205
+ parsed = yaml.parse(content);
206
+ } else {
207
+ parsed = content;
208
+ }
209
+ return InstrumentationConfigSchema.parse(parsed);
210
+ }
108
211
  (class extends effect.Data.TaggedError("ConfigError") {
109
212
  get message() {
110
213
  return this.reason;
@@ -282,7 +385,7 @@ var makeConfigLoader = effect.Effect.gen(function* () {
282
385
  })
283
386
  });
284
387
  });
285
- var ConfigLoaderLive = effect.Layer.effect(ConfigLoader, makeConfigLoader);
388
+ effect.Layer.effect(ConfigLoader, makeConfigLoader);
286
389
  var PatternMatcher = class {
287
390
  constructor(config) {
288
391
  __publicField(this, "ignorePatterns", []);
@@ -430,84 +533,58 @@ var Logger = class {
430
533
  }
431
534
  };
432
535
  var logger = new Logger();
433
- var NodeConfigLoaderLive = ConfigLoaderLive.pipe(
434
- effect.Layer.provide(effect.Layer.mergeAll(platformNode.NodeContext.layer, platform.FetchHttpClient.layer))
435
- );
436
- var cachedLoaderPromise = null;
437
- function getCachedLoader() {
438
- if (!cachedLoaderPromise) {
439
- cachedLoaderPromise = effect.Effect.runPromise(
440
- effect.Effect.gen(function* () {
441
- return yield* ConfigLoader;
442
- }).pipe(effect.Effect.provide(NodeConfigLoaderLive))
443
- );
536
+ async function loadFromFile(filePath) {
537
+ const { readFile } = await import('fs/promises');
538
+ const content = await readFile(filePath, "utf-8");
539
+ return parseAndValidateConfig(content);
540
+ }
541
+ async function loadFromUrl(url) {
542
+ const response = await fetch(url);
543
+ if (!response.ok) {
544
+ throw new Error(`Failed to fetch config from ${url}: ${response.statusText}`);
444
545
  }
445
- return cachedLoaderPromise;
546
+ const content = await response.text();
547
+ return parseAndValidateConfig(content);
446
548
  }
447
- async function loadConfig(uri, options) {
448
- if (options?.cacheTimeout === 0) {
449
- const program = effect.Effect.gen(function* () {
450
- const loader2 = yield* ConfigLoader;
451
- return yield* loader2.loadFromUri(uri);
452
- });
453
- return effect.Effect.runPromise(program.pipe(effect.Effect.provide(NodeConfigLoaderLive)));
549
+ async function loadConfig(uri, _options) {
550
+ if (uri.startsWith("http://") || uri.startsWith("https://")) {
551
+ return loadFromUrl(uri);
552
+ }
553
+ if (uri.startsWith("file://")) {
554
+ const filePath = uri.slice(7);
555
+ return loadFromFile(filePath);
454
556
  }
455
- const loader = await getCachedLoader();
456
- return effect.Effect.runPromise(loader.loadFromUri(uri));
557
+ return loadFromFile(uri);
457
558
  }
458
559
  async function loadConfigFromInline(content) {
459
- const loader = await getCachedLoader();
460
- return effect.Effect.runPromise(loader.loadFromInline(content));
461
- }
462
- function getDefaultConfig() {
463
- return {
464
- version: "1.0",
465
- instrumentation: {
466
- enabled: true,
467
- logging: "on",
468
- description: "Default instrumentation configuration",
469
- instrument_patterns: [
470
- { pattern: "^app\\.", enabled: true, description: "Application operations" },
471
- { pattern: "^http\\.server\\.", enabled: true, description: "HTTP server operations" },
472
- { pattern: "^http\\.client\\.", enabled: true, description: "HTTP client operations" }
473
- ],
474
- ignore_patterns: [
475
- { pattern: "^test\\.", description: "Test utilities" },
476
- { pattern: "^internal\\.", description: "Internal operations" },
477
- { pattern: "^health\\.", description: "Health checks" }
478
- ]
479
- },
480
- effect: {
481
- auto_extract_metadata: true
482
- }
483
- };
560
+ return parseAndValidateConfig(content);
484
561
  }
485
562
  async function loadConfigWithOptions(options = {}) {
486
- const loadOptions = options.cacheTimeout !== void 0 ? { cacheTimeout: options.cacheTimeout } : void 0;
487
563
  if (options.config) {
488
564
  return loadConfigFromInline(options.config);
489
565
  }
490
566
  const envConfigPath = process.env.ATRIM_INSTRUMENTATION_CONFIG;
491
567
  if (envConfigPath) {
492
- return loadConfig(envConfigPath, loadOptions);
568
+ return loadConfig(envConfigPath);
493
569
  }
494
570
  if (options.configUrl) {
495
- return loadConfig(options.configUrl, loadOptions);
571
+ return loadConfig(options.configUrl);
496
572
  }
497
573
  if (options.configPath) {
498
- return loadConfig(options.configPath, loadOptions);
574
+ return loadConfig(options.configPath);
499
575
  }
500
576
  const { existsSync } = await import('fs');
501
577
  const { join } = await import('path');
502
578
  const defaultPath = join(process.cwd(), "instrumentation.yaml");
503
579
  if (existsSync(defaultPath)) {
504
- return loadConfig(defaultPath, loadOptions);
580
+ return loadConfig(defaultPath);
505
581
  }
506
- return getDefaultConfig();
582
+ return defaultConfig;
507
583
  }
508
584
 
509
585
  // src/integrations/effect/effect-tracer.ts
510
- var SDK_NAME = "@effect/opentelemetry-otlp";
586
+ var SDK_NAME = "@effect/opentelemetry";
587
+ var ATTR_TELEMETRY_EXPORTER_MODE = "telemetry.exporter.mode";
511
588
  function createEffectInstrumentation(options = {}) {
512
589
  return effect.Layer.unwrapEffect(
513
590
  effect.Effect.gen(function* () {
@@ -518,90 +595,89 @@ function createEffectInstrumentation(options = {}) {
518
595
  message: error instanceof Error ? error.message : String(error)
519
596
  })
520
597
  });
598
+ const effectEnabled = process.env.OTEL_EFFECT_ENABLED !== "false" && (config.effect?.enabled ?? true);
599
+ if (!effectEnabled) {
600
+ logger.log("@atrim/instrumentation/effect: Effect tracing disabled via config");
601
+ return effect.Layer.empty;
602
+ }
521
603
  yield* effect.Effect.sync(() => {
522
604
  const loggingLevel = config.instrumentation.logging || "on";
523
605
  logger.setLevel(loggingLevel);
524
606
  });
525
607
  yield* effect.Effect.sync(() => initializePatternMatcher(config));
526
- const otlpEndpoint = options.otlpEndpoint || process.env.OTEL_EXPORTER_OTLP_ENDPOINT || "http://localhost:4318";
527
608
  const serviceName = options.serviceName || process.env.OTEL_SERVICE_NAME || "effect-service";
528
609
  const serviceVersion = options.serviceVersion || process.env.npm_package_version || "1.0.0";
529
- const autoExtractMetadata = options.autoExtractMetadata ?? config.effect?.auto_extract_metadata ?? true;
530
- const continueExistingTraces = options.continueExistingTraces ?? true;
531
- logger.log("\u{1F50D} Effect OpenTelemetry instrumentation");
532
- logger.log(` \u{1F4E1} Endpoint: ${otlpEndpoint}`);
533
- logger.log(` \u{1F3F7}\uFE0F Service: ${serviceName}`);
534
- logger.log(` \u2705 Auto metadata extraction: ${autoExtractMetadata}`);
535
- logger.log(` \u2705 Continue existing traces: ${continueExistingTraces}`);
536
- const otlpLayer = Otlp__namespace.layer({
537
- baseUrl: otlpEndpoint,
538
- resource: {
539
- serviceName,
540
- serviceVersion,
541
- attributes: {
542
- "platform.component": "effect",
543
- "effect.auto_metadata": autoExtractMetadata,
544
- "effect.context_propagation": continueExistingTraces,
545
- [ATTR_TELEMETRY_SDK_LANGUAGE]: TELEMETRY_SDK_LANGUAGE_VALUE_NODEJS,
546
- [ATTR_TELEMETRY_SDK_NAME]: SDK_NAME
547
- }
548
- },
549
- // Bridge Effect context to OpenTelemetry global context
550
- // This is essential for context propagation to work properly
551
- tracerContext: (f, span) => {
552
- if (span._tag !== "Span") {
553
- return f();
610
+ const exporterMode = options.exporterMode ?? config.effect?.exporter ?? "unified";
611
+ const resourceAttributes = {
612
+ "platform.component": "effect",
613
+ [semanticConventions.ATTR_TELEMETRY_SDK_LANGUAGE]: semanticConventions.TELEMETRY_SDK_LANGUAGE_VALUE_NODEJS,
614
+ [semanticConventions.ATTR_TELEMETRY_SDK_NAME]: SDK_NAME,
615
+ [ATTR_TELEMETRY_EXPORTER_MODE]: exporterMode
616
+ };
617
+ if (exporterMode === "standalone") {
618
+ const otlpEndpoint = options.otlpEndpoint || process.env.OTEL_EXPORTER_OTLP_ENDPOINT || "http://localhost:4318";
619
+ logger.log("Effect OpenTelemetry instrumentation (standalone)");
620
+ logger.log(` Service: ${serviceName}`);
621
+ logger.log(` Endpoint: ${otlpEndpoint}`);
622
+ logger.log(" WARNING: Standalone mode bypasses Node SDK filtering");
623
+ return Otlp__namespace.layer({
624
+ baseUrl: otlpEndpoint,
625
+ resource: {
626
+ serviceName,
627
+ serviceVersion,
628
+ attributes: resourceAttributes
629
+ },
630
+ // Bridge Effect context to OpenTelemetry global context
631
+ tracerContext: (f, span) => {
632
+ if (span._tag !== "Span") {
633
+ return f();
634
+ }
635
+ const spanContext = {
636
+ traceId: span.traceId,
637
+ spanId: span.spanId,
638
+ traceFlags: span.sampled ? api.TraceFlags.SAMPLED : api.TraceFlags.NONE
639
+ };
640
+ const otelSpan = api.trace.wrapSpanContext(spanContext);
641
+ return api.context.with(api.trace.setSpan(api.context.active(), otelSpan), f);
554
642
  }
555
- const spanContext = {
556
- traceId: span.traceId,
557
- spanId: span.spanId,
558
- traceFlags: span.sampled ? api.TraceFlags.SAMPLED : api.TraceFlags.NONE
559
- };
560
- const otelSpan = api.trace.wrapSpanContext(spanContext);
561
- return api.context.with(api.trace.setSpan(api.context.active(), otelSpan), f);
562
- }
563
- }).pipe(effect.Layer.provide(platform.FetchHttpClient.layer));
564
- if (autoExtractMetadata) {
565
- return otlpLayer;
643
+ }).pipe(effect.Layer.provide(platform.FetchHttpClient.layer));
644
+ } else {
645
+ logger.log("Effect OpenTelemetry instrumentation (unified)");
646
+ logger.log(` Service: ${serviceName}`);
647
+ logger.log(" Using global TracerProvider for span export");
648
+ return Tracer__namespace.layerGlobal.pipe(
649
+ effect.Layer.provide(
650
+ Resource__namespace.layer({
651
+ serviceName,
652
+ serviceVersion,
653
+ attributes: resourceAttributes
654
+ })
655
+ )
656
+ );
566
657
  }
567
- return otlpLayer;
568
658
  })
569
659
  ).pipe(effect.Layer.orDie);
570
660
  }
571
661
  var EffectInstrumentationLive = effect.Effect.sync(() => {
572
- const endpoint = process.env.OTEL_EXPORTER_OTLP_ENDPOINT || "http://localhost:4318";
573
662
  const serviceName = process.env.OTEL_SERVICE_NAME || "effect-service";
574
663
  const serviceVersion = process.env.npm_package_version || "1.0.0";
575
664
  logger.minimal(`@atrim/instrumentation/effect: Effect tracing enabled (${serviceName})`);
576
- logger.log("\u{1F50D} Effect OpenTelemetry tracer");
577
- logger.log(` \u{1F4E1} Endpoint: ${endpoint}`);
578
- logger.log(` \u{1F3F7}\uFE0F Service: ${serviceName}`);
579
- return Otlp__namespace.layer({
580
- baseUrl: endpoint,
581
- resource: {
582
- serviceName,
583
- serviceVersion,
584
- attributes: {
585
- "platform.component": "effect",
586
- [ATTR_TELEMETRY_SDK_LANGUAGE]: TELEMETRY_SDK_LANGUAGE_VALUE_NODEJS,
587
- [ATTR_TELEMETRY_SDK_NAME]: SDK_NAME
588
- }
589
- },
590
- // CRITICAL: Bridge Effect context to OpenTelemetry global context
591
- // This allows NodeSDK auto-instrumentation to see Effect spans as parent spans
592
- tracerContext: (f, span) => {
593
- if (span._tag !== "Span") {
594
- return f();
595
- }
596
- const spanContext = {
597
- traceId: span.traceId,
598
- spanId: span.spanId,
599
- traceFlags: span.sampled ? api.TraceFlags.SAMPLED : api.TraceFlags.NONE
600
- };
601
- const otelSpan = api.trace.wrapSpanContext(spanContext);
602
- return api.context.with(api.trace.setSpan(api.context.active(), otelSpan), f);
603
- }
604
- }).pipe(effect.Layer.provide(platform.FetchHttpClient.layer));
665
+ logger.log("Effect OpenTelemetry tracer (unified)");
666
+ logger.log(` Service: ${serviceName}`);
667
+ return Tracer__namespace.layerGlobal.pipe(
668
+ effect.Layer.provide(
669
+ Resource__namespace.layer({
670
+ serviceName,
671
+ serviceVersion,
672
+ attributes: {
673
+ "platform.component": "effect",
674
+ [semanticConventions.ATTR_TELEMETRY_SDK_LANGUAGE]: semanticConventions.TELEMETRY_SDK_LANGUAGE_VALUE_NODEJS,
675
+ [semanticConventions.ATTR_TELEMETRY_SDK_NAME]: SDK_NAME,
676
+ [ATTR_TELEMETRY_EXPORTER_MODE]: "unified"
677
+ }
678
+ })
679
+ )
680
+ );
605
681
  }).pipe(effect.Layer.unwrapEffect);
606
682
  function annotateUser(userId, email, username) {
607
683
  const attributes = {