@traccia2/sdk 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (130) hide show
  1. package/LICENSE +23 -0
  2. package/README.md +503 -0
  3. package/dist/auto.d.ts +27 -0
  4. package/dist/auto.d.ts.map +1 -0
  5. package/dist/auto.js +171 -0
  6. package/dist/auto.js.map +1 -0
  7. package/dist/config/env-config.d.ts +21 -0
  8. package/dist/config/env-config.d.ts.map +1 -0
  9. package/dist/config/env-config.js +111 -0
  10. package/dist/config/env-config.js.map +1 -0
  11. package/dist/config/pricing-config.d.ts +27 -0
  12. package/dist/config/pricing-config.d.ts.map +1 -0
  13. package/dist/config/pricing-config.js +74 -0
  14. package/dist/config/pricing-config.js.map +1 -0
  15. package/dist/config/runtime-config.d.ts +65 -0
  16. package/dist/config/runtime-config.d.ts.map +1 -0
  17. package/dist/config/runtime-config.js +97 -0
  18. package/dist/config/runtime-config.js.map +1 -0
  19. package/dist/context/context.d.ts +29 -0
  20. package/dist/context/context.d.ts.map +1 -0
  21. package/dist/context/context.js +48 -0
  22. package/dist/context/context.js.map +1 -0
  23. package/dist/exporter/console-exporter.d.ts +18 -0
  24. package/dist/exporter/console-exporter.d.ts.map +1 -0
  25. package/dist/exporter/console-exporter.js +39 -0
  26. package/dist/exporter/console-exporter.js.map +1 -0
  27. package/dist/exporter/http-exporter.d.ts +57 -0
  28. package/dist/exporter/http-exporter.d.ts.map +1 -0
  29. package/dist/exporter/http-exporter.js +181 -0
  30. package/dist/exporter/http-exporter.js.map +1 -0
  31. package/dist/exporter/index.d.ts +7 -0
  32. package/dist/exporter/index.d.ts.map +1 -0
  33. package/dist/exporter/index.js +12 -0
  34. package/dist/exporter/index.js.map +1 -0
  35. package/dist/index.d.ts +10 -0
  36. package/dist/index.d.ts.map +1 -0
  37. package/dist/index.js +32 -0
  38. package/dist/index.js.map +1 -0
  39. package/dist/integrations/index.d.ts +9 -0
  40. package/dist/integrations/index.d.ts.map +1 -0
  41. package/dist/integrations/index.js +16 -0
  42. package/dist/integrations/index.js.map +1 -0
  43. package/dist/integrations/langchain-callback.d.ts +72 -0
  44. package/dist/integrations/langchain-callback.d.ts.map +1 -0
  45. package/dist/integrations/langchain-callback.js +201 -0
  46. package/dist/integrations/langchain-callback.js.map +1 -0
  47. package/dist/integrations/langgraph-instrumentation.d.ts +57 -0
  48. package/dist/integrations/langgraph-instrumentation.d.ts.map +1 -0
  49. package/dist/integrations/langgraph-instrumentation.js +162 -0
  50. package/dist/integrations/langgraph-instrumentation.js.map +1 -0
  51. package/dist/processor/batch-processor.d.ts +68 -0
  52. package/dist/processor/batch-processor.d.ts.map +1 -0
  53. package/dist/processor/batch-processor.js +150 -0
  54. package/dist/processor/batch-processor.js.map +1 -0
  55. package/dist/processor/cost-processor.d.ts +16 -0
  56. package/dist/processor/cost-processor.d.ts.map +1 -0
  57. package/dist/processor/cost-processor.js +50 -0
  58. package/dist/processor/cost-processor.js.map +1 -0
  59. package/dist/processor/index.d.ts +9 -0
  60. package/dist/processor/index.d.ts.map +1 -0
  61. package/dist/processor/index.js +18 -0
  62. package/dist/processor/index.js.map +1 -0
  63. package/dist/processor/logging-processor.d.ts +13 -0
  64. package/dist/processor/logging-processor.d.ts.map +1 -0
  65. package/dist/processor/logging-processor.js +26 -0
  66. package/dist/processor/logging-processor.js.map +1 -0
  67. package/dist/processor/sampler.d.ts +20 -0
  68. package/dist/processor/sampler.d.ts.map +1 -0
  69. package/dist/processor/sampler.js +33 -0
  70. package/dist/processor/sampler.js.map +1 -0
  71. package/dist/processor/token-counter.d.ts +13 -0
  72. package/dist/processor/token-counter.d.ts.map +1 -0
  73. package/dist/processor/token-counter.js +40 -0
  74. package/dist/processor/token-counter.js.map +1 -0
  75. package/dist/tracer/index.d.ts +8 -0
  76. package/dist/tracer/index.d.ts.map +1 -0
  77. package/dist/tracer/index.js +15 -0
  78. package/dist/tracer/index.js.map +1 -0
  79. package/dist/tracer/provider.d.ts +59 -0
  80. package/dist/tracer/provider.d.ts.map +1 -0
  81. package/dist/tracer/provider.js +114 -0
  82. package/dist/tracer/provider.js.map +1 -0
  83. package/dist/tracer/span-context.d.ts +23 -0
  84. package/dist/tracer/span-context.d.ts.map +1 -0
  85. package/dist/tracer/span-context.js +34 -0
  86. package/dist/tracer/span-context.js.map +1 -0
  87. package/dist/tracer/span.d.ts +49 -0
  88. package/dist/tracer/span.d.ts.map +1 -0
  89. package/dist/tracer/span.js +118 -0
  90. package/dist/tracer/span.js.map +1 -0
  91. package/dist/tracer/tracer.d.ts +28 -0
  92. package/dist/tracer/tracer.d.ts.map +1 -0
  93. package/dist/tracer/tracer.js +75 -0
  94. package/dist/tracer/tracer.js.map +1 -0
  95. package/dist/types.d.ts +135 -0
  96. package/dist/types.d.ts.map +1 -0
  97. package/dist/types.js +16 -0
  98. package/dist/types.js.map +1 -0
  99. package/package.json +79 -0
  100. package/src/__tests__/exporter.test.ts +62 -0
  101. package/src/__tests__/integrations-langchain.test.ts +384 -0
  102. package/src/__tests__/integrations-langgraph.test.ts +479 -0
  103. package/src/__tests__/processor.test.ts +89 -0
  104. package/src/__tests__/span.test.ts +103 -0
  105. package/src/__tests__/tracer.test.ts +89 -0
  106. package/src/auto.ts +198 -0
  107. package/src/config/env-config.ts +93 -0
  108. package/src/config/pricing-config.ts +84 -0
  109. package/src/config/runtime-config.ts +108 -0
  110. package/src/context/context.ts +52 -0
  111. package/src/exporter/console-exporter.ts +38 -0
  112. package/src/exporter/http-exporter.ts +188 -0
  113. package/src/exporter/index.ts +7 -0
  114. package/src/index.ts +51 -0
  115. package/src/integrations/README.md +287 -0
  116. package/src/integrations/index.ts +13 -0
  117. package/src/integrations/langchain-callback.ts +229 -0
  118. package/src/integrations/langgraph-instrumentation.ts +174 -0
  119. package/src/processor/batch-processor.ts +180 -0
  120. package/src/processor/cost-processor.ts +57 -0
  121. package/src/processor/index.ts +9 -0
  122. package/src/processor/logging-processor.ts +26 -0
  123. package/src/processor/sampler.ts +35 -0
  124. package/src/processor/token-counter.ts +42 -0
  125. package/src/tracer/index.ts +8 -0
  126. package/src/tracer/provider.ts +130 -0
  127. package/src/tracer/span-context.ts +46 -0
  128. package/src/tracer/span.ts +145 -0
  129. package/src/tracer/tracer.ts +100 -0
  130. package/src/types.ts +155 -0
