@atrim/instrument-node 0.4.1 → 0.5.0-3a3dd2c-20251124202015

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,264 @@
1
+ import { Context, FiberRef, Effect as Effect$1, Layer } from 'effect';
2
+
3
+ // src/integrations/effect/auto/index.ts
4
+
5
+ // src/integrations/effect/auto/naming.ts
6
+ function parseCallStack(maxDepth = 15) {
7
+ const error = new Error();
8
+ const stack = error.stack || "";
9
+ const context = {
10
+ operator: "effect",
11
+ stack
12
+ };
13
+ const lines = stack.split("\n");
14
+ const skipPatterns = [
15
+ /node_modules/,
16
+ /at parseCallStack/,
17
+ /at resolveSpanName/,
18
+ /at autoTrace/,
19
+ /at Effect\.gen/,
20
+ /at Generator\.next/,
21
+ /at __awaiter/,
22
+ /at new Promise/,
23
+ /^Error$/,
24
+ /at Object\.<anonymous>/,
25
+ /at Module\._compile/,
26
+ /at processTicksAndRejections/,
27
+ /internal\//
28
+ ];
29
+ let framesChecked = 0;
30
+ for (const line of lines) {
31
+ if (framesChecked >= maxDepth) break;
32
+ if (skipPatterns.some((pattern) => pattern.test(line))) {
33
+ continue;
34
+ }
35
+ framesChecked++;
36
+ const classMethodMatch = line.match(/at\s+(\w+)\.(\w+)\s+\(([^)]+):(\d+):\d+\)/);
37
+ if (classMethodMatch && classMethodMatch[1] && classMethodMatch[2]) {
38
+ const className = classMethodMatch[1];
39
+ const methodName = classMethodMatch[2];
40
+ if (!["Object", "Module", "Function"].includes(className)) {
41
+ context.class = className;
42
+ context.function = methodName;
43
+ if (classMethodMatch[3]) {
44
+ context.file = classMethodMatch[3];
45
+ context.module = extractModuleName(classMethodMatch[3]);
46
+ }
47
+ if (classMethodMatch[4]) {
48
+ context.line = parseInt(classMethodMatch[4], 10);
49
+ }
50
+ break;
51
+ }
52
+ }
53
+ const functionMatch = line.match(/at\s+(\w+)\s+\(([^)]+):(\d+):\d+\)/);
54
+ if (functionMatch && functionMatch[1]) {
55
+ const name = functionMatch[1];
56
+ if (!["anonymous", "eval", "Object", "Module"].includes(name)) {
57
+ context.function = name;
58
+ if (functionMatch[2]) {
59
+ context.file = functionMatch[2];
60
+ context.module = extractModuleName(functionMatch[2]);
61
+ }
62
+ if (functionMatch[3]) {
63
+ context.line = parseInt(functionMatch[3], 10);
64
+ }
65
+ break;
66
+ }
67
+ }
68
+ const fileMatch = line.match(/\(([^)]+):(\d+):\d+\)/);
69
+ if (fileMatch && fileMatch[1] && fileMatch[2]) {
70
+ context.file = fileMatch[1];
71
+ context.line = parseInt(fileMatch[2], 10);
72
+ context.module = extractModuleName(fileMatch[1]);
73
+ }
74
+ }
75
+ return context;
76
+ }
77
+ function extractModuleName(filePath) {
78
+ const parts = filePath.split("/");
79
+ const fileName = parts[parts.length - 1] || "unknown";
80
+ return fileName.replace(/\.[^.]+$/, "");
81
+ }
82
+ function matchRule(rule, context) {
83
+ const captures = /* @__PURE__ */ new Map();
84
+ const match = rule.match;
85
+ if (match.file) {
86
+ if (!context.file) return { matched: false, captures };
87
+ const regex = new RegExp(match.file);
88
+ const result = regex.exec(context.file);
89
+ if (!result) return { matched: false, captures };
90
+ result.forEach((value, index) => {
91
+ if (index > 0 && value) {
92
+ captures.set(`match:${index}`, value);
93
+ }
94
+ });
95
+ }
96
+ if (match.function) {
97
+ if (!context.function) return { matched: false, captures };
98
+ const regex = new RegExp(match.function);
99
+ const result = regex.exec(context.function);
100
+ if (!result) return { matched: false, captures };
101
+ result.forEach((value, index) => {
102
+ if (index > 0 && value) {
103
+ captures.set(`match:${index}`, value);
104
+ }
105
+ });
106
+ }
107
+ if (match.operator) {
108
+ const regex = new RegExp(match.operator);
109
+ if (!regex.test(context.operator)) return { matched: false, captures };
110
+ }
111
+ if (match.stack) {
112
+ if (!context.stack) return { matched: false, captures };
113
+ const regex = new RegExp(match.stack);
114
+ const result = regex.exec(context.stack);
115
+ if (!result) return { matched: false, captures };
116
+ result.forEach((value, index) => {
117
+ if (index > 0 && value) {
118
+ captures.set(`match:${index}`, value);
119
+ }
120
+ });
121
+ }
122
+ if (match.annotation) {
123
+ if (!context.annotations?.has(match.annotation)) {
124
+ return { matched: false, captures };
125
+ }
126
+ const value = context.annotations.get(match.annotation);
127
+ if (value !== void 0) {
128
+ captures.set(`annotation:${match.annotation}`, String(value));
129
+ }
130
+ }
131
+ return { matched: true, captures };
132
+ }
133
+ function applyTemplate(template, context, captures) {
134
+ let result = template;
135
+ result = result.replace(/\{operator\}/g, context.operator);
136
+ result = result.replace(/\{function\}/g, context.function || "anonymous");
137
+ result = result.replace(/\{module\}/g, context.module || "unknown");
138
+ result = result.replace(/\{file\}/g, context.file || "unknown");
139
+ result = result.replace(/\{line\}/g, String(context.line || 0));
140
+ result = result.replace(/\{class\}/g, context.class || "");
141
+ for (const [key, value] of captures) {
142
+ result = result.replace(new RegExp(`\\{${key}\\}`, "g"), value);
143
+ }
144
+ result = result.replace(/\{[^}]+\}/g, "");
145
+ result = result.replace(/\.+/g, ".");
146
+ result = result.replace(/^\.+|\.+$/g, "");
147
+ return result || "effect.operation";
148
+ }
149
+ function resolveSpanName(config, context) {
150
+ for (const rule of config.rules) {
151
+ const matchResult = matchRule(rule, context);
152
+ if (matchResult.matched) {
153
+ return applyTemplate(rule.name, context, matchResult.captures);
154
+ }
155
+ }
156
+ return applyTemplate(config.default, context, /* @__PURE__ */ new Map());
157
+ }
158
+ function createSpanNameResolver(config) {
159
+ return (operator, contextOverrides) => {
160
+ const context = {
161
+ ...parseCallStack(),
162
+ operator,
163
+ ...contextOverrides
164
+ };
165
+ return resolveSpanName(config, context);
166
+ };
167
+ }
168
+
169
+ // src/integrations/effect/auto/index.ts
170
+ var AutoTracingConfig = class extends Context.Tag("AutoTracingConfig")() {
171
+ };
172
+ var autoTracingDisabled = FiberRef.unsafeMake(false);
173
+ var spanNameOverride = FiberRef.unsafeMake(void 0);
174
+ var defaultConfig = {
175
+ default: "effect.{operator}",
176
+ rules: []
177
+ };
178
+ var withoutAutoTracing = (self) => {
179
+ return Effect$1.locally(autoTracingDisabled, true)(self);
180
+ };
181
+ var setSpanName = (name) => (self) => {
182
+ return Effect$1.locally(spanNameOverride, name)(self);
183
+ };
184
+ function autoTrace(effect, operator) {
185
+ const context = parseCallStack();
186
+ const resolver = createSpanNameResolver(defaultConfig);
187
+ const spanName = resolver(operator, context);
188
+ return effect.pipe(Effect$1.withSpan(spanName));
189
+ }
190
+ function createAutoTracedGen() {
191
+ return function autoTracedGen(f) {
192
+ const effect = Effect$1.gen(f);
193
+ return autoTrace(effect, "gen");
194
+ };
195
+ }
196
+ function createAutoTracedAll() {
197
+ return function autoTracedAll(arg, options) {
198
+ const effect = Effect$1.all(arg, options);
199
+ return autoTrace(effect, "all");
200
+ };
201
+ }
202
+ function createAutoTracedForEach() {
203
+ return function autoTracedForEach(self, f, options) {
204
+ const effect = Effect$1.forEach(self, f, options);
205
+ return autoTrace(effect, "forEach");
206
+ };
207
+ }
208
+ function createAutoTracedTryPromise() {
209
+ return function autoTracedTryPromise(options) {
210
+ const effect = Effect$1.tryPromise(options);
211
+ return autoTrace(effect, "tryPromise");
212
+ };
213
+ }
214
+ function createAutoTracedPromise() {
215
+ return function autoTracedPromise(evaluate) {
216
+ const effect = Effect$1.promise(evaluate);
217
+ return autoTrace(effect, "promise");
218
+ };
219
+ }
220
+ var Effect = {
221
+ ...Effect$1,
222
+ // Auto-traced operators
223
+ gen: createAutoTracedGen(),
224
+ all: createAutoTracedAll(),
225
+ forEach: createAutoTracedForEach(),
226
+ tryPromise: createAutoTracedTryPromise(),
227
+ promise: createAutoTracedPromise()
228
+ // TODO: Add more auto-traced operators as needed
229
+ // - race
230
+ // - raceAll
231
+ // - timeout
232
+ // - retry
233
+ // - etc.
234
+ };
235
+ var AutoTracingLive = Layer.succeed(AutoTracingConfig, {
236
+ enabled: true,
237
+ namingConfig: defaultConfig,
238
+ filterPatterns: {
239
+ include: [],
240
+ exclude: []
241
+ },
242
+ sampling: {
243
+ rate: 1,
244
+ minDuration: "0 millis"
245
+ }
246
+ });
247
+ function createAutoTracingLayer(config) {
248
+ return Layer.succeed(AutoTracingConfig, {
249
+ enabled: true,
250
+ namingConfig: config.namingConfig || defaultConfig,
251
+ filterPatterns: {
252
+ include: config.filterPatterns?.include || [],
253
+ exclude: config.filterPatterns?.exclude || []
254
+ },
255
+ sampling: {
256
+ rate: config.sampling?.rate ?? 1,
257
+ minDuration: config.sampling?.minDuration || "0 millis"
258
+ }
259
+ });
260
+ }
261
+
262
+ export { AutoTracingConfig, AutoTracingLive, Effect, autoTracingDisabled, createAutoTracingLayer, createSpanNameResolver, parseCallStack, resolveSpanName, setSpanName, spanNameOverride, withoutAutoTracing };
263
+ //# sourceMappingURL=index.js.map
264
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../../src/integrations/effect/auto/naming.ts","../../../../../src/integrations/effect/auto/index.ts"],"names":["EffectOriginal"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Span Naming System for Auto-Tracing\n *\n * Resolves span names from templates based on call context and configuration rules.\n *\n * Template variables:\n * - {operator} - Effect operator name (gen, all, forEach, etc.)\n * - {function} - Enclosing function name\n * - {module} - Module/file name without extension\n * - {file} - Full file path\n * - {line} - Line number\n * - {class} - Class name if in a method\n * - {match:N} - Captured group from regex match\n */\n\nimport type { SpanNamingRule } from '@atrim/instrument-core'\n\n/**\n * Context information for span naming\n */\nexport interface SpanNamingContext {\n /** Effect operator name (gen, all, forEach, etc.) */\n operator: string\n /** Enclosing function name */\n function?: string\n /** Module/file name without extension */\n module?: string\n /** Full file path */\n file?: string\n /** Line number */\n line?: number\n /** Class name if in a method */\n class?: string\n /** Call stack string */\n stack?: string\n /** Fiber annotations */\n annotations?: Map<string, unknown>\n}\n\n/**\n * Span naming configuration\n */\nexport interface SpanNamingConfig {\n /** Default template when no rules match */\n default: string\n /** Custom naming rules */\n rules: SpanNamingRule[]\n}\n\n/**\n * Result of template resolution with any captured groups\n */\ninterface MatchResult {\n matched: boolean\n captures: Map<string, string>\n}\n\n/**\n * Parse call stack to extract context information\n *\n * @param maxDepth - Maximum frames to search\n * @returns Context extracted from stack\n */\nexport function parseCallStack(maxDepth: number = 15): SpanNamingContext {\n const error = new Error()\n const stack = error.stack || ''\n\n const context: SpanNamingContext = {\n operator: 'effect',\n stack\n }\n\n const lines = stack.split('\\n')\n\n // Patterns to skip (internal frames)\n const skipPatterns = [\n /node_modules/,\n /at parseCallStack/,\n /at resolveSpanName/,\n /at autoTrace/,\n /at Effect\\.gen/,\n /at Generator\\.next/,\n /at __awaiter/,\n /at new Promise/,\n /^Error$/,\n /at Object\\.<anonymous>/,\n /at Module\\._compile/,\n /at processTicksAndRejections/,\n /internal\\//\n ]\n\n let framesChecked = 0\n\n for (const line of lines) {\n if (framesChecked >= maxDepth) break\n\n // Skip if matches any skip pattern\n if (skipPatterns.some((pattern) => pattern.test(line))) {\n continue\n }\n\n framesChecked++\n\n // Try to extract class.method format\n // Format: \" at ClassName.methodName (file:line:col)\"\n const classMethodMatch = line.match(/at\\s+(\\w+)\\.(\\w+)\\s+\\(([^)]+):(\\d+):\\d+\\)/)\n if (classMethodMatch && classMethodMatch[1] && classMethodMatch[2]) {\n const className = classMethodMatch[1]\n const methodName = classMethodMatch[2]\n\n if (!['Object', 'Module', 'Function'].includes(className)) {\n context.class = className\n context.function = methodName\n if (classMethodMatch[3]) {\n context.file = classMethodMatch[3]\n context.module = extractModuleName(classMethodMatch[3])\n }\n if (classMethodMatch[4]) {\n context.line = parseInt(classMethodMatch[4], 10)\n }\n break\n }\n }\n\n // Try to extract function name\n // Format: \" at functionName (file:line:col)\"\n const functionMatch = line.match(/at\\s+(\\w+)\\s+\\(([^)]+):(\\d+):\\d+\\)/)\n if (functionMatch && functionMatch[1]) {\n const name = functionMatch[1]\n if (!['anonymous', 'eval', 'Object', 'Module'].includes(name)) {\n context.function = name\n if (functionMatch[2]) {\n context.file = functionMatch[2]\n context.module = extractModuleName(functionMatch[2])\n }\n if (functionMatch[3]) {\n context.line = parseInt(functionMatch[3], 10)\n }\n break\n }\n }\n\n // Fallback: extract file:line without function name\n const fileMatch = line.match(/\\(([^)]+):(\\d+):\\d+\\)/)\n if (fileMatch && fileMatch[1] && fileMatch[2]) {\n context.file = fileMatch[1]\n context.line = parseInt(fileMatch[2], 10)\n context.module = extractModuleName(fileMatch[1])\n // Don't break - continue looking for function name\n }\n }\n\n return context\n}\n\n/**\n * Extract module name from file path\n */\nfunction extractModuleName(filePath: string): string {\n const parts = filePath.split('/')\n const fileName = parts[parts.length - 1] || 'unknown'\n return fileName.replace(/\\.[^.]+$/, '')\n}\n\n/**\n * Check if a rule matches the given context\n *\n * @param rule - Naming rule to check\n * @param context - Call context\n * @returns Match result with any captured groups\n */\nfunction matchRule(rule: SpanNamingRule, context: SpanNamingContext): MatchResult {\n const captures = new Map<string, string>()\n const match = rule.match\n\n // Check file pattern\n if (match.file) {\n if (!context.file) return { matched: false, captures }\n const regex = new RegExp(match.file)\n const result = regex.exec(context.file)\n if (!result) return { matched: false, captures }\n // Store captured groups\n result.forEach((value, index) => {\n if (index > 0 && value) {\n captures.set(`match:${index}`, value)\n }\n })\n }\n\n // Check function pattern\n if (match.function) {\n if (!context.function) return { matched: false, captures }\n const regex = new RegExp(match.function)\n const result = regex.exec(context.function)\n if (!result) return { matched: false, captures }\n // Store captured groups\n result.forEach((value, index) => {\n if (index > 0 && value) {\n captures.set(`match:${index}`, value)\n }\n })\n }\n\n // Check operator pattern\n if (match.operator) {\n const regex = new RegExp(match.operator)\n if (!regex.test(context.operator)) return { matched: false, captures }\n }\n\n // Check stack pattern\n if (match.stack) {\n if (!context.stack) return { matched: false, captures }\n const regex = new RegExp(match.stack)\n const result = regex.exec(context.stack)\n if (!result) return { matched: false, captures }\n // Store captured groups\n result.forEach((value, index) => {\n if (index > 0 && value) {\n captures.set(`match:${index}`, value)\n }\n })\n }\n\n // Check annotation\n if (match.annotation) {\n if (!context.annotations?.has(match.annotation)) {\n return { matched: false, captures }\n }\n const value = context.annotations.get(match.annotation)\n if (value !== undefined) {\n captures.set(`annotation:${match.annotation}`, String(value))\n }\n }\n\n return { matched: true, captures }\n}\n\n/**\n * Apply template substitution\n *\n * @param template - Name template with {variables}\n * @param context - Call context\n * @param captures - Captured regex groups\n * @returns Resolved span name\n */\nfunction applyTemplate(\n template: string,\n context: SpanNamingContext,\n captures: Map<string, string>\n): string {\n let result = template\n\n // Replace standard variables\n result = result.replace(/\\{operator\\}/g, context.operator)\n result = result.replace(/\\{function\\}/g, context.function || 'anonymous')\n result = result.replace(/\\{module\\}/g, context.module || 'unknown')\n result = result.replace(/\\{file\\}/g, context.file || 'unknown')\n result = result.replace(/\\{line\\}/g, String(context.line || 0))\n result = result.replace(/\\{class\\}/g, context.class || '')\n\n // Replace captured groups {match:N}\n for (const [key, value] of captures) {\n result = result.replace(new RegExp(`\\\\{${key}\\\\}`, 'g'), value)\n }\n\n // Clean up any unreplaced variables\n result = result.replace(/\\{[^}]+\\}/g, '')\n\n // Clean up empty segments (e.g., \"foo..bar\" -> \"foo.bar\")\n result = result.replace(/\\.+/g, '.')\n result = result.replace(/^\\.+|\\.+$/g, '')\n\n return result || 'effect.operation'\n}\n\n/**\n * Resolve span name from configuration and context\n *\n * @param config - Span naming configuration\n * @param context - Call context\n * @returns Resolved span name\n */\nexport function resolveSpanName(config: SpanNamingConfig, context: SpanNamingContext): string {\n // Try each rule in order\n for (const rule of config.rules) {\n const matchResult = matchRule(rule, context)\n if (matchResult.matched) {\n return applyTemplate(rule.name, context, matchResult.captures)\n }\n }\n\n // Use default template\n return applyTemplate(config.default, context, new Map())\n}\n\n/**\n * Create a span name resolver function\n *\n * @param config - Span naming configuration\n * @returns Function that resolves span names\n */\nexport function createSpanNameResolver(\n config: SpanNamingConfig\n): (operator: string, contextOverrides?: Partial<SpanNamingContext>) => string {\n return (operator: string, contextOverrides?: Partial<SpanNamingContext>) => {\n const context = {\n ...parseCallStack(),\n operator,\n ...contextOverrides\n }\n return resolveSpanName(config, context)\n }\n}\n","/**\n * Auto-Traced Effect Module\n *\n * Drop-in replacement for Effect with automatic tracing.\n * Import this instead of 'effect' to get automatic span creation.\n *\n * @example\n * ```typescript\n * // Instead of: import { Effect } from 'effect'\n * import { Effect } from '@atrim/instrument-node/effect/auto'\n *\n * // All operations are automatically traced\n * const program = Effect.gen(function* () {\n * yield* Effect.sleep('100 millis')\n * return 'done'\n * })\n * ```\n */\n\nimport { Effect as EffectOriginal, FiberRef, Layer, Context } from 'effect'\nimport {\n createSpanNameResolver,\n parseCallStack,\n type SpanNamingConfig,\n type SpanNamingContext\n} from './naming.js'\n\n// Don't re-export everything - let users import what they need from 'effect'\n// This avoids conflicts and bundle bloat\n\n/**\n * Auto-tracing configuration service\n */\nexport class AutoTracingConfig extends Context.Tag('AutoTracingConfig')<\n AutoTracingConfig,\n {\n readonly enabled: boolean\n readonly namingConfig: SpanNamingConfig\n readonly filterPatterns: {\n include: string[]\n exclude: string[]\n }\n readonly sampling: {\n rate: number\n minDuration: string\n }\n }\n>() {}\n\n/**\n * FiberRef to disable auto-tracing for specific effects\n */\nexport const autoTracingDisabled = FiberRef.unsafeMake(false)\n\n/**\n * FiberRef for custom span name override\n */\nexport const spanNameOverride = FiberRef.unsafeMake<string | undefined>(undefined)\n\n/**\n * Default auto-tracing configuration\n */\nconst defaultConfig: SpanNamingConfig = {\n default: 'effect.{operator}',\n rules: []\n}\n\n/**\n * Disable auto-tracing for the wrapped effect\n *\n * @example\n * ```typescript\n * const program = Effect.gen(function* () {\n * yield* internalWork()\n * }).pipe(withoutAutoTracing())\n * ```\n */\nexport const withoutAutoTracing = <A, E, R>(\n self: EffectOriginal.Effect<A, E, R>\n): EffectOriginal.Effect<A, E, R> => {\n return EffectOriginal.locally(autoTracingDisabled, true)(self)\n}\n\n/**\n * Set a custom span name for the wrapped effect\n *\n * @example\n * ```typescript\n * const program = Effect.gen(function* () {\n * yield* doWork()\n * }).pipe(setSpanName('custom.name'))\n * ```\n */\nexport const setSpanName =\n (name: string) =>\n <A, E, R>(self: EffectOriginal.Effect<A, E, R>): EffectOriginal.Effect<A, E, R> => {\n return EffectOriginal.locally(spanNameOverride, name)(self)\n }\n\n/**\n * Check if auto-tracing should be applied\n */\nfunction shouldTrace(name: string, config: SpanNamingConfig): boolean {\n // TODO: Implement filtering based on config\n return true\n}\n\n/**\n * Helper to wrap an effect with auto-tracing\n */\nfunction autoTrace<A, E, R>(\n effect: EffectOriginal.Effect<A, E, R>,\n operator: string\n): EffectOriginal.Effect<A, E, R> {\n const context = parseCallStack()\n const resolver = createSpanNameResolver(defaultConfig)\n const spanName = resolver(operator, context)\n\n return effect.pipe(EffectOriginal.withSpan(spanName))\n}\n\n/**\n * Create auto-traced version of Effect.gen\n */\nfunction createAutoTracedGen() {\n return function autoTracedGen(f: any) {\n const effect = EffectOriginal.gen(f)\n return autoTrace(effect, 'gen')\n }\n}\n\n/**\n * Create auto-traced version of Effect.all\n */\nfunction createAutoTracedAll() {\n return function autoTracedAll(arg: any, options?: any) {\n const effect = EffectOriginal.all(arg, options)\n return autoTrace(effect, 'all')\n }\n}\n\n/**\n * Create auto-traced version of Effect.forEach\n */\nfunction createAutoTracedForEach() {\n return function autoTracedForEach(self: any, f: any, options?: any) {\n const effect = EffectOriginal.forEach(self, f, options)\n return autoTrace(effect, 'forEach')\n }\n}\n\n/**\n * Create auto-traced version of Effect.tryPromise\n */\nfunction createAutoTracedTryPromise() {\n return function autoTracedTryPromise(options: any) {\n const effect = EffectOriginal.tryPromise(options)\n return autoTrace(effect, 'tryPromise')\n }\n}\n\n/**\n * Create auto-traced version of Effect.promise\n */\nfunction createAutoTracedPromise() {\n return function autoTracedPromise(evaluate: any) {\n const effect = EffectOriginal.promise(evaluate)\n return autoTrace(effect, 'promise')\n }\n}\n\n/**\n * Auto-traced Effect namespace\n *\n * Drop-in replacement for Effect with automatic tracing\n */\nexport const Effect = {\n ...EffectOriginal,\n\n // Auto-traced operators\n gen: createAutoTracedGen(),\n all: createAutoTracedAll(),\n forEach: createAutoTracedForEach(),\n tryPromise: createAutoTracedTryPromise(),\n promise: createAutoTracedPromise()\n\n // TODO: Add more auto-traced operators as needed\n // - race\n // - raceAll\n // - timeout\n // - retry\n // - etc.\n}\n\n/**\n * Create the AutoTracingLive layer\n *\n * @example\n * ```typescript\n * const program = Effect.gen(function* () {\n * yield* doWork()\n * })\n *\n * await Effect.runPromise(\n * program.pipe(Effect.provide(AutoTracingLive))\n * )\n * ```\n */\nexport const AutoTracingLive = Layer.succeed(AutoTracingConfig, {\n enabled: true,\n namingConfig: defaultConfig,\n filterPatterns: {\n include: [],\n exclude: []\n },\n sampling: {\n rate: 1.0,\n minDuration: '0 millis'\n }\n})\n\n/**\n * Create custom auto-tracing layer with configuration\n *\n * @example\n * ```typescript\n * const CustomAutoTracing = createAutoTracingLayer({\n * namingConfig: {\n * default: '{module}.{function}',\n * rules: [\n * {\n * match: { file: 'src/api/.*' },\n * name: 'api.{function}'\n * }\n * ]\n * },\n * filterPatterns: {\n * include: ['^app\\\\.', '^api\\\\.'],\n * exclude: ['^internal\\\\.']\n * },\n * sampling: {\n * rate: 0.1,\n * minDuration: '50 millis'\n * }\n * })\n * ```\n */\nexport function createAutoTracingLayer(config: {\n namingConfig?: SpanNamingConfig\n filterPatterns?: {\n include?: string[]\n exclude?: string[]\n }\n sampling?: {\n rate?: number\n minDuration?: string\n }\n}) {\n return Layer.succeed(AutoTracingConfig, {\n enabled: true,\n namingConfig: config.namingConfig || defaultConfig,\n filterPatterns: {\n include: config.filterPatterns?.include || [],\n exclude: config.filterPatterns?.exclude || []\n },\n sampling: {\n rate: config.sampling?.rate ?? 1.0,\n minDuration: config.sampling?.minDuration || '0 millis'\n }\n })\n}\n\n// Export naming utilities\nexport { parseCallStack, resolveSpanName, createSpanNameResolver } from './naming.js'\nexport type { SpanNamingContext, SpanNamingConfig } from './naming.js'\n"]}
@@ -34,6 +34,11 @@ var HttpClient__namespace = /*#__PURE__*/_interopNamespace(HttpClient);
34
34
  var HttpClientRequest__namespace = /*#__PURE__*/_interopNamespace(HttpClientRequest);
