@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.
- package/LICENSE +23 -0
- package/README.md +503 -0
- package/dist/auto.d.ts +27 -0
- package/dist/auto.d.ts.map +1 -0
- package/dist/auto.js +171 -0
- package/dist/auto.js.map +1 -0
- package/dist/config/env-config.d.ts +21 -0
- package/dist/config/env-config.d.ts.map +1 -0
- package/dist/config/env-config.js +111 -0
- package/dist/config/env-config.js.map +1 -0
- package/dist/config/pricing-config.d.ts +27 -0
- package/dist/config/pricing-config.d.ts.map +1 -0
- package/dist/config/pricing-config.js +74 -0
- package/dist/config/pricing-config.js.map +1 -0
- package/dist/config/runtime-config.d.ts +65 -0
- package/dist/config/runtime-config.d.ts.map +1 -0
- package/dist/config/runtime-config.js +97 -0
- package/dist/config/runtime-config.js.map +1 -0
- package/dist/context/context.d.ts +29 -0
- package/dist/context/context.d.ts.map +1 -0
- package/dist/context/context.js +48 -0
- package/dist/context/context.js.map +1 -0
- package/dist/exporter/console-exporter.d.ts +18 -0
- package/dist/exporter/console-exporter.d.ts.map +1 -0
- package/dist/exporter/console-exporter.js +39 -0
- package/dist/exporter/console-exporter.js.map +1 -0
- package/dist/exporter/http-exporter.d.ts +57 -0
- package/dist/exporter/http-exporter.d.ts.map +1 -0
- package/dist/exporter/http-exporter.js +181 -0
- package/dist/exporter/http-exporter.js.map +1 -0
- package/dist/exporter/index.d.ts +7 -0
- package/dist/exporter/index.d.ts.map +1 -0
- package/dist/exporter/index.js +12 -0
- package/dist/exporter/index.js.map +1 -0
- package/dist/index.d.ts +10 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +32 -0
- package/dist/index.js.map +1 -0
- package/dist/integrations/index.d.ts +9 -0
- package/dist/integrations/index.d.ts.map +1 -0
- package/dist/integrations/index.js +16 -0
- package/dist/integrations/index.js.map +1 -0
- package/dist/integrations/langchain-callback.d.ts +72 -0
- package/dist/integrations/langchain-callback.d.ts.map +1 -0
- package/dist/integrations/langchain-callback.js +201 -0
- package/dist/integrations/langchain-callback.js.map +1 -0
- package/dist/integrations/langgraph-instrumentation.d.ts +57 -0
- package/dist/integrations/langgraph-instrumentation.d.ts.map +1 -0
- package/dist/integrations/langgraph-instrumentation.js +162 -0
- package/dist/integrations/langgraph-instrumentation.js.map +1 -0
- package/dist/processor/batch-processor.d.ts +68 -0
- package/dist/processor/batch-processor.d.ts.map +1 -0
- package/dist/processor/batch-processor.js +150 -0
- package/dist/processor/batch-processor.js.map +1 -0
- package/dist/processor/cost-processor.d.ts +16 -0
- package/dist/processor/cost-processor.d.ts.map +1 -0
- package/dist/processor/cost-processor.js +50 -0
- package/dist/processor/cost-processor.js.map +1 -0
- package/dist/processor/index.d.ts +9 -0
- package/dist/processor/index.d.ts.map +1 -0
- package/dist/processor/index.js +18 -0
- package/dist/processor/index.js.map +1 -0
- package/dist/processor/logging-processor.d.ts +13 -0
- package/dist/processor/logging-processor.d.ts.map +1 -0
- package/dist/processor/logging-processor.js +26 -0
- package/dist/processor/logging-processor.js.map +1 -0
- package/dist/processor/sampler.d.ts +20 -0
- package/dist/processor/sampler.d.ts.map +1 -0
- package/dist/processor/sampler.js +33 -0
- package/dist/processor/sampler.js.map +1 -0
- package/dist/processor/token-counter.d.ts +13 -0
- package/dist/processor/token-counter.d.ts.map +1 -0
- package/dist/processor/token-counter.js +40 -0
- package/dist/processor/token-counter.js.map +1 -0
- package/dist/tracer/index.d.ts +8 -0
- package/dist/tracer/index.d.ts.map +1 -0
- package/dist/tracer/index.js +15 -0
- package/dist/tracer/index.js.map +1 -0
- package/dist/tracer/provider.d.ts +59 -0
- package/dist/tracer/provider.d.ts.map +1 -0
- package/dist/tracer/provider.js +114 -0
- package/dist/tracer/provider.js.map +1 -0
- package/dist/tracer/span-context.d.ts +23 -0
- package/dist/tracer/span-context.d.ts.map +1 -0
- package/dist/tracer/span-context.js +34 -0
- package/dist/tracer/span-context.js.map +1 -0
- package/dist/tracer/span.d.ts +49 -0
- package/dist/tracer/span.d.ts.map +1 -0
- package/dist/tracer/span.js +118 -0
- package/dist/tracer/span.js.map +1 -0
- package/dist/tracer/tracer.d.ts +28 -0
- package/dist/tracer/tracer.d.ts.map +1 -0
- package/dist/tracer/tracer.js +75 -0
- package/dist/tracer/tracer.js.map +1 -0
- package/dist/types.d.ts +135 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +16 -0
- package/dist/types.js.map +1 -0
- package/package.json +79 -0
- package/src/__tests__/exporter.test.ts +62 -0
- package/src/__tests__/integrations-langchain.test.ts +384 -0
- package/src/__tests__/integrations-langgraph.test.ts +479 -0
- package/src/__tests__/processor.test.ts +89 -0
- package/src/__tests__/span.test.ts +103 -0
- package/src/__tests__/tracer.test.ts +89 -0
- package/src/auto.ts +198 -0
- package/src/config/env-config.ts +93 -0
- package/src/config/pricing-config.ts +84 -0
- package/src/config/runtime-config.ts +108 -0
- package/src/context/context.ts +52 -0
- package/src/exporter/console-exporter.ts +38 -0
- package/src/exporter/http-exporter.ts +188 -0
- package/src/exporter/index.ts +7 -0
- package/src/index.ts +51 -0
- package/src/integrations/README.md +287 -0
- package/src/integrations/index.ts +13 -0
- package/src/integrations/langchain-callback.ts +229 -0
- package/src/integrations/langgraph-instrumentation.ts +174 -0
- package/src/processor/batch-processor.ts +180 -0
- package/src/processor/cost-processor.ts +57 -0
- package/src/processor/index.ts +9 -0
- package/src/processor/logging-processor.ts +26 -0
- package/src/processor/sampler.ts +35 -0
- package/src/processor/token-counter.ts +42 -0
- package/src/tracer/index.ts +8 -0
- package/src/tracer/provider.ts +130 -0
- package/src/tracer/span-context.ts +46 -0
- package/src/tracer/span.ts +145 -0
- package/src/tracer/tracer.ts +100 -0
- 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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"}
|