@@ -0,0 +1,201 @@
1
+ "use strict";
2
+ /**
3
+ * LangChain callback handler for automatic tracing.
4
+ * Integrates with LangChain's callback system to automatically instrument
5
+ * LLM calls, chains, agents, and tools.
6
+ */
7
+ Object.defineProperty(exports, "__esModule", { value: true });
8
+ exports.TraciaCallbackHandler = void 0;
9
+ const auto_1 = require("../auto");
10
+ /**
11
+ * LangChain Callback Handler for Traccia SDK.
12
+ * Automatically traces LLM calls, chains, agents, and tools.
13
+ *
14
+ * @example
15
+ * import { ChatOpenAI } from 'langchain/chat_models/openai';
16
+ * import { LLMChain } from 'langchain/chains';
17
+ * import { TraciaCallbackHandler } from '@traccia/sdk/integrations/langchain';
18
+ *
19
+ * const handler = new TraciaCallbackHandler();
20
+ * const chain = new LLMChain({
21
+ * llm: new ChatOpenAI(),
22
+ * callbacks: [handler],
23
+ * });
24
+ *
25
+ * await chain.run({ input: 'What is 2+2?' });
26
+ * // Automatically traced with spans for LLM, chain execution, tokens, etc.
27
+ */
28
+ class TraciaCallbackHandler {
29
+ constructor() {
30
+ this.tracer = (0, auto_1.getTracer)('langchain');
31
+ this.spanStack = new Map();
32
+ }
33
+ /**
34
+ * Handle LLM start - called when an LLM begins execution.
35
+ */
36
+ async handleLLMStart(llm, prompts, runId, _parentRunId) {
37
+ const span = this.tracer.startSpan('llm', {
38
+ attributes: {
39
+ type: 'llm',
40
+ model: llm.name || llm._modelType || 'unknown',
41
+ prompt_count: prompts.length,
42
+ first_prompt_length: prompts[0]?.length || 0,
43
+ },
44
+ });
45
+ this.spanStack.set(runId, span);
46
+ }
47
+ /**
48
+ * Handle LLM end - called when an LLM finishes execution.
49
+ */
50
+ async handleLLMEnd(output, runId) {
51
+ const span = this.spanStack.get(runId);
52
+ if (span) {
53
+ try {
54
+ const tokenUsage = output?.llmOutput?.token_usage || output?.token_usage;
55
+ if (tokenUsage) {
56
+ span.setAttribute('prompt_tokens', tokenUsage.prompt_tokens);
57
+ span.setAttribute('completion_tokens', tokenUsage.completion_tokens);
58
+ span.setAttribute('total_tokens', (tokenUsage.prompt_tokens || 0) + (tokenUsage.completion_tokens || 0));
59
+ }
60
+ if (output?.text) {
61
+ span.setAttribute('output_length', output.text.length);
62
+ }
63
+ }
64
+ catch (error) {
65
+ // Silently fail on attribute setting
66
+ }
67
+ span.end();
68
+ this.spanStack.delete(runId);
69
+ }
70
+ }
71
+ /**
72
+ * Handle LLM error.
73
+ */
74
+ async handleLLMError(error, runId) {
75
+ const span = this.spanStack.get(runId);
76
+ if (span) {
77
+ span.recordException(error, { source: 'langchain-llm' });
78
+ span.end();
79
+ this.spanStack.delete(runId);
80
+ }
81
+ }
82
+ /**
83
+ * Handle chain start - called when a chain begins execution.
84
+ */
85
+ async handleChainStart(chain, inputs, runId, _parentRunId) {
86
+ const chainName = chain.name || chain._chainType || 'chain';
87
+ const span = this.tracer.startSpan(`chain:${chainName}`, {
88
+ attributes: {
89
+ type: 'chain',
90
+ chain_name: chainName,
91
+ chain_type: chain._chainType,
92
+ input_keys: Object.keys(inputs).join(','),
93
+ },
94
+ });
95
+ this.spanStack.set(runId, span);
96
+ }
97
+ /**
98
+ * Handle chain end - called when a chain finishes execution.
99
+ */
100
+ async handleChainEnd(output, runId) {
101
+ const span = this.spanStack.get(runId);
102
+ if (span) {
103
+ try {
104
+ if (output) {
105
+ const outputStr = typeof output === 'string' ? output : JSON.stringify(output);
106
+ span.setAttribute('output_length', outputStr.length);
107
+ }
108
+ }
109
+ catch (error) {
110
+ // Silently fail
111
+ }
112
+ span.end();
113
+ this.spanStack.delete(runId);
114
+ }
115
+ }
116
+ /**
117
+ * Handle chain error.
118
+ */
119
+ async handleChainError(error, runId) {
120
+ const span = this.spanStack.get(runId);
121
+ if (span) {
122
+ span.recordException(error, { source: 'langchain-chain' });
123
+ span.end();
124
+ this.spanStack.delete(runId);
125
+ }
126
+ }
127
+ /**
128
+ * Handle tool start - called when a tool is invoked.
129
+ */
130
+ async handleToolStart(tool, input, runId, _parentRunId) {
131
+ const toolName = tool.name || 'unknown-tool';
132
+ const span = this.tracer.startSpan(`tool:${toolName}`, {
133
+ attributes: {
134
+ type: 'tool',
135
+ tool_name: toolName,
136
+ tool_description: tool.description,
137
+ input_length: typeof input === 'string' ? input.length : 0,
138
+ },
139
+ });
140
+ this.spanStack.set(runId, span);
141
+ }
142
+ /**
143
+ * Handle tool end - called when a tool finishes execution.
144
+ */
145
+ async handleToolEnd(output, runId) {
146
+ const span = this.spanStack.get(runId);
147
+ if (span) {
148
+ try {
149
+ span.setAttribute('output_length', output?.length || 0);
150
+ }
151
+ catch (error) {
152
+ // Silently fail
153
+ }
154
+ span.end();
155
+ this.spanStack.delete(runId);
156
+ }
157
+ }
158
+ /**
159
+ * Handle tool error.
160
+ */
161
+ async handleToolError(error, runId) {
162
+ const span = this.spanStack.get(runId);
163
+ if (span) {
164
+ span.recordException(error, { source: 'langchain-tool' });
165
+ span.end();
166
+ this.spanStack.delete(runId);
167
+ }
168
+ }
169
+ /**
170
+ * Handle agent action.
171
+ */
172
+ async handleAgentAction(action, runId) {
173
+ const span = this.spanStack.get(runId);
174
+ if (span) {
175
+ try {
176
+ span.setAttribute('agent_action', action.tool);
177
+ }
178
+ catch (error) {
179
+ // Silently fail
180
+ }
181
+ }
182
+ }
183
+ /**
184
+ * Handle agent finish.
185
+ */
186
+ async handleAgentFinish(finish, runId) {
187
+ const span = this.spanStack.get(runId);
188
+ if (span) {
189
+ try {
190
+ span.setAttribute('agent_finish_output', JSON.stringify(finish.returnValues));
191
+ }
192
+ catch (error) {
193
+ // Silently fail
194
+ }
195
+ span.end();
196
+ this.spanStack.delete(runId);
197
+ }
198
+ }
199
+ }
200
+ exports.TraciaCallbackHandler = TraciaCallbackHandler;
201
+ //# sourceMappingURL=langchain-callback.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"langchain-callback.js","sourceRoot":"","sources":["../../src/integrations/langchain-callback.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,57 @@
1
+ /**
2
+ * LangGraph instrumentation for automatic tracing.
3
+ * Provides utilities to instrument LangGraph state graphs for automatic tracing.
4
+ */
5
+ /**
6
+ * Instrument a LangGraph to automatically trace execution.
7
+ * Wraps graph invocation to create spans for the entire graph execution.
8
+ *
9
+ * @example
10
+ * import { StateGraph } from 'langchain/graph';
11
+ * import { instrumentLangGraph } from '@traccia/sdk/integrations/langgraph';
12
+ *
13
+ * const graph = new StateGraph(AgentState)
14
+ * .addNode('agent', agentNode)
15
+ * .addNode('tools', toolsNode)
16
+ * .addEdge('agent', 'tools')
17
+ * .addEdge('tools', 'agent');
18
+ *
19
+ * const instrumented = instrumentLangGraph(graph, { graphName: 'my-agent' });
20
+ * const compiled = instrumented.compile();
21
+ *
22
+ * await compiled.invoke({ messages: [...] });
23
+ * // Automatically traced with span for graph execution
24
+ */
25
+ export declare function instrumentLangGraph(graph: any, options?: {
26
+ graphName?: string;
27
+ }): any;
28
+ /**
29
+ * Create a traced node function wrapper for LangGraph nodes.
30
+ * Automatically wraps node execution with tracing spans.
31
+ *
32
+ * @example
33
+ * import { createTracedNode } from '@traccia/sdk/integrations/langgraph';
34
+ *
35
+ * const agentNode = createTracedNode('agent', async (state) => {
36
+ * // Your agent logic here
37
+ * return { messages: [...] };
38
+ * });
39
+ *
40
+ * graph.addNode('agent', agentNode);
41
+ */
42
+ export declare function createTracedNode(nodeName: string, nodeFunc: (state: any) => Promise<any>): (state: any) => Promise<any>;
43
+ /**
44
+ * Create a traced conditional edge function for LangGraph.
45
+ * Wraps conditional routing logic with tracing.
46
+ *
47
+ * @example
48
+ * import { createTracedConditional } from '@traccia/sdk/integrations/langgraph';
49
+ *
50
+ * const shouldContinue = createTracedConditional('should_continue', (state) => {
51
+ * return state.messages.length > 10 ? 'end' : 'continue';
52
+ * });
53
+ *
54
+ * graph.addConditionalEdges('agent', shouldContinue);
55
+ */
56
+ export declare function createTracedConditional(conditionName: string, conditionFunc: (state: any) => string): (state: any) => string;
57
+ //# sourceMappingURL=langgraph-instrumentation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"langgraph-instrumentation.d.ts","sourceRoot":"","sources":["../../src/integrations/langgraph-instrumentation.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,GAAG,EAAE,OAAO,CAAC,EAAE;IAAE,SAAS,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,GAAG,CAoErF;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,gBAAgB,CAC9B,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,CAAC,KAAK,EAAE,GAAG,KAAK,OAAO,CAAC,GAAG,CAAC,GACrC,CAAC,KAAK,EAAE,GAAG,KAAK,OAAO,CAAC,GAAG,CAAC,CAoB9B;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,uBAAuB,CACrC,aAAa,EAAE,MAAM,EACrB,aAAa,EAAE,CAAC,KAAK,EAAE,GAAG,KAAK,MAAM,GACpC,CAAC,KAAK,EAAE,GAAG,KAAK,MAAM,CAqBxB"}
@@ -0,0 +1,162 @@
1
+ "use strict";
2
+ /**
3
+ * LangGraph instrumentation for automatic tracing.
4
+ * Provides utilities to instrument LangGraph state graphs for automatic tracing.
5
+ */
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.instrumentLangGraph = instrumentLangGraph;
8
+ exports.createTracedNode = createTracedNode;
9
+ exports.createTracedConditional = createTracedConditional;
10
+ const auto_1 = require("../auto");
11
+ /**
12
+ * Instrument a LangGraph to automatically trace execution.
13
+ * Wraps graph invocation to create spans for the entire graph execution.
14
+ *
15
+ * @example
16
+ * import { StateGraph } from 'langchain/graph';
17
+ * import { instrumentLangGraph } from '@traccia/sdk/integrations/langgraph';
18
+ *
19
+ * const graph = new StateGraph(AgentState)
20
+ * .addNode('agent', agentNode)
21
+ * .addNode('tools', toolsNode)
22
+ * .addEdge('agent', 'tools')
23
+ * .addEdge('tools', 'agent');
24
+ *
25
+ * const instrumented = instrumentLangGraph(graph, { graphName: 'my-agent' });
26
+ * const compiled = instrumented.compile();
27
+ *
28
+ * await compiled.invoke({ messages: [...] });
29
+ * // Automatically traced with span for graph execution
30
+ */
31
+ function instrumentLangGraph(graph, options) {
32
+ const tracer = (0, auto_1.getTracer)('langgraph');
33
+ const graphName = options?.graphName || graph.graph_name || 'langgraph';
34
+ // Store original compile method
35
+ const originalCompile = graph.compile.bind(graph);
36
+ // Override compile to wrap invocation
37
+ graph.compile = function () {
38
+ const compiled = originalCompile();
39
+ const originalInvoke = compiled.invoke.bind(compiled);
40
+ const originalStream = compiled.stream?.bind(compiled);
41
+ /**
42
+ * Wrap invoke calls with tracing.
43
+ */
44
+ compiled.invoke = async function (input, config) {
45
+ const span = tracer.startSpan('langgraph-invoke', {
46
+ attributes: {
47
+ graph_name: graphName,
48
+ config_thread_id: config?.configurable?.thread_id,
49
+ },
50
+ });
51
+ try {
52
+ const result = await originalInvoke(input, config);
53
+ span.end();
54
+ return result;
55
+ }
56
+ catch (error) {
57
+ span.recordException(error, { context: 'langgraph-invoke' });
58
+ span.end();
59
+ throw error;
60
+ }
61
+ };
62
+ /**
63
+ * Wrap stream calls with tracing.
64
+ */
65
+ if (originalStream) {
66
+ compiled.stream = async function* (input, config) {
67
+ const span = tracer.startSpan('langgraph-stream', {
68
+ attributes: {
69
+ graph_name: graphName,
70
+ config_thread_id: config?.configurable?.thread_id,
71
+ },
72
+ });
73
+ let eventCount = 0;
74
+ try {
75
+ for await (const event of originalStream(input, config)) {
76
+ eventCount++;
77
+ yield event;
78
+ }
79
+ span.setAttribute('stream_events', eventCount);
80
+ span.end();
81
+ }
82
+ catch (error) {
83
+ span.recordException(error, { context: 'langgraph-stream' });
84
+ span.setAttribute('stream_events', eventCount);
85
+ span.end();
86
+ throw error;
87
+ }
88
+ };
89
+ }
90
+ return compiled;
91
+ };
92
+ return graph;
93
+ }
94
+ /**
95
+ * Create a traced node function wrapper for LangGraph nodes.
96
+ * Automatically wraps node execution with tracing spans.
97
+ *
98
+ * @example
99
+ * import { createTracedNode } from '@traccia/sdk/integrations/langgraph';
100
+ *
101
+ * const agentNode = createTracedNode('agent', async (state) => {
102
+ * // Your agent logic here
103
+ * return { messages: [...] };
104
+ * });
105
+ *
106
+ * graph.addNode('agent', agentNode);
107
+ */
108
+ function createTracedNode(nodeName, nodeFunc) {
109
+ const tracer = (0, auto_1.getTracer)('langgraph');
110
+ return async function tracedNode(state) {
111
+ const span = tracer.startSpan(`node:${nodeName}`, {
112
+ attributes: {
113
+ node_name: nodeName,
114
+ },
115
+ });
116
+ try {
117
+ const result = await nodeFunc(state);
118
+ span.end();
119
+ return result;
120
+ }
121
+ catch (error) {
122
+ span.recordException(error, { node: nodeName });
123
+ span.end();
124
+ throw error;
125
+ }
126
+ };
127
+ }
128
+ /**
129
+ * Create a traced conditional edge function for LangGraph.
130
+ * Wraps conditional routing logic with tracing.
131
+ *
132
+ * @example
133
+ * import { createTracedConditional } from '@traccia/sdk/integrations/langgraph';
134
+ *
135
+ * const shouldContinue = createTracedConditional('should_continue', (state) => {
136
+ * return state.messages.length > 10 ? 'end' : 'continue';
137
+ * });
138
+ *
139
+ * graph.addConditionalEdges('agent', shouldContinue);
140
+ */
141
+ function createTracedConditional(conditionName, conditionFunc) {
142
+ const tracer = (0, auto_1.getTracer)('langgraph');
143
+ return function tracedConditional(state) {
144
+ const span = tracer.startSpan(`condition:${conditionName}`, {
145
+ attributes: {
146
+ condition_name: conditionName,
147
+ },
148
+ });
149
+ try {
150
+ const result = conditionFunc(state);
151
+ span.setAttribute('condition_result', result);
152
+ span.end();
153
+ return result;
154
+ }
155
+ catch (error) {
156
+ span.recordException(error, { condition: conditionName });
157
+ span.end();
158
+ throw error;
159
+ }
160
+ };
161
+ }
162
+ //# sourceMappingURL=langgraph-instrumentation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"langgraph-instrumentation.js","sourceRoot":"","sources":["../../src/integrations/langgraph-instrumentation.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,68 @@
1
+ /**
2
+ * Batch span processor with queue management and background flush.
3
+ */
4
+ import { ISpan, ISpanProcessor, ISpanExporter } from '../types';
5
+ import { ISampler } from '../types';
6
+ /**
7
+ * Drop policy for handling queue overflow.
8
+ */
9
+ export declare enum DropPolicy {
10
+ DROP_OLDEST = "drop_oldest",
11
+ DROP_NEWEST = "drop_newest"
12
+ }
13
+ /**
14
+ * Batch span processor.
15
+ */
16
+ export declare class BatchSpanProcessor implements ISpanProcessor {
17
+ private exporter?;
18
+ private maxQueueSize;
19
+ private maxExportBatchSize;
20
+ private scheduleDelayMs;
21
+ private dropPolicy;
22
+ private sampler?;
23
+ private queue;
24
+ private _shutdown;
25
+ private timer?;
26
+ private processing;
27
+ constructor(options?: {
28
+ exporter?: ISpanExporter;
29
+ maxQueueSize?: number;
30
+ maxExportBatchSize?: number;
31
+ scheduleDelayMs?: number;
32
+ dropPolicy?: DropPolicy;
33
+ sampler?: ISampler;
34
+ });
35
+ /**
36
+ * Handle span end.
37
+ */
38
+ onEnd(span: ISpan): void;
39
+ /**
40
+ * Force flush pending spans.
41
+ */
42
+ forceFlush(timeout?: number): Promise<void>;
43
+ /**
44
+ * Shutdown the processor.
45
+ */
46
+ shutdown(): Promise<void>;
47
+ /**
48
+ * Enqueue a span.
49
+ */
50
+ private enqueue;
51
+ /**
52
+ * Flush once (export one batch).
53
+ */
54
+ private flushOnce;
55
+ /**
56
+ * Drain queue.
57
+ */
58
+ private drainQueue;
59
+ /**
60
+ * Export spans.
61
+ */
62
+ private export;
63
+ /**
64
+ * Start the background scheduling.
65
+ */
66
+ private startSchedule;
67
+ }
68
+ //# sourceMappingURL=batch-processor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"batch-processor.d.ts","sourceRoot":"","sources":["../../src/processor/batch-processor.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,KAAK,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAChE,OAAO,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AAMpC;;GAEG;AACH,oBAAY,UAAU;IACpB,WAAW,gBAAgB;IAC3B,WAAW,gBAAgB;CAC5B;AAED;;GAEG;AACH,qBAAa,kBAAmB,YAAW,cAAc;IACvD,OAAO,CAAC,QAAQ,CAAC,CAAgB;IACjC,OAAO,CAAC,YAAY,CAAS;IAC7B,OAAO,CAAC,kBAAkB,CAAS;IACnC,OAAO,CAAC,eAAe,CAAS;IAChC,OAAO,CAAC,UAAU,CAAa;IAC/B,OAAO,CAAC,OAAO,CAAC,CAAW;IAE3B,OAAO,CAAC,KAAK,CAAe;IAC5B,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,KAAK,CAAC,CAAiB;IAC/B,OAAO,CAAC,UAAU,CAAS;gBAEf,OAAO,GAAE;QACnB,QAAQ,CAAC,EAAE,aAAa,CAAC;QACzB,YAAY,CAAC,EAAE,MAAM,CAAC;QACtB,kBAAkB,CAAC,EAAE,MAAM,CAAC;QAC5B,eAAe,CAAC,EAAE,MAAM,CAAC;QACzB,UAAU,CAAC,EAAE,UAAU,CAAC;QACxB,OAAO,CAAC,EAAE,QAAQ,CAAC;KACf;IAWN;;OAEG;IACH,KAAK,CAAC,IAAI,EAAE,KAAK,GAAG,IAAI;IAaxB;;OAEG;IACG,UAAU,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAYjD;;OAEG;IACG,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;IAW/B;;OAEG;IACH,OAAO,CAAC,OAAO;IAWf;;OAEG;YACW,SAAS;IAkBvB;;OAEG;IACH,OAAO,CAAC,UAAU;IAWlB;;OAEG;YACW,MAAM;IAepB;;OAEG;IACH,OAAO,CAAC,aAAa;CAWtB"}
@@ -0,0 +1,150 @@
1
+ "use strict";
2
+ /**
3
+ * Batch span processor with queue management and background flush.
4
+ */
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.BatchSpanProcessor = exports.DropPolicy = void 0;
7
+ const DEFAULT_MAX_QUEUE_SIZE = 5000;
8
+ const DEFAULT_MAX_EXPORT_BATCH_SIZE = 512;
9
+ const DEFAULT_SCHEDULE_DELAY_MS = 5000;
10
+ /**
11
+ * Drop policy for handling queue overflow.
12
+ */
13
+ var DropPolicy;
14
+ (function (DropPolicy) {
15
+ DropPolicy["DROP_OLDEST"] = "drop_oldest";
16
+ DropPolicy["DROP_NEWEST"] = "drop_newest";
17
+ })(DropPolicy || (exports.DropPolicy = DropPolicy = {}));
18
+ /**
19
+ * Batch span processor.
20
+ */
21
+ class BatchSpanProcessor {
22
+ constructor(options = {}) {
23
+ this.queue = [];
24
+ this._shutdown = false;
25
+ this.processing = false;
26
+ this.exporter = options.exporter;
27
+ this.maxQueueSize = options.maxQueueSize || DEFAULT_MAX_QUEUE_SIZE;
28
+ this.maxExportBatchSize = options.maxExportBatchSize || DEFAULT_MAX_EXPORT_BATCH_SIZE;
29
+ this.scheduleDelayMs = options.scheduleDelayMs || DEFAULT_SCHEDULE_DELAY_MS;
30
+ this.dropPolicy = options.dropPolicy || DropPolicy.DROP_OLDEST;
31
+ this.sampler = options.sampler;
32
+ this.startSchedule();
33
+ }
34
+ /**
35
+ * Handle span end.
36
+ */
37
+ onEnd(span) {
38
+ if (this._shutdown) {
39
+ return;
40
+ }
41
+ // Apply head-based sampling: drop non-sampled traces
42
+ if (this.sampler && span.context.traceFlags === 0) {
43
+ return;
44
+ }
45
+ this.enqueue(span);
46
+ }
47
+ /**
48
+ * Force flush pending spans.
49
+ */
50
+ async forceFlush(timeout) {
51
+ const deadline = timeout ? Date.now() + timeout : undefined;
52
+ // eslint-disable-next-line no-constant-condition
53
+ while (true) {
54
+ const flushed = await this.flushOnce(deadline);
55
+ if (!flushed || (deadline && Date.now() >= deadline)) {
56
+ break;
57
+ }
58
+ }
59
+ }
60
+ /**
61
+ * Shutdown the processor.
62
+ */
63
+ async shutdown() {
64
+ this._shutdown = true;
65
+ if (this.timer) {
66
+ clearTimeout(this.timer);
67
+ }
68
+ await this.forceFlush();
69
+ if (this.exporter) {
70
+ await this.exporter.shutdown();
71
+ }
72
+ }
73
+ /**
74
+ * Enqueue a span.
75
+ */
76
+ enqueue(span) {
77
+ if (this.queue.length >= this.maxQueueSize) {
78
+ if (this.dropPolicy === DropPolicy.DROP_OLDEST) {
79
+ this.queue.shift();
80
+ }
81
+ else {
82
+ return; // Drop newest
83
+ }
84
+ }
85
+ this.queue.push(span);
86
+ }
87
+ /**
88
+ * Flush once (export one batch).
89
+ */
90
+ async flushOnce(deadline) {
91
+ if (this.processing) {
92
+ return false;
93
+ }
94
+ if (deadline && Date.now() >= deadline) {
95
+ return false;
96
+ }
97
+ const batch = this.drainQueue(this.maxExportBatchSize);
98
+ if (batch.length === 0) {
99
+ return false;
100
+ }
101
+ await this.export(batch);
102
+ return true;
103
+ }
104
+ /**
105
+ * Drain queue.
106
+ */
107
+ drainQueue(limit) {
108
+ const batch = [];
109
+ while (batch.length < limit && this.queue.length > 0) {
110
+ const span = this.queue.shift();
111
+ if (span) {
112
+ batch.push(span);
113
+ }
114
+ }
115
+ return batch;
116
+ }
117
+ /**
118
+ * Export spans.
119
+ */
120
+ async export(spans) {
121
+ if (!this.exporter) {
122
+ return;
123
+ }
124
+ this.processing = true;
125
+ try {
126
+ await this.exporter.export(spans);
127
+ }
128
+ catch {
129
+ // Export errors are swallowed for resilience
130
+ }
131
+ finally {
132
+ this.processing = false;
133
+ }
134
+ }
135
+ /**
136
+ * Start the background scheduling.
137
+ */
138
+ startSchedule() {
139
+ // eslint-disable-next-line @typescript-eslint/no-misused-promises
140
+ this.timer = setInterval(async () => {
141
+ await this.flushOnce();
142
+ }, this.scheduleDelayMs);
143
+ // Ensure the timer doesn't keep the process alive
144
+ if (this.timer.unref) {
145
+ this.timer.unref();
146
+ }
147
+ }
148
+ }
149
+ exports.BatchSpanProcessor = BatchSpanProcessor;
150
+ //# sourceMappingURL=batch-processor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"batch-processor.js","sourceRoot":"","sources":["../../src/processor/batch-processor.ts"],"names":[],"mappings":"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"}