35
35
 
36
36
  // 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";
37
42
  var __defProp = Object.defineProperty;
38
43
  var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
39
44
  var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
@@ -64,13 +69,69 @@ var AutoIsolationConfigSchema = zod.z.object({
64
69
  add_metadata: zod.z.boolean().default(true)
65
70
  }).default({})
66
71
  });
72
+ var SpanNamingRuleSchema = zod.z.object({
73
+ // Match conditions (all specified conditions must match)
74
+ match: zod.z.object({
75
+ // Match by file path pattern (regex)
76
+ file: zod.z.string().optional(),
77
+ // Match by function name pattern (regex)
78
+ function: zod.z.string().optional(),
79
+ // Match by operator type (gen, all, forEach, etc.)
80
+ operator: zod.z.string().optional(),
81
+ // Match by call stack pattern (regex)
82
+ stack: zod.z.string().optional(),
83
+ // Match by fiber annotation key
84
+ annotation: zod.z.string().optional()
85
+ }),
86
+ // Name template with substitution variables
87
+ // Available: {operator}, {function}, {module}, {file}, {line}, {class}, {match:N}
88
+ name: zod.z.string()
89
+ });
90
+ var AutoTracingConfigSchema = zod.z.object({
91
+ // Global enable/disable for auto-tracing
92
+ enabled: zod.z.boolean().default(true),
93
+ // Span naming configuration
94
+ span_naming: zod.z.object({
95
+ // Default name template when no rules match
96
+ default: zod.z.string().default("effect.{operator}"),
97
+ // Custom naming rules (applied in order, first match wins)
98
+ rules: zod.z.array(SpanNamingRuleSchema).default([])
99
+ }).default({}),
100
+ // Pattern filtering
101
+ filter_patterns: zod.z.object({
102
+ // Only trace spans matching these patterns
103
+ include: zod.z.array(zod.z.string()).default([]),
104
+ // Exclude spans matching these patterns (takes precedence)
105
+ exclude: zod.z.array(zod.z.string()).default([])
106
+ }).default({}),
107
+ // Sampling configuration
108
+ sampling: zod.z.object({
109
+ // Sampling rate (0.0 to 1.0)
110
+ rate: zod.z.number().min(0).max(1).default(1),
111
+ // Only trace effects with duration > this value
112
+ min_duration: zod.z.string().default("0 millis")
113
+ }).default({})
114
+ });
67
115
  var HttpFilteringConfigSchema = zod.z.object({
68
116
  // Patterns to ignore for outgoing HTTP requests (string patterns only in YAML)
69
117
  ignore_outgoing_urls: zod.z.array(zod.z.string()).optional(),
70
118
  // Patterns to ignore for incoming HTTP requests (string patterns only in YAML)
71
119
  ignore_incoming_paths: zod.z.array(zod.z.string()).optional(),
72
120
  // Require parent span for outgoing requests (prevents root spans for HTTP calls)
73
- require_parent_for_outgoing_spans: zod.z.boolean().optional()
121
+ require_parent_for_outgoing_spans: zod.z.boolean().optional(),
122
+ // Trace context propagation configuration
123
+ // Controls which cross-origin requests receive W3C Trace Context headers (traceparent, tracestate)
124
+ propagate_trace_context: zod.z.object({
125
+ // Strategy for trace propagation
126
+ // - "all": Propagate to all cross-origin requests (may cause CORS errors)
127
+ // - "none": Never propagate trace headers
128
+ // - "same-origin": Only propagate to same-origin requests (default, safe)
129
+ // - "patterns": Propagate based on include_urls patterns
130
+ strategy: zod.z.enum(["all", "none", "same-origin", "patterns"]).default("same-origin"),
131
+ // URL patterns to include when strategy is "patterns"
132
+ // Supports regex patterns (e.g., "^https://api\\.myapp\\.com")
133
+ include_urls: zod.z.array(zod.z.string()).optional()
134
+ }).optional()
74
135
  });
