@atrim/instrument-node 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +30 -0
- package/package.json +130 -0
- package/target/dist/index.cjs +1133 -0
- package/target/dist/index.cjs.map +1 -0
- package/target/dist/index.d.cts +548 -0
- package/target/dist/index.d.ts +548 -0
- package/target/dist/index.js +1095 -0
- package/target/dist/index.js.map +1 -0
- package/target/dist/integrations/effect/index.cjs +705 -0
- package/target/dist/integrations/effect/index.cjs.map +1 -0
- package/target/dist/integrations/effect/index.js +669 -0
- package/target/dist/integrations/effect/index.js.map +1 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../../core/src/instrumentation-schema.ts","../../../../../core/src/errors.ts","../../../../../core/src/config-loader.ts","../../../../../core/src/pattern-matcher.ts","../../../../../core/src/logger.ts","../../../../src/integrations/effect/effect-tracer.ts","../../../../src/integrations/effect/effect-helpers.ts","../../../../src/integrations/effect/fiberset.ts"],"names":["z","Data","Effect","readFileSync","parseYAML","Duration","Schedule","Cache","join","existsSync","Layer","Otlp","TraceFlags","trace","context","FetchHttpClient","effect","EffectFiberSet","Tracer","isolated"],"mappings":"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","file":"index.cjs","sourcesContent":["/**\n * Configuration schema using Zod\n */\nimport { z } from 'zod'\n\nexport const PatternConfigSchema = z.object({\n pattern: z.string(),\n enabled: z.boolean().optional(),\n description: z.string().optional()\n})\n\n/**\n * Configuration for automatic span isolation in Effect operations\n *\n * This prevents context leakage when using FiberSet.run, Effect.fork, etc.\n * while maintaining logical parent relationships via span links.\n */\nexport const AutoIsolationConfigSchema = z.object({\n // Global enable/disable for auto-isolation\n enabled: z.boolean().default(false),\n\n // Which operators to auto-isolate\n operators: z\n .object({\n fiberset_run: z.boolean().default(true),\n effect_fork: z.boolean().default(true),\n effect_fork_daemon: z.boolean().default(true),\n effect_fork_in: z.boolean().default(false)\n })\n .default({}),\n\n // Virtual parent tracking configuration\n tracking: z\n .object({\n use_span_links: z.boolean().default(true),\n use_attributes: z.boolean().default(true),\n capture_logical_parent: z.boolean().default(true)\n })\n .default({}),\n\n // Span categorization\n attributes: z\n .object({\n category: z.string().default('background_task'),\n add_metadata: z.boolean().default(true)\n })\n .default({})\n})\n\nexport const InstrumentationConfigSchema = z.object({\n version: z.string(),\n instrumentation: z.object({\n enabled: z.boolean(),\n description: z.string().optional(),\n logging: z.enum(['on', 'off', 'minimal']).optional().default('on'),\n instrument_patterns: z.array(PatternConfigSchema),\n ignore_patterns: z.array(PatternConfigSchema)\n }),\n effect: z\n .object({\n auto_extract_metadata: z.boolean(),\n auto_isolation: AutoIsolationConfigSchema.optional()\n })\n .optional()\n})\n\nexport type InstrumentationConfig = z.infer<typeof InstrumentationConfigSchema>\nexport type PatternConfig = z.infer<typeof PatternConfigSchema>\nexport type AutoIsolationConfig = z.infer<typeof AutoIsolationConfigSchema>\n","/**\n * Typed error hierarchy for @atrim/instrumentation\n *\n * These errors use Effect's Data.TaggedError for typed error handling\n * with proper discriminated unions.\n */\n\nimport { Data } from 'effect'\n\n/**\n * Base error for configuration-related failures\n */\nexport class ConfigError extends Data.TaggedError('ConfigError')<{\n reason: string\n cause?: unknown\n}> {}\n\n/**\n * Error when fetching configuration from a URL fails\n */\nexport class ConfigUrlError extends Data.TaggedError('ConfigUrlError')<{\n reason: string\n cause?: unknown\n}> {}\n\n/**\n * Error when configuration validation fails (invalid YAML, schema mismatch)\n */\nexport class ConfigValidationError extends Data.TaggedError('ConfigValidationError')<{\n reason: string\n cause?: unknown\n}> {}\n\n/**\n * Error when reading configuration from a file fails\n */\nexport class ConfigFileError extends Data.TaggedError('ConfigFileError')<{\n reason: string\n cause?: unknown\n}> {}\n\n/**\n * Error when service detection fails (package.json not found, invalid format)\n */\nexport class ServiceDetectionError extends Data.TaggedError('ServiceDetectionError')<{\n reason: string\n cause?: unknown\n}> {}\n\n/**\n * Error when OpenTelemetry SDK initialization fails\n */\nexport class InitializationError extends Data.TaggedError('InitializationError')<{\n reason: string\n cause?: unknown\n}> {}\n\n/**\n * Error when span export fails (e.g., ECONNREFUSED to collector)\n */\nexport class ExportError extends Data.TaggedError('ExportError')<{\n reason: string\n cause?: unknown\n}> {}\n\n/**\n * Error when shutting down the SDK fails\n */\nexport class ShutdownError extends Data.TaggedError('ShutdownError')<{\n reason: string\n cause?: unknown\n}> {}\n","/**\n * Configuration loading from file, URL, or environment\n *\n * Priority order (highest to lowest):\n * 1. Explicit config object (passed programmatically)\n * 2. Environment variable (ATRIM_INSTRUMENTATION_CONFIG)\n * 3. Project root file (./instrumentation.yaml)\n * 4. Default config (built-in defaults)\n *\n * Uses Effect for typed error handling, automatic caching, retry logic, and timeouts.\n */\n\nimport { Effect, Duration, Schedule, Cache } from 'effect'\nimport { readFileSync, existsSync } from 'fs'\nimport { join } from 'path'\nimport { parse as parseYAML } from 'yaml'\nimport {\n InstrumentationConfigSchema,\n type InstrumentationConfig\n} from './instrumentation-schema.js'\nimport { ConfigError, ConfigFileError, ConfigUrlError, ConfigValidationError } from './errors.js'\n\nexport interface ConfigLoaderOptions {\n configPath?: string\n configUrl?: string\n config?: InstrumentationConfig\n cacheTimeout?: number\n}\n\n// Security constraints\nconst SECURITY_DEFAULTS = {\n maxConfigSize: 1_000_000, // 1MB\n requestTimeout: 5_000, // 5 seconds\n maxRedirects: 3,\n allowedProtocols: ['https:'], // Only HTTPS for remote configs\n cacheTimeout: 300_000 // 5 minutes\n} as const\n\n/**\n * Get default configuration\n */\nfunction getDefaultConfig(): InstrumentationConfig {\n return {\n version: '1.0',\n instrumentation: {\n enabled: true,\n logging: 'on',\n description: 'Default instrumentation configuration',\n instrument_patterns: [\n { pattern: '^app\\\\.', enabled: true, description: 'Application operations' },\n { pattern: '^http\\\\.server\\\\.', enabled: true, description: 'HTTP server operations' },\n { pattern: '^http\\\\.client\\\\.', enabled: true, description: 'HTTP client operations' }\n ],\n ignore_patterns: [\n { pattern: '^test\\\\.', description: 'Test utilities' },\n { pattern: '^internal\\\\.', description: 'Internal operations' },\n { pattern: '^health\\\\.', description: 'Health checks' }\n ]\n },\n effect: {\n auto_extract_metadata: true\n }\n }\n}\n\n/**\n * Validate configuration against schema (Effect version)\n */\nconst validateConfigEffect = (\n rawConfig: unknown\n): Effect.Effect<InstrumentationConfig, ConfigValidationError> =>\n Effect.try({\n try: () => InstrumentationConfigSchema.parse(rawConfig),\n catch: (error) =>\n new ConfigValidationError({\n reason: 'Invalid configuration schema',\n cause: error\n })\n })\n\n/**\n * Load configuration from local file (Effect version)\n */\nconst loadConfigFromFileEffect = (\n filePath: string\n): Effect.Effect<InstrumentationConfig, ConfigFileError | ConfigValidationError> =>\n Effect.gen(function* () {\n // Read file\n const fileContents = yield* Effect.try({\n try: () => readFileSync(filePath, 'utf8'),\n catch: (error) =>\n new ConfigFileError({\n reason: `Failed to read config file at ${filePath}`,\n cause: error\n })\n })\n\n // Security: Check file size\n if (fileContents.length > SECURITY_DEFAULTS.maxConfigSize) {\n return yield* Effect.fail(\n new ConfigFileError({\n reason: `Config file exceeds maximum size of ${SECURITY_DEFAULTS.maxConfigSize} bytes`\n })\n )\n }\n\n // Parse YAML\n let rawConfig: unknown\n try {\n rawConfig = parseYAML(fileContents)\n } catch (error) {\n return yield* Effect.fail(\n new ConfigValidationError({\n reason: 'Invalid YAML syntax',\n cause: error\n })\n )\n }\n\n // Validate schema\n return yield* validateConfigEffect(rawConfig)\n })\n\n/**\n * Fetch and parse config from URL (Effect version)\n */\nconst fetchAndParseConfig = (\n url: string\n): Effect.Effect<InstrumentationConfig, ConfigUrlError | ConfigValidationError> =>\n Effect.gen(function* () {\n // Security: Validate protocol\n let urlObj: URL\n try {\n urlObj = new URL(url)\n } catch (error) {\n return yield* Effect.fail(\n new ConfigUrlError({\n reason: `Invalid URL: ${url}`,\n cause: error\n })\n )\n }\n\n if (!SECURITY_DEFAULTS.allowedProtocols.includes(urlObj.protocol as 'https:')) {\n return yield* Effect.fail(\n new ConfigUrlError({\n reason: `Insecure protocol ${urlObj.protocol}. Only ${SECURITY_DEFAULTS.allowedProtocols.join(', ')} are allowed`\n })\n )\n }\n\n // Fetch with timeout and retry\n const response = yield* Effect.tryPromise({\n try: () =>\n fetch(url, {\n redirect: 'follow',\n headers: {\n Accept: 'application/yaml, text/yaml, text/x-yaml'\n }\n }),\n catch: (error) =>\n new ConfigUrlError({\n reason: `Failed to load config from URL ${url}`,\n cause: error\n })\n }).pipe(\n Effect.timeout(Duration.millis(SECURITY_DEFAULTS.requestTimeout)),\n Effect.retry({\n times: 3,\n schedule: Schedule.exponential(Duration.millis(100))\n }),\n Effect.catchAll((error) => {\n // Handle timeout separately\n if (error._tag === 'TimeoutException') {\n return Effect.fail(\n new ConfigUrlError({\n reason: `Config fetch timeout after ${SECURITY_DEFAULTS.requestTimeout}ms`\n })\n )\n }\n return Effect.fail(error as ConfigUrlError)\n })\n )\n\n // Validate response\n if (!response.ok) {\n return yield* Effect.fail(\n new ConfigUrlError({\n reason: `HTTP ${response.status}: ${response.statusText}`\n })\n )\n }\n\n // Security: Check content length\n const contentLength = response.headers.get('content-length')\n if (contentLength && parseInt(contentLength) > SECURITY_DEFAULTS.maxConfigSize) {\n return yield* Effect.fail(\n new ConfigUrlError({\n reason: `Config exceeds maximum size of ${SECURITY_DEFAULTS.maxConfigSize} bytes`\n })\n )\n }\n\n // Read response text\n const text = yield* Effect.tryPromise({\n try: () => response.text(),\n catch: (error) =>\n new ConfigUrlError({\n reason: 'Failed to read response body',\n cause: error\n })\n })\n\n // Security: Double-check actual size\n if (text.length > SECURITY_DEFAULTS.maxConfigSize) {\n return yield* Effect.fail(\n new ConfigUrlError({\n reason: `Config exceeds maximum size of ${SECURITY_DEFAULTS.maxConfigSize} bytes`\n })\n )\n }\n\n // Parse YAML\n let rawConfig: unknown\n try {\n rawConfig = parseYAML(text)\n } catch (error) {\n return yield* Effect.fail(\n new ConfigValidationError({\n reason: 'Invalid YAML syntax',\n cause: error\n })\n )\n }\n\n // Validate schema\n return yield* validateConfigEffect(rawConfig)\n })\n\n/**\n * Create cached config loader with Effect.cached\n */\nconst makeConfigCache = () =>\n Cache.make({\n capacity: 100,\n timeToLive: Duration.minutes(5),\n lookup: (url: string) => fetchAndParseConfig(url)\n })\n\n// Global cache instance\nlet cacheInstance: Cache.Cache<\n string,\n InstrumentationConfig,\n ConfigUrlError | ConfigValidationError\n> | null = null\n\n/**\n * Get or create cache instance\n */\nconst getCache = Effect.gen(function* () {\n if (!cacheInstance) {\n cacheInstance = yield* makeConfigCache()\n }\n return cacheInstance\n})\n\n/**\n * Load configuration from URL with caching (Effect version)\n */\nconst loadConfigFromUrlEffect = (\n url: string,\n cacheTimeout: number = SECURITY_DEFAULTS.cacheTimeout\n): Effect.Effect<InstrumentationConfig, ConfigUrlError | ConfigValidationError> =>\n Effect.gen(function* () {\n // Bypass cache if timeout is 0\n if (cacheTimeout === 0) {\n return yield* fetchAndParseConfig(url)\n }\n\n // Use cache\n const cache = yield* getCache\n return yield* cache.get(url)\n })\n\n/**\n * Load configuration with priority order (Effect version)\n */\nexport const loadConfigEffect = (\n options: ConfigLoaderOptions = {}\n): Effect.Effect<\n InstrumentationConfig,\n ConfigError | ConfigFileError | ConfigUrlError | ConfigValidationError\n> =>\n Effect.gen(function* () {\n // Priority 1: Explicit config object\n if (options.config) {\n return yield* validateConfigEffect(options.config)\n }\n\n // Priority 2: Environment variable\n const envConfigPath = process.env.ATRIM_INSTRUMENTATION_CONFIG\n if (envConfigPath) {\n if (envConfigPath.startsWith('http://') || envConfigPath.startsWith('https://')) {\n return yield* loadConfigFromUrlEffect(envConfigPath, options.cacheTimeout)\n }\n return yield* loadConfigFromFileEffect(envConfigPath)\n }\n\n // Priority 3: Explicit options\n if (options.configUrl) {\n return yield* loadConfigFromUrlEffect(options.configUrl, options.cacheTimeout)\n }\n if (options.configPath) {\n return yield* loadConfigFromFileEffect(options.configPath)\n }\n\n // Priority 4: Project root file\n const defaultPath = join(process.cwd(), 'instrumentation.yaml')\n const exists = yield* Effect.sync(() => existsSync(defaultPath))\n\n if (exists) {\n return yield* loadConfigFromFileEffect(defaultPath)\n }\n\n // Priority 5: Default config\n return getDefaultConfig()\n })\n\n// ============================================================================\n// Promise API (Backward Compatible)\n// ============================================================================\n\n/**\n * Load configuration with priority order (Promise version)\n *\n * Throws errors for backward compatibility with existing behavior.\n * Use `loadConfigEffect` for typed error handling in error channel.\n */\nexport async function loadConfig(\n options: ConfigLoaderOptions = {}\n): Promise<InstrumentationConfig> {\n return Effect.runPromise(\n loadConfigEffect(options).pipe(\n // Convert typed errors to regular Error with reason message for backward compatibility\n Effect.mapError((error) => {\n const message = error.reason\n const newError = new Error(message)\n newError.cause = error.cause\n return newError\n })\n )\n )\n}\n\n/**\n * Clear the config cache (useful for testing)\n */\nexport function clearConfigCache(): void {\n cacheInstance = null\n}\n","/**\n * Pattern matching utilities\n *\n * Implements efficient pattern-based span filtering with caching.\n *\n * Matching rules:\n * 1. Check ignore patterns first (takes precedence)\n * 2. Check instrument patterns second\n * 3. Default behavior: If no patterns match, span is created (fail-open)\n */\n\nimport type { InstrumentationConfig, PatternConfig } from './instrumentation-schema.js'\n\n/**\n * Compiled pattern with metadata\n */\ninterface CompiledPattern {\n regex: RegExp\n enabled: boolean\n description?: string\n}\n\n/**\n * Pattern matcher with compiled regex cache\n */\nexport class PatternMatcher {\n private ignorePatterns: CompiledPattern[] = []\n private instrumentPatterns: CompiledPattern[] = []\n private enabled: boolean = true\n\n constructor(config: InstrumentationConfig) {\n this.enabled = config.instrumentation.enabled\n\n // Compile ignore patterns (highest priority)\n this.ignorePatterns = config.instrumentation.ignore_patterns.map((p) => this.compilePattern(p))\n\n // Compile instrument patterns\n this.instrumentPatterns = config.instrumentation.instrument_patterns\n .filter((p) => p.enabled !== false) // Filter out disabled patterns\n .map((p) => this.compilePattern(p))\n }\n\n /**\n * Compile a pattern configuration into a RegExp\n */\n private compilePattern(pattern: PatternConfig): CompiledPattern {\n try {\n const compiled: CompiledPattern = {\n regex: new RegExp(pattern.pattern),\n enabled: pattern.enabled !== false\n }\n if (pattern.description !== undefined) {\n compiled.description = pattern.description\n }\n return compiled\n } catch (error) {\n throw new Error(\n `Failed to compile pattern \"${pattern.pattern}\": ${error instanceof Error ? error.message : String(error)}`\n )\n }\n }\n\n /**\n * Check if a span should be instrumented\n *\n * Returns true if the span should be created, false otherwise.\n *\n * Logic:\n * 1. If instrumentation disabled globally, return false\n * 2. Check ignore patterns - if any match, return false\n * 3. Check instrument patterns - if any match, return true\n * 4. Default: return true (fail-open - create span if no patterns match)\n */\n shouldInstrument(spanName: string): boolean {\n // Global disable\n if (!this.enabled) {\n return false\n }\n\n // Check ignore patterns first (highest priority)\n for (const pattern of this.ignorePatterns) {\n if (pattern.regex.test(spanName)) {\n return false\n }\n }\n\n // Check instrument patterns\n for (const pattern of this.instrumentPatterns) {\n if (pattern.enabled && pattern.regex.test(spanName)) {\n return true\n }\n }\n\n // Default: fail-open (create span if no patterns match)\n // This ensures backward compatibility and doesn't break existing instrumentation\n return true\n }\n\n /**\n * Get statistics about pattern matching (for debugging/monitoring)\n */\n getStats(): {\n enabled: boolean\n ignorePatternCount: number\n instrumentPatternCount: number\n } {\n return {\n enabled: this.enabled,\n ignorePatternCount: this.ignorePatterns.length,\n instrumentPatternCount: this.instrumentPatterns.filter((p) => p.enabled).length\n }\n }\n}\n\n// Global pattern matcher instance\nlet globalMatcher: PatternMatcher | null = null\n\n/**\n * Initialize the global pattern matcher\n */\nexport function initializePatternMatcher(config: InstrumentationConfig): void {\n globalMatcher = new PatternMatcher(config)\n}\n\n/**\n * Check if a span should be instrumented (uses global matcher)\n *\n * This is a convenience function for use without direct access to the matcher instance.\n * If no matcher is initialized, defaults to true (fail-open).\n */\nexport function shouldInstrumentSpan(spanName: string): boolean {\n if (!globalMatcher) {\n // No matcher initialized - fail open\n return true\n }\n return globalMatcher.shouldInstrument(spanName)\n}\n\n/**\n * Get the global pattern matcher (for advanced use cases)\n */\nexport function getPatternMatcher(): PatternMatcher | null {\n return globalMatcher\n}\n\n/**\n * Clear the global pattern matcher (useful for testing)\n */\nexport function clearPatternMatcher(): void {\n globalMatcher = null\n}\n","/**\n * Centralized logging utility for @atrim/instrumentation\n *\n * Supports three levels:\n * - 'on' (default): All logging enabled\n * - 'minimal': Only a single initialization message + errors/warnings\n * - 'off': No logging at all\n */\n\nexport type LogLevel = 'on' | 'off' | 'minimal'\n\nclass Logger {\n private level: LogLevel = 'on'\n private hasLoggedMinimal = false\n\n /**\n * Set the logging level\n */\n setLevel(level: LogLevel): void {\n this.level = level\n this.hasLoggedMinimal = false\n }\n\n /**\n * Get the current logging level\n */\n getLevel(): LogLevel {\n return this.level\n }\n\n /**\n * Log a minimal initialization message (only shown once in minimal mode)\n */\n minimal(message: string): void {\n if (this.level === 'off') {\n return\n }\n\n if (this.level === 'minimal' && !this.hasLoggedMinimal) {\n console.log(message)\n this.hasLoggedMinimal = true\n return\n }\n\n if (this.level === 'on') {\n console.log(message)\n }\n }\n\n /**\n * Log an informational message\n */\n log(...args: unknown[]): void {\n if (this.level === 'on') {\n console.log(...args)\n }\n }\n\n /**\n * Log a warning message (shown in minimal mode)\n */\n warn(...args: unknown[]): void {\n if (this.level !== 'off') {\n console.warn(...args)\n }\n }\n\n /**\n * Log an error message (shown in minimal mode)\n */\n error(...args: unknown[]): void {\n if (this.level !== 'off') {\n console.error(...args)\n }\n }\n\n /**\n * Check if full logging is enabled\n */\n isEnabled(): boolean {\n return this.level === 'on'\n }\n\n /**\n * Check if minimal logging is enabled\n */\n isMinimal(): boolean {\n return this.level === 'minimal'\n }\n\n /**\n * Check if logging is completely disabled\n */\n isDisabled(): boolean {\n return this.level === 'off'\n }\n}\n\n// Singleton instance\nexport const logger = new Logger()\n","/**\n * Effect-TS Tracer integration with context propagation\n *\n * This module provides Effect-TS tracing that seamlessly integrates with\n * OpenTelemetry NodeSDK auto-instrumentation. Effect spans will automatically\n * continue existing traces created by NodeSDK (e.g., HTTP requests).\n *\n * Context Propagation:\n * - NodeSDK auto-instrumentation creates root spans (e.g., HTTP requests)\n * - Effect operations automatically become child spans of the active trace\n * - Uses OpenTelemetry Context API (equivalent to Java thread-local)\n * - No configuration needed - works out of the box\n *\n * Architecture:\n * 1. @effect/opentelemetry uses the global OpenTelemetry tracer provider\n * 2. When an Effect operation starts, it checks context.active() for existing spans\n * 3. If found, creates child spans. If not, creates new root span.\n * 4. This happens automatically via OpenTelemetry Context propagation\n */\n\nimport { Effect, Layer, Tracer } from 'effect'\nimport type { Tracer as EffectTracer } from 'effect'\nimport * as Otlp from '@effect/opentelemetry/Otlp'\nimport { FetchHttpClient } from '@effect/platform'\nimport { context, trace, type SpanContext, TraceFlags } from '@opentelemetry/api'\nimport {\n loadConfig,\n type ConfigLoaderOptions,\n initializePatternMatcher,\n logger\n} from '@atrim/instrument-core'\n\n/**\n * Configuration options for Effect instrumentation\n */\nexport interface EffectInstrumentationOptions extends ConfigLoaderOptions {\n /**\n * OTLP endpoint URL\n * @default process.env.OTEL_EXPORTER_OTLP_ENDPOINT || 'http://localhost:4318'\n */\n otlpEndpoint?: string\n\n /**\n * Service name\n * @default process.env.OTEL_SERVICE_NAME || 'effect-service'\n */\n serviceName?: string\n\n /**\n * Service version\n * @default process.env.npm_package_version || '1.0.0'\n */\n serviceVersion?: string\n\n /**\n * Whether to automatically extract Effect fiber metadata\n * @default true\n */\n autoExtractMetadata?: boolean\n\n /**\n * Whether to continue existing traces from NodeSDK auto-instrumentation\n *\n * When true (default):\n * - Effect spans become children of existing NodeSDK spans\n * - Example: HTTP request span → Effect business logic span\n * - Uses OpenTelemetry Context API for propagation\n *\n * When false:\n * - Effect operations always create new root spans\n * - Not recommended unless you have specific requirements\n *\n * @default true\n */\n continueExistingTraces?: boolean\n}\n\n/**\n * Create Effect instrumentation layer with custom options\n *\n * This function creates an Effect Layer that provides OpenTelemetry tracing\n * with automatic context propagation from NodeSDK auto-instrumentation.\n *\n * @example\n * ```typescript\n * // With NodeSDK auto-instrumentation\n * import { NodeSDK } from '@opentelemetry/sdk-node'\n * import { getNodeAutoInstrumentations } from '@opentelemetry/auto-instrumentations-node'\n *\n * // 1. Start NodeSDK (creates HTTP spans automatically)\n * const sdk = new NodeSDK({\n * instrumentations: [getNodeAutoInstrumentations()]\n * })\n * sdk.start()\n *\n * // 2. Create Effect instrumentation (will continue NodeSDK traces)\n * const EffectLayer = createEffectInstrumentation()\n *\n * // 3. Use in Effect operations\n * const program = Effect.gen(function* () {\n * // This span will be a child of the HTTP request span (if any)\n * yield* Effect.log(\"Business logic\")\n * }).pipe(\n * Effect.withSpan(\"app.business.logic\"),\n * Effect.provide(EffectLayer)\n * )\n * ```\n */\nexport function createEffectInstrumentation(\n options: EffectInstrumentationOptions = {}\n): Layer.Layer<never, unknown, never> {\n return Layer.unwrapEffect(\n Effect.gen(function* () {\n // 1. Load configuration\n const config = yield* Effect.tryPromise({\n try: () => loadConfig(options),\n catch: (error) => ({\n _tag: 'ConfigError' as const,\n message: error instanceof Error ? error.message : String(error)\n })\n })\n\n // 2. Configure logger based on config\n yield* Effect.sync(() => {\n const loggingLevel = config.instrumentation.logging || 'on'\n logger.setLevel(loggingLevel)\n })\n\n // 3. Initialize pattern matcher\n yield* Effect.sync(() => initializePatternMatcher(config))\n\n // 4. Extract options with defaults\n const otlpEndpoint =\n options.otlpEndpoint || process.env.OTEL_EXPORTER_OTLP_ENDPOINT || 'http://localhost:4318'\n\n const serviceName = options.serviceName || process.env.OTEL_SERVICE_NAME || 'effect-service'\n\n const serviceVersion = options.serviceVersion || process.env.npm_package_version || '1.0.0'\n\n const autoExtractMetadata =\n options.autoExtractMetadata ?? config.effect?.auto_extract_metadata ?? true\n\n const continueExistingTraces = options.continueExistingTraces ?? true\n\n logger.log('🔍 Effect OpenTelemetry instrumentation')\n logger.log(` 📡 Endpoint: ${otlpEndpoint}`)\n logger.log(` 🏷️ Service: ${serviceName}`)\n logger.log(` ✅ Auto metadata extraction: ${autoExtractMetadata}`)\n logger.log(` ✅ Continue existing traces: ${continueExistingTraces}`)\n\n // 5. Create Otlp layer for Effect operations\n // CRITICAL: Uses tracerContext callback to bridge Effect spans to OpenTelemetry context\n // This allows bidirectional context propagation:\n // - NodeSDK spans → Effect spans (child relationship)\n // - Effect spans → NodeSDK spans (subsequent auto-instrumented calls)\n const otlpLayer = Otlp.layer({\n baseUrl: otlpEndpoint,\n resource: {\n serviceName,\n serviceVersion,\n attributes: {\n 'platform.component': 'effect',\n 'effect.auto_metadata': autoExtractMetadata,\n 'effect.context_propagation': continueExistingTraces\n }\n },\n // Bridge Effect context to OpenTelemetry global context\n // This is essential for context propagation to work properly\n tracerContext: <X>(f: () => X, span: Tracer.AnySpan): X => {\n // Only bridge actual Effect spans (not ExternalSpan)\n if (span._tag !== 'Span') {\n return f()\n }\n\n // Create OpenTelemetry SpanContext from Effect span metadata\n const spanContext: SpanContext = {\n traceId: span.traceId,\n spanId: span.spanId,\n traceFlags: span.sampled ? TraceFlags.SAMPLED : TraceFlags.NONE\n }\n\n // Create a non-recording span to represent the Effect span in OTel context\n const otelSpan = trace.wrapSpanContext(spanContext)\n\n // Set as active span in OpenTelemetry global context\n return context.with(trace.setSpan(context.active(), otelSpan), f)\n }\n }).pipe(Layer.provide(FetchHttpClient.layer))\n\n // 6. If auto-metadata extraction is enabled, add a layer that extracts\n // Effect fiber metadata for each span\n if (autoExtractMetadata) {\n // TODO: Implement metadata extraction layer\n // For now, just return the base Otlp layer\n return otlpLayer\n }\n\n return otlpLayer\n })\n ).pipe(Layer.orDie)\n}\n\n/**\n * Zero-config Effect instrumentation layer\n *\n * Uses the global OpenTelemetry tracer provider that was set up by\n * initializeInstrumentation(). This ensures all traces (Express, Effect, etc.)\n * go to the same OTLP endpoint.\n *\n * Context Propagation:\n * - Automatically continues traces from NodeSDK auto-instrumentation\n * - Effect spans become children of HTTP request spans\n * - No configuration needed\n *\n * @example\n * ```typescript\n * import { EffectInstrumentationLive } from '@atrim/instrumentation/effect'\n *\n * const program = Effect.gen(function* () {\n * // This span continues any existing trace from NodeSDK\n * yield* Effect.log(\"Processing\")\n * }).pipe(\n * Effect.withSpan(\"app.process\"),\n * Effect.provide(EffectInstrumentationLive)\n * )\n * ```\n */\nexport const EffectInstrumentationLive: Layer.Layer<never, never, never> = Effect.sync(() => {\n const endpoint = process.env.OTEL_EXPORTER_OTLP_ENDPOINT || 'http://localhost:4318'\n const serviceName = process.env.OTEL_SERVICE_NAME || 'effect-service'\n const serviceVersion = process.env.npm_package_version || '1.0.0'\n\n logger.log('🔍 Effect OpenTelemetry tracer (Otlp.layer)')\n logger.log(` 📡 Endpoint: ${endpoint}`)\n logger.log(` 🏷️ Service: ${serviceName}`)\n\n // Use Otlp.layer() like atrim platform\n // This creates Effect-specific spans that get exported via OTLP\n return Otlp.layer({\n baseUrl: endpoint,\n resource: {\n serviceName,\n serviceVersion,\n attributes: {\n 'platform.component': 'effect'\n }\n },\n // CRITICAL: Bridge Effect context to OpenTelemetry global context\n // This allows NodeSDK auto-instrumentation to see Effect spans as parent spans\n tracerContext: <X>(f: () => X, span: EffectTracer.AnySpan): X => {\n // Only bridge actual Effect spans (not ExternalSpan)\n if (span._tag !== 'Span') {\n return f()\n }\n\n // Create OpenTelemetry SpanContext from Effect span metadata\n const spanContext: SpanContext = {\n traceId: span.traceId,\n spanId: span.spanId,\n traceFlags: span.sampled ? TraceFlags.SAMPLED : TraceFlags.NONE\n }\n\n // Create a non-recording span to represent the Effect span in OTel context\n const otelSpan = trace.wrapSpanContext(spanContext)\n\n // Set as active span in OpenTelemetry global context\n return context.with(trace.setSpan(context.active(), otelSpan), f)\n }\n }).pipe(Layer.provide(FetchHttpClient.layer))\n}).pipe(Layer.unwrapEffect)\n","/**\n * Effect-specific span annotation helpers\n */\n\nexport function annotateUser(_userId: string, _email?: string): void {\n // TODO: Implement\n}\n\nexport function annotateDataSize(_bytes: number, _count: number): void {\n // TODO: Implement\n}\n\nexport function annotateBatch(_size: number, _batchSize: number): void {\n // TODO: Implement\n}\n\nexport function annotateLLM(\n _model: string,\n _operation: string,\n _inputTokens: number,\n _outputTokens: number\n): void {\n // TODO: Implement\n}\n\nexport function annotateQuery(_query: string, _database: string): void {\n // TODO: Implement\n}\n\nexport function annotateHttpRequest(_method: string, _url: string, _statusCode: number): void {\n // TODO: Implement\n}\n\nexport function annotateError(\n _error: Error,\n _context?: Record<string, string | number | boolean>\n): void {\n // TODO: Implement\n}\n\nexport function annotatePriority(_priority: string): void {\n // TODO: Implement\n}\n\nexport function annotateCache(_operation: string, _hit: boolean): void {\n // TODO: Implement\n}\n","/**\n * FiberSet helpers with automatic span isolation and virtual parent tracking\n *\n * Provides wrappers around Effect's FiberSet.run that automatically:\n * 1. Isolate span context (prevent leakage via { root: true })\n * 2. Track logical parent via OpenTelemetry span links\n * 3. Add custom attributes as universal fallback\n *\n * @module\n */\n\nimport { Effect, FiberSet as EffectFiberSet, Tracer } from 'effect'\nimport type { RuntimeFiber } from 'effect/Fiber'\n\n/**\n * Options for span isolation when running effects in FiberSet\n */\nexport interface IsolationOptions {\n /**\n * Whether to create a root span (breaks parent chain)\n * @default true (from config or this default)\n */\n readonly createRoot?: boolean\n\n /**\n * Capture logical parent relationship via span links and attributes\n * @default true\n */\n readonly captureLogicalParent?: boolean\n\n /**\n * Use OpenTelemetry span links to track logical parent\n * Works in: Honeycomb, Datadog, Lightstep, SigNoz, Splunk\n * @default true\n */\n readonly useSpanLinks?: boolean\n\n /**\n * Add custom attributes for logical parent tracking\n * Works in: ALL observability tools (universal fallback)\n * @default true\n */\n readonly useAttributes?: boolean\n\n /**\n * Propagate interruption from parent\n * @default undefined (FiberSet.run default behavior)\n */\n readonly propagateInterruption?: boolean\n\n /**\n * Custom span attributes to add\n */\n readonly attributes?: Record<string, unknown>\n\n /**\n * Span category for Atrim grouping\n * @default \"background_task\"\n */\n readonly category?: string\n}\n\n/**\n * Create a span link to the logical parent span\n *\n * This maintains observability while using root spans to prevent context leakage.\n */\nconst createLogicalParentLink = (\n parentSpan: Tracer.AnySpan,\n useSpanLinks: boolean\n): Tracer.SpanLink[] => {\n if (!useSpanLinks) {\n return []\n }\n\n return [\n {\n _tag: 'SpanLink' as const,\n span: parentSpan,\n attributes: {\n 'link.type': 'logical_parent',\n 'atrim.relationship': 'spawned_by',\n description: 'Logical parent (isolated to prevent context leakage)'\n }\n }\n ]\n}\n\n/**\n * Create attributes for logical parent tracking\n *\n * These serve as universal fallback for tools that don't support span links well.\n */\nconst createLogicalParentAttributes = (\n parentSpan: Tracer.AnySpan,\n useAttributes: boolean,\n category: string,\n useSpanLinks: boolean,\n customAttributes: Record<string, unknown>\n): Record<string, unknown> => {\n if (!useAttributes) {\n return customAttributes\n }\n\n return {\n // Logical parent tracking (works in ALL tools)\n 'atrim.logical_parent.span_id': parentSpan.spanId,\n 'atrim.logical_parent.trace_id': parentSpan.traceId,\n 'atrim.logical_parent.name': parentSpan._tag === 'Span' ? parentSpan.name : 'external',\n\n // Categorization and metadata\n 'atrim.fiberset.isolated': true,\n 'atrim.span.category': category,\n 'atrim.has_logical_parent': true,\n 'atrim.isolation.method': useSpanLinks ? 'hybrid' : 'attributes_only',\n\n // User-provided attributes\n ...customAttributes\n }\n}\n\n/**\n * Run an effect in a FiberSet with automatic span isolation and virtual parent tracking.\n *\n * This function prevents span context leakage (fibers inheriting parent spans incorrectly)\n * while maintaining logical parent relationships for observability.\n *\n * **Technical:** Uses `{ root: true }` to create independent root span\n * **Observability:** Uses span links + attributes to track logical parent\n *\n * @example\n * ```typescript\n * import { runIsolated } from \"@atrim/instrumentation/effect/fiberset\"\n *\n * const program = Effect.scoped(\n * Effect.gen(function* () {\n * const set = yield* FiberSet.make()\n *\n * yield* Effect.gen(function* () {\n * // Spawn background tasks with automatic isolation\n * yield* runIsolated(set, backgroundTask1(), \"background-task-1\")\n * yield* runIsolated(set, backgroundTask2(), \"background-task-2\")\n * }).pipe(\n * Effect.withSpan(\"parent-operation\")\n * )\n *\n * yield* Effect.sleep(\"100 millis\")\n * })\n * )\n *\n * // In Honeycomb/Datadog/SigNoz:\n * // - background tasks are ROOT spans (no context leakage)\n * // - span links show they were spawned by parent-operation\n * // - can reconstruct virtual hierarchy\n * ```\n *\n * @param set - The FiberSet to run the effect in\n * @param effect - The effect to run (will be isolated)\n * @param name - Span name for the isolated effect\n * @param options - Configuration options\n * @returns Effect that returns the forked fiber\n *\n * @see https://github.com/atrim-ai/instrumentation/issues/5\n */\nexport const runIsolated = <A, E, R>(\n set: EffectFiberSet.FiberSet<A, E>,\n effect: Effect.Effect<A, E, R>,\n name: string,\n options?: IsolationOptions\n): Effect.Effect<RuntimeFiber<A, E>, never, R> => {\n const {\n createRoot = true,\n captureLogicalParent = true,\n useSpanLinks = true,\n useAttributes = true,\n propagateInterruption,\n attributes = {},\n category = 'background_task'\n } = options ?? {}\n\n // If not creating root and not capturing parent, just use standard FiberSet.run\n if (!createRoot && !captureLogicalParent) {\n return EffectFiberSet.run(set, effect, { propagateInterruption })\n }\n\n return Effect.gen(function* () {\n // Get current parent span (if any)\n const maybeParent = yield* Effect.serviceOption(Tracer.ParentSpan)\n\n // If no parent, just create root span\n if (maybeParent._tag === 'None' || !captureLogicalParent) {\n const isolated = effect.pipe(\n Effect.withSpan(name, {\n root: createRoot,\n attributes: {\n 'atrim.fiberset.isolated': createRoot,\n 'atrim.span.category': category,\n 'atrim.has_logical_parent': false,\n ...attributes\n }\n })\n )\n\n return yield* EffectFiberSet.run(set, isolated, { propagateInterruption })\n }\n\n const parent = maybeParent.value\n\n // Create span links for logical parent tracking\n const links = createLogicalParentLink(parent, useSpanLinks)\n\n // Create attributes for universal fallback\n const spanAttributes = createLogicalParentAttributes(\n parent,\n useAttributes,\n category,\n useSpanLinks,\n attributes\n )\n\n // Create isolated effect with root span + logical parent tracking\n const isolated = effect.pipe(\n Effect.withSpan(name, {\n root: createRoot,\n links: links.length > 0 ? links : undefined,\n attributes: spanAttributes\n })\n )\n\n return yield* EffectFiberSet.run(set, isolated, { propagateInterruption })\n })\n}\n\n/**\n * Convenience function to run an effect in a FiberSet with automatic span isolation.\n *\n * This is a simpler version of `runIsolated` with sensible defaults.\n *\n * @example\n * ```typescript\n * yield* runWithSpan(set, \"background-task\", backgroundTask(), {\n * attributes: { \"task.priority\": \"high\" }\n * })\n * ```\n */\nexport const runWithSpan = <A, E, R>(\n set: EffectFiberSet.FiberSet<A, E>,\n name: string,\n effect: Effect.Effect<A, E, R>,\n options?: {\n readonly propagateInterruption?: boolean\n readonly attributes?: Record<string, unknown>\n readonly category?: string\n }\n): Effect.Effect<RuntimeFiber<A, E>, never, R> => {\n return runIsolated(set, effect, name, {\n createRoot: true,\n captureLogicalParent: true,\n useSpanLinks: true,\n useAttributes: true,\n ...options\n })\n}\n\n/**\n * Annotate the current span with metadata about spawned FiberSet tasks.\n *\n * Call this in the parent operation before spawning tasks to add metadata\n * that helps reconstruct the virtual hierarchy.\n *\n * @example\n * ```typescript\n * yield* Effect.gen(function* () {\n * yield* annotateSpawnedTasks([\n * { name: \"background-task-1\" },\n * { name: \"background-task-2\" },\n * { name: \"background-task-3\" }\n * ])\n *\n * yield* runIsolated(set, task1(), \"background-task-1\")\n * yield* runIsolated(set, task2(), \"background-task-2\")\n * yield* runIsolated(set, task3(), \"background-task-3\")\n * }).pipe(\n * Effect.withSpan(\"parent-operation\")\n * )\n * ```\n */\nexport const annotateSpawnedTasks = (\n tasks: Array<{ name: string; spanId?: string; category?: string }>\n): Effect.Effect<void> => {\n return Effect.annotateCurrentSpan({\n 'atrim.fiberset.spawned_count': tasks.length,\n 'atrim.fiberset.task_names': tasks.map((t) => t.name).join(','),\n 'atrim.has_background_tasks': true,\n 'atrim.spawned_tasks': JSON.stringify(\n tasks.map((t) => ({\n name: t.name,\n ...(t.spanId && { span_id: t.spanId }),\n ...(t.category && { category: t.category })\n }))\n )\n })\n}\n\n/**\n * Re-export FiberSet namespace with isolation helpers\n *\n * This provides a convenient way to import all FiberSet functions:\n * ```typescript\n * import { FiberSet } from \"@atrim/instrumentation/effect/fiberset\"\n * ```\n */\nexport const FiberSet = {\n // Re-export all original FiberSet functions\n make: EffectFiberSet.make,\n add: EffectFiberSet.add,\n unsafeAdd: EffectFiberSet.unsafeAdd,\n run: EffectFiberSet.run,\n clear: EffectFiberSet.clear,\n join: EffectFiberSet.join,\n awaitEmpty: EffectFiberSet.awaitEmpty,\n size: EffectFiberSet.size,\n runtime: EffectFiberSet.runtime,\n runtimePromise: EffectFiberSet.runtimePromise,\n makeRuntime: EffectFiberSet.makeRuntime,\n makeRuntimePromise: EffectFiberSet.makeRuntimePromise,\n isFiberSet: EffectFiberSet.isFiberSet,\n\n // Add our isolation helpers\n runIsolated,\n runWithSpan\n}\n"]}
|