trodo-node 1.2.0 → 2.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +154 -2
- package/dist/cjs/TrodoClient.js +71 -102
- package/dist/cjs/TrodoClient.js.map +1 -1
- package/dist/cjs/api/ApiClient.js +20 -2
- package/dist/cjs/api/ApiClient.js.map +1 -1
- package/dist/cjs/api/endpoints.js +7 -1
- package/dist/cjs/api/endpoints.js.map +1 -1
- package/dist/cjs/index.js +97 -29
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/otel/autoInstrument.js +253 -0
- package/dist/cjs/otel/autoInstrument.js.map +1 -0
- package/dist/cjs/otel/context.js +49 -0
- package/dist/cjs/otel/context.js.map +1 -0
- package/dist/cjs/otel/helpers.js +254 -0
- package/dist/cjs/otel/helpers.js.map +1 -0
- package/dist/cjs/otel/processor.js +129 -0
- package/dist/cjs/otel/processor.js.map +1 -0
- package/dist/cjs/otel/uuid.js +24 -0
- package/dist/cjs/otel/uuid.js.map +1 -0
- package/dist/cjs/otel/wrapAgent.js +399 -0
- package/dist/cjs/otel/wrapAgent.js.map +1 -0
- package/dist/esm/TrodoClient.d.ts +34 -11
- package/dist/esm/TrodoClient.d.ts.map +1 -1
- package/dist/esm/TrodoClient.js +71 -102
- package/dist/esm/TrodoClient.js.map +1 -1
- package/dist/esm/api/ApiClient.d.ts +9 -1
- package/dist/esm/api/ApiClient.d.ts.map +1 -1
- package/dist/esm/api/ApiClient.js +20 -2
- package/dist/esm/api/ApiClient.js.map +1 -1
- package/dist/esm/api/endpoints.d.ts +6 -1
- package/dist/esm/api/endpoints.d.ts.map +1 -1
- package/dist/esm/api/endpoints.js +7 -1
- package/dist/esm/api/endpoints.js.map +1 -1
- package/dist/esm/index.d.ts +84 -19
- package/dist/esm/index.d.ts.map +1 -1
- package/dist/esm/index.js +82 -23
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/otel/autoInstrument.d.ts +61 -0
- package/dist/esm/otel/autoInstrument.d.ts.map +1 -0
- package/dist/esm/otel/autoInstrument.js +248 -0
- package/dist/esm/otel/autoInstrument.js.map +1 -0
- package/dist/esm/otel/context.d.ts +26 -0
- package/dist/esm/otel/context.d.ts.map +1 -0
- package/dist/esm/otel/context.js +44 -0
- package/dist/esm/otel/context.js.map +1 -0
- package/dist/esm/otel/helpers.d.ts +119 -0
- package/dist/esm/otel/helpers.d.ts.map +1 -0
- package/dist/esm/otel/helpers.js +244 -0
- package/dist/esm/otel/helpers.js.map +1 -0
- package/dist/esm/otel/processor.d.ts +94 -0
- package/dist/esm/otel/processor.d.ts.map +1 -0
- package/dist/esm/otel/processor.js +125 -0
- package/dist/esm/otel/processor.js.map +1 -0
- package/dist/esm/otel/uuid.d.ts +7 -0
- package/dist/esm/otel/uuid.d.ts.map +1 -0
- package/dist/esm/otel/uuid.js +21 -0
- package/dist/esm/otel/uuid.js.map +1 -0
- package/dist/esm/otel/wrapAgent.d.ts +100 -0
- package/dist/esm/otel/wrapAgent.d.ts.map +1 -0
- package/dist/esm/otel/wrapAgent.js +389 -0
- package/dist/esm/otel/wrapAgent.js.map +1 -0
- package/dist/esm/types/index.d.ts +24 -48
- package/dist/esm/types/index.d.ts.map +1 -1
- package/package.json +1 -1
package/dist/esm/index.js
CHANGED
|
@@ -1,20 +1,58 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* trodo-node — Trodo Analytics SDK for Node.js
|
|
3
3
|
*
|
|
4
|
-
*
|
|
4
|
+
* Quick start (any stack):
|
|
5
5
|
* import trodo from 'trodo-node';
|
|
6
|
-
* trodo.init({ siteId: 'your-site-id' });
|
|
7
|
-
* const user = trodo.forUser('user-123');
|
|
8
|
-
* await user.track('purchase_completed', { amount: 99.99 });
|
|
6
|
+
* trodo.init({ siteId: 'your-site-id' }); // autoInstrument on by default
|
|
9
7
|
*
|
|
10
|
-
*
|
|
11
|
-
*
|
|
12
|
-
*
|
|
8
|
+
* // OpenAI / Anthropic / LangChain / Vercel AI SDK — nothing else to do.
|
|
9
|
+
* const { result, runId } = await trodo.wrapAgent(
|
|
10
|
+
* 'customer-support',
|
|
11
|
+
* async (run) => {
|
|
12
|
+
* run.setInput({ query });
|
|
13
|
+
* const answer = await agent.run(query);
|
|
14
|
+
* run.setOutput(answer);
|
|
15
|
+
* return answer;
|
|
16
|
+
* },
|
|
17
|
+
* { distinctId, conversationId },
|
|
18
|
+
* );
|
|
19
|
+
*
|
|
20
|
+
* await trodo.feedback(runId, { satisfaction: 'positive', rating: 5 });
|
|
21
|
+
*
|
|
22
|
+
* Raw-HTTP LLM caller:
|
|
23
|
+
* const resp = await fetch(url, { body }).then(r => r.json());
|
|
24
|
+
* await trodo.trackLlmCall({
|
|
25
|
+
* model: 'gemini-2.5-flash', provider: 'google',
|
|
26
|
+
* inputTokens: resp.usageMetadata.promptTokenCount,
|
|
27
|
+
* outputTokens: resp.usageMetadata.candidatesTokenCount,
|
|
28
|
+
* prompt: body, completion: resp,
|
|
29
|
+
* });
|
|
30
|
+
*
|
|
31
|
+
* Custom tool:
|
|
32
|
+
* const runFunnelQuery = trodo.tool(
|
|
33
|
+
* async (teamId, preset) => { ... },
|
|
34
|
+
* { name: 'run_funnel_query' },
|
|
35
|
+
* );
|
|
36
|
+
*
|
|
37
|
+
* Downstream microservice (join the caller's run instead of creating a new one):
|
|
38
|
+
* // Express:
|
|
39
|
+
* app.use(trodo.expressMiddleware());
|
|
40
|
+
*
|
|
41
|
+
* // Or manually:
|
|
42
|
+
* await trodo.joinRun(
|
|
43
|
+
* headers['x-trodo-run-id'],
|
|
44
|
+
* headers['x-trodo-parent-span-id'],
|
|
45
|
+
* async () => { ... },
|
|
46
|
+
* );
|
|
13
47
|
*/
|
|
14
48
|
export { TrodoClient } from './TrodoClient.js';
|
|
15
49
|
export { UserContext } from './UserContext.js';
|
|
16
50
|
export * from './types/index.js';
|
|
17
51
|
import { TrodoClient } from './TrodoClient.js';
|
|
52
|
+
export { getActiveContext } from './otel/context.js';
|
|
53
|
+
export { currentRunId, currentSpanId } from './otel/wrapAgent.js';
|
|
54
|
+
import { propagationHeaders, trace, llm, retrieval, getTracer, tool as _toolImpl, } from './otel/helpers.js';
|
|
55
|
+
export { propagationHeaders, trace, llm, retrieval, getTracer };
|
|
18
56
|
// ============================================================================
|
|
19
57
|
// Singleton convenience API
|
|
20
58
|
// ============================================================================
|
|
@@ -87,22 +125,37 @@ export async function shutdown() {
|
|
|
87
125
|
return getClient().shutdown();
|
|
88
126
|
}
|
|
89
127
|
// ----------------------------------------------------------------------------
|
|
90
|
-
// Agent
|
|
128
|
+
// Agent Runs — unified surface
|
|
91
129
|
// ----------------------------------------------------------------------------
|
|
92
|
-
|
|
93
|
-
|
|
130
|
+
/**
|
|
131
|
+
* Wrap an async function as an agent run. All OTel-instrumented LLM/tool
|
|
132
|
+
* calls and nested withSpan calls are auto-captured as child spans.
|
|
133
|
+
*/
|
|
134
|
+
export function wrapAgent(agentName, fn, options) {
|
|
135
|
+
return getClient().wrapAgent(agentName, fn, options);
|
|
136
|
+
}
|
|
137
|
+
/** Create a nested span inside the current run. */
|
|
138
|
+
export function withSpan(name, fn, options) {
|
|
139
|
+
return getClient().withSpan(name, fn, options);
|
|
140
|
+
}
|
|
141
|
+
/** Join an existing run owned by a remote service — spans nest under it. */
|
|
142
|
+
export function joinRun(runId, parentSpanId, fn, options) {
|
|
143
|
+
return getClient().joinRun(runId, parentSpanId, fn, options);
|
|
94
144
|
}
|
|
95
|
-
export function
|
|
96
|
-
return
|
|
145
|
+
export function tool(a, b) {
|
|
146
|
+
return _toolImpl(a, b);
|
|
97
147
|
}
|
|
98
|
-
|
|
99
|
-
|
|
148
|
+
/** Record a one-shot LLM span for a raw-HTTP caller. */
|
|
149
|
+
export function trackLlmCall(params) {
|
|
150
|
+
return getClient().trackLlmCall(params);
|
|
100
151
|
}
|
|
101
|
-
|
|
102
|
-
|
|
152
|
+
/** Return an Express/Connect middleware that auto-joins inbound runs. */
|
|
153
|
+
export function expressMiddleware() {
|
|
154
|
+
return getClient().expressMiddleware();
|
|
103
155
|
}
|
|
104
|
-
|
|
105
|
-
|
|
156
|
+
/** Attach feedback to a completed run. */
|
|
157
|
+
export function feedback(runId, props) {
|
|
158
|
+
return getClient().feedback(runId, props);
|
|
106
159
|
}
|
|
107
160
|
// Default export: the singleton namespace (matches frontend SDK pattern)
|
|
108
161
|
const trodo = {
|
|
@@ -121,11 +174,17 @@ const trodo = {
|
|
|
121
174
|
disableAutoEvents,
|
|
122
175
|
flush,
|
|
123
176
|
shutdown,
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
177
|
+
wrapAgent,
|
|
178
|
+
withSpan,
|
|
179
|
+
joinRun,
|
|
180
|
+
tool,
|
|
181
|
+
trace,
|
|
182
|
+
llm,
|
|
183
|
+
retrieval,
|
|
184
|
+
getTracer,
|
|
185
|
+
trackLlmCall,
|
|
186
|
+
expressMiddleware,
|
|
187
|
+
feedback,
|
|
129
188
|
};
|
|
130
189
|
export default trodo;
|
|
131
190
|
//# sourceMappingURL=index.js.map
|
package/dist/esm/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Optional: register OpenTelemetry auto-instrumentation that feeds spans into
|
|
3
|
+
* our TrodoSpanProcessor. Call `enableAutoInstrument()` once at app startup to
|
|
4
|
+
* pick up Anthropic, OpenAI, Vercel AI SDK, LangChain, Bedrock, Google
|
|
5
|
+
* Generative AI etc. without any more code from the user.
|
|
6
|
+
*
|
|
7
|
+
* Each underlying OTel package is an optional peer dependency — we require()
|
|
8
|
+
* them lazily and skip anything that isn't installed. The user picks which
|
|
9
|
+
* instrumentations they want by installing the packages.
|
|
10
|
+
*/
|
|
11
|
+
import type { TrodoSpanProcessor, TrodoSpan } from './processor.js';
|
|
12
|
+
export type InstrumentationId = 'anthropic' | 'openai' | 'langchain' | 'bedrock' | 'cohere' | 'google-generativeai' | 'vertexai' | 'llama-index' | 'vercel-ai' | 'http' | 'fetch';
|
|
13
|
+
export interface AutoInstrumentOptions {
|
|
14
|
+
processor: TrodoSpanProcessor;
|
|
15
|
+
/** Disable individual instrumentations by name. */
|
|
16
|
+
disable?: InstrumentationId[];
|
|
17
|
+
}
|
|
18
|
+
type OtelSpanLike = {
|
|
19
|
+
name: string;
|
|
20
|
+
attributes?: Record<string, unknown>;
|
|
21
|
+
status?: {
|
|
22
|
+
code?: number;
|
|
23
|
+
};
|
|
24
|
+
startTime?: [number, number];
|
|
25
|
+
endTime?: [number, number];
|
|
26
|
+
spanContext?: () => {
|
|
27
|
+
spanId: string;
|
|
28
|
+
traceId: string;
|
|
29
|
+
};
|
|
30
|
+
parentSpanId?: string;
|
|
31
|
+
};
|
|
32
|
+
/**
|
|
33
|
+
* Translate an OTel span to our TrodoSpan shape using GenAI semantic
|
|
34
|
+
* conventions (gen_ai.*). Accepts both stable and legacy/experimental keys.
|
|
35
|
+
*/
|
|
36
|
+
export declare function otelSpanToTrodoSpan(otel: OtelSpanLike): TrodoSpan | null;
|
|
37
|
+
/**
|
|
38
|
+
* Adapter that lets the OTel SDK push spans into our processor.
|
|
39
|
+
* Register with `sdk.addSpanProcessor(otelAdapter(processor))` in your app
|
|
40
|
+
* bootstrap.
|
|
41
|
+
*/
|
|
42
|
+
export declare function otelAdapter(processor: TrodoSpanProcessor): {
|
|
43
|
+
onStart(): void;
|
|
44
|
+
onEnd(span: OtelSpanLike): void;
|
|
45
|
+
forceFlush(): Promise<void>;
|
|
46
|
+
shutdown(): Promise<void>;
|
|
47
|
+
};
|
|
48
|
+
/**
|
|
49
|
+
* Best-effort: register OTel auto-instrumentations if the user has them
|
|
50
|
+
* installed. This is optional — users can also configure OTel themselves and
|
|
51
|
+
* pass `otelAdapter(processor)` as a span processor.
|
|
52
|
+
*
|
|
53
|
+
* Returns the list of instrumentation ids that were successfully registered.
|
|
54
|
+
*
|
|
55
|
+
* Vercel AI SDK note: if you set `experimental_telemetry: { isEnabled: true,
|
|
56
|
+
* tracer: trace.getTracer('ai') }` on generateText/streamText calls, those
|
|
57
|
+
* spans flow through the SDK-registered OTel SpanProcessor automatically.
|
|
58
|
+
*/
|
|
59
|
+
export declare function enableAutoInstrument(opts: AutoInstrumentOptions): InstrumentationId[];
|
|
60
|
+
export {};
|
|
61
|
+
//# sourceMappingURL=autoInstrument.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"autoInstrument.d.ts","sourceRoot":"","sources":["../../../src/otel/autoInstrument.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,OAAO,KAAK,EAAE,kBAAkB,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAGpE,MAAM,MAAM,iBAAiB,GACzB,WAAW,GACX,QAAQ,GACR,WAAW,GACX,SAAS,GACT,QAAQ,GACR,qBAAqB,GACrB,UAAU,GACV,aAAa,GACb,WAAW,GACX,MAAM,GACN,OAAO,CAAC;AAEZ,MAAM,WAAW,qBAAqB;IACpC,SAAS,EAAE,kBAAkB,CAAC;IAC9B,mDAAmD;IACnD,OAAO,CAAC,EAAE,iBAAiB,EAAE,CAAC;CAC/B;AAED,KAAK,YAAY,GAAG;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACrC,MAAM,CAAC,EAAE;QAAE,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAC3B,SAAS,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC7B,OAAO,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC3B,WAAW,CAAC,EAAE,MAAM;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC;IACxD,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB,CAAC;AAuCF;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,YAAY,GAAG,SAAS,GAAG,IAAI,CA6DxE;AAED;;;;GAIG;AACH,wBAAgB,WAAW,CAAC,SAAS,EAAE,kBAAkB,GAAG;IAC1D,OAAO,IAAI,IAAI,CAAC;IAChB,KAAK,CAAC,IAAI,EAAE,YAAY,GAAG,IAAI,CAAC;IAChC,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5B,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CAC3B,CAgBA;AA4FD;;;;;;;;;;GAUG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,qBAAqB,GAAG,iBAAiB,EAAE,CA6BrF"}
|
|
@@ -0,0 +1,248 @@
|
|
|
1
|
+
import { getActiveContext } from './context.js';
|
|
2
|
+
function hrToIso(hr) {
|
|
3
|
+
if (!hr)
|
|
4
|
+
return undefined;
|
|
5
|
+
const ms = hr[0] * 1000 + Math.floor(hr[1] / 1e6);
|
|
6
|
+
return new Date(ms).toISOString();
|
|
7
|
+
}
|
|
8
|
+
function inferKind(attrs) {
|
|
9
|
+
if (!attrs)
|
|
10
|
+
return 'generic';
|
|
11
|
+
if (attrs['gen_ai.tool.name'])
|
|
12
|
+
return 'tool';
|
|
13
|
+
if (attrs['gen_ai.operation.name'] || attrs['gen_ai.request.model'])
|
|
14
|
+
return 'llm';
|
|
15
|
+
if (attrs['db.system'] || attrs['retrieval.query'])
|
|
16
|
+
return 'retrieval';
|
|
17
|
+
return 'generic';
|
|
18
|
+
}
|
|
19
|
+
function pickNum(attrs, keys) {
|
|
20
|
+
for (const k of keys) {
|
|
21
|
+
const v = attrs[k];
|
|
22
|
+
if (typeof v === 'number')
|
|
23
|
+
return v;
|
|
24
|
+
if (typeof v === 'string' && v !== '' && !isNaN(Number(v)))
|
|
25
|
+
return Number(v);
|
|
26
|
+
}
|
|
27
|
+
return undefined;
|
|
28
|
+
}
|
|
29
|
+
function pickStr(attrs, keys) {
|
|
30
|
+
for (const k of keys) {
|
|
31
|
+
const v = attrs[k];
|
|
32
|
+
if (typeof v === 'string' && v.length)
|
|
33
|
+
return v;
|
|
34
|
+
}
|
|
35
|
+
return undefined;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Translate an OTel span to our TrodoSpan shape using GenAI semantic
|
|
39
|
+
* conventions (gen_ai.*). Accepts both stable and legacy/experimental keys.
|
|
40
|
+
*/
|
|
41
|
+
export function otelSpanToTrodoSpan(otel) {
|
|
42
|
+
const ctx = getActiveContext();
|
|
43
|
+
if (!ctx)
|
|
44
|
+
return null; // outside of wrapAgent — drop
|
|
45
|
+
const sc = otel.spanContext?.();
|
|
46
|
+
if (!sc)
|
|
47
|
+
return null;
|
|
48
|
+
const attrs = otel.attributes || {};
|
|
49
|
+
const kind = inferKind(attrs);
|
|
50
|
+
const startedAt = hrToIso(otel.startTime) || new Date().toISOString();
|
|
51
|
+
const endedAt = hrToIso(otel.endTime);
|
|
52
|
+
const durationMs = otel.startTime && otel.endTime
|
|
53
|
+
? Math.max(0, (otel.endTime[0] - otel.startTime[0]) * 1000 +
|
|
54
|
+
(otel.endTime[1] - otel.startTime[1]) / 1e6)
|
|
55
|
+
: undefined;
|
|
56
|
+
const model = pickStr(attrs, [
|
|
57
|
+
'gen_ai.request.model',
|
|
58
|
+
'gen_ai.response.model',
|
|
59
|
+
'llm.request.model',
|
|
60
|
+
]);
|
|
61
|
+
const provider = pickStr(attrs, ['gen_ai.system', 'llm.vendor']);
|
|
62
|
+
const inputTokens = pickNum(attrs, [
|
|
63
|
+
'gen_ai.usage.input_tokens',
|
|
64
|
+
'gen_ai.usage.prompt_tokens',
|
|
65
|
+
'llm.usage.prompt_tokens',
|
|
66
|
+
]);
|
|
67
|
+
const outputTokens = pickNum(attrs, [
|
|
68
|
+
'gen_ai.usage.output_tokens',
|
|
69
|
+
'gen_ai.usage.completion_tokens',
|
|
70
|
+
'llm.usage.completion_tokens',
|
|
71
|
+
]);
|
|
72
|
+
const temperature = pickNum(attrs, ['gen_ai.request.temperature']);
|
|
73
|
+
const toolName = pickStr(attrs, ['gen_ai.tool.name']);
|
|
74
|
+
const input = pickStr(attrs, ['gen_ai.prompt', 'llm.prompts']);
|
|
75
|
+
const output = pickStr(attrs, ['gen_ai.completion', 'llm.completion']);
|
|
76
|
+
const span = {
|
|
77
|
+
span_id: sc.spanId,
|
|
78
|
+
run_id: ctx.runId,
|
|
79
|
+
parent_span_id: otel.parentSpanId || ctx.spanId,
|
|
80
|
+
kind,
|
|
81
|
+
name: otel.name,
|
|
82
|
+
status: otel.status?.code === 2 ? 'error' : 'ok',
|
|
83
|
+
started_at: startedAt,
|
|
84
|
+
ended_at: endedAt,
|
|
85
|
+
duration_ms: durationMs,
|
|
86
|
+
model,
|
|
87
|
+
provider,
|
|
88
|
+
input_tokens: inputTokens,
|
|
89
|
+
output_tokens: outputTokens,
|
|
90
|
+
temperature,
|
|
91
|
+
tool_name: toolName,
|
|
92
|
+
input,
|
|
93
|
+
output,
|
|
94
|
+
attributes: attrs,
|
|
95
|
+
};
|
|
96
|
+
return span;
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Adapter that lets the OTel SDK push spans into our processor.
|
|
100
|
+
* Register with `sdk.addSpanProcessor(otelAdapter(processor))` in your app
|
|
101
|
+
* bootstrap.
|
|
102
|
+
*/
|
|
103
|
+
export function otelAdapter(processor) {
|
|
104
|
+
return {
|
|
105
|
+
onStart() {
|
|
106
|
+
/* noop */
|
|
107
|
+
},
|
|
108
|
+
onEnd(otel) {
|
|
109
|
+
const span = otelSpanToTrodoSpan(otel);
|
|
110
|
+
if (span)
|
|
111
|
+
processor.enqueueSpan(span);
|
|
112
|
+
},
|
|
113
|
+
async forceFlush() {
|
|
114
|
+
await processor.forceFlush();
|
|
115
|
+
},
|
|
116
|
+
async shutdown() {
|
|
117
|
+
await processor.shutdown();
|
|
118
|
+
},
|
|
119
|
+
};
|
|
120
|
+
}
|
|
121
|
+
function buildInstrumentors() {
|
|
122
|
+
return [
|
|
123
|
+
{
|
|
124
|
+
id: 'anthropic',
|
|
125
|
+
factory: () => {
|
|
126
|
+
// eslint-disable-next-line @typescript-eslint/no-var-requires
|
|
127
|
+
const m = require('@opentelemetry/instrumentation-anthropic');
|
|
128
|
+
return new m.AnthropicInstrumentation();
|
|
129
|
+
},
|
|
130
|
+
},
|
|
131
|
+
{
|
|
132
|
+
id: 'openai',
|
|
133
|
+
factory: () => {
|
|
134
|
+
// eslint-disable-next-line @typescript-eslint/no-var-requires
|
|
135
|
+
const m = require('@opentelemetry/instrumentation-openai');
|
|
136
|
+
return new m.OpenAIInstrumentation();
|
|
137
|
+
},
|
|
138
|
+
},
|
|
139
|
+
{
|
|
140
|
+
id: 'langchain',
|
|
141
|
+
factory: () => {
|
|
142
|
+
// eslint-disable-next-line @typescript-eslint/no-var-requires
|
|
143
|
+
const m = require('@opentelemetry/instrumentation-langchain');
|
|
144
|
+
return new m.LangChainInstrumentation();
|
|
145
|
+
},
|
|
146
|
+
},
|
|
147
|
+
{
|
|
148
|
+
id: 'bedrock',
|
|
149
|
+
factory: () => {
|
|
150
|
+
// eslint-disable-next-line @typescript-eslint/no-var-requires
|
|
151
|
+
const m = require('@opentelemetry/instrumentation-bedrock');
|
|
152
|
+
return new m.BedrockInstrumentation();
|
|
153
|
+
},
|
|
154
|
+
},
|
|
155
|
+
{
|
|
156
|
+
id: 'cohere',
|
|
157
|
+
factory: () => {
|
|
158
|
+
// eslint-disable-next-line @typescript-eslint/no-var-requires
|
|
159
|
+
const m = require('@opentelemetry/instrumentation-cohere');
|
|
160
|
+
return new m.CohereInstrumentation();
|
|
161
|
+
},
|
|
162
|
+
},
|
|
163
|
+
{
|
|
164
|
+
id: 'google-generativeai',
|
|
165
|
+
factory: () => {
|
|
166
|
+
// eslint-disable-next-line @typescript-eslint/no-var-requires
|
|
167
|
+
const m = require('@opentelemetry/instrumentation-google-generativeai');
|
|
168
|
+
return new m.GoogleGenerativeAIInstrumentation();
|
|
169
|
+
},
|
|
170
|
+
},
|
|
171
|
+
{
|
|
172
|
+
id: 'vertexai',
|
|
173
|
+
factory: () => {
|
|
174
|
+
// eslint-disable-next-line @typescript-eslint/no-var-requires
|
|
175
|
+
const m = require('@opentelemetry/instrumentation-vertexai');
|
|
176
|
+
return new m.VertexAIInstrumentation();
|
|
177
|
+
},
|
|
178
|
+
},
|
|
179
|
+
{
|
|
180
|
+
id: 'llama-index',
|
|
181
|
+
factory: () => {
|
|
182
|
+
// eslint-disable-next-line @typescript-eslint/no-var-requires
|
|
183
|
+
const m = require('@opentelemetry/instrumentation-llamaindex');
|
|
184
|
+
return new m.LlamaIndexInstrumentation();
|
|
185
|
+
},
|
|
186
|
+
},
|
|
187
|
+
{
|
|
188
|
+
id: 'http',
|
|
189
|
+
factory: () => {
|
|
190
|
+
// eslint-disable-next-line @typescript-eslint/no-var-requires
|
|
191
|
+
const m = require('@opentelemetry/instrumentation-http');
|
|
192
|
+
return new m.HttpInstrumentation();
|
|
193
|
+
},
|
|
194
|
+
},
|
|
195
|
+
{
|
|
196
|
+
id: 'fetch',
|
|
197
|
+
factory: () => {
|
|
198
|
+
// eslint-disable-next-line @typescript-eslint/no-var-requires
|
|
199
|
+
const m = require('@opentelemetry/instrumentation-fetch');
|
|
200
|
+
return new m.FetchInstrumentation();
|
|
201
|
+
},
|
|
202
|
+
},
|
|
203
|
+
];
|
|
204
|
+
}
|
|
205
|
+
/**
|
|
206
|
+
* Best-effort: register OTel auto-instrumentations if the user has them
|
|
207
|
+
* installed. This is optional — users can also configure OTel themselves and
|
|
208
|
+
* pass `otelAdapter(processor)` as a span processor.
|
|
209
|
+
*
|
|
210
|
+
* Returns the list of instrumentation ids that were successfully registered.
|
|
211
|
+
*
|
|
212
|
+
* Vercel AI SDK note: if you set `experimental_telemetry: { isEnabled: true,
|
|
213
|
+
* tracer: trace.getTracer('ai') }` on generateText/streamText calls, those
|
|
214
|
+
* spans flow through the SDK-registered OTel SpanProcessor automatically.
|
|
215
|
+
*/
|
|
216
|
+
export function enableAutoInstrument(opts) {
|
|
217
|
+
const disabled = new Set(opts.disable || []);
|
|
218
|
+
const active = [];
|
|
219
|
+
try {
|
|
220
|
+
// eslint-disable-next-line @typescript-eslint/no-var-requires
|
|
221
|
+
const { NodeSDK } = require('@opentelemetry/sdk-node');
|
|
222
|
+
// eslint-disable-next-line @typescript-eslint/no-var-requires
|
|
223
|
+
const { Resource } = require('@opentelemetry/resources');
|
|
224
|
+
const instrumentations = [];
|
|
225
|
+
for (const spec of buildInstrumentors()) {
|
|
226
|
+
if (disabled.has(spec.id))
|
|
227
|
+
continue;
|
|
228
|
+
try {
|
|
229
|
+
instrumentations.push(spec.factory());
|
|
230
|
+
active.push(spec.id);
|
|
231
|
+
}
|
|
232
|
+
catch {
|
|
233
|
+
/* package not installed — skip */
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
const sdk = new NodeSDK({
|
|
237
|
+
resource: new Resource({ 'service.name': 'trodo-agent' }),
|
|
238
|
+
spanProcessor: otelAdapter(opts.processor),
|
|
239
|
+
instrumentations,
|
|
240
|
+
});
|
|
241
|
+
sdk.start();
|
|
242
|
+
}
|
|
243
|
+
catch {
|
|
244
|
+
// @opentelemetry/sdk-node not installed; wrapAgent + withSpan still work.
|
|
245
|
+
}
|
|
246
|
+
return active;
|
|
247
|
+
}
|
|
248
|
+
//# sourceMappingURL=autoInstrument.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"autoInstrument.js","sourceRoot":"","sources":["../../../src/otel/autoInstrument.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Run/span active-context — used by wrapAgent, joinRun, and withSpan to
|
|
3
|
+
* thread parent_span_id and run_id through nested function calls without
|
|
4
|
+
* the user touching IDs.
|
|
5
|
+
*
|
|
6
|
+
* Backed by AsyncLocalStorage in Node (Node >= 14). Falls back to a global
|
|
7
|
+
* store in other runtimes (best-effort — only the top of each call chain
|
|
8
|
+
* is preserved).
|
|
9
|
+
*
|
|
10
|
+
* When a user registers a real OpenTelemetry SDK, their OTel ContextManager
|
|
11
|
+
* supersedes this for cross-package propagation. This lightweight store is
|
|
12
|
+
* the baseline so wrapAgent works without any external OTel dependency.
|
|
13
|
+
*/
|
|
14
|
+
import type { TrodoSpanProcessor } from './processor.js';
|
|
15
|
+
export interface ActiveSpanContext {
|
|
16
|
+
runId: string;
|
|
17
|
+
spanId: string;
|
|
18
|
+
parentSpanId: string | null;
|
|
19
|
+
teamSiteId: string;
|
|
20
|
+
processor: TrodoSpanProcessor;
|
|
21
|
+
}
|
|
22
|
+
export declare function getActiveContext(): ActiveSpanContext | null;
|
|
23
|
+
export declare function runWithContext<R>(ctx: ActiveSpanContext, fn: () => R): R;
|
|
24
|
+
/** Async variant — context is preserved across awaits via AsyncLocalStorage. */
|
|
25
|
+
export declare function runWithContextAsync<R>(ctx: ActiveSpanContext, fn: () => Promise<R>): Promise<R>;
|
|
26
|
+
//# sourceMappingURL=context.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../../../src/otel/context.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AACH,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AAEzD,MAAM,WAAW,iBAAiB;IAChC,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,kBAAkB,CAAC;CAC/B;AAsBD,wBAAgB,gBAAgB,IAAI,iBAAiB,GAAG,IAAI,CAG3D;AAED,wBAAgB,cAAc,CAAC,CAAC,EAAE,GAAG,EAAE,iBAAiB,EAAE,EAAE,EAAE,MAAM,CAAC,GAAG,CAAC,CASxE;AAED,gFAAgF;AAChF,wBAAgB,mBAAmB,CAAC,CAAC,EACnC,GAAG,EAAE,iBAAiB,EACtB,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GACnB,OAAO,CAAC,CAAC,CAAC,CAOZ"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
let AsyncLocalStorageCtor = null;
|
|
2
|
+
try {
|
|
3
|
+
// eslint-disable-next-line @typescript-eslint/no-var-requires
|
|
4
|
+
AsyncLocalStorageCtor = require('node:async_hooks').AsyncLocalStorage;
|
|
5
|
+
}
|
|
6
|
+
catch {
|
|
7
|
+
try {
|
|
8
|
+
// eslint-disable-next-line @typescript-eslint/no-var-requires
|
|
9
|
+
AsyncLocalStorageCtor = require('async_hooks').AsyncLocalStorage;
|
|
10
|
+
}
|
|
11
|
+
catch {
|
|
12
|
+
AsyncLocalStorageCtor = null;
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
const als = AsyncLocalStorageCtor ? new AsyncLocalStorageCtor() : null;
|
|
16
|
+
let fallbackStore = null;
|
|
17
|
+
export function getActiveContext() {
|
|
18
|
+
if (als)
|
|
19
|
+
return als.getStore() ?? null;
|
|
20
|
+
return fallbackStore;
|
|
21
|
+
}
|
|
22
|
+
export function runWithContext(ctx, fn) {
|
|
23
|
+
if (als)
|
|
24
|
+
return als.run(ctx, fn);
|
|
25
|
+
const prev = fallbackStore;
|
|
26
|
+
fallbackStore = ctx;
|
|
27
|
+
try {
|
|
28
|
+
return fn();
|
|
29
|
+
}
|
|
30
|
+
finally {
|
|
31
|
+
fallbackStore = prev;
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
/** Async variant — context is preserved across awaits via AsyncLocalStorage. */
|
|
35
|
+
export function runWithContextAsync(ctx, fn) {
|
|
36
|
+
if (als)
|
|
37
|
+
return als.run(ctx, fn);
|
|
38
|
+
const prev = fallbackStore;
|
|
39
|
+
fallbackStore = ctx;
|
|
40
|
+
return fn().finally(() => {
|
|
41
|
+
fallbackStore = prev;
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
//# sourceMappingURL=context.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context.js","sourceRoot":"","sources":["../../../src/otel/context.ts"],"names":[],"mappings":"AAuBA,IAAI,qBAAqB,GAGb,IAAI,CAAC;AAEjB,IAAI,CAAC;IACH,8DAA8D;IAC9D,qBAAqB,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAAC,iBAAiB,CAAC;AACxE,CAAC;AAAC,MAAM,CAAC;IACP,IAAI,CAAC;QACH,8DAA8D;QAC9D,qBAAqB,GAAG,OAAO,CAAC,aAAa,CAAC,CAAC,iBAAiB,CAAC;IACnE,CAAC;IAAC,MAAM,CAAC;QACP,qBAAqB,GAAG,IAAI,CAAC;IAC/B,CAAC;AACH,CAAC;AAED,MAAM,GAAG,GAAG,qBAAqB,CAAC,CAAC,CAAC,IAAI,qBAAqB,EAAqB,CAAC,CAAC,CAAC,IAAI,CAAC;AAC1F,IAAI,aAAa,GAA6B,IAAI,CAAC;AAEnD,MAAM,UAAU,gBAAgB;IAC9B,IAAI,GAAG;QAAE,OAAO,GAAG,CAAC,QAAQ,EAAE,IAAI,IAAI,CAAC;IACvC,OAAO,aAAa,CAAC;AACvB,CAAC;AAED,MAAM,UAAU,cAAc,CAAI,GAAsB,EAAE,EAAW;IACnE,IAAI,GAAG;QAAE,OAAO,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;IACjC,MAAM,IAAI,GAAG,aAAa,CAAC;IAC3B,aAAa,GAAG,GAAG,CAAC;IACpB,IAAI,CAAC;QACH,OAAO,EAAE,EAAE,CAAC;IACd,CAAC;YAAS,CAAC;QACT,aAAa,GAAG,IAAI,CAAC;IACvB,CAAC;AACH,CAAC;AAED,gFAAgF;AAChF,MAAM,UAAU,mBAAmB,CACjC,GAAsB,EACtB,EAAoB;IAEpB,IAAI,GAAG;QAAE,OAAO,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;IACjC,MAAM,IAAI,GAAG,aAAa,CAAC;IAC3B,aAAa,GAAG,GAAG,CAAC;IACpB,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,EAAE;QACvB,aAAa,GAAG,IAAI,CAAC;IACvB,CAAC,CAAC,CAAC;AACL,CAAC"}
|