75
136
  var InstrumentationConfigSchema = zod.z.object({
76
137
  version: zod.z.string(),
@@ -83,7 +144,8 @@ var InstrumentationConfigSchema = zod.z.object({
83
144
  }),
84
145
  effect: zod.z.object({
85
146
  auto_extract_metadata: zod.z.boolean(),
86
- auto_isolation: AutoIsolationConfigSchema.optional()
147
+ auto_isolation: AutoIsolationConfigSchema.optional(),
148
+ auto_tracing: AutoTracingConfigSchema.optional()
87
149
  }).optional(),
88
150
  http: HttpFilteringConfigSchema.optional()
89
151
  });
@@ -489,6 +551,7 @@ async function loadConfigWithOptions(options = {}) {
489
551
  }
490
552
 
491
553
  // src/integrations/effect/effect-tracer.ts
554
+ var SDK_NAME = "@effect/opentelemetry-otlp";
492
555
  function createEffectInstrumentation(options = {}) {
493
556
  return effect.Layer.unwrapEffect(
494
557
  effect.Effect.gen(function* () {
@@ -522,7 +585,9 @@ function createEffectInstrumentation(options = {}) {
522
585
  attributes: {
523
586
  "platform.component": "effect",
524
587
  "effect.auto_metadata": autoExtractMetadata,
525
- "effect.context_propagation": continueExistingTraces
588
+ "effect.context_propagation": continueExistingTraces,
589
+ [ATTR_TELEMETRY_SDK_LANGUAGE]: TELEMETRY_SDK_LANGUAGE_VALUE_NODEJS,
590
+ [ATTR_TELEMETRY_SDK_NAME]: SDK_NAME
526
591
  }
527
592
  },
528
593
  // Bridge Effect context to OpenTelemetry global context
@@ -561,7 +626,9 @@ var EffectInstrumentationLive = effect.Effect.sync(() => {
561
626
  serviceName,
562
627
  serviceVersion,
563
628
  attributes: {
564
- "platform.component": "effect"
629
+ "platform.component": "effect",
630
+ [ATTR_TELEMETRY_SDK_LANGUAGE]: TELEMETRY_SDK_LANGUAGE_VALUE_NODEJS,
631
+ [ATTR_TELEMETRY_SDK_NAME]: SDK_NAME
565
632
  }
566
633
  },
567
634
  // CRITICAL: Bridge Effect context to OpenTelemetry global context
@@ -580,25 +647,144 @@ var EffectInstrumentationLive = effect.Effect.sync(() => {
580
647
  }
581
648
  }).pipe(effect.Layer.provide(platform.FetchHttpClient.layer));
582
649
  }).pipe(effect.Layer.unwrapEffect);
583
-
584
- // src/integrations/effect/effect-helpers.ts
585
- function annotateUser(_userId, _email) {
650
+ function annotateUser(userId, email, username) {
651
+ const attributes = {
652
+ "user.id": userId
653
+ };
654
+ if (email) attributes["user.email"] = email;
655
+ if (username) attributes["user.name"] = username;
656
+ return effect.Effect.annotateCurrentSpan(attributes);
586
657
  }
587
- function annotateDataSize(_bytes, _count) {
658
+ function annotateDataSize(bytes, items, compressionRatio) {
659
+ const attributes = {
660
+ "data.size.bytes": bytes,
661
+ "data.size.items": items
662
+ };
663
+ if (compressionRatio !== void 0) {
664
+ attributes["data.compression.ratio"] = compressionRatio;
665
+ }
666
+ return effect.Effect.annotateCurrentSpan(attributes);
588
667
  }
589
- function annotateBatch(_size, _batchSize) {
668
+ function annotateBatch(totalItems, batchSize, successCount, failureCount) {
669
+ const attributes = {
670
+ "batch.size": batchSize,
671
+ "batch.total_items": totalItems,
672
+ "batch.count": Math.ceil(totalItems / batchSize)
673
+ };
674
+ if (successCount !== void 0) {
675
+ attributes["batch.success_count"] = successCount;
676
+ }
677
+ if (failureCount !== void 0) {
678
+ attributes["batch.failure_count"] = failureCount;
679
+ }
680
+ return effect.Effect.annotateCurrentSpan(attributes);
590
681
  }
591
- function annotateLLM(_model, _operation, _inputTokens, _outputTokens) {
682
+ function annotateLLM(model, provider, tokens) {
683
+ const attributes = {
684
+ "llm.model": model,
685
+ "llm.provider": provider
686
+ };
687
+ if (tokens) {
688
+ if (tokens.prompt !== void 0) attributes["llm.tokens.prompt"] = tokens.prompt;
689
+ if (tokens.completion !== void 0) attributes["llm.tokens.completion"] = tokens.completion;
690
+ if (tokens.total !== void 0) attributes["llm.tokens.total"] = tokens.total;
691
+ }
692
+ return effect.Effect.annotateCurrentSpan(attributes);
592
693
  }
593
- function annotateQuery(_query, _database) {
694
+ function annotateQuery(query, duration, rowCount, database) {
695
+ const attributes = {
696
+ "db.statement": query.length > 1e3 ? query.substring(0, 1e3) + "..." : query
697
+ };
698
+ if (duration !== void 0) attributes["db.duration.ms"] = duration;
699
+ if (rowCount !== void 0) attributes["db.row_count"] = rowCount;
700
+ if (database) attributes["db.name"] = database;
701
+ return effect.Effect.annotateCurrentSpan(attributes);
594
702
  }
595
- function annotateHttpRequest(_method, _url, _statusCode) {
703
+ function annotateHttpRequest(method, url, statusCode, contentLength) {
704
+ const attributes = {
705
+ "http.method": method,
706
+ "http.url": url
707
+ };
708
+ if (statusCode !== void 0) attributes["http.status_code"] = statusCode;
709
+ if (contentLength !== void 0) attributes["http.response.content_length"] = contentLength;
710
+ return effect.Effect.annotateCurrentSpan(attributes);
596
711
  }
597
- function annotateError(_error, _context) {
712
+ function annotateError(error, recoverable, errorType) {
713
+ const errorMessage = typeof error === "string" ? error : error.message;
714
+ const errorStack = typeof error === "string" ? void 0 : error.stack;
715
+ const attributes = {
716
+ "error.message": errorMessage,
717
+ "error.recoverable": recoverable
718
+ };
719
+ if (errorType) attributes["error.type"] = errorType;
720
+ if (errorStack) attributes["error.stack"] = errorStack;
721
+ return effect.Effect.annotateCurrentSpan(attributes);
598
722
  }
599
- function annotatePriority(_priority) {
723
+ function annotatePriority(priority, reason) {
724
+ const attributes = {
725
+ "operation.priority": priority
726
+ };
727
+ if (reason) attributes["operation.priority.reason"] = reason;
728
+ return effect.Effect.annotateCurrentSpan(attributes);
729
+ }
730
+ function annotateCache(hit, key, ttl) {
731
+ const attributes = {
732
+ "cache.hit": hit,
733
+ "cache.key": key
734
+ };
735
+ if (ttl !== void 0) attributes["cache.ttl.seconds"] = ttl;
736
+ return effect.Effect.annotateCurrentSpan(attributes);
737
+ }
738
+ function extractEffectMetadata() {
739
+ return effect.Effect.gen(function* () {
740
+ const metadata = {};
741
+ const currentFiber = effect.Fiber.getCurrentFiber();
742
+ if (effect.Option.isSome(currentFiber)) {
743
+ const fiber = currentFiber.value;
744
+ const fiberId = fiber.id();
745
+ metadata["effect.fiber.id"] = effect.FiberId.threadName(fiberId);
746
+ const status = yield* effect.Fiber.status(fiber);
747
+ if (status._tag) {
748
+ metadata["effect.fiber.status"] = status._tag;
749
+ }
750
+ }
751
+ const parentSpanResult = yield* effect.Effect.currentSpan.pipe(
752
+ effect.Effect.option
753
+ // Convert NoSuchElementException to Option
754
+ );
755
+ if (effect.Option.isSome(parentSpanResult)) {
756
+ const parentSpan = parentSpanResult.value;
757
+ metadata["effect.operation.nested"] = true;
758
+ metadata["effect.operation.root"] = false;
759
+ if (parentSpan.spanId) {
760
+ metadata["effect.parent.span.id"] = parentSpan.spanId;
761
+ }
762
+ if (parentSpan.name) {
763
+ metadata["effect.parent.span.name"] = parentSpan.name;
764
+ }
765
+ if (parentSpan.traceId) {
766
+ metadata["effect.parent.trace.id"] = parentSpan.traceId;
767
+ }
768
+ } else {
769
+ metadata["effect.operation.nested"] = false;
770
+ metadata["effect.operation.root"] = true;
771
+ }
772
+ return metadata;
773
+ });
600
774
  }
601
- function annotateCache(_operation, _hit) {
775
+ function autoEnrichSpan() {
776
+ return effect.Effect.gen(function* () {
777
+ const metadata = yield* extractEffectMetadata();
778
+ yield* effect.Effect.annotateCurrentSpan(metadata);
779
+ });
780
+ }
781
+ function withAutoEnrichedSpan(spanName, options) {
782
+ return (self) => {
783
+ return effect.Effect.gen(function* () {
784
+ yield* autoEnrichSpan();
785
+ return yield* self;
786
+ }).pipe(effect.Effect.withSpan(spanName, options));
787
+ };
602
788
  }
603
789
  var createLogicalParentLink = (parentSpan, useSpanLinks) => {
604
790
  if (!useSpanLinks) {
@@ -737,8 +923,11 @@ exports.annotatePriority = annotatePriority;
737
923
  exports.annotateQuery = annotateQuery;
738
924
  exports.annotateSpawnedTasks = annotateSpawnedTasks;
739
925
  exports.annotateUser = annotateUser;
926
+ exports.autoEnrichSpan = autoEnrichSpan;
740
927
  exports.createEffectInstrumentation = createEffectInstrumentation;
928
+ exports.extractEffectMetadata = extractEffectMetadata;
741
929
  exports.runIsolated = runIsolated;
742
930
  exports.runWithSpan = runWithSpan;
931
+ exports.withAutoEnrichedSpan = withAutoEnrichedSpan;
743
932
  //# sourceMappingURL=index.cjs.map
744
933
  //# sourceMappingURL=index.cjs.map